diff options
| -rwxr-xr-x | bitbake/bin/bitbake-worker | 7 | ||||
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 30 |
2 files changed, 30 insertions, 7 deletions
diff --git a/bitbake/bin/bitbake-worker b/bitbake/bin/bitbake-worker index ff20c1ca98..bc13b4f314 100755 --- a/bitbake/bin/bitbake-worker +++ b/bitbake/bin/bitbake-worker | |||
| @@ -81,7 +81,7 @@ def workerlog_write(msg): | |||
| 81 | lf.write(msg) | 81 | lf.write(msg) |
| 82 | lf.flush() | 82 | lf.flush() |
| 83 | 83 | ||
| 84 | def fork_off_task(cfg, data, workerdata, fn, task, taskname, appends, quieterrors=False): | 84 | def fork_off_task(cfg, data, workerdata, fn, task, taskname, appends, taskdepdata, quieterrors=False): |
| 85 | # We need to setup the environment BEFORE the fork, since | 85 | # We need to setup the environment BEFORE the fork, since |
| 86 | # a fork() or exec*() activates PSEUDO... | 86 | # a fork() or exec*() activates PSEUDO... |
| 87 | 87 | ||
| @@ -148,6 +148,7 @@ def fork_off_task(cfg, data, workerdata, fn, task, taskname, appends, quieterror | |||
| 148 | os.umask(umask) | 148 | os.umask(umask) |
| 149 | 149 | ||
| 150 | data.setVar("BB_WORKERCONTEXT", "1") | 150 | data.setVar("BB_WORKERCONTEXT", "1") |
| 151 | data.setVar("BB_TASKDEPDATA", taskdepdata) | ||
| 151 | data.setVar("BUILDNAME", workerdata["buildname"]) | 152 | data.setVar("BUILDNAME", workerdata["buildname"]) |
| 152 | data.setVar("DATE", workerdata["date"]) | 153 | data.setVar("DATE", workerdata["date"]) |
| 153 | data.setVar("TIME", workerdata["time"]) | 154 | data.setVar("TIME", workerdata["time"]) |
| @@ -300,10 +301,10 @@ class BitbakeWorker(object): | |||
| 300 | sys.exit(0) | 301 | sys.exit(0) |
| 301 | 302 | ||
| 302 | def handle_runtask(self, data): | 303 | def handle_runtask(self, data): |
| 303 | fn, task, taskname, quieterrors, appends = pickle.loads(data) | 304 | fn, task, taskname, quieterrors, appends, taskdepdata = pickle.loads(data) |
| 304 | workerlog_write("Handling runtask %s %s %s\n" % (task, fn, taskname)) | 305 | workerlog_write("Handling runtask %s %s %s\n" % (task, fn, taskname)) |
| 305 | 306 | ||
| 306 | pid, pipein, pipeout = fork_off_task(self.cookercfg, self.data, self.workerdata, fn, task, taskname, appends, quieterrors) | 307 | pid, pipein, pipeout = fork_off_task(self.cookercfg, self.data, self.workerdata, fn, task, taskname, appends, taskdepdata, quieterrors) |
| 307 | 308 | ||
| 308 | self.build_pids[pid] = task | 309 | self.build_pids[pid] = task |
| 309 | self.build_pipes[pid] = runQueueWorkerPipe(pipein, pipeout) | 310 | self.build_pipes[pid] = runQueueWorkerPipe(pipein, pipeout) |
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index f984119e87..428cff1c80 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -1437,14 +1437,16 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
| 1437 | startevent = runQueueTaskStarted(task, self.stats, self.rq) | 1437 | startevent = runQueueTaskStarted(task, self.stats, self.rq) |
| 1438 | bb.event.fire(startevent, self.cfgData) | 1438 | bb.event.fire(startevent, self.cfgData) |
| 1439 | 1439 | ||
| 1440 | taskdepdata = self.build_taskdepdata(task) | ||
| 1441 | |||
| 1440 | taskdep = self.rqdata.dataCache.task_deps[fn] | 1442 | taskdep = self.rqdata.dataCache.task_deps[fn] |
| 1441 | if 'fakeroot' in taskdep and taskname in taskdep['fakeroot'] and not self.cooker.configuration.dry_run: | 1443 | if 'fakeroot' in taskdep and taskname in taskdep['fakeroot'] and not self.cooker.configuration.dry_run: |
| 1442 | if not self.rq.fakeworker: | 1444 | if not self.rq.fakeworker: |
| 1443 | self.rq.start_fakeworker(self) | 1445 | self.rq.start_fakeworker(self) |
| 1444 | self.rq.fakeworker.stdin.write("<runtask>" + pickle.dumps((fn, task, taskname, False, self.cooker.collection.get_file_appends(fn))) + "</runtask>") | 1446 | self.rq.fakeworker.stdin.write("<runtask>" + pickle.dumps((fn, task, taskname, False, self.cooker.collection.get_file_appends(fn), taskdepdata)) + "</runtask>") |
| 1445 | self.rq.fakeworker.stdin.flush() | 1447 | self.rq.fakeworker.stdin.flush() |
| 1446 | else: | 1448 | else: |
| 1447 | self.rq.worker.stdin.write("<runtask>" + pickle.dumps((fn, task, taskname, False, self.cooker.collection.get_file_appends(fn))) + "</runtask>") | 1449 | self.rq.worker.stdin.write("<runtask>" + pickle.dumps((fn, task, taskname, False, self.cooker.collection.get_file_appends(fn), taskdepdata)) + "</runtask>") |
| 1448 | self.rq.worker.stdin.flush() | 1450 | self.rq.worker.stdin.flush() |
| 1449 | 1451 | ||
| 1450 | self.build_stamps[task] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) | 1452 | self.build_stamps[task] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) |
| @@ -1474,6 +1476,26 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
| 1474 | 1476 | ||
| 1475 | return True | 1477 | return True |
| 1476 | 1478 | ||
| 1479 | def build_taskdepdata(self, task): | ||
| 1480 | taskdepdata = {} | ||
| 1481 | next = self.rqdata.runq_depends[task] | ||
| 1482 | next.add(task) | ||
| 1483 | while next: | ||
| 1484 | additional = [] | ||
| 1485 | for revdep in next: | ||
| 1486 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[revdep]] | ||
| 1487 | pn = self.rqdata.dataCache.pkg_fn[fn] | ||
| 1488 | taskname = self.rqdata.runq_task[revdep] | ||
| 1489 | deps = self.rqdata.runq_depends[revdep] | ||
| 1490 | taskdepdata[revdep] = [pn, taskname, fn, deps] | ||
| 1491 | for revdep2 in deps: | ||
| 1492 | if revdep2 not in taskdepdata: | ||
| 1493 | additional.append(revdep2) | ||
| 1494 | next = additional | ||
| 1495 | |||
| 1496 | #bb.note("Task %s: " % task + str(taskdepdata).replace("], ", "],\n")) | ||
| 1497 | return taskdepdata | ||
| 1498 | |||
| 1477 | class RunQueueExecuteScenequeue(RunQueueExecute): | 1499 | class RunQueueExecuteScenequeue(RunQueueExecute): |
| 1478 | def __init__(self, rq): | 1500 | def __init__(self, rq): |
| 1479 | RunQueueExecute.__init__(self, rq) | 1501 | RunQueueExecute.__init__(self, rq) |
| @@ -1784,10 +1806,10 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
| 1784 | if 'fakeroot' in taskdep and taskname in taskdep['fakeroot']: | 1806 | if 'fakeroot' in taskdep and taskname in taskdep['fakeroot']: |
| 1785 | if not self.rq.fakeworker: | 1807 | if not self.rq.fakeworker: |
| 1786 | self.rq.start_fakeworker(self) | 1808 | self.rq.start_fakeworker(self) |
| 1787 | self.rq.fakeworker.stdin.write("<runtask>" + pickle.dumps((fn, realtask, taskname, True, self.cooker.collection.get_file_appends(fn))) + "</runtask>") | 1809 | self.rq.fakeworker.stdin.write("<runtask>" + pickle.dumps((fn, realtask, taskname, True, self.cooker.collection.get_file_appends(fn), None)) + "</runtask>") |
| 1788 | self.rq.fakeworker.stdin.flush() | 1810 | self.rq.fakeworker.stdin.flush() |
| 1789 | else: | 1811 | else: |
| 1790 | self.rq.worker.stdin.write("<runtask>" + pickle.dumps((fn, realtask, taskname, True, self.cooker.collection.get_file_appends(fn))) + "</runtask>") | 1812 | self.rq.worker.stdin.write("<runtask>" + pickle.dumps((fn, realtask, taskname, True, self.cooker.collection.get_file_appends(fn), None)) + "</runtask>") |
| 1791 | self.rq.worker.stdin.flush() | 1813 | self.rq.worker.stdin.flush() |
| 1792 | 1814 | ||
| 1793 | self.runq_running[task] = 1 | 1815 | self.runq_running[task] = 1 |
