From 76a281c870621f5b5608d098a70504c6069ccd11 Mon Sep 17 00:00:00 2001 From: Paul Eggleton Date: Sat, 23 Jan 2016 00:52:21 +1300 Subject: bitbake: taskdata: add the ability to access world targets list In certain circumstances it can be useful to get access to the world targets list from a recipe in order to add dependencies on some or all of the items in it. If a special function, 'calculate_extra_depends' is defined in the recipe, and the recipe is to be built, then call it at the right point before we calculate which tasks should be run. The function can append items to the "deps" list in order to add dependencies. This is not as tidy a solution as I would have liked, but it does at least do the job. As part of this change, the buildWorldTargets function was moved to bb.providers to make it possible to call from taskdata. Part of the implementation of [YOCTO #8600]. (Bitbake rev: aba0dce57c889495ec5c13919991a060aeff65d2) Signed-off-by: Paul Eggleton Signed-off-by: Richard Purdie --- bitbake/lib/bb/cache.py | 5 ++++- bitbake/lib/bb/cooker.py | 24 +----------------------- bitbake/lib/bb/providers.py | 26 ++++++++++++++++++++++++++ bitbake/lib/bb/taskdata.py | 17 +++++++++++++++++ 4 files changed, 48 insertions(+), 24 deletions(-) diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index 83f2ff1561..8485eb467a 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py @@ -43,7 +43,7 @@ except ImportError: logger.info("Importing cPickle failed. " "Falling back to a very slow implementation.") -__cache_version__ = "148" +__cache_version__ = "149" def getCacheFile(path, filename, data_hash): return os.path.join(path, filename + "." + data_hash) @@ -144,6 +144,7 @@ class CoreRecipeInfo(RecipeInfoCommon): self.fakerootenv = self.getvar('FAKEROOTENV', metadata) self.fakerootdirs = self.getvar('FAKEROOTDIRS', metadata) self.fakerootnoenv = self.getvar('FAKEROOTNOENV', metadata) + self.extradepsfunc = self.getvar('calculate_extra_depends', metadata) @classmethod def init_cacheData(cls, cachedata): @@ -179,6 +180,7 @@ class CoreRecipeInfo(RecipeInfoCommon): cachedata.fakerootenv = {} cachedata.fakerootnoenv = {} cachedata.fakerootdirs = {} + cachedata.extradepsfunc = {} def add_cacheData(self, cachedata, fn): cachedata.task_deps[fn] = self.task_deps @@ -246,6 +248,7 @@ class CoreRecipeInfo(RecipeInfoCommon): cachedata.fakerootenv[fn] = self.fakerootenv cachedata.fakerootnoenv[fn] = self.fakerootnoenv cachedata.fakerootdirs[fn] = self.fakerootdirs + cachedata.extradepsfunc[fn] = self.extradepsfunc diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 74190ec9a7..9c58d95006 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -1109,28 +1109,6 @@ class BBCooker: tree = self.generatePkgDepTreeData(pkgs, 'build') bb.event.fire(bb.event.TargetsTreeGenerated(tree), self.data) - def buildWorldTargetList(self): - """ - Build package list for "bitbake world" - """ - parselog.debug(1, "collating packages for \"world\"") - for f in self.recipecache.possible_world: - terminal = True - pn = self.recipecache.pkg_fn[f] - - for p in self.recipecache.pn_provides[pn]: - if p.startswith('virtual/'): - parselog.debug(2, "World build skipping %s due to %s provider starting with virtual/", f, p) - terminal = False - break - for pf in self.recipecache.providers[p]: - if self.recipecache.pkg_fn[pf] != pn: - parselog.debug(2, "World build skipping %s due to both us and %s providing %s", f, pf, p) - terminal = False - break - if terminal: - self.recipecache.world_target.add(pn) - def interactiveMode( self ): """Drop off into a shell""" try: @@ -1591,7 +1569,7 @@ class BBCooker: parselog.warn("Explicit target \"%s\" is in ASSUME_PROVIDED, ignoring" % pkg) if 'world' in pkgs_to_build: - self.buildWorldTargetList() + bb.providers.buildWorldTargetList(self.recipecache) pkgs_to_build.remove('world') for t in self.recipecache.world_target: pkgs_to_build.append(t) diff --git a/bitbake/lib/bb/providers.py b/bitbake/lib/bb/providers.py index 637e1fab96..68c8d592d2 100644 --- a/bitbake/lib/bb/providers.py +++ b/bitbake/lib/bb/providers.py @@ -379,3 +379,29 @@ def getRuntimeProviders(dataCache, rdepend): logger.debug(1, "Assuming %s is a dynamic package, but it may not exist" % rdepend) return rproviders + + +def buildWorldTargetList(dataCache): + """ + Build package list for "bitbake world" + """ + if dataCache.world_target: + return + + logger.debug(1, "collating packages for \"world\"") + for f in dataCache.possible_world: + terminal = True + pn = dataCache.pkg_fn[f] + + for p in dataCache.pn_provides[pn]: + if p.startswith('virtual/'): + logger.debug(2, "World build skipping %s due to %s provider starting with virtual/", f, p) + terminal = False + break + for pf in dataCache.providers[p]: + if dataCache.pkg_fn[pf] != pn: + logger.debug(2, "World build skipping %s due to both us and %s providing %s", f, pf, p) + terminal = False + break + if terminal: + dataCache.world_target.add(pn) diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py index 39c899ebb7..6e4d149e5a 100644 --- a/bitbake/lib/bb/taskdata.py +++ b/bitbake/lib/bb/taskdata.py @@ -172,6 +172,8 @@ class TaskData: if fnid in self.tasks_fnid: return + self.add_extra_deps(fn, dataCache) + for task in task_deps['tasks']: # Work out task dependencies @@ -242,6 +244,21 @@ class TaskData: self.fail_fnid(fnid) return + def add_extra_deps(self, fn, dataCache): + func = dataCache.extradepsfunc.get(fn, None) + if func: + bb.providers.buildWorldTargetList(dataCache) + pn = dataCache.pkg_fn[fn] + params = {'deps': dataCache.deps[fn], + 'world_target': dataCache.world_target, + 'pkg_pn': dataCache.pkg_pn, + 'self_pn': pn} + funcname = '_%s_calculate_extra_depends' % pn.replace('-', '_') + paramlist = ','.join(params.keys()) + func = 'def %s(%s):\n%s\n\n%s(%s)' % (funcname, paramlist, func, funcname, paramlist) + bb.utils.better_exec(func, params) + + def have_build_target(self, target): """ Have we a build target matching this name? -- cgit v1.2.3-54-g00ecf