diff options
author | Robert Yang <liezhi.yang@windriver.com> | 2011-06-28 17:05:19 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-06-28 12:14:06 +0100 |
commit | 41bef02bef8379590ba012319aebe05068a8081e (patch) | |
tree | 5e3977ad1497bac2d9e97fce4682a3d824ee0e13 | |
parent | a10d40b113d8570db2576910540b16192a99e53e (diff) | |
download | bitbake-41bef02bef8379590ba012319aebe05068a8081e.tar.gz |
bitbake: Add task specific stamp file support
This patch, based on proof of concept code from Richard adds code to
bitbake to allow individual tasks to optionally specify their stamp
file using the stamp-base flag. This takes the same form as the STAMP
variable but can be specified on a per task basis.
Code is also added to runqueue to ensure that if two tasks share the
same stamp file, only one will be executed at once.
A significant usecase for this code is to share source code (${S})
between recipes where separate build directories (${B}) are used.
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | lib/bb/build.py | 4 | ||||
-rw-r--r-- | lib/bb/cache.py | 3 | ||||
-rw-r--r-- | lib/bb/runqueue.py | 10 |
3 files changed, 15 insertions, 2 deletions
diff --git a/lib/bb/build.py b/lib/bb/build.py index 4bbf10fbe..1c73ae26f 100644 --- a/lib/bb/build.py +++ b/lib/bb/build.py @@ -385,10 +385,10 @@ def stamp_internal(taskname, d, file_name): taskflagname = taskname.replace("_setscene", "") if file_name: - stamp = d.stamp[file_name] + stamp = d.stamp_base[file_name].get(taskflagname) or d.stamp[file_name] extrainfo = d.stamp_extrainfo[file_name].get(taskflagname) or "" else: - stamp = d.getVar('STAMP', True) + stamp = d.getVarFlag(taskflagname, 'stamp-base', True) or d.getVar('STAMP', True) file_name = d.getVar('BB_FILENAME', True) extrainfo = d.getVarFlag(taskflagname, 'stamp-extra-info', True) or "" diff --git a/lib/bb/cache.py b/lib/bb/cache.py index 6c92a9363..99d7395f8 100644 --- a/lib/bb/cache.py +++ b/lib/bb/cache.py @@ -124,6 +124,7 @@ class CoreRecipeInfo(RecipeInfoCommon): self.broken = self.getvar('BROKEN', metadata) self.not_world = self.getvar('EXCLUDE_FROM_WORLD', metadata) self.stamp = self.getvar('STAMP', metadata) + self.stamp_base = self.flaglist('stamp-base', self.tasks, metadata) self.stamp_extrainfo = self.flaglist('stamp-extra-info', self.tasks, metadata) self.packages_dynamic = self.listvar('PACKAGES_DYNAMIC', metadata) self.depends = self.depvar('DEPENDS', metadata) @@ -151,6 +152,7 @@ class CoreRecipeInfo(RecipeInfoCommon): cachedata.pkg_dp = {} cachedata.stamp = {} + cachedata.stamp_base = {} cachedata.stamp_extrainfo = {} cachedata.fn_provides = {} cachedata.pn_provides = defaultdict(list) @@ -183,6 +185,7 @@ class CoreRecipeInfo(RecipeInfoCommon): cachedata.pkg_pepvpr[fn] = (self.pe, self.pv, self.pr) cachedata.pkg_dp[fn] = self.defaultpref cachedata.stamp[fn] = self.stamp + cachedata.stamp_base[fn] = self.stamp_base cachedata.stamp_extrainfo[fn] = self.stamp_extrainfo provides = [self.pn] diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index 6277fc65c..9f6460ebe 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -105,6 +105,11 @@ class RunQueueScheduler(object): if self.rq.runq_running[taskid] == 1: continue if self.rq.runq_buildable[taskid] == 1: + fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[taskid]] + taskname = self.rqdata.runq_task[taskid] + stamp = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) + if stamp in self.rq.build_stamps.values(): + continue return taskid def next(self): @@ -1009,6 +1014,7 @@ class RunQueueExecute: self.runq_complete = [] self.build_pids = {} self.build_pipes = {} + self.build_stamps = {} self.failed_fnids = [] def runqueue_process_waitpid(self): @@ -1023,6 +1029,9 @@ class RunQueueExecute: del self.build_pids[result[0]] self.build_pipes[result[0]].close() del self.build_pipes[result[0]] + # self.build_stamps[result[0]] may not exist when use shared work directory. + if result[0] in self.build_stamps.keys(): + del self.build_stamps[result[0]] if result[1] != 0: self.task_fail(task, result[1]>>8) else: @@ -1335,6 +1344,7 @@ class RunQueueExecuteTasks(RunQueueExecute): self.build_pids[pid] = task self.build_pipes[pid] = runQueuePipe(pipein, pipeout, self.cfgData) + self.build_stamps[pid] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) self.runq_running[task] = 1 self.stats.taskActive() if self.stats.active < self.number_tasks: |