bitbake: Add in code to support the BBCLASSEXTEND variable. Virtual native/sdk recipes then become possible

This commit is contained in:
Richard Purdie 2009-01-01 14:43:54 +00:00
parent 28fd9dadbd
commit ade351e2f4
6 changed files with 85 additions and 24 deletions

View File

@ -453,6 +453,8 @@ def main():
except bb.parse.ParseError: except bb.parse.ParseError:
bb.fatal( "Unable to parse %s" % config_file ) bb.fatal( "Unable to parse %s" % config_file )
if isinstance(documentation, dict):
documentation = documentation[""]
# Assuming we've the file loaded now, we will initialize the 'tree' # Assuming we've the file loaded now, we will initialize the 'tree'
doc = Documentation() doc = Documentation()

View File

@ -628,13 +628,10 @@ class BBCooker:
fn = self.matchFile(buildfile) fn = self.matchFile(buildfile)
self.buildSetVars() self.buildSetVars()
# Load data into the cache for fn # Load data into the cache for fn and parse the loaded cache data
self.bb_cache = bb.cache.init(self) 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.status = bb.cache.CacheData()
self.bb_cache.handle_data(fn, self.status) self.bb_cache.loadData(fn, self.configuration.data, self.status)
# Tweak some variables # Tweak some variables
item = self.bb_cache.getVar('PN', fn, True) item = self.bb_cache.getVar('PN', fn, True)

View File

@ -63,7 +63,7 @@ class Cache:
self.has_cache = True self.has_cache = True
self.cachefile = os.path.join(self.cachedir,"bb_cache.dat") self.cachefile = os.path.join(self.cachedir,"bb_cache.dat")
bb.msg.debug(1, bb.msg.domain.Cache, "Using cache in '%s'" % self.cachedir) bb.msg.debug(1, bb.msg.domain.Cache, "Using cache in '%s'" % self.cachedir)
try: try:
os.stat( self.cachedir ) os.stat( self.cachedir )
@ -125,30 +125,59 @@ class Cache:
self.depends_cache[fn][var] = result self.depends_cache[fn][var] = result
return result return result
def setData(self, fn, data): def setData(self, virtualfn, fn, data):
""" """
Called to prime bb_cache ready to learn which variables to cache. Called to prime bb_cache ready to learn which variables to cache.
Will be followed by calls to self.getVar which aren't cached Will be followed by calls to self.getVar which aren't cached
but can be fulfilled from self.data. but can be fulfilled from self.data.
""" """
self.data_fn = fn self.data_fn = virtualfn
self.data = data self.data = data
# Make sure __depends makes the depends_cache # Make sure __depends makes the depends_cache
self.getVar("__depends", fn, True) self.getVar("__depends", virtualfn, True)
self.depends_cache[fn]["CACHETIMESTAMP"] = bb.parse.cached_mtime(fn) self.depends_cache[virtualfn]["CACHETIMESTAMP"] = bb.parse.cached_mtime(fn)
def loadDataFull(self, fn, cfgData): def virtualfn2realfn(self, virtualfn):
"""
Convert a virtual file name to a real one + the associated subclass keyword
"""
fn = virtualfn
cls = ""
if virtualfn.startswith('virtual:'):
cls = virtualfn.split(':', 2)[1]
fn = virtualfn.replace('virtual:' + cls + ':', '')
#bb.msg.debug(2, bb.msg.domain.Cache, "virtualfn2realfn %s to %s %s" % (virtualfn, fn, cls))
return (fn, cls)
def realfn2virtual(self, realfn, cls):
"""
Convert a real filename + the associated subclass keyword to a virtual filename
"""
if cls == "":
#bb.msg.debug(2, bb.msg.domain.Cache, "realfn2virtual %s and '%s' to %s" % (realfn, cls, realfn))
return realfn
#bb.msg.debug(2, bb.msg.domain.Cache, "realfn2virtual %s and %s to %s" % (realfn, cls, "virtual:" + cls + ":" + realfn))
return "virtual:" + cls + ":" + realfn
def loadDataFull(self, virtualfn, cfgData):
""" """
Return a complete set of data for fn. Return a complete set of data for fn.
To do this, we need to parse the file. To do this, we need to parse the file.
""" """
(fn, cls) = self.virtualfn2realfn(virtualfn)
bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s (full)" % fn) bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s (full)" % fn)
bb_data, skipped = self.load_bbfile(fn, cfgData) bb_data, skipped = self.load_bbfile(fn, cfgData)
if isinstance(bb_data, dict):
return bb_data[cls]
return bb_data return bb_data
def loadData(self, fn, cfgData): def loadData(self, fn, cfgData, cacheData):
""" """
Load a subset of data for fn. Load a subset of data for fn.
If the cached data is valid we do nothing, If the cached data is valid we do nothing,
@ -161,12 +190,36 @@ class Cache:
if self.cacheValid(fn): if self.cacheValid(fn):
if "SKIPPED" in self.depends_cache[fn]: if "SKIPPED" in self.depends_cache[fn]:
return True, True return True, True
self.handle_data(fn, cacheData)
multi = self.getVar('BBCLASSEXTEND', fn, True)
if multi:
for cls in multi.split():
virtualfn = self.realfn2virtual(fn, cls)
# Pretend we're clean so getVar works
self.clean[virtualfn] = ""
self.handle_data(virtualfn, cacheData)
return True, False return True, False
bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s" % fn) bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s" % fn)
bb_data, skipped = self.load_bbfile(fn, cfgData) bb_data, skipped = self.load_bbfile(fn, cfgData)
self.setData(fn, bb_data)
if skipped:
if isinstance(bb_data, dict):
self.setData(fn, fn, bb_data[""])
else:
self.setData(fn, fn, bb_data)
return False, skipped
if isinstance(bb_data, dict):
for data in bb_data:
virtualfn = self.realfn2virtual(fn, data)
self.setData(virtualfn, fn, bb_data[data])
self.handle_data(virtualfn, cacheData)
return False, skipped
self.setData(fn, fn, bb_data)
self.handle_data(fn, cacheData)
return False, skipped return False, skipped
def cacheValid(self, fn): def cacheValid(self, fn):
@ -384,6 +437,7 @@ class Cache:
# Touch this to make sure its in the cache # Touch this to make sure its in the cache
self.getVar('__BB_DONT_CACHE', file_name, True) self.getVar('__BB_DONT_CACHE', file_name, True)
self.getVar('BBCLASSEXTEND', file_name, True)
def load_bbfile( self, bbfile , config): def load_bbfile( self, bbfile , config):
""" """

