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 <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
f551e67fa7
commit
818a36590a
|
@ -286,6 +286,42 @@ def variant2virtual(realfn, variant):
|
||||||
return "multiconfig:" + elems[1] + ":" + realfn
|
return "multiconfig:" + elems[1] + ":" + realfn
|
||||||
return "virtual:" + variant + ":" + 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):
|
class NoCache(object):
|
||||||
|
|
||||||
|
@ -312,54 +348,23 @@ class NoCache(object):
|
||||||
if virtonly:
|
if virtonly:
|
||||||
(bbfile, virtual, mc) = virtualfn2realfn(bbfile)
|
(bbfile, virtual, mc) = virtualfn2realfn(bbfile)
|
||||||
bb_data = self.databuilder.mcdata[mc].createCopy()
|
bb_data = self.databuilder.mcdata[mc].createCopy()
|
||||||
bb_data.setVar("__BBMULTICONFIG", mc)
|
|
||||||
bb_data.setVar("__ONLYFINALISE", virtual or "default")
|
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
|
return datastores
|
||||||
|
|
||||||
bb_data = self.data.createCopy()
|
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:
|
for mc in self.databuilder.mcdata:
|
||||||
if not mc:
|
if not mc:
|
||||||
continue
|
continue
|
||||||
bb_data = self.databuilder.mcdata[mc].createCopy()
|
bb_data = self.databuilder.mcdata[mc].createCopy()
|
||||||
bb_data.setVar("__BBMULTICONFIG", mc)
|
newstores = parse_recipe(bb_data, bbfile, appends, mc)
|
||||||
newstores = self._load_bbfile(bb_data, bbfile, appends)
|
|
||||||
for ns in newstores:
|
for ns in newstores:
|
||||||
datastores["multiconfig:%s:%s" % (mc, ns)] = newstores[ns]
|
datastores["multiconfig:%s:%s" % (mc, ns)] = newstores[ns]
|
||||||
|
|
||||||
return datastores
|
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):
|
class Cache(NoCache):
|
||||||
"""
|
"""
|
||||||
BitBake Cache implementation
|
BitBake Cache implementation
|
||||||
|
|
Loading…
Reference in New Issue