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', |