summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/runqueue.py41
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: