diff options
author | Richard Purdie <richard@openedhand.com> | 2007-01-08 23:53:01 +0000 |
---|---|---|
committer | Richard Purdie <richard@openedhand.com> | 2007-01-08 23:53:01 +0000 |
commit | f5665d5bfcfb13d01da9e4c7d5046453e80f7baf (patch) | |
tree | b8908549afaf3006bf3763419711090ac999c2a4 /bitbake/lib/bb/runqueue.py | |
parent | aec95de5f7dca2afa3a4a0bdb0d4d553c13f680d (diff) | |
download | poky-f5665d5bfcfb13d01da9e4c7d5046453e80f7baf.tar.gz |
bitbake: Sync with upstream.
* File licence headers were sanitised causing most of the diff.
* cooker.py was created from bin/bitbake.
* cvs fetcher port option was added
* The -f force option was fixed to work correctly
* Multiple entries in rrecrdeps are now handled correctly
(allows adding do_deploy to image depends)
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@1129 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 95 |
1 files changed, 60 insertions, 35 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 4da543ffc8..2ef2670da0 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -5,20 +5,23 @@ | |||
5 | BitBake 'RunQueue' implementation | 5 | BitBake 'RunQueue' implementation |
6 | 6 | ||
7 | Handles preparation and execution of a queue of tasks | 7 | Handles preparation and execution of a queue of tasks |
8 | |||
9 | Copyright (C) 2006 Richard Purdie | ||
10 | |||
11 | This program is free software; you can redistribute it and/or modify it under | ||
12 | the terms of the GNU General Public License version 2 as published by the Free | ||
13 | Software Foundation | ||
14 | |||
15 | This program is distributed in the hope that it will be useful, but WITHOUT | ||
16 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||
17 | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. | ||
18 | |||
19 | You should have received a copy of the GNU General Public License along with | ||
20 | """ | 8 | """ |
21 | 9 | ||
10 | # Copyright (C) 2006 Richard Purdie | ||
11 | # | ||
12 | # This program is free software; you can redistribute it and/or modify | ||
13 | # it under the terms of the GNU General Public License version 2 as | ||
14 | # published by the Free Software Foundation. | ||
15 | # | ||
16 | # This program is distributed in the hope that it will be useful, | ||
17 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | # GNU General Public License for more details. | ||
20 | # | ||
21 | # You should have received a copy of the GNU General Public License along | ||
22 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
24 | |||
22 | from bb import msg, data, fetch, event, mkdirhier, utils | 25 | from bb import msg, data, fetch, event, mkdirhier, utils |
23 | from sets import Set | 26 | from sets import Set |
24 | import bb, os, sys | 27 | import bb, os, sys |
@@ -48,7 +51,7 @@ class RunQueue: | |||
48 | taskname = self.runq_task[task] | 51 | taskname = self.runq_task[task] |
49 | return "%s, %s" % (fn, taskname) | 52 | return "%s, %s" % (fn, taskname) |
50 | 53 | ||
51 | def prepare_runqueue(self, cfgData, dataCache, taskData, targets): | 54 | def prepare_runqueue(self, cooker, cfgData, dataCache, taskData, targets): |
52 | """ | 55 | """ |
53 | Turn a set of taskData into a RunQueue and compute data needed | 56 | Turn a set of taskData into a RunQueue and compute data needed |
54 | to optimise the execution order. | 57 | to optimise the execution order. |
@@ -104,9 +107,13 @@ class RunQueue: | |||
104 | depdata = taskData.build_targets[depid][0] | 107 | depdata = taskData.build_targets[depid][0] |
105 | if depdata: | 108 | if depdata: |
106 | dep = taskData.fn_index[depdata] | 109 | dep = taskData.fn_index[depdata] |
107 | taskid = taskData.gettask_id(dep, taskname) | 110 | # Need to avoid creating new tasks here |
108 | depends.append(taskid) | 111 | taskid = taskData.gettask_id(dep, taskname, False) |
109 | fnid = taskData.tasks_fnid[taskid] | 112 | if taskid: |
113 | depends.append(taskid) | ||
114 | fnid = taskData.tasks_fnid[taskid] | ||
115 | else: | ||
116 | fnid = taskData.getfn_id(dep) | ||
110 | for nextdepid in taskData.depids[fnid]: | 117 | for nextdepid in taskData.depids[fnid]: |
111 | if nextdepid not in dep_seen: | 118 | if nextdepid not in dep_seen: |
112 | add_recursive_build(nextdepid) | 119 | add_recursive_build(nextdepid) |
@@ -127,9 +134,13 @@ class RunQueue: | |||
127 | depdata = taskData.run_targets[rdepid][0] | 134 | depdata = taskData.run_targets[rdepid][0] |
128 | if depdata: | 135 | if depdata: |
129 | dep = taskData.fn_index[depdata] | 136 | dep = taskData.fn_index[depdata] |
130 | taskid = taskData.gettask_id(dep, taskname) | 137 | # Need to avoid creating new tasks here |
131 | depends.append(taskid) | 138 | taskid = taskData.gettask_id(dep, taskname, False) |
132 | fnid = taskData.tasks_fnid[taskid] | 139 | if taskid: |
140 | depends.append(taskid) | ||
141 | fnid = taskData.tasks_fnid[taskid] | ||
142 | else: | ||
143 | fnid = taskData.getfn_id(dep) | ||
133 | for nextdepid in taskData.depids[fnid]: | 144 | for nextdepid in taskData.depids[fnid]: |
134 | if nextdepid not in dep_seen: | 145 | if nextdepid not in dep_seen: |
135 | add_recursive_build(nextdepid) | 146 | add_recursive_build(nextdepid) |
@@ -143,11 +154,11 @@ class RunQueue: | |||
143 | if 'recrdeptask' in task_deps and taskData.tasks_name[task] in task_deps['recrdeptask']: | 154 | if 'recrdeptask' in task_deps and taskData.tasks_name[task] in task_deps['recrdeptask']: |
144 | dep_seen = [] | 155 | dep_seen = [] |
145 | rdep_seen = [] | 156 | rdep_seen = [] |
146 | taskname = task_deps['recrdeptask'][taskData.tasks_name[task]] | 157 | for taskname in task_deps['recrdeptask'][taskData.tasks_name[task]].split(): |
147 | for depid in taskData.depids[fnid]: | 158 | for depid in taskData.depids[fnid]: |
148 | add_recursive_build(depid) | 159 | add_recursive_build(depid) |
149 | for rdepid in taskData.rdepids[fnid]: | 160 | for rdepid in taskData.rdepids[fnid]: |
150 | add_recursive_run(rdepid) | 161 | add_recursive_run(rdepid) |
151 | 162 | ||
152 | #Prune self references | 163 | #Prune self references |
153 | if task in depends: | 164 | if task in depends: |
@@ -188,13 +199,21 @@ class RunQueue: | |||
188 | 199 | ||
189 | for target in targets: | 200 | for target in targets: |
190 | targetid = taskData.getbuild_id(target[0]) | 201 | targetid = taskData.getbuild_id(target[0]) |
191 | if targetid in taskData.failed_deps: | ||
192 | continue | ||
193 | 202 | ||
194 | if targetid not in taskData.build_targets: | 203 | if targetid not in taskData.build_targets: |
195 | continue | 204 | continue |
196 | 205 | ||
197 | fnid = taskData.build_targets[targetid][0] | 206 | fnid = taskData.build_targets[targetid][0] |
207 | |||
208 | # Remove stamps for targets if force mode active | ||
209 | if cooker.configuration.force: | ||
210 | fn = taskData.fn_index[fnid] | ||
211 | bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (target[1], fn)) | ||
212 | bb.build.del_stamp(target[1], dataCache, fn) | ||
213 | |||
214 | if targetid in taskData.failed_deps: | ||
215 | continue | ||
216 | |||
198 | if fnid in taskData.failed_fnids: | 217 | if fnid in taskData.failed_fnids: |
199 | continue | 218 | continue |
200 | 219 | ||
@@ -338,10 +357,13 @@ class RunQueue: | |||
338 | 357 | ||
339 | bb.msg.note(1, bb.msg.domain.RunQueue, "Executing runqueue") | 358 | bb.msg.note(1, bb.msg.domain.RunQueue, "Executing runqueue") |
340 | 359 | ||
360 | active_builds = 0 | ||
361 | tasks_completed = 0 | ||
362 | tasks_skipped = 0 | ||
363 | |||
341 | runq_buildable = [] | 364 | runq_buildable = [] |
342 | runq_running = [] | 365 | runq_running = [] |
343 | runq_complete = [] | 366 | runq_complete = [] |
344 | active_builds = 0 | ||
345 | build_pids = {} | 367 | build_pids = {} |
346 | failed_fnids = [] | 368 | failed_fnids = [] |
347 | 369 | ||
@@ -405,15 +427,15 @@ class RunQueue: | |||
405 | fn = taskData.fn_index[self.runq_fnid[task]] | 427 | fn = taskData.fn_index[self.runq_fnid[task]] |
406 | taskname = self.runq_task[task] | 428 | taskname = self.runq_task[task] |
407 | 429 | ||
408 | if bb.build.stamp_is_current_cache(dataCache, fn, taskname): | 430 | if bb.build.stamp_is_current(taskname, dataCache, fn): |
409 | targetid = taskData.gettask_id(fn, taskname) | 431 | bb.msg.debug(2, bb.msg.domain.RunQueue, "Stamp current task %s (%s)" % (task, self.get_user_idstring(task, taskData))) |
410 | if not (targetid in taskData.external_targets and cooker.configuration.force): | 432 | runq_running[task] = 1 |
411 | bb.msg.debug(2, bb.msg.domain.RunQueue, "Stamp current task %s (%s)" % (task, self.get_user_idstring(task, taskData))) | 433 | task_complete(self, task) |
412 | runq_running[task] = 1 | 434 | tasks_completed = tasks_completed + 1 |
413 | task_complete(self, task) | 435 | tasks_skipped = tasks_skipped + 1 |
414 | continue | 436 | continue |
415 | 437 | ||
416 | bb.msg.debug(1, bb.msg.domain.RunQueue, "Running task %s (%s)" % (task, self.get_user_idstring(task, taskData))) | 438 | bb.msg.note(1, bb.msg.domain.RunQueue, "Running task %d of %d (ID: %s, %s)" % (tasks_completed + active_builds + 1, len(self.runq_fnid), task, self.get_user_idstring(task, taskData))) |
417 | try: | 439 | try: |
418 | pid = os.fork() | 440 | pid = os.fork() |
419 | except OSError, e: | 441 | except OSError, e: |
@@ -451,6 +473,7 @@ class RunQueue: | |||
451 | failed_fnids.append(self.runq_fnid[task]) | 473 | failed_fnids.append(self.runq_fnid[task]) |
452 | break | 474 | break |
453 | task_complete(self, task) | 475 | task_complete(self, task) |
476 | tasks_completed = tasks_completed + 1 | ||
454 | del build_pids[result[0]] | 477 | del build_pids[result[0]] |
455 | continue | 478 | continue |
456 | break | 479 | break |
@@ -486,6 +509,8 @@ class RunQueue: | |||
486 | if runq_complete[task] == 0: | 509 | if runq_complete[task] == 0: |
487 | bb.msg.error(bb.msg.domain.RunQueue, "Task %s never completed!" % task) | 510 | bb.msg.error(bb.msg.domain.RunQueue, "Task %s never completed!" % task) |
488 | 511 | ||
512 | bb.msg.note(1, bb.msg.domain.RunQueue, "Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and %d failed." % (tasks_completed, tasks_skipped, len(failed_fnids))) | ||
513 | |||
489 | return failed_fnids | 514 | return failed_fnids |
490 | 515 | ||
491 | def dump_data(self, taskQueue): | 516 | def dump_data(self, taskQueue): |