]> code.ossystems Code Review - openembedded-core.git/commitdiff
bitbake: Introduce stamp-extra-info task flag into stamp filenames
authorDongxiao Xu <dongxiao.xu@intel.com>
Tue, 18 Jan 2011 08:18:18 +0000 (16:18 +0800)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Tue, 18 Jan 2011 12:50:04 +0000 (12:50 +0000)
For certain tasks, we need additional information in build stamp file
other than the task name and file name. stamp-extra-info is introduced as
a task flag which is appended to the stamp file name.

[Code simplifcations/tweaks from Richard]

Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
bitbake/lib/bb/build.py
bitbake/lib/bb/cache.py
bitbake/lib/bb/runqueue.py
bitbake/lib/bb/siggen.py

index 722639f3bb086960ae112487ab7b622b71fcfd9d..e723c7ea85f1f2a974718d62fdb1b7430a2063a0 100644 (file)
@@ -386,14 +386,16 @@ def stamp_internal(taskname, d, file_name):
     """
     if file_name:
         stamp = d.stamp[file_name]
+        extrainfo = d.stamp_extrainfo[file_name].get(taskname) or ""
     else:
         stamp = d.getVar('STAMP', True)
         file_name = d.getVar('BB_FILENAME', True)
+        extrainfo = d.getVarFlag(taskname, 'stamp-extra-info', True) or ""
 
     if not stamp:
         return
 
-    stamp = bb.parse.siggen.stampfile(stamp, file_name, taskname)
+    stamp = bb.parse.siggen.stampfile(stamp, file_name, taskname, extrainfo)
 
     bb.utils.mkdirhier(os.path.dirname(stamp))
 
@@ -420,8 +422,12 @@ def del_stamp(task, d, file_name = None):
     stamp = stamp_internal(task, d, file_name)
     bb.utils.remove(stamp)
 
-def stampfile(taskname, d):
-    return stamp_internal(taskname, d, None)
+def stampfile(taskname, d, file_name = None):
+    """
+    Return the stamp for a given task
+    (d can be a data dict or dataCache)
+    """
+    return stamp_internal(taskname, d, file_name)
 
 def add_tasks(tasklist, d):
     task_deps = data.getVar('_task_deps', d)
index 9a2e2d5298feac87a6191c3dce9db4cf556178ef..262f574f519dcb2bc968e041eb4796e5938c0552 100644 (file)
@@ -43,7 +43,7 @@ except ImportError:
     logger.info("Importing cPickle failed. "
                 "Falling back to a very slow implementation.")
 
-__cache_version__ = "134"
+__cache_version__ = "135"
 
 recipe_fields = (
     'pn',
@@ -55,6 +55,7 @@ recipe_fields = (
     'provides',
     'task_deps',
     'stamp',
+    'stamp_extrainfo',
     'broken',
     'not_world',
     'skipped',
@@ -101,6 +102,11 @@ class RecipeInfo(namedtuple('RecipeInfo', recipe_fields)):
         return dict((task, cls.getvar("%s_task-%s" % (var, task), metadata))
                     for task in tasks)
 
+    @classmethod
+    def flaglist(cls, flag, varlist, metadata):
+        return dict((var, metadata.getVarFlag(flag, var, True))
+                    for var in varlist)
+
     @classmethod
     def getvar(cls, var, metadata):
         return metadata.getVar(var, True) or ''
@@ -148,6 +154,7 @@ class RecipeInfo(namedtuple('RecipeInfo', recipe_fields)):
             broken           = cls.getvar('BROKEN', metadata),
             not_world        = cls.getvar('EXCLUDE_FROM_WORLD', metadata),
             stamp            = cls.getvar('STAMP', metadata),
+            stamp_extrainfo  = cls.flaglist('stamp-extra-info', tasks, metadata),
             packages_dynamic = cls.listvar('PACKAGES_DYNAMIC', metadata),
             depends          = cls.depvar('DEPENDS', metadata),
             provides         = cls.depvar('PROVIDES', metadata),
@@ -562,6 +569,7 @@ class CacheData(object):
         self.task_queues = {}
         self.task_deps = {}
         self.stamp = {}
+        self.stamp_extrainfo = {}
         self.preferred = {}
         self.tasks = {}
         self.basetaskhash = {}
@@ -583,6 +591,7 @@ class CacheData(object):
         self.pkg_pepvpr[fn] = (info.pe, info.pv, info.pr)
         self.pkg_dp[fn] = info.defaultpref
         self.stamp[fn] = info.stamp
+        self.stamp_extrainfo[fn] = info.stamp_extrainfo
 
         provides = [info.pn]
         for provide in info.provides:
index a46527505f6bf16038b42a7df3f6fb8145a7e1e9..b9d89ec0820762107581b93afb44789ce6689763 100644 (file)
@@ -794,7 +794,7 @@ class RunQueue:
                 continue
             fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]]
             taskname = self.rqdata.runq_task[task]
-            stampfile = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn], fn, taskname)
+            stampfile = bb.build.stampfile(taskname, self.rqdata.dataCache, fn)
             # If the stamp is missing its not current
             if not os.access(stampfile, os.F_OK):
                 del unchecked[task]
@@ -815,7 +815,7 @@ class RunQueue:
                 if task in unchecked:
                     fn = self.taskData.fn_index[self.rqdata.runq_fnid[task]]
                     taskname = self.rqdata.runq_task[task]
-                    stampfile = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn], fn, taskname)
+                    stampfile = bb.build.stampfile(taskname, self.rqdata.dataCache, fn)
                     iscurrent = True
 
                     t1 = os.stat(stampfile)[stat.ST_MTIME]
@@ -823,7 +823,7 @@ class RunQueue:
                         if iscurrent:
                             fn2 = self.taskData.fn_index[self.rqdata.runq_fnid[dep]]
                             taskname2 = self.rqdata.runq_task[dep]
-                            stampfile2 = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn2], fn2, taskname2)
+                            stampfile2 = bb.build.stampfile(taskname2, self.rqdata.dataCache, fn2)
                             if fn == fn2 or (fulldeptree and fn2 not in stampwhitelist):
                                 if dep in notcurrent:
                                     iscurrent = False
@@ -875,7 +875,7 @@ class RunQueue:
         if taskname is None:
             taskname = self.rqdata.runq_task[task]
 
-        stampfile = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn], fn, taskname)
+        stampfile = bb.build.stampfile(taskname, self.rqdata.dataCache, fn)
 
         # If the stamp is missing its not current
         if not os.access(stampfile, os.F_OK):
@@ -896,8 +896,8 @@ class RunQueue:
             if iscurrent:
                 fn2 = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[dep]]
                 taskname2 = self.rqdata.runq_task[dep]
-                stampfile2 = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn2], fn2, taskname2)
-                stampfile3 = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn2], fn2, taskname2 + "_setscene")
+                stampfile2 = bb.build.stampfile(taskname2, self.rqdata.dataCache, fn2)
+                stampfile3 = bb.build.stampfile(taskname2 + "_setscene", self.rqdata.dataCache, fn2)
                 t2 = get_timestamp(stampfile2)
                 t3 = get_timestamp(stampfile3)
                 if t3 and t3 > t2:
index 010c2cab26cffba431bf6480941ae1287c58b201..2d28ecfc2d4c4794fc56c88efd1da436df2bc940 100644 (file)
@@ -42,8 +42,8 @@ class SignatureGenerator(object):
     def set_taskdata(self, hashes, deps):
         return
 
-    def stampfile(self, stampbase, file_name, taskname):
-        return "%s.%s" % (stampbase, taskname)
+    def stampfile(self, stampbase, file_name, taskname, extrainfo):
+        return ("%s.%s.%s" % (stampbase, taskname, extrainfo)).rstrip('.')
 
 class SignatureGeneratorBasic(SignatureGenerator):
     """
@@ -196,13 +196,13 @@ class SignatureGeneratorBasic(SignatureGenerator):
 class SignatureGeneratorBasicHash(SignatureGeneratorBasic):
     name = "basichash"
 
-    def stampfile(self, stampbase, fn, taskname):
+    def stampfile(self, stampbase, fn, taskname, extrainfo):
         if taskname != "do_setscene" and taskname.endswith("_setscene"):
             k = fn + "." + taskname[:-9]
         else:
             k = fn + "." + taskname
         h = self.taskhash[k]
-        return "%s.%s.%s" % (stampbase, taskname, h)
+        return ("%s.%s.%s.%s" % (stampbase, taskname, h, extrainfo)).rstrip('.')
 
 def dump_this_task(outfile, d):
     fn = d.getVar("BB_FILENAME", True)