diff options
| -rwxr-xr-x | bitbake/bin/bitbake | 3 | ||||
| -rw-r--r-- | bitbake/lib/bb/cache.py | 8 | ||||
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 4 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/__init__.py | 4 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/ast.py | 6 | ||||
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 38 | ||||
| -rw-r--r-- | bitbake/lib/bb/utils.py | 1 |
7 files changed, 59 insertions, 5 deletions
diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index 7caa5d95e6..4e6815e46e 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake | |||
| @@ -120,6 +120,9 @@ Default BBFILES are the .bb files in the current directory.""") | |||
| 120 | parser.add_option("-n", "--dry-run", help = "don't execute, just go through the motions", | 120 | parser.add_option("-n", "--dry-run", help = "don't execute, just go through the motions", |
| 121 | action = "store_true", dest = "dry_run", default = False) | 121 | action = "store_true", dest = "dry_run", default = False) |
| 122 | 122 | ||
| 123 | parser.add_option("-S", "--dump-signatures", help = "don't execute, just dump out the signature construction information", | ||
| 124 | action = "store_true", dest = "dump_signatures", default = False) | ||
| 125 | |||
| 123 | parser.add_option("-p", "--parse-only", help = "quit after parsing the BB files (developers only)", | 126 | parser.add_option("-p", "--parse-only", help = "quit after parsing the BB files (developers only)", |
| 124 | action = "store_true", dest = "parse_only", default = False) | 127 | action = "store_true", dest = "parse_only", default = False) |
| 125 | 128 | ||
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index 21cbad915e..646fdecbeb 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py | |||
| @@ -38,7 +38,7 @@ except ImportError: | |||
| 38 | import pickle | 38 | import pickle |
| 39 | bb.msg.note(1, bb.msg.domain.Cache, "Importing cPickle failed. Falling back to a very slow implementation.") | 39 | bb.msg.note(1, bb.msg.domain.Cache, "Importing cPickle failed. Falling back to a very slow implementation.") |
| 40 | 40 | ||
| 41 | __cache_version__ = "131" | 41 | __cache_version__ = "132" |
| 42 | 42 | ||
| 43 | class Cache: | 43 | class Cache: |
| 44 | """ | 44 | """ |
| @@ -377,6 +377,10 @@ class Cache: | |||
| 377 | 377 | ||
| 378 | cacheData.stamp[file_name] = self.getVar('STAMP', file_name, True) | 378 | cacheData.stamp[file_name] = self.getVar('STAMP', file_name, True) |
| 379 | 379 | ||
| 380 | cacheData.tasks[file_name] = self.getVar('__BBTASKS', file_name, True) | ||
| 381 | for t in cacheData.tasks[file_name]: | ||
| 382 | cacheData.basetaskhash[file_name + "." + t] = self.getVar("BB_BASEHASH_task-%s" % t, file_name, True) | ||
| 383 | |||
| 380 | # build FileName to PackageName lookup table | 384 | # build FileName to PackageName lookup table |
| 381 | cacheData.pkg_fn[file_name] = pn | 385 | cacheData.pkg_fn[file_name] = pn |
| 382 | cacheData.pkg_pepvpr[file_name] = (pe, pv, pr) | 386 | cacheData.pkg_pepvpr[file_name] = (pe, pv, pr) |
| @@ -539,6 +543,8 @@ class CacheData: | |||
| 539 | self.task_deps = {} | 543 | self.task_deps = {} |
| 540 | self.stamp = {} | 544 | self.stamp = {} |
| 541 | self.preferred = {} | 545 | self.preferred = {} |
| 546 | self.tasks = {} | ||
| 547 | self.basetaskhash = {} | ||
| 542 | 548 | ||
| 543 | """ | 549 | """ |
| 544 | Indirect Cache variables | 550 | Indirect Cache variables |
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index ea33693ddb..5cea9dba9d 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -496,6 +496,8 @@ class BBCooker: | |||
| 496 | def parseConfigurationFiles(self, files): | 496 | def parseConfigurationFiles(self, files): |
| 497 | try: | 497 | try: |
| 498 | data = self.configuration.data | 498 | data = self.configuration.data |
| 499 | |||
| 500 | bb.parse.init_parser(data) | ||
| 499 | for f in files: | 501 | for f in files: |
| 500 | data = bb.parse.handle(f, data) | 502 | data = bb.parse.handle(f, data) |
| 501 | 503 | ||
| @@ -548,6 +550,8 @@ class BBCooker: | |||
| 548 | bb.fetch.fetcher_init(self.configuration.data) | 550 | bb.fetch.fetcher_init(self.configuration.data) |
| 549 | bb.codeparser.parser_cache_init(self.configuration.data) | 551 | bb.codeparser.parser_cache_init(self.configuration.data) |
| 550 | 552 | ||
| 553 | bb.parse.init_parser(data) | ||
| 554 | |||
| 551 | bb.event.fire(bb.event.ConfigParsed(), self.configuration.data) | 555 | bb.event.fire(bb.event.ConfigParsed(), self.configuration.data) |
| 552 | 556 | ||
| 553 | except IOError as e: | 557 | except IOError as e: |
diff --git a/bitbake/lib/bb/parse/__init__.py b/bitbake/lib/bb/parse/__init__.py index 95f372b00b..c7249ef050 100644 --- a/bitbake/lib/bb/parse/__init__.py +++ b/bitbake/lib/bb/parse/__init__.py | |||
| @@ -28,6 +28,7 @@ handlers = [] | |||
| 28 | 28 | ||
| 29 | import bb, os | 29 | import bb, os |
| 30 | import bb.utils | 30 | import bb.utils |
| 31 | import bb.siggen | ||
| 31 | 32 | ||
| 32 | class ParseError(Exception): | 33 | class ParseError(Exception): |
| 33 | """Exception raised when parsing fails""" | 34 | """Exception raised when parsing fails""" |
| @@ -79,6 +80,9 @@ def init(fn, data): | |||
| 79 | if h['supports'](fn): | 80 | if h['supports'](fn): |
| 80 | return h['init'](data) | 81 | return h['init'](data) |
| 81 | 82 | ||
| 83 | def init_parser(d): | ||
| 84 | bb.parse.siggen = bb.siggen.init(d) | ||
| 85 | |||
| 82 | def resolve_file(fn, d): | 86 | def resolve_file(fn, d): |
| 83 | if not os.path.isabs(fn): | 87 | if not os.path.isabs(fn): |
| 84 | bbpath = bb.data.getVar("BBPATH", d, True) | 88 | bbpath = bb.data.getVar("BBPATH", d, True) |
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index b800569434..870ae65b0e 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py | |||
| @@ -300,7 +300,7 @@ def handleInherit(statements, m): | |||
| 300 | n = __word__.findall(files) | 300 | n = __word__.findall(files) |
| 301 | statements.append(InheritNode(m.group(1))) | 301 | statements.append(InheritNode(m.group(1))) |
| 302 | 302 | ||
| 303 | def finalize(fn, d): | 303 | def finalize(fn, d, variant = None): |
| 304 | for lazykey in bb.data.getVar("__lazy_assigned", d) or (): | 304 | for lazykey in bb.data.getVar("__lazy_assigned", d) or (): |
| 305 | if bb.data.getVar(lazykey, d) is None: | 305 | if bb.data.getVar(lazykey, d) is None: |
| 306 | val = bb.data.getVarFlag(lazykey, "defaultval", d) | 306 | val = bb.data.getVarFlag(lazykey, "defaultval", d) |
| @@ -323,7 +323,7 @@ def finalize(fn, d): | |||
| 323 | tasklist = bb.data.getVar('__BBTASKS', d) or [] | 323 | tasklist = bb.data.getVar('__BBTASKS', d) or [] |
| 324 | bb.build.add_tasks(tasklist, d) | 324 | bb.build.add_tasks(tasklist, d) |
| 325 | 325 | ||
| 326 | #bb.data.generate_dependencies(d) | 326 | bb.parse.siggen.finalise(fn, d, variant) |
| 327 | 327 | ||
| 328 | bb.event.fire(bb.event.RecipeParsed(fn), d) | 328 | bb.event.fire(bb.event.RecipeParsed(fn), d) |
| 329 | 329 | ||
| @@ -433,7 +433,7 @@ def multi_finalize(fn, d): | |||
| 433 | for variant, variant_d in datastores.iteritems(): | 433 | for variant, variant_d in datastores.iteritems(): |
| 434 | if variant: | 434 | if variant: |
| 435 | try: | 435 | try: |
| 436 | finalize(fn, variant_d) | 436 | finalize(fn, variant_d, variant) |
| 437 | except bb.parse.SkipPackage: | 437 | except bb.parse.SkipPackage: |
| 438 | bb.data.setVar("__SKIPPED", True, variant_d) | 438 | bb.data.setVar("__SKIPPED", True, variant_d) |
| 439 | 439 | ||
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 1b974312b2..3d84bb17ee 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -178,6 +178,7 @@ class RunQueueData: | |||
| 178 | self.runq_task = [] | 178 | self.runq_task = [] |
| 179 | self.runq_depends = [] | 179 | self.runq_depends = [] |
| 180 | self.runq_revdeps = [] | 180 | self.runq_revdeps = [] |
| 181 | self.runq_hash = [] | ||
| 181 | 182 | ||
| 182 | def runq_depends_names(self, ids): | 183 | def runq_depends_names(self, ids): |
| 183 | import re | 184 | import re |
| @@ -477,6 +478,7 @@ class RunQueueData: | |||
| 477 | self.runq_task.append(taskData.tasks_name[task]) | 478 | self.runq_task.append(taskData.tasks_name[task]) |
| 478 | self.runq_depends.append(set(depends)) | 479 | self.runq_depends.append(set(depends)) |
| 479 | self.runq_revdeps.append(set()) | 480 | self.runq_revdeps.append(set()) |
| 481 | self.runq_hash.append("") | ||
| 480 | 482 | ||
| 481 | runq_build.append(0) | 483 | runq_build.append(0) |
| 482 | runq_recrdepends.append(recrdepends) | 484 | runq_recrdepends.append(recrdepends) |
| @@ -589,6 +591,7 @@ class RunQueueData: | |||
| 589 | del self.runq_depends[listid-delcount] | 591 | del self.runq_depends[listid-delcount] |
| 590 | del runq_build[listid-delcount] | 592 | del runq_build[listid-delcount] |
| 591 | del self.runq_revdeps[listid-delcount] | 593 | del self.runq_revdeps[listid-delcount] |
| 594 | del self.runq_hash[listid-delcount] | ||
| 592 | delcount = delcount + 1 | 595 | delcount = delcount + 1 |
| 593 | maps.append(-1) | 596 | maps.append(-1) |
| 594 | 597 | ||
| @@ -686,6 +689,20 @@ class RunQueueData: | |||
| 686 | #bb.note("Found setscene for %s %s" % (self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task])) | 689 | #bb.note("Found setscene for %s %s" % (self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task])) |
| 687 | self.runq_setscene.append(task) | 690 | self.runq_setscene.append(task) |
| 688 | 691 | ||
| 692 | # Interate over the task list and call into the siggen code | ||
| 693 | |||
| 694 | dealtwith = set() | ||
| 695 | todeal = set(range(len(self.runq_fnid))) | ||
| 696 | while len(todeal) > 0: | ||
| 697 | for task in todeal.copy(): | ||
| 698 | if len(self.runq_depends[task] - dealtwith) == 0: | ||
| 699 | dealtwith.add(task) | ||
| 700 | todeal.remove(task) | ||
| 701 | procdep = [] | ||
| 702 | for dep in self.runq_depends[task]: | ||
| 703 | procdep.append(self.taskData.fn_index[self.runq_fnid[dep]] + "." + self.runq_task[dep]) | ||
| 704 | self.runq_hash[task] = bb.parse.siggen.get_taskhash(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task], procdep, self.dataCache) | ||
| 705 | |||
| 689 | return len(self.runq_fnid) | 706 | return len(self.runq_fnid) |
| 690 | 707 | ||
| 691 | def dump_data(self, taskQueue): | 708 | def dump_data(self, taskQueue): |
| @@ -885,7 +902,10 @@ class RunQueue: | |||
| 885 | self.state = runQueueSceneInit | 902 | self.state = runQueueSceneInit |
| 886 | 903 | ||
| 887 | if self.state is runQueueSceneInit: | 904 | if self.state is runQueueSceneInit: |
| 888 | self.rqexe = RunQueueExecuteScenequeue(self) | 905 | if self.cooker.configuration.dump_signatures: |
| 906 | self.dump_signatures() | ||
| 907 | else: | ||
| 908 | self.rqexe = RunQueueExecuteScenequeue(self) | ||
| 889 | 909 | ||
| 890 | if self.state is runQueueSceneRun: | 910 | if self.state is runQueueSceneRun: |
| 891 | self.rqexe.execute() | 911 | self.rqexe.execute() |
| @@ -926,6 +946,20 @@ class RunQueue: | |||
| 926 | else: | 946 | else: |
| 927 | self.rqexe.finish() | 947 | self.rqexe.finish() |
| 928 | 948 | ||
| 949 | def dump_signatures(self): | ||
| 950 | self.state = runQueueComplete | ||
| 951 | done = set() | ||
| 952 | bb.note("Reparsing files to collect dependency data") | ||
| 953 | for task in range(len(self.rqdata.runq_fnid)): | ||
| 954 | if self.rqdata.runq_fnid[task] not in done: | ||
| 955 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] | ||
| 956 | the_data = self.cooker.bb_cache.loadDataFull(fn, self.cooker.get_file_appends(fn), self.cooker.configuration.data) | ||
| 957 | done.add(self.rqdata.runq_fnid[task]) | ||
| 958 | |||
| 959 | bb.parse.siggen.dump_sigs(self.rqdata.dataCache) | ||
| 960 | |||
| 961 | return | ||
| 962 | |||
| 929 | 963 | ||
| 930 | class RunQueueExecute: | 964 | class RunQueueExecute: |
| 931 | 965 | ||
| @@ -1007,6 +1041,8 @@ class RunQueueExecute: | |||
| 1007 | comps = var.split("=") | 1041 | comps = var.split("=") |
| 1008 | env[comps[0]] = comps[1] | 1042 | env[comps[0]] = comps[1] |
| 1009 | 1043 | ||
| 1044 | env['BB_TASKHASH'] = self.rqdata.runq_hash[task] | ||
| 1045 | |||
| 1010 | sys.stdout.flush() | 1046 | sys.stdout.flush() |
| 1011 | sys.stderr.flush() | 1047 | sys.stderr.flush() |
| 1012 | 1048 | ||
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 9fc56eaa0f..c2e6ff08ed 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
| @@ -452,6 +452,7 @@ def preserved_envvars_list(): | |||
| 452 | 'BB_PRESERVE_ENV', | 452 | 'BB_PRESERVE_ENV', |
| 453 | 'BB_ENV_WHITELIST', | 453 | 'BB_ENV_WHITELIST', |
| 454 | 'BB_ENV_EXTRAWHITE', | 454 | 'BB_ENV_EXTRAWHITE', |
| 455 | 'BB_TASKHASH', | ||
| 455 | 'COLORTERM', | 456 | 'COLORTERM', |
| 456 | 'DBUS_SESSION_BUS_ADDRESS', | 457 | 'DBUS_SESSION_BUS_ADDRESS', |
| 457 | 'DESKTOP_SESSION', | 458 | 'DESKTOP_SESSION', |
