// // Copyright (c) 2006, Brian Frank and Andy Frank // Licensed under the Academic Free License version 3.0 // // History: // 3 Nov 06 Brian Frank Creation // ** ** BuildGroup is the base class for build scripts which compose ** a set of children build scripts into a single group. The ** target's of a BuildGroup are the union of the target ** names available in the children scripts. ** abstract class BuildGroup : BuildScript { ** ** Required list of Uris relative to this scriptDir of ** Fantom build script files to group together. ** Uri[] childrenScripts := Uri[,] ** ** Compiled children scripts ** once BuildScript[] children() { acc := BuildScript[,] childrenScripts.each |uri| { f := scriptDir + uri log.debug("CompileScript [$f]") s := (BuildScript)FanScript(this, f).compile.types.first.make s.log = log acc.add(s) } return acc } ** ** BuildGroup publishes the union by name of it's ** children script targets plus any of its own targets. ** override once TargetMethod[] targets() { // get union of names in my children scripts Str[]? names := null children.each |child| { // get all the target names in this subscript Str[] n := child.targets.map |t| { t.name } // get union of names if (names == null) names = n else names = names.union(n) } // map names to group targets map := Str:TargetMethod[:] { ordered = true } names.each |n| { map[n] = GroupTarget(this, n) } // add my own targets, which trump children targets typeof.methods.each |m| { if (!m.hasFacet(Target#)) return map[m.name] = TargetMethod(this, m) } // now create a Target for each name list := map.vals list.moveTo(map["compile"], 0) return list } ** ** Run the specified target name on each of the ** children scripts that support the specified name. ** virtual Void runOnChildren(Str targetName) { children.each |child| { target := child.target(targetName, false) if (target != null) target.run } } ** ** Run the specified target name on each of the children ** scripts that support the specified name. Unlike runOnChildren ** this method actually spawns a new process to run the child ** script. ** virtual Void spawnOnChildren(Str targetName) { fanExe := Exec.exePath(devHomeDir + `bin/fan`) children.each |child| { target := child.target(targetName) if (target != null) Exec(this, [fanExe, child.scriptFile.osPath, targetName]).run } } override Void dumpEnv() { super.dumpEnv children.each |child| { child.dumpEnv } } } internal class GroupTarget : TargetMethod { new make(BuildGroup s, Str n) : super(s, BuildGroup#runOnChildren) { name = n } override const Str name override Str help() { "Run '$name' on group" } override Void run() { ((BuildGroup)script).runOnChildren(name) } }