diff options
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
| -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 |
