diff options
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 81 |
1 files changed, 80 insertions, 1 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index c9b6b847db..b62a28a2be 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -240,6 +240,7 @@ class RunQueueData: | |||
240 | 240 | ||
241 | self.stampwhitelist = cfgData.getVar("BB_STAMP_WHITELIST", True) or "" | 241 | self.stampwhitelist = cfgData.getVar("BB_STAMP_WHITELIST", True) or "" |
242 | self.multi_provider_whitelist = (cfgData.getVar("MULTI_PROVIDER_WHITELIST", True) or "").split() | 242 | self.multi_provider_whitelist = (cfgData.getVar("MULTI_PROVIDER_WHITELIST", True) or "").split() |
243 | self.setscenewhitelist = get_setscene_enforce_whitelist(cfgData) | ||
243 | 244 | ||
244 | self.reset() | 245 | self.reset() |
245 | 246 | ||
@@ -1596,8 +1597,51 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1596 | Run the tasks in a queue prepared by rqdata.prepare() | 1597 | Run the tasks in a queue prepared by rqdata.prepare() |
1597 | """ | 1598 | """ |
1598 | 1599 | ||
1599 | self.rq.read_workers() | 1600 | if self.rqdata.setscenewhitelist: |
1601 | # Check tasks that are going to run against the whitelist | ||
1602 | def check_norun_task(tid, showerror=False): | ||
1603 | fn = fn_from_tid(tid) | ||
1604 | taskname = taskname_from_tid(tid) | ||
1605 | # Ignore covered tasks | ||
1606 | if tid in self.rq.scenequeue_covered: | ||
1607 | return False | ||
1608 | # Ignore stamped tasks | ||
1609 | if self.rq.check_stamp_task(tid, taskname, cache=self.stampcache): | ||
1610 | return False | ||
1611 | # Ignore noexec tasks | ||
1612 | taskdep = self.rqdata.dataCache.task_deps[fn] | ||
1613 | if 'noexec' in taskdep and taskname in taskdep['noexec']: | ||
1614 | return False | ||
1600 | 1615 | ||
1616 | pn = self.rqdata.dataCache.pkg_fn[fn] | ||
1617 | if not check_setscene_enforce_whitelist(pn, taskname, self.rqdata.setscenewhitelist): | ||
1618 | if showerror: | ||
1619 | if tid in self.rqdata.runq_setscene_tids: | ||
1620 | logger.error('Task %s.%s attempted to execute unexpectedly and should have been setscened' % (pn, taskname)) | ||
1621 | else: | ||
1622 | logger.error('Task %s.%s attempted to execute unexpectedly' % (pn, taskname)) | ||
1623 | return True | ||
1624 | return False | ||
1625 | # Look to see if any tasks that we think shouldn't run are going to | ||
1626 | unexpected = False | ||
1627 | for tid in self.rqdata.runtaskentries: | ||
1628 | if check_norun_task(tid): | ||
1629 | unexpected = True | ||
1630 | break | ||
1631 | if unexpected: | ||
1632 | # Run through the tasks in the rough order they'd have executed and print errors | ||
1633 | # (since the order can be useful - usually missing sstate for the last few tasks | ||
1634 | # is the cause of the problem) | ||
1635 | task = self.sched.next() | ||
1636 | while task is not None: | ||
1637 | check_norun_task(task, showerror=True) | ||
1638 | self.task_skip(task, 'Setscene enforcement check') | ||
1639 | task = self.sched.next() | ||
1640 | |||
1641 | self.rq.state = runQueueCleanUp | ||
1642 | return True | ||
1643 | |||
1644 | self.rq.read_workers() | ||
1601 | 1645 | ||
1602 | if self.stats.total == 0: | 1646 | if self.stats.total == 0: |
1603 | # nothing to do | 1647 | # nothing to do |
@@ -1940,6 +1984,16 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
1940 | self.scenequeue_covered.add(task) | 1984 | self.scenequeue_covered.add(task) |
1941 | self.scenequeue_updatecounters(task) | 1985 | self.scenequeue_updatecounters(task) |
1942 | 1986 | ||
1987 | def check_taskfail(self, task): | ||
1988 | if self.rqdata.setscenewhitelist: | ||
1989 | realtask = task.split('_setscene')[0] | ||
1990 | fn = fn_from_tid(realtask) | ||
1991 | taskname = taskname_from_tid(realtask) | ||
1992 | pn = self.rqdata.dataCache.pkg_fn[fn] | ||
1993 | if not check_setscene_enforce_whitelist(pn, taskname, self.rqdata.setscenewhitelist): | ||
1994 | logger.error('Task %s.%s failed' % (pn, taskname + "_setscene")) | ||
1995 | self.rq.state = runQueueCleanUp | ||
1996 | |||
1943 | def task_complete(self, task): | 1997 | def task_complete(self, task): |
1944 | self.stats.taskCompleted() | 1998 | self.stats.taskCompleted() |
1945 | bb.event.fire(sceneQueueTaskCompleted(task, self.stats, self.rq), self.cfgData) | 1999 | bb.event.fire(sceneQueueTaskCompleted(task, self.stats, self.rq), self.cfgData) |
@@ -1950,6 +2004,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
1950 | bb.event.fire(sceneQueueTaskFailed(task, self.stats, result, self), self.cfgData) | 2004 | bb.event.fire(sceneQueueTaskFailed(task, self.stats, result, self), self.cfgData) |
1951 | self.scenequeue_notcovered.add(task) | 2005 | self.scenequeue_notcovered.add(task) |
1952 | self.scenequeue_updatecounters(task, True) | 2006 | self.scenequeue_updatecounters(task, True) |
2007 | self.check_taskfail(task) | ||
1953 | 2008 | ||
1954 | def task_failoutright(self, task): | 2009 | def task_failoutright(self, task): |
1955 | self.runq_running.add(task) | 2010 | self.runq_running.add(task) |
@@ -2231,3 +2286,27 @@ class runQueuePipe(): | |||
2231 | if len(self.queue) > 0: | 2286 | if len(self.queue) > 0: |
2232 | print("Warning, worker left partial message: %s" % self.queue) | 2287 | print("Warning, worker left partial message: %s" % self.queue) |
2233 | self.input.close() | 2288 | self.input.close() |
2289 | |||
2290 | def get_setscene_enforce_whitelist(d): | ||
2291 | if d.getVar('BB_SETSCENE_ENFORCE', True) != '1': | ||
2292 | return None | ||
2293 | whitelist = (d.getVar("BB_SETSCENE_ENFORCE_WHITELIST", True) or "").split() | ||
2294 | outlist = [] | ||
2295 | for item in whitelist[:]: | ||
2296 | if item.startswith('%:'): | ||
2297 | for target in sys.argv[1:]: | ||
2298 | if not target.startswith('-'): | ||
2299 | outlist.append(target.split(':')[0] + ':' + item.split(':')[1]) | ||
2300 | else: | ||
2301 | outlist.append(item) | ||
2302 | return outlist | ||
2303 | |||
2304 | def check_setscene_enforce_whitelist(pn, taskname, whitelist): | ||
2305 | import fnmatch | ||
2306 | if whitelist: | ||
2307 | item = '%s:%s' % (pn, taskname) | ||
2308 | for whitelist_item in whitelist: | ||
2309 | if fnmatch.fnmatch(item, whitelist_item): | ||
2310 | return True | ||
2311 | return False | ||
2312 | return True | ||