diff options
author | Alejandro Enedino Hernandez Samaniego <alejandro.enedino.hernandez-samaniego@xilinx.com> | 2018-07-25 09:01:01 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-08-01 10:07:22 +0100 |
commit | b8730f68d22b9c1ebd012ffd7aedccd22cceb0da (patch) | |
tree | 18dcab42041ff11a5c554e1bc798f9df0fc158fc /bitbake/lib/bb/taskdata.py | |
parent | 7df8a4f834e059e5beddc9f7bedec4f4a5a668d3 (diff) | |
download | poky-b8730f68d22b9c1ebd012ffd7aedccd22cceb0da.tar.gz |
bitbake: bitbake: Add support for multiconfig dependencies
This patch adds the capability for tasks from different
multiconfigs to depend on one another.
These dependencies can be enabled using the following format:
task[mcdepends] = "multiconfig:FROM-MC:TO-MC:PN:task-to-depend-on"
For the sake of simplicity consider the following example:
Assuming we have set up multiconfig builds, one for qemux86 and one for
qemuarm, named x86 and arm respectively.
Adding the following line to an image recipe (core-image-sato):
do_image[mcdepends] = "multiconfig:x86:arm:core-image-minimal:do_rootfs"
Would state that core-image-sato:do_image from x86 will depend on
core-image-minimal:do_rootfs from arm so it can be executed.
This patch makes modifications to:
- cooker: To glue both multiconfigs in one place and make sure
the dependencies can be provided.
- taskdata: To parse and add a new kind of dependency (mcdepends) to
the taskdata object.
- runqueue: To differentiate tasks from different multiconfigs,
add the specified dependencies to the corresponding tasks, and
create a working runqueue that contains tasks from both multiconfigs.
- siggen: To avoid looking for tasks from different multiconfigs on
objects where they dont belong.
The taskdata objects are still not aware of the concept of multiconfig,
so each object doesnt know which multiconfig its building, hence why
the mcdepends are added to all taskdata objects equally (we really
dont expect many of these), but the actual dependencies are added only
to the required tasks by the runqueue.
(Bitbake rev: da8cb8633504bdc815bdcefc538340b9bce5065d)
Signed-off-by: Alejandro Enedino Hernandez Samaniego <alejandr@xilinx.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/taskdata.py')
-rw-r--r-- | bitbake/lib/bb/taskdata.py | 18 |
1 files changed, 17 insertions, 1 deletions
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 |