diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/build.py | 1 | ||||
-rw-r--r-- | bitbake/lib/bb/cooker.py | 34 | ||||
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 21 | ||||
-rw-r--r-- | bitbake/lib/bb/siggen.py | 13 | ||||
-rw-r--r-- | bitbake/lib/bb/taskdata.py | 18 |
5 files changed, 79 insertions, 8 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index 4631abdde5..c79354b3f1 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py | |||
@@ -803,6 +803,7 @@ def add_tasks(tasklist, d): | |||
803 | if name in flags: | 803 | if name in flags: |
804 | deptask = d.expand(flags[name]) | 804 | deptask = d.expand(flags[name]) |
805 | task_deps[name][task] = deptask | 805 | task_deps[name][task] = deptask |
806 | getTask('mcdepends') | ||
806 | getTask('depends') | 807 | getTask('depends') |
807 | getTask('rdepends') | 808 | getTask('rdepends') |
808 | getTask('deptask') | 809 | getTask('deptask') |
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 1fda40dd41..946ba9ca06 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -609,7 +609,14 @@ class BBCooker: | |||
609 | k2 = k.split(":do_") | 609 | k2 = k.split(":do_") |
610 | k = k2[0] | 610 | k = k2[0] |
611 | ktask = k2[1] | 611 | ktask = k2[1] |
612 | taskdata[mc].add_provider(localdata[mc], self.recipecaches[mc], k) | 612 | if mc: |
613 | # Provider might be from another mc | ||
614 | for mcavailable in self.multiconfigs: | ||
615 | # The first element is empty | ||
616 | if mcavailable: | ||
617 | taskdata[mcavailable].add_provider(localdata[mcavailable], self.recipecaches[mcavailable], k) | ||
618 | else: | ||
619 | taskdata[mc].add_provider(localdata[mc], self.recipecaches[mc], k) | ||
613 | current += 1 | 620 | current += 1 |
614 | if not ktask.startswith("do_"): | 621 | if not ktask.startswith("do_"): |
615 | ktask = "do_%s" % ktask | 622 | ktask = "do_%s" % ktask |
@@ -620,6 +627,27 @@ class BBCooker: | |||
620 | runlist.append([mc, k, ktask, fn]) | 627 | runlist.append([mc, k, ktask, fn]) |
621 | bb.event.fire(bb.event.TreeDataPreparationProgress(current, len(fulltargetlist)), self.data) | 628 | bb.event.fire(bb.event.TreeDataPreparationProgress(current, len(fulltargetlist)), self.data) |
622 | 629 | ||
630 | mcdeps = taskdata[mc].get_mcdepends() | ||
631 | # No need to do check providers if there are no mcdeps or not an mc build | ||
632 | if mcdeps and mc: | ||
633 | # Make sure we can provide the multiconfig dependency | ||
634 | seen = set() | ||
635 | new = True | ||
636 | while new: | ||
637 | new = False | ||
638 | for mc in self.multiconfigs: | ||
639 | for k in mcdeps: | ||
640 | if k in seen: | ||
641 | continue | ||
642 | l = k.split(':') | ||
643 | depmc = l[2] | ||
644 | if depmc not in self.multiconfigs: | ||
645 | bb.fatal("Multiconfig dependency %s depends on nonexistent mc configuration %s" % (k,depmc)) | ||
646 | else: | ||
647 | logger.debug(1, "Adding providers for multiconfig dependency %s" % l[3]) | ||
648 | taskdata[depmc].add_provider(localdata[depmc], self.recipecaches[depmc], l[3]) | ||
649 | seen.add(k) | ||
650 | new = True | ||
623 | for mc in self.multiconfigs: | 651 | for mc in self.multiconfigs: |
624 | taskdata[mc].add_unresolved(localdata[mc], self.recipecaches[mc]) | 652 | taskdata[mc].add_unresolved(localdata[mc], self.recipecaches[mc]) |
625 | 653 | ||
@@ -706,8 +734,8 @@ class BBCooker: | |||
706 | if not dotname in depend_tree["tdepends"]: | 734 | if not dotname in depend_tree["tdepends"]: |
707 | depend_tree["tdepends"][dotname] = [] | 735 | depend_tree["tdepends"][dotname] = [] |
708 | for dep in rq.rqdata.runtaskentries[tid].depends: | 736 | for dep in rq.rqdata.runtaskentries[tid].depends: |
709 | (depmc, depfn, deptaskname, deptaskfn) = bb.runqueue.split_tid_mcfn(dep) | 737 | (depmc, depfn, _, deptaskfn) = bb.runqueue.split_tid_mcfn(dep) |
710 | deppn = self.recipecaches[mc].pkg_fn[deptaskfn] | 738 | deppn = self.recipecaches[depmc].pkg_fn[deptaskfn] |
711 | depend_tree["tdepends"][dotname].append("%s.%s" % (deppn, bb.runqueue.taskname_from_tid(dep))) | 739 | depend_tree["tdepends"][dotname].append("%s.%s" % (deppn, bb.runqueue.taskname_from_tid(dep))) |
712 | if taskfn not in seen_fns: | 740 | if taskfn not in seen_fns: |
713 | seen_fns.append(taskfn) | 741 | seen_fns.append(taskfn) |
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index ba9bebebcf..a43c9983a1 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -602,6 +602,19 @@ class RunQueueData: | |||
602 | if t in taskData[mc].taskentries: | 602 | if t in taskData[mc].taskentries: |
603 | depends.add(t) | 603 | depends.add(t) |
604 | 604 | ||
605 | def add_mc_dependencies(mc, tid): | ||
606 | mcdeps = taskData[mc].get_mcdepends() | ||
607 | for dep in mcdeps: | ||
608 | mcdependency = dep.split(':') | ||
609 | pn = mcdependency[3] | ||
610 | frommc = mcdependency[1] | ||
611 | mcdep = mcdependency[2] | ||
612 | deptask = mcdependency[4] | ||
613 | if mc == frommc: | ||
614 | fn = taskData[mcdep].build_targets[pn][0] | ||
615 | newdep = '%s:%s' % (fn,deptask) | ||
616 | taskData[mc].taskentries[tid].tdepends.append(newdep) | ||
617 | |||
605 | for mc in taskData: | 618 | for mc in taskData: |
606 | for tid in taskData[mc].taskentries: | 619 | for tid in taskData[mc].taskentries: |
607 | 620 | ||
@@ -618,12 +631,16 @@ class RunQueueData: | |||
618 | if fn in taskData[mc].failed_fns: | 631 | if fn in taskData[mc].failed_fns: |
619 | continue | 632 | continue |
620 | 633 | ||
634 | # We add multiconfig dependencies before processing internal task deps (tdepends) | ||
635 | if 'mcdepends' in task_deps and taskname in task_deps['mcdepends']: | ||
636 | add_mc_dependencies(mc, tid) | ||
637 | |||
621 | # Resolve task internal dependencies | 638 | # Resolve task internal dependencies |
622 | # | 639 | # |
623 | # e.g. addtask before X after Y | 640 | # e.g. addtask before X after Y |
624 | for t in taskData[mc].taskentries[tid].tdepends: | 641 | for t in taskData[mc].taskentries[tid].tdepends: |
625 | (_, depfn, deptaskname, _) = split_tid_mcfn(t) | 642 | (depmc, depfn, deptaskname, _) = split_tid_mcfn(t) |
626 | depends.add(build_tid(mc, depfn, deptaskname)) | 643 | depends.add(build_tid(depmc, depfn, deptaskname)) |
627 | 644 | ||
628 | # Resolve 'deptask' dependencies | 645 | # Resolve 'deptask' dependencies |
629 | # | 646 | # |
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index ab228e4148..e9bb51d736 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py | |||
@@ -193,15 +193,24 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
193 | return taint | 193 | return taint |
194 | 194 | ||
195 | def get_taskhash(self, fn, task, deps, dataCache): | 195 | def get_taskhash(self, fn, task, deps, dataCache): |
196 | |||
197 | mc = '' | ||
198 | if fn.startswith('multiconfig:'): | ||
199 | mc = fn.split(':')[1] | ||
196 | k = fn + "." + task | 200 | k = fn + "." + task |
201 | |||
197 | data = dataCache.basetaskhash[k] | 202 | data = dataCache.basetaskhash[k] |
198 | self.basehash[k] = data | 203 | self.basehash[k] = data |
199 | self.runtaskdeps[k] = [] | 204 | self.runtaskdeps[k] = [] |
200 | self.file_checksum_values[k] = [] | 205 | self.file_checksum_values[k] = [] |
201 | recipename = dataCache.pkg_fn[fn] | 206 | recipename = dataCache.pkg_fn[fn] |
202 | |||
203 | for dep in sorted(deps, key=clean_basepath): | 207 | for dep in sorted(deps, key=clean_basepath): |
204 | depname = dataCache.pkg_fn[self.pkgnameextract.search(dep).group('fn')] | 208 | pkgname = self.pkgnameextract.search(dep).group('fn') |
209 | if mc: | ||
210 | depmc = pkgname.split(':')[1] | ||
211 | if mc != depmc: | ||
212 | continue | ||
213 | depname = dataCache.pkg_fn[pkgname] | ||
205 | if not self.rundep_check(fn, recipename, task, dep, depname, dataCache): | 214 | if not self.rundep_check(fn, recipename, task, dep, depname, dataCache): |
206 | continue | 215 | continue |
207 | if dep not in self.taskhash: | 216 | if dep not in self.taskhash: |
diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py index 0ea6c0bfd6..94e822c485 100644 --- a/bitbake/lib/bb/taskdata.py +++ b/bitbake/lib/bb/taskdata.py | |||
@@ -70,6 +70,8 @@ class TaskData: | |||
70 | 70 | ||
71 | self.skiplist = skiplist | 71 | self.skiplist = skiplist |
72 | 72 | ||
73 | self.mcdepends = [] | ||
74 | |||
73 | def add_tasks(self, fn, dataCache): | 75 | def add_tasks(self, fn, dataCache): |
74 | """ | 76 | """ |
75 | Add tasks for a given fn to the database | 77 | Add tasks for a given fn to the database |
@@ -88,6 +90,13 @@ class TaskData: | |||
88 | 90 | ||
89 | self.add_extra_deps(fn, dataCache) | 91 | self.add_extra_deps(fn, dataCache) |
90 | 92 | ||
93 | def add_mcdepends(task): | ||
94 | for dep in task_deps['mcdepends'][task].split(): | ||
95 | if len(dep.split(':')) != 5: | ||
96 | bb.msg.fatal("TaskData", "Error for %s:%s[%s], multiconfig dependency %s does not contain exactly four ':' characters.\n Task '%s' should be specified in the form 'multiconfig:fromMC:toMC:packagename:task'" % (fn, task, 'mcdepends', dep, 'mcdepends')) | ||
97 | if dep not in self.mcdepends: | ||
98 | self.mcdepends.append(dep) | ||
99 | |||
91 | # Common code for dep_name/depends = 'depends'/idepends and 'rdepends'/irdepends | 100 | # Common code for dep_name/depends = 'depends'/idepends and 'rdepends'/irdepends |
92 | def handle_deps(task, dep_name, depends, seen): | 101 | def handle_deps(task, dep_name, depends, seen): |
93 | if dep_name in task_deps and task in task_deps[dep_name]: | 102 | if dep_name in task_deps and task in task_deps[dep_name]: |
@@ -110,16 +119,20 @@ class TaskData: | |||
110 | parentids = [] | 119 | parentids = [] |
111 | for dep in task_deps['parents'][task]: | 120 | for dep in task_deps['parents'][task]: |
112 | if dep not in task_deps['tasks']: | 121 | if dep not in task_deps['tasks']: |
113 | bb.debug(2, "Not adding dependeny of %s on %s since %s does not exist" % (task, dep, dep)) | 122 | bb.debug(2, "Not adding dependency of %s on %s since %s does not exist" % (task, dep, dep)) |
114 | continue | 123 | continue |
115 | parentid = "%s:%s" % (fn, dep) | 124 | parentid = "%s:%s" % (fn, dep) |
116 | parentids.append(parentid) | 125 | parentids.append(parentid) |
117 | self.taskentries[tid].tdepends.extend(parentids) | 126 | self.taskentries[tid].tdepends.extend(parentids) |
118 | 127 | ||
128 | |||
119 | # Touch all intertask dependencies | 129 | # Touch all intertask dependencies |
120 | handle_deps(task, 'depends', self.taskentries[tid].idepends, self.seen_build_target) | 130 | handle_deps(task, 'depends', self.taskentries[tid].idepends, self.seen_build_target) |
121 | handle_deps(task, 'rdepends', self.taskentries[tid].irdepends, self.seen_run_target) | 131 | handle_deps(task, 'rdepends', self.taskentries[tid].irdepends, self.seen_run_target) |
122 | 132 | ||
133 | if 'mcdepends' in task_deps and task in task_deps['mcdepends']: | ||
134 | add_mcdepends(task) | ||
135 | |||
123 | # Work out build dependencies | 136 | # Work out build dependencies |
124 | if not fn in self.depids: | 137 | if not fn in self.depids: |
125 | dependids = set() | 138 | dependids = set() |
@@ -537,6 +550,9 @@ class TaskData: | |||
537 | provmap[name] = provider[0] | 550 | provmap[name] = provider[0] |
538 | return provmap | 551 | return provmap |
539 | 552 | ||
553 | def get_mcdepends(self): | ||
554 | return self.mcdepends | ||
555 | |||
540 | def dump_data(self): | 556 | def dump_data(self): |
541 | """ | 557 | """ |
542 | Dump some debug information on the internal data structures | 558 | Dump some debug information on the internal data structures |