From 4ca7075b0972163d95e3c3f5a40c602bf3bb0245 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Fri, 16 Mar 2012 10:46:05 +0000 Subject: runqueue.py: When checking whether stamps are valid for setscene, recurse Currently the code checking whether stamps are valid only traverses one step of the dependency graph. This works fine in the normal cases where we've already validated dependencies but for the setscene code, it doesn't work well. A typical problem usecase is something like: bitbake gcc-cross -c unpack -f bitbake gcc-cross which will ignore any sstate files already cached which could be used to speed up the gcc-cross build. This becomes particularly problematic with multiple gcc builds where only one should rebuild yet they all do. This patch teaches the stamp code to be able to recurse within a given fn which gives the behaviour people would expect from the code and allows bitbake to make better use of prebuild sstate objects. (Bitbake rev: e68814cb2e8da523d4ddf05e8ceddfaa19244851) Signed-off-by: Richard Purdie --- bitbake/lib/bb/runqueue.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index bc0602700d..dcd6d1a8c0 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py @@ -875,7 +875,7 @@ class RunQueue: bb.msg.fatal("RunQueue", "check_stamps fatal internal error") return current - def check_stamp_task(self, task, taskname = None): + def check_stamp_task(self, task, taskname = None, recurse = False): def get_timestamp(f): try: if not os.access(f, os.F_OK): @@ -930,7 +930,8 @@ class RunQueue: if t1 < t2: logger.debug(2, 'Stampfile %s < %s', stampfile, stampfile2) iscurrent = False - + if recurse and iscurrent: + iscurrent = self.check_stamp_task(dep, recurse=True) return iscurrent def execute_runqueue(self): @@ -1648,7 +1649,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute): fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[realtask]] taskname = self.rqdata.runq_task[realtask] + "_setscene" - if self.rq.check_stamp_task(realtask, self.rqdata.runq_task[realtask]): + if self.rq.check_stamp_task(realtask, self.rqdata.runq_task[realtask], recurse = True): logger.debug(2, 'Stamp for underlying task %s(%s) is current, so skipping setscene variant', task, self.rqdata.get_user_idstring(realtask)) self.task_failoutright(task) -- cgit v1.2.3-54-g00ecf