From 818a36590a74ad6c461e3af538f405be6a9ef6f0 Mon Sep 17 00:00:00 2001 From: Paul Eggleton Date: Tue, 30 Aug 2016 20:45:09 +1200 Subject: [PATCH] bitbake: cache: allow parsing a recipe with a custom config datastore To accommodate the OpenEmbedded layer index recipe parsing, we have to have the ability to pass in a custom config datastore since it constructs a synthetic one. To make this possible after the multi-config changes, rename the internal _load_bbfile() function to parse_recipe(), make it a function at the module level (since it doesn't actually need to access any members of the class or instance) and move setting __BBMULTICONFIG inside it since other code will expect that to be set. Part of the fix for [YOCTO #10192]. (Bitbake rev: 5b3fedfe0822dd7effa4b6d5e96eaf42669a71df) Signed-off-by: Paul Eggleton Signed-off-by: Richard Purdie --- bitbake/lib/bb/cache.py | 73 ++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index 0d5a034b53..dd9cfdfacf 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py @@ -286,6 +286,42 @@ def variant2virtual(realfn, variant): return "multiconfig:" + elems[1] + ":" + realfn return "virtual:" + variant + ":" + realfn +def parse_recipe(bb_data, bbfile, appends, mc=''): + """ + Parse a recipe + """ + + chdir_back = False + + bb_data.setVar("__BBMULTICONFIG", mc) + + # expand tmpdir to include this topdir + bb_data.setVar('TMPDIR', bb_data.getVar('TMPDIR', True) or "") + bbfile_loc = os.path.abspath(os.path.dirname(bbfile)) + oldpath = os.path.abspath(os.getcwd()) + bb.parse.cached_mtime_noerror(bbfile_loc) + + # The ConfHandler first looks if there is a TOPDIR and if not + # then it would call getcwd(). + # Previously, we chdir()ed to bbfile_loc, called the handler + # and finally chdir()ed back, a couple of thousand times. We now + # just fill in TOPDIR to point to bbfile_loc if there is no TOPDIR yet. + if not bb_data.getVar('TOPDIR', False): + chdir_back = True + bb_data.setVar('TOPDIR', bbfile_loc) + try: + if appends: + bb_data.setVar('__BBAPPEND', " ".join(appends)) + bb_data = bb.parse.handle(bbfile, bb_data) + if chdir_back: + os.chdir(oldpath) + return bb_data + except: + if chdir_back: + os.chdir(oldpath) + raise + + class NoCache(object): @@ -312,54 +348,23 @@ class NoCache(object): if virtonly: (bbfile, virtual, mc) = virtualfn2realfn(bbfile) bb_data = self.databuilder.mcdata[mc].createCopy() - bb_data.setVar("__BBMULTICONFIG", mc) bb_data.setVar("__ONLYFINALISE", virtual or "default") - datastores = self._load_bbfile(bb_data, bbfile, appends) + datastores = parse_recipe(bb_data, bbfile, appends, mc) return datastores bb_data = self.data.createCopy() - datastores = self._load_bbfile(bb_data, bbfile, appends) + datastores = parse_recipe(bb_data, bbfile, appends) for mc in self.databuilder.mcdata: if not mc: continue bb_data = self.databuilder.mcdata[mc].createCopy() - bb_data.setVar("__BBMULTICONFIG", mc) - newstores = self._load_bbfile(bb_data, bbfile, appends) + newstores = parse_recipe(bb_data, bbfile, appends, mc) for ns in newstores: datastores["multiconfig:%s:%s" % (mc, ns)] = newstores[ns] return datastores - def _load_bbfile(self, bb_data, bbfile, appends): - chdir_back = False - - # expand tmpdir to include this topdir - bb_data.setVar('TMPDIR', bb_data.getVar('TMPDIR', True) or "") - bbfile_loc = os.path.abspath(os.path.dirname(bbfile)) - oldpath = os.path.abspath(os.getcwd()) - bb.parse.cached_mtime_noerror(bbfile_loc) - - # The ConfHandler first looks if there is a TOPDIR and if not - # then it would call getcwd(). - # Previously, we chdir()ed to bbfile_loc, called the handler - # and finally chdir()ed back, a couple of thousand times. We now - # just fill in TOPDIR to point to bbfile_loc if there is no TOPDIR yet. - if not bb_data.getVar('TOPDIR', False): - chdir_back = True - bb_data.setVar('TOPDIR', bbfile_loc) - try: - if appends: - bb_data.setVar('__BBAPPEND', " ".join(appends)) - bb_data = bb.parse.handle(bbfile, bb_data) - if chdir_back: - os.chdir(oldpath) - return bb_data - except: - if chdir_back: - os.chdir(oldpath) - raise - class Cache(NoCache): """ BitBake Cache implementation