[poky] [PATCH 3/5] bitbake: Introduce stamp-extra-info into build stamp file

Dongxiao Xu dongxiao.xu at intel.com
Fri Jan 14 14:14:34 PST 2011


For certain tasks, we need additional information in build stamp file
except the task name and file name. stamp-extra-info is introduced as
an flag adding to the end of stamp file name.

Besides, if we need to add common flags for tasks, we can set value for
macro BB_STAMP_EXTRA.

Signed-off-by: Dongxiao Xu <dongxiao.xu at intel.com>
---
 bitbake/lib/bb/build.py    |   14 +++++---------
 bitbake/lib/bb/cache.py    |   19 ++++++++++++++++++-
 bitbake/lib/bb/runqueue.py |   12 ++++++------
 bitbake/lib/bb/siggen.py   |   20 ++++++++++++++++++--
 meta/classes/base.bbclass  |    2 +-
 5 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index f127796..2175d54 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -383,15 +383,11 @@ def stamp_internal(taskname, d, file_name):
     When called in task context, d will be a data store, file_name will not be set
     """
     if file_name:
-        stamp = d.stamp[file_name]
+        is_dict = False
     else:
-        stamp = d.getVar('STAMP', True)
-        file_name = d.getVar('BB_FILENAME', True)
+        is_dict = True
 
-    if not stamp:
-        return
-
-    stamp = bb.parse.siggen.stampfile(stamp, file_name, taskname)
+    stamp = bb.parse.siggen.stampfile(d, file_name, taskname, is_dict)
 
     bb.utils.mkdirhier(os.path.dirname(stamp))
 
@@ -420,8 +416,8 @@ def del_stamp(task, d, file_name = None):
     if os.access(stamp, os.F_OK):
         os.remove(stamp)
 
-def stampfile(taskname, d):
-    return stamp_internal(taskname, d, None)
+def stampfile(taskname, d, file_name):
+    return stamp_internal(taskname, d, file_name)
 
 def add_tasks(tasklist, d):
     task_deps = data.getVar('_task_deps', d)
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index 9a2e2d5..2437d4a 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -55,6 +55,8 @@ recipe_fields = (
     'provides',
     'task_deps',
     'stamp',
+    'stamp_extra',
+    'stamp_extra_info',
     'broken',
     'not_world',
     'skipped',
@@ -102,6 +104,11 @@ class RecipeInfo(namedtuple('RecipeInfo', recipe_fields)):
                     for task in tasks)
 
     @classmethod
+    def stampvar(cls, var, tasks, stamp, metadata):
+        return dict((stamp + '.' + task, metadata.getVarFlag(task, var, True))
+                    for task in tasks)
+
+    @classmethod
     def getvar(cls, var, metadata):
         return metadata.getVar(var, True) or ''
 
@@ -126,6 +133,7 @@ class RecipeInfo(namedtuple('RecipeInfo', recipe_fields)):
         if not pn in packages:
             packages.append(pn)
 
+        stamp = cls.getvar('STAMP', metadata)
         return RecipeInfo(
             tasks            = tasks,
             basetaskhashes   = cls.taskvar('BB_BASEHASH', tasks, metadata),
@@ -147,7 +155,9 @@ class RecipeInfo(namedtuple('RecipeInfo', recipe_fields)):
             defaultpref      = cls.intvar('DEFAULT_PREFERENCE', metadata),
             broken           = cls.getvar('BROKEN', metadata),
             not_world        = cls.getvar('EXCLUDE_FROM_WORLD', metadata),
-            stamp            = cls.getvar('STAMP', metadata),
+            stamp            = stamp,
+            stamp_extra      = cls.getvar('BB_STAMP_EXTRA', metadata),
+            stamp_extra_info = cls.stampvar('stamp-extra-info', tasks, stamp, metadata),
             packages_dynamic = cls.listvar('PACKAGES_DYNAMIC', metadata),
             depends          = cls.depvar('DEPENDS', metadata),
             provides         = cls.depvar('PROVIDES', metadata),
@@ -562,6 +572,8 @@ class CacheData(object):
         self.task_queues = {}
         self.task_deps = {}
         self.stamp = {}
+        self.stamp_extra = {}
+        self.stamp_extra_info = {}
         self.preferred = {}
         self.tasks = {}
         self.basetaskhash = {}
@@ -577,12 +589,17 @@ class CacheData(object):
         self.bbfile_config_priorities = []
 
     def add_from_recipeinfo(self, fn, info):
+        tasks = info.tasks
         self.task_deps[fn] = info.task_deps
         self.pkg_fn[fn] = info.pn
         self.pkg_pn[info.pn].append(fn)
         self.pkg_pepvpr[fn] = (info.pe, info.pv, info.pr)
         self.pkg_dp[fn] = info.defaultpref
         self.stamp[fn] = info.stamp
+        self.stamp_extra[fn] = info.stamp_extra
+
+        for task in tasks:
+            self.stamp_extra_info[self.stamp[fn] + '.' + task] = info.stamp_extra_info[self.stamp[fn] + '.' + task]
 
         provides = [info.pn]
         for provide in info.provides:
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index a465275..b9d89ec 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -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:
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index 4dc09b3..48fe6af 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -42,8 +42,24 @@ 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, d, file_name, taskname, is_dict):
+        if is_dict:
+            stamp = d.getVar('STAMP', True)
+            file_name = d.getVar('BB_FILENAME', True)
+            extra_info = taskname + '.' + (bb.data.getVarFlag(taskname, 'stamp-extra-info', d) or bb.data.getVar('BB_STAMP_EXTRA', d, True) or "")
+            extra_info = bb.data.expand(extra_info, d)
+        else:
+            stamp = d.stamp[file_name]
+            if stamp + "." + taskname in d.stamp_extra_info.keys():
+                extra_info = taskname + '.' + (d.stamp_extra_info[stamp + "." + taskname] or d.stamp_extra[file_name] or "")
+            else:
+                extra_info = taskname + '.' + (d.stamp_extra[file_name] or "")
+
+        if not stamp:
+            return
+
+        return "%s.%s" % (stamp, extra_info.rstrip('.'))
+
 
 class SignatureGeneratorBasic(SignatureGenerator):
     """
diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
index f1ffb45..58913d7 100644
--- a/meta/classes/base.bbclass
+++ b/meta/classes/base.bbclass
@@ -107,7 +107,7 @@ python base_scenefunction () {
 python base_do_setscene () {
 	for f in (bb.data.getVar('SCENEFUNCS', d, 1) or '').split():
 		bb.build.exec_func(f, d)
-	if not os.path.exists(bb.build.stampfile("do_setscene", d)):
+	if not os.path.exists(bb.build.stampfile("do_setscene", d, None)):
 		bb.build.make_stamp("do_setscene", d)
 }
 do_setscene[selfstamp] = "1"
-- 
1.6.3.3




More information about the poky mailing list