diff options
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 02d7ff9768..864708ee4a 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -1813,6 +1813,7 @@ class RunQueueExecute: | |||
1813 | self.build_stamps2 = [] | 1813 | self.build_stamps2 = [] |
1814 | self.failed_tids = [] | 1814 | self.failed_tids = [] |
1815 | self.sq_deferred = {} | 1815 | self.sq_deferred = {} |
1816 | self.sq_needed_harddeps = set() | ||
1816 | 1817 | ||
1817 | self.stampcache = {} | 1818 | self.stampcache = {} |
1818 | 1819 | ||
@@ -2140,7 +2141,10 @@ class RunQueueExecute: | |||
2140 | # Find the next setscene to run | 2141 | # Find the next setscene to run |
2141 | for nexttask in self.sorted_setscene_tids: | 2142 | for nexttask in self.sorted_setscene_tids: |
2142 | if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values(): | 2143 | if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values(): |
2143 | if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.sqdata.sq_revdeps[nexttask]): | 2144 | if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \ |
2145 | nexttask not in self.sq_needed_harddeps and \ | ||
2146 | self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \ | ||
2147 | self.check_dependencies(nexttask, self.sqdata.sq_revdeps[nexttask]): | ||
2144 | if nexttask not in self.rqdata.target_tids: | 2148 | if nexttask not in self.rqdata.target_tids: |
2145 | logger.debug2("Skipping setscene for task %s" % nexttask) | 2149 | logger.debug2("Skipping setscene for task %s" % nexttask) |
2146 | self.sq_task_skip(nexttask) | 2150 | self.sq_task_skip(nexttask) |
@@ -2148,6 +2152,18 @@ class RunQueueExecute: | |||
2148 | if nexttask in self.sq_deferred: | 2152 | if nexttask in self.sq_deferred: |
2149 | del self.sq_deferred[nexttask] | 2153 | del self.sq_deferred[nexttask] |
2150 | return True | 2154 | return True |
2155 | if nexttask in self.sqdata.sq_harddeps_rev and not self.sqdata.sq_harddeps_rev[nexttask].issubset(self.scenequeue_covered | self.scenequeue_notcovered): | ||
2156 | logger.debug2("Deferring %s due to hard dependencies" % nexttask) | ||
2157 | updated = False | ||
2158 | for dep in self.sqdata.sq_harddeps_rev[nexttask]: | ||
2159 | if dep not in self.sq_needed_harddeps: | ||
2160 | logger.debug2("Enabling task %s as it is a hard dependency" % dep) | ||
2161 | self.sq_buildable.add(dep) | ||
2162 | self.sq_needed_harddeps.add(dep) | ||
2163 | updated = True | ||
2164 | if updated: | ||
2165 | return True | ||
2166 | continue | ||
2151 | # If covered tasks are running, need to wait for them to complete | 2167 | # If covered tasks are running, need to wait for them to complete |
2152 | for t in self.sqdata.sq_covered_tasks[nexttask]: | 2168 | for t in self.sqdata.sq_covered_tasks[nexttask]: |
2153 | if t in self.runq_running and t not in self.runq_complete: | 2169 | if t in self.runq_running and t not in self.runq_complete: |
@@ -2596,8 +2612,8 @@ class RunQueueExecute: | |||
2596 | update_tasks2 = [] | 2612 | update_tasks2 = [] |
2597 | for tid in update_tasks: | 2613 | for tid in update_tasks: |
2598 | harddepfail = False | 2614 | harddepfail = False |
2599 | for t in self.sqdata.sq_harddeps: | 2615 | for t in self.sqdata.sq_harddeps_rev[tid]: |
2600 | if tid in self.sqdata.sq_harddeps[t] and t in self.scenequeue_notcovered: | 2616 | if t in self.scenequeue_notcovered: |
2601 | harddepfail = True | 2617 | harddepfail = True |
2602 | break | 2618 | break |
2603 | if not harddepfail and self.sqdata.sq_revdeps[tid].issubset(self.scenequeue_covered | self.scenequeue_notcovered): | 2619 | if not harddepfail and self.sqdata.sq_revdeps[tid].issubset(self.scenequeue_covered | self.scenequeue_notcovered): |
@@ -2629,12 +2645,13 @@ class RunQueueExecute: | |||
2629 | 2645 | ||
2630 | if changed: | 2646 | if changed: |
2631 | self.stats.updateCovered(len(self.scenequeue_covered), len(self.scenequeue_notcovered)) | 2647 | self.stats.updateCovered(len(self.scenequeue_covered), len(self.scenequeue_notcovered)) |
2648 | self.sq_needed_harddeps = set() | ||
2632 | self.holdoff_need_update = True | 2649 | self.holdoff_need_update = True |
2633 | 2650 | ||
2634 | def scenequeue_updatecounters(self, task, fail=False): | 2651 | def scenequeue_updatecounters(self, task, fail=False): |
2635 | 2652 | ||
2636 | for dep in sorted(self.sqdata.sq_deps[task]): | 2653 | if fail and task in self.sqdata.sq_harddeps: |
2637 | if fail and task in self.sqdata.sq_harddeps and dep in self.sqdata.sq_harddeps[task]: | 2654 | for dep in sorted(self.sqdata.sq_harddeps[task]): |
2638 | if dep in self.scenequeue_covered or dep in self.scenequeue_notcovered: | 2655 | if dep in self.scenequeue_covered or dep in self.scenequeue_notcovered: |
2639 | # dependency could be already processed, e.g. noexec setscene task | 2656 | # dependency could be already processed, e.g. noexec setscene task |
2640 | continue | 2657 | continue |
@@ -2644,6 +2661,7 @@ class RunQueueExecute: | |||
2644 | logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep)) | 2661 | logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep)) |
2645 | self.sq_task_failoutright(dep) | 2662 | self.sq_task_failoutright(dep) |
2646 | continue | 2663 | continue |
2664 | for dep in sorted(self.sqdata.sq_deps[task]): | ||
2647 | if self.sqdata.sq_revdeps[dep].issubset(self.scenequeue_covered | self.scenequeue_notcovered): | 2665 | if self.sqdata.sq_revdeps[dep].issubset(self.scenequeue_covered | self.scenequeue_notcovered): |
2648 | if dep not in self.sq_buildable: | 2666 | if dep not in self.sq_buildable: |
2649 | self.sq_buildable.add(dep) | 2667 | self.sq_buildable.add(dep) |
@@ -2780,6 +2798,7 @@ class SQData(object): | |||
2780 | self.sq_revdeps = {} | 2798 | self.sq_revdeps = {} |
2781 | # Injected inter-setscene task dependencies | 2799 | # Injected inter-setscene task dependencies |
2782 | self.sq_harddeps = {} | 2800 | self.sq_harddeps = {} |
2801 | self.sq_harddeps_rev = {} | ||
2783 | # Cache of stamp files so duplicates can't run in parallel | 2802 | # Cache of stamp files so duplicates can't run in parallel |
2784 | self.stamps = {} | 2803 | self.stamps = {} |
2785 | # Setscene tasks directly depended upon by the build | 2804 | # Setscene tasks directly depended upon by the build |
@@ -2907,6 +2926,7 @@ def build_scenequeue_data(sqdata, rqdata, sqrq): | |||
2907 | idepends = rqdata.taskData[mc].taskentries[realtid].idepends | 2926 | idepends = rqdata.taskData[mc].taskentries[realtid].idepends |
2908 | sqdata.stamps[tid] = bb.parse.siggen.stampfile_mcfn(taskname, taskfn, extrainfo=False) | 2927 | sqdata.stamps[tid] = bb.parse.siggen.stampfile_mcfn(taskname, taskfn, extrainfo=False) |
2909 | 2928 | ||
2929 | sqdata.sq_harddeps_rev[tid] = set() | ||
2910 | for (depname, idependtask) in idepends: | 2930 | for (depname, idependtask) in idepends: |
2911 | 2931 | ||
2912 | if depname not in rqdata.taskData[mc].build_targets: | 2932 | if depname not in rqdata.taskData[mc].build_targets: |
@@ -2919,20 +2939,15 @@ def build_scenequeue_data(sqdata, rqdata, sqrq): | |||
2919 | if deptid not in rqdata.runtaskentries: | 2939 | if deptid not in rqdata.runtaskentries: |
2920 | bb.msg.fatal("RunQueue", "Task %s depends upon non-existent task %s:%s" % (realtid, depfn, idependtask)) | 2940 | bb.msg.fatal("RunQueue", "Task %s depends upon non-existent task %s:%s" % (realtid, depfn, idependtask)) |
2921 | 2941 | ||
2942 | logger.debug2("Adding hard setscene dependency %s for %s" % (deptid, tid)) | ||
2943 | |||
2922 | if not deptid in sqdata.sq_harddeps: | 2944 | if not deptid in sqdata.sq_harddeps: |
2923 | sqdata.sq_harddeps[deptid] = set() | 2945 | sqdata.sq_harddeps[deptid] = set() |
2924 | sqdata.sq_harddeps[deptid].add(tid) | 2946 | sqdata.sq_harddeps[deptid].add(tid) |
2925 | 2947 | sqdata.sq_harddeps_rev[tid].add(deptid) | |
2926 | sq_revdeps_squash[tid].add(deptid) | ||
2927 | # Have to zero this to avoid circular dependencies | ||
2928 | sq_revdeps_squash[deptid] = set() | ||
2929 | 2948 | ||
2930 | rqdata.init_progress_reporter.next_stage() | 2949 | rqdata.init_progress_reporter.next_stage() |
2931 | 2950 | ||
2932 | for task in sqdata.sq_harddeps: | ||
2933 | for dep in sqdata.sq_harddeps[task]: | ||
2934 | sq_revdeps_squash[dep].add(task) | ||
2935 | |||
2936 | rqdata.init_progress_reporter.next_stage() | 2951 | rqdata.init_progress_reporter.next_stage() |
2937 | 2952 | ||
2938 | #for tid in sq_revdeps_squash: | 2953 | #for tid in sq_revdeps_squash: |