def buildTargets(self, targets): """ Attempt to build the targets specified """ buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire(bb.event.BuildStarted(buildname, targets, self.configuration.event_data)) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort, self.configuration.tryaltconfigs) runlist = [] try: for k in targets: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % self.configuration.cmd]) taskdata.add_unresolved(localdata, self.status) except bb.providers.NoProvider: sys.exit(1) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() try: failures = rq.execute_runqueue() except runqueue.TaskFailure, fnids: failures = 0 for fnid in fnids: bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) failures = failures + 1 bb.event.fire(bb.event.BuildCompleted(buildname, targets, self.configuration.event_data, failures)) sys.exit(1)
def buildTargets(self, targets): """ Attempt to build the targets specified """ buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire(bb.event.BuildStarted(buildname, targets, self.configuration.event_data)) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) runlist = [] try: for k in targets: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % self.configuration.cmd]) taskdata.add_unresolved(localdata, self.status) except bb.providers.NoProvider: sys.exit(1) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() try: failures = rq.execute_runqueue() except runqueue.TaskFailure, fnids: failures = 0 for fnid in fnids: bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) failures = failures + 1 bb.event.fire(bb.event.BuildCompleted(buildname, targets, self.configuration.event_data, failures)) sys.exit(1)
def showEnvironment(self, buildfile=None, pkgs_to_build=[]): """ Show the outer or per-package environment """ fn = None envdata = None if 'world' in pkgs_to_build: print "'world' is not a valid target for --environment." sys.exit(1) if len(pkgs_to_build) > 1: print "Only one target can be used with the --environment option." sys.exit(1) if buildfile: if len(pkgs_to_build) > 0: print "No target should be used with the --environment and --buildfile options." sys.exit(1) self.cb = None self.bb_cache = bb.cache.init(self) fn = self.matchFile(buildfile) if not fn: sys.exit(1) elif len(pkgs_to_build) == 1: self.updateCache() localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort, self.configuration.tryaltconfigs) try: taskdata.add_provider(localdata, self.status, pkgs_to_build[0]) taskdata.add_unresolved(localdata, self.status) except bb.providers.NoProvider: sys.exit(1) targetid = taskdata.getbuild_id(pkgs_to_build[0]) fnid = taskdata.build_targets[targetid][0] fn = taskdata.fn_index[fnid] else: envdata = self.configuration.data if fn: try: envdata = self.bb_cache.loadDataFull(fn, self.configuration.data) except IOError, e: bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e)) except Exception, e: bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e)
def buildFile(self, buildfile): """ Build the file matching regexp buildfile """ # Make sure our target is a fully qualified filename fn = self.matchFile(buildfile) if not fn: return False # Load data into the cache for fn self.bb_cache = bb.cache.init(self) self.bb_cache.loadData(fn, self.configuration.data) # Parse the loaded cache data self.status = bb.cache.CacheData() self.bb_cache.handle_data(fn, self.status) # Tweak some variables item = self.bb_cache.getVar('PN', fn, True) self.status.ignored_dependencies = Set() self.status.bbfile_priority[fn] = 1 # Remove external dependencies self.status.task_deps[fn]['depends'] = {} self.status.deps[fn] = [] self.status.rundeps[fn] = [] self.status.runrecs[fn] = [] # Remove stamp for target if force mode active if self.configuration.force: bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (self.configuration.cmd, fn)) bb.build.del_stamp('do_%s' % self.configuration.cmd, self.configuration.data) # Setup taskdata structure taskdata = bb.taskdata.TaskData(self.configuration.abort, self.configuration.tryaltconfigs) taskdata.add_provider(self.configuration.data, self.status, item) buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire(bb.event.BuildStarted(buildname, [item], self.configuration.event_data)) # Execute the runqueue runlist = [[item, "do_%s" % self.configuration.cmd]] rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() try: failures = rq.execute_runqueue() except runqueue.TaskFailure, fnids: failures = 0 for fnid in fnids: bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) failures = failures + 1 bb.event.fire(bb.event.BuildCompleted(buildname, [item], self.configuration.event_data, failures)) return False
def buildFile(self, buildfile): """ Build the file matching regexp buildfile """ # Make sure our target is a fully qualified filename fn = self.matchFile(buildfile) if not fn: return False # Load data into the cache for fn self.bb_cache = bb.cache.init(self) self.bb_cache.loadData(fn, self.configuration.data) # Parse the loaded cache data self.status = bb.cache.CacheData() self.bb_cache.handle_data(fn, self.status) # Tweak some variables item = self.bb_cache.getVar('PN', fn, True) self.status.ignored_dependencies = Set() self.status.bbfile_priority[fn] = 1 # Remove external dependencies self.status.task_deps[fn]['depends'] = {} self.status.deps[fn] = [] self.status.rundeps[fn] = [] self.status.runrecs[fn] = [] # Remove stamp for target if force mode active if self.configuration.force: bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (self.configuration.cmd, fn)) bb.build.del_stamp('do_%s' % self.configuration.cmd, self.configuration.data) # Setup taskdata structure taskdata = bb.taskdata.TaskData(self.configuration.abort) taskdata.add_provider(self.configuration.data, self.status, item) buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire(bb.event.BuildStarted(buildname, [item], self.configuration.event_data)) # Execute the runqueue runlist = [[item, "do_%s" % self.configuration.cmd]] rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() try: failures = rq.execute_runqueue() except runqueue.TaskFailure, fnids: failures = 0 for fnid in fnids: bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) failures = failures + 1 bb.event.fire(bb.event.BuildCompleted(buildname, [item], self.configuration.event_data, failures)) return False
def showEnvironment(self , buildfile = None, pkgs_to_build = []): """ Show the outer or per-package environment """ fn = None envdata = None if 'world' in pkgs_to_build: print "'world' is not a valid target for --environment." sys.exit(1) if len(pkgs_to_build) > 1: print "Only one target can be used with the --environment option." sys.exit(1) if buildfile: if len(pkgs_to_build) > 0: print "No target should be used with the --environment and --buildfile options." sys.exit(1) self.cb = None self.bb_cache = bb.cache.init(self) fn = self.matchFile(buildfile) if not fn: sys.exit(1) elif len(pkgs_to_build) == 1: self.updateCache() localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort, self.configuration.tryaltconfigs) try: taskdata.add_provider(localdata, self.status, pkgs_to_build[0]) taskdata.add_unresolved(localdata, self.status) except bb.providers.NoProvider: sys.exit(1) targetid = taskdata.getbuild_id(pkgs_to_build[0]) fnid = taskdata.build_targets[targetid][0] fn = taskdata.fn_index[fnid] else: envdata = self.configuration.data if fn: try: envdata = self.bb_cache.loadDataFull(fn, self.configuration.data) except IOError, e: bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e)) except Exception, e: bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e)
def showEnvironment(self, buildfile=None, pkgs_to_build=[]): """ Show the outer or per-package environment """ fn = None envdata = None if buildfile: self.cb = None self.bb_cache = bb.cache.init(self) fn = self.matchFile(buildfile) elif len(pkgs_to_build) == 1: self.updateCache() localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) taskdata.add_provider(localdata, self.status, pkgs_to_build[0]) taskdata.add_unresolved(localdata, self.status) targetid = taskdata.getbuild_id(pkgs_to_build[0]) fnid = taskdata.build_targets[targetid][0] fn = taskdata.fn_index[fnid] else: envdata = self.configuration.data if fn: try: envdata = self.bb_cache.loadDataFull(fn, self.configuration.data) except IOError, e: bb.msg.error(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e)) raise except Exception, e: bb.msg.error(bb.msg.domain.Parsing, "%s" % e) raise
def showEnvironment(self, buildfile = None, pkgs_to_build = []): """ Show the outer or per-package environment """ fn = None envdata = None if buildfile: self.cb = None self.bb_cache = bb.cache.init(self) fn = self.matchFile(buildfile) elif len(pkgs_to_build) == 1: self.updateCache() localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) taskdata.add_provider(localdata, self.status, pkgs_to_build[0]) taskdata.add_unresolved(localdata, self.status) targetid = taskdata.getbuild_id(pkgs_to_build[0]) fnid = taskdata.build_targets[targetid][0] fn = taskdata.fn_index[fnid] else: envdata = self.configuration.data if fn: try: envdata = self.bb_cache.loadDataFull(fn, self.configuration.data) except IOError, e: bb.msg.error(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e)) raise except Exception, e: bb.msg.error(bb.msg.domain.Parsing, "%s" % e) raise
def buildFile(self, buildfile, task): """ Build the file matching regexp buildfile """ # Parse the configuration here. We need to do it explicitly here since # buildFile() doesn't use the cache self.parseConfiguration() # If we are told to do the None task then query the default task if (task == None): task = self.configuration.cmd fn = self.matchFile(buildfile) self.buildSetVars() # Load data into the cache for fn and parse the loaded cache data self.bb_cache = bb.cache.init(self) self.status = bb.cache.CacheData() self.bb_cache.loadData(fn, self.configuration.data, self.status) # Tweak some variables item = self.bb_cache.getVar('PN', fn, True) self.status.ignored_dependencies = set() self.status.bbfile_priority[fn] = 1 # Remove external dependencies self.status.task_deps[fn]['depends'] = {} self.status.deps[fn] = [] self.status.rundeps[fn] = [] self.status.runrecs[fn] = [] # Remove stamp for target if force mode active if self.configuration.force: bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (task, fn)) bb.build.del_stamp('do_%s' % task, self.status, fn) # Setup taskdata structure taskdata = bb.taskdata.TaskData(self.configuration.abort) taskdata.add_provider(self.configuration.data, self.status, item) buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire( bb.event.BuildStarted(buildname, [item], self.configuration.event_data)) # Execute the runqueue runlist = [[item, "do_%s" % task]] rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) def buildFileIdle(server, rq, abort): if abort or self.cookerAction == cookerStop: rq.finish_runqueue(True) elif self.cookerAction == cookerShutdown: rq.finish_runqueue(False) failures = 0 try: retval = rq.execute_runqueue() except runqueue.TaskFailure, fnids: for fnid in fnids: bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) failures = failures + 1 retval = False if not retval: self.cookerIdle = True self.command.finishAsyncCommand() bb.event.fire( bb.event.BuildCompleted(buildname, targets, self.configuration.event_data, failures)) return retval
def generateDepTreeData(self, pkgs_to_build, task): """ Create a dependency tree of pkgs_to_build, returning the data. """ # Need files parsed self.updateCache() # If we are told to do the None task then query the default task if (task == None): task = self.configuration.cmd pkgs_to_build = self.checkPackages(pkgs_to_build) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) runlist = [] for k in pkgs_to_build: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % task]) taskdata.add_unresolved(localdata, self.status) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() seen_fnids = [] depend_tree = {} depend_tree["depends"] = {} depend_tree["tdepends"] = {} depend_tree["pn"] = {} depend_tree["rdepends-pn"] = {} depend_tree["packages"] = {} depend_tree["rdepends-pkg"] = {} depend_tree["rrecs-pkg"] = {} for task in range(len(rq.runq_fnid)): taskname = rq.runq_task[task] fnid = rq.runq_fnid[task] fn = taskdata.fn_index[fnid] pn = self.status.pkg_fn[fn] version = "%s:%s-%s" % self.status.pkg_pepvpr[fn] if pn not in depend_tree["pn"]: depend_tree["pn"][pn] = {} depend_tree["pn"][pn]["filename"] = fn depend_tree["pn"][pn]["version"] = version for dep in rq.runq_depends[task]: depfn = taskdata.fn_index[rq.runq_fnid[dep]] deppn = self.status.pkg_fn[depfn] dotname = "%s.%s" % (pn, rq.runq_task[task]) if not dotname in depend_tree["tdepends"]: depend_tree["tdepends"][dotname] = [] depend_tree["tdepends"][dotname].append( "%s.%s" % (deppn, rq.runq_task[dep])) if fnid not in seen_fnids: seen_fnids.append(fnid) packages = [] depend_tree["depends"][pn] = [] for dep in taskdata.depids[fnid]: depend_tree["depends"][pn].append( taskdata.build_names_index[dep]) depend_tree["rdepends-pn"][pn] = [] for rdep in taskdata.rdepids[fnid]: depend_tree["rdepends-pn"][pn].append( taskdata.run_names_index[rdep]) rdepends = self.status.rundeps[fn] for package in rdepends: depend_tree["rdepends-pkg"][package] = [] for rdepend in rdepends[package]: depend_tree["rdepends-pkg"][package].append(rdepend) packages.append(package) rrecs = self.status.runrecs[fn] for package in rrecs: depend_tree["rrecs-pkg"][package] = [] for rdepend in rrecs[package]: depend_tree["rrecs-pkg"][package].append(rdepend) if not package in packages: packages.append(package) for package in packages: if package not in depend_tree["packages"]: depend_tree["packages"][package] = {} depend_tree["packages"][package]["pn"] = pn depend_tree["packages"][package]["filename"] = fn depend_tree["packages"][package]["version"] = version return depend_tree
self.buildSetVars() buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire( bb.event.BuildStarted(buildname, targets, self.configuration.event_data)) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) runlist = [] for k in targets: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % task]) taskdata.add_unresolved(localdata, self.status) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) self.cookerIdle = False self.server.register_idle_function(buildTargetsIdle, rq) def updateCache(self): self.parseConfiguration() if self.cookerState == cookerParsed: return
def generateDotGraph( self, pkgs_to_build, ignore_deps ): """ Generate a task dependency graph. pkgs_to_build A list of packages that needs to be built ignore_deps A list of names where processing of dependencies should be stopped. e.g. dependencies that get """ for dep in ignore_deps: self.status.ignored_dependencies.add(dep) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort, self.configuration.tryaltconfigs) runlist = [] try: for k in pkgs_to_build: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % self.configuration.cmd]) taskdata.add_unresolved(localdata, self.status) except bb.providers.NoProvider: sys.exit(1) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() seen_fnids = [] depends_file = file('depends.dot', 'w' ) tdepends_file = file('task-depends.dot', 'w' ) print >> depends_file, "digraph depends {" print >> tdepends_file, "digraph depends {" for task in range(len(rq.runq_fnid)): taskname = rq.runq_task[task] fnid = rq.runq_fnid[task] fn = taskdata.fn_index[fnid] pn = self.status.pkg_fn[fn] version = "%s:%s-%s" % self.status.pkg_pepvpr[fn] print >> tdepends_file, '"%s.%s" [label="%s %s\\n%s\\n%s"]' % (pn, taskname, pn, taskname, version, fn) for dep in rq.runq_depends[task]: depfn = taskdata.fn_index[rq.runq_fnid[dep]] deppn = self.status.pkg_fn[depfn] print >> tdepends_file, '"%s.%s" -> "%s.%s"' % (pn, rq.runq_task[task], deppn, rq.runq_task[dep]) if fnid not in seen_fnids: seen_fnids.append(fnid) packages = [] print >> depends_file, '"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn) for depend in self.status.deps[fn]: print >> depends_file, '"%s" -> "%s"' % (pn, depend) rdepends = self.status.rundeps[fn] for package in rdepends: for rdepend in rdepends[package]: print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) packages.append(package) rrecs = self.status.runrecs[fn] for package in rrecs: for rdepend in rrecs[package]: print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) if not package in packages: packages.append(package) for package in packages: if package != pn: print >> depends_file, '"%s" [label="%s(%s) %s\\n%s"]' % (package, package, pn, version, fn) for depend in self.status.deps[fn]: print >> depends_file, '"%s" -> "%s"' % (package, depend) # Prints a flattened form of the above where subpackages of a package are merged into the main pn #print >> depends_file, '"%s" [label="%s %s\\n%s\\n%s"]' % (pn, pn, taskname, version, fn) #for rdep in taskdata.rdepids[fnid]: # print >> depends_file, '"%s" -> "%s" [style=dashed]' % (pn, taskdata.run_names_index[rdep]) #for dep in taskdata.depids[fnid]: # print >> depends_file, '"%s" -> "%s"' % (pn, taskdata.build_names_index[dep]) print >> depends_file, "}" print >> tdepends_file, "}" bb.msg.note(1, bb.msg.domain.Collection, "Dependencies saved to 'depends.dot'") bb.msg.note(1, bb.msg.domain.Collection, "Task dependencies saved to 'task-depends.dot'")
def generateDotGraph( self, pkgs_to_build, ignore_deps ): """ Generate a task dependency graph. pkgs_to_build A list of packages that needs to be built ignore_deps A list of names where processing of dependencies should be stopped. e.g. dependencies that get """ for dep in ignore_deps: self.status.ignored_dependencies.add(dep) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) runlist = [] try: for k in pkgs_to_build: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % self.configuration.cmd]) taskdata.add_unresolved(localdata, self.status) except bb.providers.NoProvider: sys.exit(1) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() seen_fnids = [] depends_file = file('depends.dot', 'w' ) tdepends_file = file('task-depends.dot', 'w' ) print >> depends_file, "digraph depends {" print >> tdepends_file, "digraph depends {" for task in range(len(rq.runq_fnid)): taskname = rq.runq_task[task] fnid = rq.runq_fnid[task] fn = taskdata.fn_index[fnid] pn = self.status.pkg_fn[fn] version = "%s:%s-%s" % self.status.pkg_pepvpr[fn] print >> tdepends_file, '"%s.%s" [label="%s %s\\n%s\\n%s"]' % (pn, taskname, pn, taskname, version, fn) for dep in rq.runq_depends[task]: depfn = taskdata.fn_index[rq.runq_fnid[dep]] deppn = self.status.pkg_fn[depfn] print >> tdepends_file, '"%s.%s" -> "%s.%s"' % (pn, rq.runq_task[task], deppn, rq.runq_task[dep]) if fnid not in seen_fnids: seen_fnids.append(fnid) packages = [] print >> depends_file, '"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn) for depend in self.status.deps[fn]: print >> depends_file, '"%s" -> "%s"' % (pn, depend) rdepends = self.status.rundeps[fn] for package in rdepends: for rdepend in rdepends[package]: print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) packages.append(package) rrecs = self.status.runrecs[fn] for package in rrecs: for rdepend in rrecs[package]: print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) if not package in packages: packages.append(package) for package in packages: if package != pn: print >> depends_file, '"%s" [label="%s(%s) %s\\n%s"]' % (package, package, pn, version, fn) for depend in self.status.deps[fn]: print >> depends_file, '"%s" -> "%s"' % (package, depend) # Prints a flattened form of the above where subpackages of a package are merged into the main pn #print >> depends_file, '"%s" [label="%s %s\\n%s\\n%s"]' % (pn, pn, taskname, version, fn) #for rdep in taskdata.rdepids[fnid]: # print >> depends_file, '"%s" -> "%s" [style=dashed]' % (pn, taskdata.run_names_index[rdep]) #for dep in taskdata.depids[fnid]: # print >> depends_file, '"%s" -> "%s"' % (pn, taskdata.build_names_index[dep]) print >> depends_file, "}" print >> tdepends_file, "}" bb.msg.note(1, bb.msg.domain.Collection, "Dependencies saved to 'depends.dot'") bb.msg.note(1, bb.msg.domain.Collection, "Task dependencies saved to 'task-depends.dot'")
def buildFile(self, buildfile, task): """ Build the file matching regexp buildfile """ # Parse the configuration here. We need to do it explicitly here since # buildFile() doesn't use the cache self.parseConfiguration() # If we are told to do the None task then query the default task if (task == None): task = self.configuration.cmd fn = self.matchFile(buildfile) self.buildSetVars() # Load data into the cache for fn and parse the loaded cache data self.bb_cache = bb.cache.init(self) self.status = bb.cache.CacheData() self.bb_cache.loadData(fn, self.configuration.data, self.status) # Tweak some variables item = self.bb_cache.getVar('PN', fn, True) self.status.ignored_dependencies = Set() self.status.bbfile_priority[fn] = 1 # Remove external dependencies self.status.task_deps[fn]['depends'] = {} self.status.deps[fn] = [] self.status.rundeps[fn] = [] self.status.runrecs[fn] = [] # Remove stamp for target if force mode active if self.configuration.force: bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (task, fn)) bb.build.del_stamp('do_%s' % task, self.status, fn) # Setup taskdata structure taskdata = bb.taskdata.TaskData(self.configuration.abort) taskdata.add_provider(self.configuration.data, self.status, item) buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire(bb.event.BuildStarted(buildname, [item], self.configuration.event_data)) # Execute the runqueue runlist = [[item, "do_%s" % task]] rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) def buildFileIdle(server, rq, abort): if abort or self.cookerAction == cookerStop: rq.finish_runqueue(True) elif self.cookerAction == cookerShutdown: rq.finish_runqueue(False) failures = 0 try: retval = rq.execute_runqueue() except runqueue.TaskFailure, fnids: for fnid in fnids: bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) failures = failures + 1 retval = False if not retval: self.cookerIdle = True self.command.finishAsyncCommand() bb.event.fire(bb.event.BuildCompleted(buildname, targets, self.configuration.event_data, failures)) return retval
def generateDepTreeData(self, pkgs_to_build, task): """ Create a dependency tree of pkgs_to_build, returning the data. """ # Need files parsed self.updateCache() # If we are told to do the None task then query the default task if (task == None): task = self.configuration.cmd pkgs_to_build = self.checkPackages(pkgs_to_build) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) runlist = [] for k in pkgs_to_build: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % task]) taskdata.add_unresolved(localdata, self.status) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) rq.prepare_runqueue() seen_fnids = [] depend_tree = {} depend_tree["depends"] = {} depend_tree["tdepends"] = {} depend_tree["pn"] = {} depend_tree["rdepends-pn"] = {} depend_tree["packages"] = {} depend_tree["rdepends-pkg"] = {} depend_tree["rrecs-pkg"] = {} for task in range(len(rq.runq_fnid)): taskname = rq.runq_task[task] fnid = rq.runq_fnid[task] fn = taskdata.fn_index[fnid] pn = self.status.pkg_fn[fn] version = "%s:%s-%s" % self.status.pkg_pepvpr[fn] if pn not in depend_tree["pn"]: depend_tree["pn"][pn] = {} depend_tree["pn"][pn]["filename"] = fn depend_tree["pn"][pn]["version"] = version for dep in rq.runq_depends[task]: depfn = taskdata.fn_index[rq.runq_fnid[dep]] deppn = self.status.pkg_fn[depfn] dotname = "%s.%s" % (pn, rq.runq_task[task]) if not dotname in depend_tree["tdepends"]: depend_tree["tdepends"][dotname] = [] depend_tree["tdepends"][dotname].append("%s.%s" % (deppn, rq.runq_task[dep])) if fnid not in seen_fnids: seen_fnids.append(fnid) packages = [] depend_tree["depends"][pn] = [] for dep in taskdata.depids[fnid]: depend_tree["depends"][pn].append(taskdata.build_names_index[dep]) depend_tree["rdepends-pn"][pn] = [] for rdep in taskdata.rdepids[fnid]: depend_tree["rdepends-pn"][pn].append(taskdata.run_names_index[rdep]) rdepends = self.status.rundeps[fn] for package in rdepends: depend_tree["rdepends-pkg"][package] = [] for rdepend in rdepends[package]: depend_tree["rdepends-pkg"][package].append(rdepend) packages.append(package) rrecs = self.status.runrecs[fn] for package in rrecs: depend_tree["rrecs-pkg"][package] = [] for rdepend in rrecs[package]: depend_tree["rrecs-pkg"][package].append(rdepend) if not package in packages: packages.append(package) for package in packages: if package not in depend_tree["packages"]: depend_tree["packages"][package] = {} depend_tree["packages"][package]["pn"] = pn depend_tree["packages"][package]["filename"] = fn depend_tree["packages"][package]["version"] = version return depend_tree
return retval self.buildSetVars() buildname = bb.data.getVar("BUILDNAME", self.configuration.data) bb.event.fire(bb.event.BuildStarted(buildname, targets, self.configuration.event_data)) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) bb.data.expandKeys(localdata) taskdata = bb.taskdata.TaskData(self.configuration.abort) runlist = [] for k in targets: taskdata.add_provider(localdata, self.status, k) runlist.append([k, "do_%s" % task]) taskdata.add_unresolved(localdata, self.status) rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) self.cookerIdle = False self.server.register_idle_function(buildTargetsIdle, rq) def updateCache(self): self.parseConfiguration () if self.cookerState == cookerParsed: return # Import Psyco if available and not disabled