diff options
Diffstat (limited to 'meta/lib/oe/sstatesig.py')
-rw-r--r-- | meta/lib/oe/sstatesig.py | 79 |
1 files changed, 42 insertions, 37 deletions
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py index d24e3738ae..21ae0a7657 100644 --- a/meta/lib/oe/sstatesig.py +++ b/meta/lib/oe/sstatesig.py | |||
@@ -2,9 +2,10 @@ | |||
2 | # SPDX-License-Identifier: GPL-2.0-only | 2 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 3 | # |
4 | import bb.siggen | 4 | import bb.siggen |
5 | import bb.runqueue | ||
5 | import oe | 6 | import oe |
6 | 7 | ||
7 | def sstate_rundepfilter(siggen, fn, recipename, task, dep, depname, dataCache): | 8 | def sstate_rundepfilter(siggen, fn, recipename, task, dep, depname, dataCaches): |
8 | # Return True if we should keep the dependency, False to drop it | 9 | # Return True if we should keep the dependency, False to drop it |
9 | def isNative(x): | 10 | def isNative(x): |
10 | return x.endswith("-native") | 11 | return x.endswith("-native") |
@@ -12,23 +13,26 @@ def sstate_rundepfilter(siggen, fn, recipename, task, dep, depname, dataCache): | |||
12 | return "-cross-" in x | 13 | return "-cross-" in x |
13 | def isNativeSDK(x): | 14 | def isNativeSDK(x): |
14 | return x.startswith("nativesdk-") | 15 | return x.startswith("nativesdk-") |
15 | def isKernel(fn): | 16 | def isKernel(mc, fn): |
16 | inherits = " ".join(dataCache.inherits[fn]) | 17 | inherits = " ".join(dataCaches[mc].inherits[fn]) |
17 | return inherits.find("/module-base.bbclass") != -1 or inherits.find("/linux-kernel-base.bbclass") != -1 | 18 | return inherits.find("/module-base.bbclass") != -1 or inherits.find("/linux-kernel-base.bbclass") != -1 |
18 | def isPackageGroup(fn): | 19 | def isPackageGroup(mc, fn): |
19 | inherits = " ".join(dataCache.inherits[fn]) | 20 | inherits = " ".join(dataCaches[mc].inherits[fn]) |
20 | return "/packagegroup.bbclass" in inherits | 21 | return "/packagegroup.bbclass" in inherits |
21 | def isAllArch(fn): | 22 | def isAllArch(mc, fn): |
22 | inherits = " ".join(dataCache.inherits[fn]) | 23 | inherits = " ".join(dataCaches[mc].inherits[fn]) |
23 | return "/allarch.bbclass" in inherits | 24 | return "/allarch.bbclass" in inherits |
24 | def isImage(fn): | 25 | def isImage(mc, fn): |
25 | return "/image.bbclass" in " ".join(dataCache.inherits[fn]) | 26 | return "/image.bbclass" in " ".join(dataCaches[mc].inherits[fn]) |
26 | 27 | ||
27 | # (Almost) always include our own inter-task dependencies. | 28 | depmc, _, deptaskname, depmcfn = bb.runqueue.split_tid_mcfn(dep) |
28 | # The exception is the special do_kernel_configme->do_unpack_and_patch | 29 | mc, _ = bb.runqueue.split_mc(fn) |
29 | # dependency from archiver.bbclass. | 30 | |
30 | if recipename == depname: | 31 | # (Almost) always include our own inter-task dependencies (unless it comes |
31 | if task == "do_kernel_configme" and dep.endswith(".do_unpack_and_patch"): | 32 | # from a mcdepends). The exception is the special |
33 | # do_kernel_configme->do_unpack_and_patch dependency from archiver.bbclass. | ||
34 | if recipename == depname and depmc == mc: | ||
35 | if task == "do_kernel_configme" and deptaskname == "do_unpack_and_patch": | ||
32 | return False | 36 | return False |
33 | return True | 37 | return True |
34 | 38 | ||
@@ -47,11 +51,11 @@ def sstate_rundepfilter(siggen, fn, recipename, task, dep, depname, dataCache): | |||
47 | # Only target packages beyond here | 51 | # Only target packages beyond here |
48 | 52 | ||
49 | # allarch packagegroups are assumed to have well behaved names which don't change between architecures/tunes | 53 | # allarch packagegroups are assumed to have well behaved names which don't change between architecures/tunes |
50 | if isPackageGroup(fn) and isAllArch(fn) and not isNative(depname): | 54 | if isPackageGroup(mc, fn) and isAllArch(mc, fn) and not isNative(depname): |
51 | return False | 55 | return False |
52 | 56 | ||
53 | # Exclude well defined machine specific configurations which don't change ABI | 57 | # Exclude well defined machine specific configurations which don't change ABI |
54 | if depname in siggen.abisaferecipes and not isImage(fn): | 58 | if depname in siggen.abisaferecipes and not isImage(mc, fn): |
55 | return False | 59 | return False |
56 | 60 | ||
57 | # Kernel modules are well namespaced. We don't want to depend on the kernel's checksum | 61 | # Kernel modules are well namespaced. We don't want to depend on the kernel's checksum |
@@ -59,10 +63,9 @@ def sstate_rundepfilter(siggen, fn, recipename, task, dep, depname, dataCache): | |||
59 | # is machine specific. | 63 | # is machine specific. |
60 | # Therefore if we're not a kernel or a module recipe (inheriting the kernel classes) | 64 | # Therefore if we're not a kernel or a module recipe (inheriting the kernel classes) |
61 | # and we reccomend a kernel-module, we exclude the dependency. | 65 | # and we reccomend a kernel-module, we exclude the dependency. |
62 | depfn = dep.rsplit(":", 1)[0] | 66 | if dataCaches and isKernel(depmc, depmcfn) and not isKernel(mc, fn): |
63 | if dataCache and isKernel(depfn) and not isKernel(fn): | 67 | for pkg in dataCaches[mc].runrecs[fn]: |
64 | for pkg in dataCache.runrecs[fn]: | 68 | if " ".join(dataCaches[mc].runrecs[fn][pkg]).find("kernel-module-") != -1: |
65 | if " ".join(dataCache.runrecs[fn][pkg]).find("kernel-module-") != -1: | ||
66 | return False | 69 | return False |
67 | 70 | ||
68 | # Default to keep dependencies | 71 | # Default to keep dependencies |
@@ -87,10 +90,12 @@ class SignatureGeneratorOEBasic(bb.siggen.SignatureGeneratorBasic): | |||
87 | self.abisaferecipes = (data.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE") or "").split() | 90 | self.abisaferecipes = (data.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE") or "").split() |
88 | self.saferecipedeps = (data.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS") or "").split() | 91 | self.saferecipedeps = (data.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS") or "").split() |
89 | pass | 92 | pass |
90 | def rundep_check(self, fn, recipename, task, dep, depname, dataCache = None): | 93 | def rundep_check(self, fn, recipename, task, dep, depname, dataCaches = None): |
91 | return sstate_rundepfilter(self, fn, recipename, task, dep, depname, dataCache) | 94 | return sstate_rundepfilter(self, fn, recipename, task, dep, depname, dataCaches) |
92 | 95 | ||
93 | class SignatureGeneratorOEBasicHashMixIn(object): | 96 | class SignatureGeneratorOEBasicHashMixIn(object): |
97 | supports_multiconfig_datacaches = True | ||
98 | |||
94 | def init_rundepcheck(self, data): | 99 | def init_rundepcheck(self, data): |
95 | self.abisaferecipes = (data.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE") or "").split() | 100 | self.abisaferecipes = (data.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE") or "").split() |
96 | self.saferecipedeps = (data.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS") or "").split() | 101 | self.saferecipedeps = (data.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS") or "").split() |
@@ -126,8 +131,8 @@ class SignatureGeneratorOEBasicHashMixIn(object): | |||
126 | newsafedeps.append(a1 + "->" + a2) | 131 | newsafedeps.append(a1 + "->" + a2) |
127 | self.saferecipedeps = newsafedeps | 132 | self.saferecipedeps = newsafedeps |
128 | 133 | ||
129 | def rundep_check(self, fn, recipename, task, dep, depname, dataCache = None): | 134 | def rundep_check(self, fn, recipename, task, dep, depname, dataCaches = None): |
130 | return sstate_rundepfilter(self, fn, recipename, task, dep, depname, dataCache) | 135 | return sstate_rundepfilter(self, fn, recipename, task, dep, depname, dataCaches) |
131 | 136 | ||
132 | def get_taskdata(self): | 137 | def get_taskdata(self): |
133 | return (self.lockedpnmap, self.lockedhashfn, self.lockedhashes) + super().get_taskdata() | 138 | return (self.lockedpnmap, self.lockedhashfn, self.lockedhashes) + super().get_taskdata() |
@@ -142,41 +147,41 @@ class SignatureGeneratorOEBasicHashMixIn(object): | |||
142 | self.dump_lockedsigs(sigfile) | 147 | self.dump_lockedsigs(sigfile) |
143 | return super(bb.siggen.SignatureGeneratorBasicHash, self).dump_sigs(dataCache, options) | 148 | return super(bb.siggen.SignatureGeneratorBasicHash, self).dump_sigs(dataCache, options) |
144 | 149 | ||
145 | def prep_taskhash(self, tid, deps, dataCache): | 150 | def prep_taskhash(self, tid, deps, dataCaches): |
146 | super().prep_taskhash(tid, deps, dataCache) | 151 | super().prep_taskhash(tid, deps, dataCaches) |
147 | if hasattr(self, "extramethod"): | 152 | if hasattr(self, "extramethod"): |
148 | (_, _, _, fn) = bb.runqueue.split_tid_mcfn(tid) | 153 | (mc, _, _, fn) = bb.runqueue.split_tid_mcfn(tid) |
149 | inherits = " ".join(dataCache.inherits[fn]) | 154 | inherits = " ".join(dataCaches[mc].inherits[fn]) |
150 | if inherits.find("/native.bbclass") != -1 or inherits.find("/cross.bbclass") != -1: | 155 | if inherits.find("/native.bbclass") != -1 or inherits.find("/cross.bbclass") != -1: |
151 | self.extramethod[tid] = ":" + self.buildarch | 156 | self.extramethod[tid] = ":" + self.buildarch |
152 | 157 | ||
153 | def get_taskhash(self, tid, deps, dataCache): | 158 | def get_taskhash(self, tid, deps, dataCaches): |
154 | if tid in self.lockedhashes: | 159 | if tid in self.lockedhashes: |
155 | if self.lockedhashes[tid]: | 160 | if self.lockedhashes[tid]: |
156 | return self.lockedhashes[tid] | 161 | return self.lockedhashes[tid] |
157 | else: | 162 | else: |
158 | return super().get_taskhash(tid, deps, dataCache) | 163 | return super().get_taskhash(tid, deps, dataCaches) |
159 | 164 | ||
160 | # get_taskhash will call get_unihash internally in the parent class, we | 165 | # get_taskhash will call get_unihash internally in the parent class, we |
161 | # need to disable our filter of it whilst this runs else | 166 | # need to disable our filter of it whilst this runs else |
162 | # incorrect hashes can be calculated. | 167 | # incorrect hashes can be calculated. |
163 | self._internal = True | 168 | self._internal = True |
164 | h = super().get_taskhash(tid, deps, dataCache) | 169 | h = super().get_taskhash(tid, deps, dataCaches) |
165 | self._internal = False | 170 | self._internal = False |
166 | 171 | ||
167 | (mc, _, task, fn) = bb.runqueue.split_tid_mcfn(tid) | 172 | (mc, _, task, fn) = bb.runqueue.split_tid_mcfn(tid) |
168 | 173 | ||
169 | recipename = dataCache.pkg_fn[fn] | 174 | recipename = dataCaches[mc].pkg_fn[fn] |
170 | self.lockedpnmap[fn] = recipename | 175 | self.lockedpnmap[fn] = recipename |
171 | self.lockedhashfn[fn] = dataCache.hashfn[fn] | 176 | self.lockedhashfn[fn] = dataCaches[mc].hashfn[fn] |
172 | 177 | ||
173 | unlocked = False | 178 | unlocked = False |
174 | if recipename in self.unlockedrecipes: | 179 | if recipename in self.unlockedrecipes: |
175 | unlocked = True | 180 | unlocked = True |
176 | else: | 181 | else: |
177 | def recipename_from_dep(dep): | 182 | def recipename_from_dep(dep): |
178 | fn = bb.runqueue.fn_from_tid(dep) | 183 | (depmc, _, _, depfn) = bb.runqueue.split_tid_mcfn(dep) |
179 | return dataCache.pkg_fn[fn] | 184 | return dataCaches[depmc].pkg_fn[depfn] |
180 | 185 | ||
181 | # If any unlocked recipe is in the direct dependencies then the | 186 | # If any unlocked recipe is in the direct dependencies then the |
182 | # current recipe should be unlocked as well. | 187 | # current recipe should be unlocked as well. |