diff options
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 226 |
1 files changed, 109 insertions, 117 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index d995e4c04a..db0d852c54 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -103,8 +103,6 @@ class RunQueueStats: | |||
103 | # runQueue state machine | 103 | # runQueue state machine |
104 | runQueuePrepare = 2 | 104 | runQueuePrepare = 2 |
105 | runQueueSceneInit = 3 | 105 | runQueueSceneInit = 3 |
106 | runQueueSceneRun = 4 | ||
107 | runQueueRunInit = 5 | ||
108 | runQueueRunning = 6 | 106 | runQueueRunning = 6 |
109 | runQueueFailed = 7 | 107 | runQueueFailed = 7 |
110 | runQueueCleanUp = 8 | 108 | runQueueCleanUp = 8 |
@@ -1203,7 +1201,7 @@ class RunQueue: | |||
1203 | # Invoked at regular time intervals via the bitbake heartbeat event | 1201 | # Invoked at regular time intervals via the bitbake heartbeat event |
1204 | # while the build is running. We generate a unique name for the handler | 1202 | # while the build is running. We generate a unique name for the handler |
1205 | # here, just in case that there ever is more than one RunQueue instance, | 1203 | # here, just in case that there ever is more than one RunQueue instance, |
1206 | # start the handler when reaching runQueueSceneRun, and stop it when | 1204 | # start the handler when reaching runQueueSceneInit, and stop it when |
1207 | # done with the build. | 1205 | # done with the build. |
1208 | self.dm = monitordisk.diskMonitor(cfgData) | 1206 | self.dm = monitordisk.diskMonitor(cfgData) |
1209 | self.dm_event_handler_name = '_bb_diskmonitor_' + str(id(self)) | 1207 | self.dm_event_handler_name = '_bb_diskmonitor_' + str(id(self)) |
@@ -1433,7 +1431,7 @@ class RunQueue: | |||
1433 | 1431 | ||
1434 | if not self.dm_event_handler_registered: | 1432 | if not self.dm_event_handler_registered: |
1435 | res = bb.event.register(self.dm_event_handler_name, | 1433 | res = bb.event.register(self.dm_event_handler_name, |
1436 | lambda x: self.dm.check(self) if self.state in [runQueueSceneRun, runQueueRunning, runQueueCleanUp] else False, | 1434 | lambda x: self.dm.check(self) if self.state in [runQueueRunning, runQueueCleanUp] else False, |
1437 | ('bb.event.HeartbeatEvent',)) | 1435 | ('bb.event.HeartbeatEvent',)) |
1438 | self.dm_event_handler_registered = True | 1436 | self.dm_event_handler_registered = True |
1439 | 1437 | ||
@@ -1465,8 +1463,6 @@ class RunQueue: | |||
1465 | self.state = runQueueRunning | 1463 | self.state = runQueueRunning |
1466 | 1464 | ||
1467 | if self.state is runQueueRunning: | 1465 | if self.state is runQueueRunning: |
1468 | retval = self.rqexe.sq_execute() | ||
1469 | # FIXME revtal | ||
1470 | retval = self.rqexe.execute() | 1466 | retval = self.rqexe.execute() |
1471 | 1467 | ||
1472 | if self.state is runQueueCleanUp: | 1468 | if self.state is runQueueCleanUp: |
@@ -1899,19 +1895,118 @@ class RunQueueExecute: | |||
1899 | 1895 | ||
1900 | def execute(self): | 1896 | def execute(self): |
1901 | """ | 1897 | """ |
1902 | Run the tasks in a queue prepared by rqdata.prepare() | 1898 | Run the tasks in a queue prepared by prepare_runqueue |
1903 | """ | 1899 | """ |
1904 | 1900 | ||
1905 | if self.cooker.configuration.setsceneonly: | ||
1906 | return True | ||
1907 | |||
1908 | self.rq.read_workers() | 1901 | self.rq.read_workers() |
1909 | 1902 | ||
1910 | if self.stats.total == 0: | 1903 | task = None |
1911 | # nothing to do | 1904 | if not self.sqdone and self.can_start_task(): |
1912 | self.rq.state = runQueueCleanUp | 1905 | # Find the next setscene to run |
1906 | for nexttask in self.rqdata.runq_setscene_tids: | ||
1907 | if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values(): | ||
1908 | if nexttask in self.sqdata.unskippable: | ||
1909 | logger.debug(2, "Setscene task %s is unskippable" % nexttask) | ||
1910 | if nexttask not in self.sqdata.unskippable and len(self.sqdata.sq_revdeps[nexttask]) > 0 and self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.sqdata.sq_revdeps[nexttask]): | ||
1911 | fn = fn_from_tid(nexttask) | ||
1912 | foundtarget = False | ||
1913 | 1913 | ||
1914 | task = self.sched.next() | 1914 | if nexttask in self.rqdata.target_tids: |
1915 | foundtarget = True | ||
1916 | if not foundtarget: | ||
1917 | logger.debug(2, "Skipping setscene for task %s" % nexttask) | ||
1918 | self.sq_task_skip(nexttask) | ||
1919 | self.scenequeue_notneeded.add(nexttask) | ||
1920 | return True | ||
1921 | if nexttask in self.sqdata.outrightfail: | ||
1922 | self.sq_task_failoutright(nexttask) | ||
1923 | return True | ||
1924 | task = nexttask | ||
1925 | break | ||
1926 | if task is not None: | ||
1927 | (mc, fn, taskname, taskfn) = split_tid_mcfn(task) | ||
1928 | taskname = taskname + "_setscene" | ||
1929 | if self.rq.check_stamp_task(task, taskname_from_tid(task), recurse = True, cache=self.stampcache): | ||
1930 | logger.debug(2, 'Stamp for underlying task %s is current, so skipping setscene variant', task) | ||
1931 | self.sq_task_failoutright(task) | ||
1932 | return True | ||
1933 | |||
1934 | if self.cooker.configuration.force: | ||
1935 | if task in self.rqdata.target_tids: | ||
1936 | self.sq_task_failoutright(task) | ||
1937 | return True | ||
1938 | |||
1939 | if self.rq.check_stamp_task(task, taskname, cache=self.stampcache): | ||
1940 | logger.debug(2, 'Setscene stamp current task %s, so skip it and its dependencies', task) | ||
1941 | self.sq_task_skip(task) | ||
1942 | return True | ||
1943 | |||
1944 | if self.cooker.configuration.skipsetscene: | ||
1945 | logger.debug(2, 'No setscene tasks should be executed. Skipping %s', task) | ||
1946 | self.sq_task_failoutright(task) | ||
1947 | return True | ||
1948 | |||
1949 | startevent = sceneQueueTaskStarted(task, self.sq_stats, self.rq) | ||
1950 | bb.event.fire(startevent, self.cfgData) | ||
1951 | |||
1952 | taskdepdata = self.sq_build_taskdepdata(task) | ||
1953 | |||
1954 | taskdep = self.rqdata.dataCaches[mc].task_deps[taskfn] | ||
1955 | taskhash = self.rqdata.get_task_hash(task) | ||
1956 | unihash = self.rqdata.get_task_unihash(task) | ||
1957 | if 'fakeroot' in taskdep and taskname in taskdep['fakeroot'] and not self.cooker.configuration.dry_run: | ||
1958 | if not mc in self.rq.fakeworker: | ||
1959 | self.rq.start_fakeworker(self, mc) | ||
1960 | self.rq.fakeworker[mc].process.stdin.write(b"<runtask>" + pickle.dumps((taskfn, task, taskname, taskhash, unihash, True, self.cooker.collection.get_file_appends(taskfn), taskdepdata, False)) + b"</runtask>") | ||
1961 | self.rq.fakeworker[mc].process.stdin.flush() | ||
1962 | else: | ||
1963 | self.rq.worker[mc].process.stdin.write(b"<runtask>" + pickle.dumps((taskfn, task, taskname, taskhash, unihash, True, self.cooker.collection.get_file_appends(taskfn), taskdepdata, False)) + b"</runtask>") | ||
1964 | self.rq.worker[mc].process.stdin.flush() | ||
1965 | |||
1966 | self.build_stamps[task] = bb.build.stampfile(taskname, self.rqdata.dataCaches[mc], taskfn, noextra=True) | ||
1967 | self.build_stamps2.append(self.build_stamps[task]) | ||
1968 | self.sq_running.add(task) | ||
1969 | self.sq_live.add(task) | ||
1970 | self.sq_stats.taskActive() | ||
1971 | if self.can_start_task(): | ||
1972 | return True | ||
1973 | |||
1974 | if not self.sq_live and not self.sqdone: | ||
1975 | logger.info("Setscene tasks completed") | ||
1976 | logger.debug(1, 'We could skip tasks %s', "\n".join(sorted(self.scenequeue_covered))) | ||
1977 | |||
1978 | completeevent = sceneQueueComplete(self.sq_stats, self.rq) | ||
1979 | bb.event.fire(completeevent, self.cfgData) | ||
1980 | |||
1981 | err = False | ||
1982 | for x in self.rqdata.runtaskentries: | ||
1983 | if x not in self.tasks_covered and x not in self.tasks_notcovered: | ||
1984 | logger.error("Task %s was never moved from the setscene queue" % x) | ||
1985 | err = True | ||
1986 | if x not in self.tasks_scenequeue_done: | ||
1987 | logger.error("Task %s was never processed by the setscene code" % x) | ||
1988 | err = True | ||
1989 | if len(self.rqdata.runtaskentries[x].depends) == 0 and x not in self.runq_buildable: | ||
1990 | logger.error("Task %s was never marked as buildable by the setscene code" % x) | ||
1991 | err = True | ||
1992 | if err: | ||
1993 | self.rq.state = runQueueFailed | ||
1994 | return True | ||
1995 | |||
1996 | if self.cooker.configuration.setsceneonly: | ||
1997 | self.rq.state = runQueueComplete | ||
1998 | return True | ||
1999 | self.sqdone = True | ||
2000 | |||
2001 | if self.stats.total == 0: | ||
2002 | # nothing to do | ||
2003 | self.rq.state = runQueueComplete | ||
2004 | return True | ||
2005 | |||
2006 | if self.cooker.configuration.setsceneonly: | ||
2007 | task = None | ||
2008 | else: | ||
2009 | task = self.sched.next() | ||
1915 | if task is not None: | 2010 | if task is not None: |
1916 | (mc, fn, taskname, taskfn) = split_tid_mcfn(task) | 2011 | (mc, fn, taskname, taskfn) = split_tid_mcfn(task) |
1917 | 2012 | ||
@@ -2164,109 +2259,6 @@ class RunQueueExecute: | |||
2164 | self.sq_stats.taskSkipped() | 2259 | self.sq_stats.taskSkipped() |
2165 | self.sq_stats.taskCompleted() | 2260 | self.sq_stats.taskCompleted() |
2166 | 2261 | ||
2167 | def sq_execute(self): | ||
2168 | """ | ||
2169 | Run the tasks in a queue prepared by prepare_runqueue | ||
2170 | """ | ||
2171 | |||
2172 | if self.sqdone: | ||
2173 | return True | ||
2174 | |||
2175 | self.rq.read_workers() | ||
2176 | |||
2177 | task = None | ||
2178 | if self.can_start_task(): | ||
2179 | # Find the next setscene to run | ||
2180 | for nexttask in self.rqdata.runq_setscene_tids: | ||
2181 | if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values(): | ||
2182 | if nexttask in self.sqdata.unskippable: | ||
2183 | logger.debug(2, "Setscene task %s is unskippable" % nexttask) | ||
2184 | if nexttask not in self.sqdata.unskippable and len(self.sqdata.sq_revdeps[nexttask]) > 0 and self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.sqdata.sq_revdeps[nexttask]): | ||
2185 | fn = fn_from_tid(nexttask) | ||
2186 | foundtarget = False | ||
2187 | |||
2188 | if nexttask in self.rqdata.target_tids: | ||
2189 | foundtarget = True | ||
2190 | if not foundtarget: | ||
2191 | logger.debug(2, "Skipping setscene for task %s" % nexttask) | ||
2192 | self.sq_task_skip(nexttask) | ||
2193 | self.scenequeue_notneeded.add(nexttask) | ||
2194 | return True | ||
2195 | if nexttask in self.sqdata.outrightfail: | ||
2196 | self.sq_task_failoutright(nexttask) | ||
2197 | return True | ||
2198 | task = nexttask | ||
2199 | break | ||
2200 | if task is not None: | ||
2201 | (mc, fn, taskname, taskfn) = split_tid_mcfn(task) | ||
2202 | taskname = taskname + "_setscene" | ||
2203 | if self.rq.check_stamp_task(task, taskname_from_tid(task), recurse = True, cache=self.stampcache): | ||
2204 | logger.debug(2, 'Stamp for underlying task %s is current, so skipping setscene variant', task) | ||
2205 | self.sq_task_failoutright(task) | ||
2206 | return True | ||
2207 | |||
2208 | if self.cooker.configuration.force: | ||
2209 | if task in self.rqdata.target_tids: | ||
2210 | self.sq_task_failoutright(task) | ||
2211 | return True | ||
2212 | |||
2213 | if self.rq.check_stamp_task(task, taskname, cache=self.stampcache): | ||
2214 | logger.debug(2, 'Setscene stamp current task %s, so skip it and its dependencies', task) | ||
2215 | self.sq_task_skip(task) | ||
2216 | return True | ||
2217 | |||
2218 | if self.cooker.configuration.skipsetscene: | ||
2219 | logger.debug(2, 'No setscene tasks should be executed. Skipping %s', task) | ||
2220 | self.sq_task_failoutright(task) | ||
2221 | return True | ||
2222 | |||
2223 | startevent = sceneQueueTaskStarted(task, self.sq_stats, self.rq) | ||
2224 | bb.event.fire(startevent, self.cfgData) | ||
2225 | |||
2226 | taskdepdata = self.sq_build_taskdepdata(task) | ||
2227 | |||
2228 | taskdep = self.rqdata.dataCaches[mc].task_deps[taskfn] | ||
2229 | taskhash = self.rqdata.get_task_hash(task) | ||
2230 | unihash = self.rqdata.get_task_unihash(task) | ||
2231 | if 'fakeroot' in taskdep and taskname in taskdep['fakeroot'] and not self.cooker.configuration.dry_run: | ||
2232 | if not mc in self.rq.fakeworker: | ||
2233 | self.rq.start_fakeworker(self, mc) | ||
2234 | self.rq.fakeworker[mc].process.stdin.write(b"<runtask>" + pickle.dumps((taskfn, task, taskname, taskhash, unihash, True, self.cooker.collection.get_file_appends(taskfn), taskdepdata, False)) + b"</runtask>") | ||
2235 | self.rq.fakeworker[mc].process.stdin.flush() | ||
2236 | else: | ||
2237 | self.rq.worker[mc].process.stdin.write(b"<runtask>" + pickle.dumps((taskfn, task, taskname, taskhash, unihash, True, self.cooker.collection.get_file_appends(taskfn), taskdepdata, False)) + b"</runtask>") | ||
2238 | self.rq.worker[mc].process.stdin.flush() | ||
2239 | |||
2240 | self.build_stamps[task] = bb.build.stampfile(taskname, self.rqdata.dataCaches[mc], taskfn, noextra=True) | ||
2241 | self.build_stamps2.append(self.build_stamps[task]) | ||
2242 | self.sq_running.add(task) | ||
2243 | self.sq_live.add(task) | ||
2244 | self.sq_stats.taskActive() | ||
2245 | if self.can_start_task(): | ||
2246 | return True | ||
2247 | |||
2248 | if self.stats.active > 0 or self.sq_stats.active > 0: | ||
2249 | self.rq.read_workers() | ||
2250 | return self.rq.active_fds() | ||
2251 | |||
2252 | #for tid in self.sqdata.sq_revdeps: | ||
2253 | # if tid not in self.sq_running: | ||
2254 | # buildable = tid in self.sq_buildable | ||
2255 | # revdeps = self.sqdata.sq_revdeps[tid] | ||
2256 | # bb.warn("Found we didn't run %s %s %s" % (tid, buildable, str(revdeps))) | ||
2257 | |||
2258 | logger.debug(1, 'We can skip tasks %s', "\n".join(sorted(self.scenequeue_covered))) | ||
2259 | |||
2260 | completeevent = sceneQueueComplete(self.sq_stats, self.rq) | ||
2261 | bb.event.fire(completeevent, self.cfgData) | ||
2262 | |||
2263 | if self.cooker.configuration.setsceneonly: | ||
2264 | self.rq.state = runQueueComplete | ||
2265 | |||
2266 | self.sqdone = True | ||
2267 | |||
2268 | return True | ||
2269 | |||
2270 | def sq_build_taskdepdata(self, task): | 2262 | def sq_build_taskdepdata(self, task): |
2271 | def getsetscenedeps(tid): | 2263 | def getsetscenedeps(tid): |
2272 | deps = set() | 2264 | deps = set() |