View File

@ -475,13 +475,10 @@ class BBCooker:
if not fn: if not fn:
return False return False
# Load data into the cache for fn # Load data into the cache for fn and parse the loaded cache data
self.bb_cache = bb.cache.init(self) 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.status = bb.cache.CacheData()
self.bb_cache.handle_data(fn, self.status) self.bb_cache.loadData(fn, self.configuration.data, self.status)
# Tweak some variables # Tweak some variables
item = self.bb_cache.getVar('PN', fn, True) item = self.bb_cache.getVar('PN', fn, True)
@ -723,7 +720,7 @@ class BBCooker:
# read a file's metadata # read a file's metadata
try: try:
fromCache, skip = self.bb_cache.loadData(f, self.configuration.data) fromCache, skip = self.bb_cache.loadData(f, self.configuration.data, self.status)
if skip: if skip:
skipped += 1 skipped += 1
bb.msg.debug(2, bb.msg.domain.Collection, "skipping %s" % f) bb.msg.debug(2, bb.msg.domain.Collection, "skipping %s" % f)
@ -731,7 +728,6 @@ class BBCooker:
continue continue
elif fromCache: cached += 1 elif fromCache: cached += 1
else: parsed += 1 else: parsed += 1
deps = None
# Disabled by RP as was no longer functional # Disabled by RP as was no longer functional
# allow metadata files to add items to BBFILES # allow metadata files to add items to BBFILES
@ -744,8 +740,6 @@ class BBCooker:
# aof = os.path.join(os.path.dirname(f),aof) # aof = os.path.join(os.path.dirname(f),aof)
# files.append(aof) # files.append(aof)
self.bb_cache.handle_data(f, self.status)
# now inform the caller # now inform the caller
if progressCallback is not None: if progressCallback is not None:
progressCallback( i + 1, len( filelist ), f, fromCache ) progressCallback( i + 1, len( filelist ), f, fromCache )

View File

@ -181,7 +181,21 @@ def handle(fn, d, include = 0):
classes.remove(__classname__) classes.remove(__classname__)
else: else:
if include == 0: if include == 0:
finalise(fn, d) multi = data.getVar('BBCLASSEXTEND', d, 1)
if multi:
based = bb.data.createCopy(d)
finalise(fn, based)
darray = {"": based}
for cls in multi.split():
pn = data.getVar('PN', d, True)
based = bb.data.createCopy(d)
data.setVar('PN', pn + '-' + cls, based)
inherit([cls], based)
finalise(fn, based)
darray[cls] = based
return darray
else:
finalise(fn, d)
bbpath.pop(0) bbpath.pop(0)
if oldfile: if oldfile:
bb.data.setVar("FILE", oldfile, d) bb.data.setVar("FILE", oldfile, d)

View File

@ -276,7 +276,7 @@ class BitBakeShellCommands:
print "SHELL: Parsing '%s'" % bbfile print "SHELL: Parsing '%s'" % bbfile
parse.update_mtime( bbfile ) parse.update_mtime( bbfile )
cooker.bb_cache.cacheValidUpdate(bbfile) cooker.bb_cache.cacheValidUpdate(bbfile)
fromCache = cooker.bb_cache.loadData(bbfile, cooker.configuration.data) fromCache = cooker.bb_cache.loadData(bbfile, cooker.configuration.data, cooker.status)
cooker.bb_cache.sync() cooker.bb_cache.sync()
if False: #fromCache: if False: #fromCache:
print "SHELL: File has not been updated, not reparsing" print "SHELL: File has not been updated, not reparsing"