diff options
author | Richard Purdie <rpurdie@linux.intel.com> | 2009-06-19 10:30:15 +0000 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2009-06-19 10:30:15 +0000 |
commit | c3d58e612592e8128f946cb94bb25d85ad9d171e (patch) | |
tree | f24a6fc81576575765ef73b2cac4bdea2147084d | |
parent | 45acd91e3f7b5f195c0921f1d7a3beb700525400 (diff) | |
download | bitbake-c3d58e612592e8128f946cb94bb25d85ad9d171e.tar.gz |
Merge the BBCLASSEXTEND code from Poky. This allows once recipe to provide mutliple targets (e.g. -native and -sdk) and has been discussed on the OE mailing list
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | lib/bb/cache.py | 70 | ||||
-rw-r--r-- | lib/bb/cooker.py | 12 | ||||
-rw-r--r-- | lib/bb/parse/parse_py/BBHandler.py | 17 | ||||
-rw-r--r-- | lib/bb/shell.py | 2 |
5 files changed, 82 insertions, 20 deletions
@@ -177,6 +177,7 @@ Changes in Bitbake 1.9.x: - Make sure allowed variables inherited from the environment are exported again (from Poky) - When running a stage task in bbshell, run populate_staging, not the stage task (from Poky) - Fix + character escaping from PACKAGES_DYNAMIC (thanks Otavio Salvador) + - Addition of BBCLASSEXTEND support for allowing one recipe to provide multiple targets (from Poky) Changes in Bitbake 1.8.0: - Release 1.7.x as a stable series diff --git a/lib/bb/cache.py b/lib/bb/cache.py index f9a20c6b2..272619386 100644 --- a/lib/bb/cache.py +++ b/lib/bb/cache.py @@ -62,7 +62,7 @@ class Cache: self.has_cache = True self.cachefile = os.path.join(self.cachedir,"bb_cache.dat") - + bb.msg.debug(1, bb.msg.domain.Cache, "Using cache in '%s'" % self.cachedir) try: os.stat( self.cachedir ) @@ -124,30 +124,59 @@ class Cache: self.depends_cache[fn][var] = 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. Will be followed by calls to self.getVar which aren't cached but can be fulfilled from self.data. """ - self.data_fn = fn + self.data_fn = virtualfn self.data = data # Make sure __depends makes the depends_cache - self.getVar("__depends", fn, True) - self.depends_cache[fn]["CACHETIMESTAMP"] = bb.parse.cached_mtime(fn) + self.getVar("__depends", virtualfn, True) + self.depends_cache[virtualfn]["CACHETIMESTAMP"] = bb.parse.cached_mtime(fn) + + 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, fn, cfgData): + def loadDataFull(self, virtualfn, cfgData): """ Return a complete set of data for fn. 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_data, skipped = self.load_bbfile(fn, cfgData) + if isinstance(bb_data, dict): + return bb_data[cls] + return bb_data - def loadData(self, fn, cfgData): + def loadData(self, fn, cfgData, cacheData): """ Load a subset of data for fn. If the cached data is valid we do nothing, @@ -160,12 +189,36 @@ class Cache: if self.cacheValid(fn): if "SKIPPED" in self.depends_cache[fn]: 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 bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s" % fn) 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 def cacheValid(self, fn): @@ -383,6 +436,7 @@ class Cache: # Touch this to make sure its in the cache self.getVar('__BB_DONT_CACHE', file_name, True) + self.getVar('BBCLASSEXTEND', file_name, True) def load_bbfile( self, bbfile , config): """ diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py index 7efff5a09..b12dc13b6 100644 --- a/lib/bb/cooker.py +++ b/lib/bb/cooker.py @@ -627,13 +627,10 @@ class BBCooker: fn = self.matchFile(buildfile) 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.loadData(fn, self.configuration.data) - - # Parse the loaded cache data 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 item = self.bb_cache.getVar('PN', fn, True) @@ -873,7 +870,7 @@ class BBCooker: # read a file's metadata 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: skipped += 1 bb.msg.debug(2, bb.msg.domain.Collection, "skipping %s" % f) @@ -881,7 +878,6 @@ class BBCooker: continue elif fromCache: cached += 1 else: parsed += 1 - deps = None # Disabled by RP as was no longer functional # allow metadata files to add items to BBFILES @@ -894,8 +890,6 @@ class BBCooker: # aof = os.path.join(os.path.dirname(f),aof) # files.append(aof) - self.bb_cache.handle_data(f, self.status) - except IOError, e: error += 1 self.bb_cache.remove(f) diff --git a/lib/bb/parse/parse_py/BBHandler.py b/lib/bb/parse/parse_py/BBHandler.py index 453a8956e..4f98bf9c3 100644 --- a/lib/bb/parse/parse_py/BBHandler.py +++ b/lib/bb/parse/parse_py/BBHandler.py @@ -175,8 +175,21 @@ def handle(fn, d, include = 0): classes.remove(__classname__) else: 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) if oldfile: bb.data.setVar("FILE", oldfile, d) diff --git a/lib/bb/shell.py b/lib/bb/shell.py index 51dae8457..2ab855b64 100644 --- a/lib/bb/shell.py +++ b/lib/bb/shell.py @@ -268,7 +268,7 @@ class BitBakeShellCommands: print "SHELL: Parsing '%s'" % bbfile parse.update_mtime( 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() if False: #fromCache: print "SHELL: File has not been updated, not reparsing" |