diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 79 |
1 files changed, 30 insertions, 49 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index aafb6ffa58..d995e4c04a 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -25,6 +25,7 @@ import subprocess | |||
25 | import pickle | 25 | import pickle |
26 | from multiprocessing import Process | 26 | from multiprocessing import Process |
27 | import shlex | 27 | import shlex |
28 | import pprint | ||
28 | 29 | ||
29 | bblogger = logging.getLogger("BitBake") | 30 | bblogger = logging.getLogger("BitBake") |
30 | logger = logging.getLogger("BitBake.RunQueue") | 31 | logger = logging.getLogger("BitBake.RunQueue") |
@@ -1681,49 +1682,6 @@ class RunQueue: | |||
1681 | output = bb.siggen.compare_sigfiles(latestmatch, match, recursecb) | 1682 | output = bb.siggen.compare_sigfiles(latestmatch, match, recursecb) |
1682 | bb.plain("\nTask %s:%s couldn't be used from the cache because:\n We need hash %s, closest matching task was %s\n " % (pn, taskname, h, prevh) + '\n '.join(output)) | 1683 | bb.plain("\nTask %s:%s couldn't be used from the cache because:\n We need hash %s, closest matching task was %s\n " % (pn, taskname, h, prevh) + '\n '.join(output)) |
1683 | 1684 | ||
1684 | def process_setscene_whitelist(rq, rqdata, stampcache, sched, rqex): | ||
1685 | # Check tasks that are going to run against the whitelist | ||
1686 | def check_norun_task(tid, showerror=False): | ||
1687 | (mc, fn, taskname, taskfn) = split_tid_mcfn(tid) | ||
1688 | # Ignore covered tasks | ||
1689 | if tid in rqex.tasks_covered: | ||
1690 | return False | ||
1691 | # Ignore stamped tasks | ||
1692 | if rq.check_stamp_task(tid, taskname, cache=stampcache): | ||
1693 | return False | ||
1694 | # Ignore noexec tasks | ||
1695 | taskdep = rqdata.dataCaches[mc].task_deps[taskfn] | ||
1696 | if 'noexec' in taskdep and taskname in taskdep['noexec']: | ||
1697 | return False | ||
1698 | |||
1699 | pn = rqdata.dataCaches[mc].pkg_fn[taskfn] | ||
1700 | if not check_setscene_enforce_whitelist(pn, taskname, rqdata.setscenewhitelist): | ||
1701 | if showerror: | ||
1702 | if tid in rqdata.runq_setscene_tids: | ||
1703 | logger.error('Task %s.%s attempted to execute unexpectedly and should have been setscened' % (pn, taskname)) | ||
1704 | else: | ||
1705 | logger.error('Task %s.%s attempted to execute unexpectedly' % (pn, taskname)) | ||
1706 | return True | ||
1707 | return False | ||
1708 | # Look to see if any tasks that we think shouldn't run are going to | ||
1709 | unexpected = False | ||
1710 | for tid in rqdata.runtaskentries: | ||
1711 | if check_norun_task(tid): | ||
1712 | unexpected = True | ||
1713 | break | ||
1714 | if unexpected: | ||
1715 | # Run through the tasks in the rough order they'd have executed and print errors | ||
1716 | # (since the order can be useful - usually missing sstate for the last few tasks | ||
1717 | # is the cause of the problem) | ||
1718 | task = sched.next() | ||
1719 | while task is not None: | ||
1720 | check_norun_task(task, showerror=True) | ||
1721 | rqex.task_skip(task, 'Setscene enforcement check') | ||
1722 | task = sched.next() | ||
1723 | |||
1724 | rq.state = runQueueCleanUp | ||
1725 | return True | ||
1726 | |||
1727 | 1685 | ||
1728 | class RunQueueExecute: | 1686 | class RunQueueExecute: |
1729 | 1687 | ||
@@ -1944,12 +1902,6 @@ class RunQueueExecute: | |||
1944 | Run the tasks in a queue prepared by rqdata.prepare() | 1902 | Run the tasks in a queue prepared by rqdata.prepare() |
1945 | """ | 1903 | """ |
1946 | 1904 | ||
1947 | if self.rqdata.setscenewhitelist is not None and not self.rqdata.setscenewhitelist_checked: | ||
1948 | self.rqdata.setscenewhitelist_checked = True | ||
1949 | |||
1950 | if process_setscenewhitelist(self.rq, self.rqdata, self.stampcache, self.sched, self): | ||
1951 | return True | ||
1952 | |||
1953 | if self.cooker.configuration.setsceneonly: | 1905 | if self.cooker.configuration.setsceneonly: |
1954 | return True | 1906 | return True |
1955 | 1907 | ||
@@ -1963,6 +1915,11 @@ class RunQueueExecute: | |||
1963 | if task is not None: | 1915 | if task is not None: |
1964 | (mc, fn, taskname, taskfn) = split_tid_mcfn(task) | 1916 | (mc, fn, taskname, taskfn) = split_tid_mcfn(task) |
1965 | 1917 | ||
1918 | if self.rqdata.setscenewhitelist is not None: | ||
1919 | if self.check_setscenewhitelist(task): | ||
1920 | self.task_fail(task, "setscene whitelist") | ||
1921 | return True | ||
1922 | |||
1966 | if task in self.tasks_covered: | 1923 | if task in self.tasks_covered: |
1967 | logger.debug(2, "Setscene covered task %s", task) | 1924 | logger.debug(2, "Setscene covered task %s", task) |
1968 | self.task_skip(task, "covered") | 1925 | self.task_skip(task, "covered") |
@@ -2348,6 +2305,30 @@ class RunQueueExecute: | |||
2348 | #bb.note("Task %s: " % task + str(taskdepdata).replace("], ", "],\n")) | 2305 | #bb.note("Task %s: " % task + str(taskdepdata).replace("], ", "],\n")) |
2349 | return taskdepdata | 2306 | return taskdepdata |
2350 | 2307 | ||
2308 | def check_setscenewhitelist(self, tid): | ||
2309 | # Check task that is going to run against the whitelist | ||
2310 | (mc, fn, taskname, taskfn) = split_tid_mcfn(tid) | ||
2311 | # Ignore covered tasks | ||
2312 | if tid in self.tasks_covered: | ||
2313 | return False | ||
2314 | # Ignore stamped tasks | ||
2315 | if self.rq.check_stamp_task(tid, taskname, cache=self.stampcache): | ||
2316 | return False | ||
2317 | # Ignore noexec tasks | ||
2318 | taskdep = self.rqdata.dataCaches[mc].task_deps[taskfn] | ||
2319 | if 'noexec' in taskdep and taskname in taskdep['noexec']: | ||
2320 | return False | ||
2321 | |||
2322 | pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn] | ||
2323 | if not check_setscene_enforce_whitelist(pn, taskname, self.rqdata.setscenewhitelist): | ||
2324 | if tid in self.rqdata.runq_setscene_tids: | ||
2325 | msg = 'Task %s.%s attempted to execute unexpectedly and should have been setscened' % (pn, taskname) | ||
2326 | else: | ||
2327 | msg = 'Task %s.%s attempted to execute unexpectedly' % (pn, taskname) | ||
2328 | logger.error(msg + '\nThis is usually due to missing setscene tasks. Those missing in this build were: %s' % pprint.pformat(self.scenequeue_notcovered)) | ||
2329 | return True | ||
2330 | return False | ||
2331 | |||
2351 | class SQData(object): | 2332 | class SQData(object): |
2352 | def __init__(self): | 2333 | def __init__(self): |
2353 | # SceneQueue dependencies | 2334 | # SceneQueue dependencies |