[bitbake-devel,2/3] bitbake, runqueue.py: Add -i to invalidate a stamp and rebuild the target

Submitted by Jason Wessel on June 14, 2012, 3:16 a.m.


Message ID 1339643761-23149-3-git-send-email-jason.wessel@windriver.com
State New
Headers show

Commit Message

Jason Wessel June 14, 2012, 3:16 a.m.
It is highly desirable to be able to invalidate a stamp used for
do_compile and to be able to continue on to build the entire
package's default target.

If invalidating a stamp, the setscene rules for the specified targets
should be automatically canceled so as to allow the full set of tasks
depending on any invalidated stap to run for the specified packages.
For example if you wanted to rebuild the "tinylogin" package and see
the results in a final image in one step for the core-image-minimal
you could do so with:

   bitbake -C compile tinylogin core-image-minimal

Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
 bin/bitbake        |    4 ++++
 lib/bb/runqueue.py |   29 +++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

Patch hide | download patch | download mbox

diff --git a/bin/bitbake b/bin/bitbake
index d178a38..1ac6e8a 100755
--- a/bin/bitbake
+++ b/bin/bitbake
@@ -118,6 +118,10 @@  Default BBFILES are the .bb files in the current directory.""")
     parser.add_option("-c", "--cmd", help = "Specify task to execute. Note that this only executes the specified task for the providee and the packages it depends on, i.e. 'compile' does not implicitly call stage for the dependencies (IOW: use only if you know what you are doing). Depending on the base.bbclass a listtasks tasks is defined and will show available tasks",
                action = "store", dest = "cmd")
+    parser.add_option("-C", "--clear-stamp", help = "Invalidate the specified stamp for a task such as 'compile' and run the default task for and specified packages",
+                action = "store", dest = "invalidate_stamp")
     parser.add_option("-r", "--read", help = "read the specified file before bitbake.conf",
                action = "append", dest = "prefile", default = [])
diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index 6596e83..f1fabfa 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -719,6 +719,28 @@  class RunQueueData:
                         procdep.append(self.taskData.fn_index[self.runq_fnid[dep]] + "." + self.runq_task[dep])
                     self.runq_hash[task] = bb.parse.siggen.get_taskhash(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task], procdep, self.dataCache)
+        # Remove any setscene tasks from the queue for which we invalidated
+        # a stamp
+        try:
+            new_setscene = []
+            test_fns = []
+            if self.cooker.configuration.invalidate_stamp:
+                for tgt in self.target_pairs:
+                    test_fns.append(tgt[0])
+            for task in self.runq_setscene:
+                try:
+                    fn = self.taskData.fn_index[self.rq.rqdata.runq_fnid[task]]
+                    if (self.cooker.configuration.invalidate_stamp and fn in test_fns):
+                        logger.debug(2, 'Removing task %s due to invalidated build stamps', task)
+                    else:
+                        new_setscene.append(task)
+                except:
+                    logger.debug(2, 'Failed invalidate check for %s', task)
+            self.runq_setscene = new_setscene
+        except:
+            logger.debug(2, 'Failed to update runq_setscene')
         self.hashes = {}
         self.hash_deps = {}
         for task in xrange(len(self.runq_fnid)):
@@ -732,6 +754,13 @@  class RunQueueData:
             self.hash_deps[identifier] = deps
+        # Remove stamps for forced invalidation
+        if self.cooker.configuration.invalidate_stamp:
+            for (fn, target) in self.target_pairs:
+                for st in self.cooker.configuration.invalidate_stamp.split(','):
+                    logger.verbose("Remove stamp %s, %s", st, fn)
+                    bb.build.del_stamp("do_%s" % st, self.dataCache, fn)
         # Remove stamps for targets if force mode active
         if self.cooker.configuration.force:
             for (fn, target) in self.target_pairs: