diff options
| -rw-r--r-- | meta/lib/oe/sstatesig.py | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py index add26193bc..a108761972 100644 --- a/meta/lib/oe/sstatesig.py +++ b/meta/lib/oe/sstatesig.py | |||
| @@ -92,6 +92,7 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash): | |||
| 92 | self.lockedpnmap = {} | 92 | self.lockedpnmap = {} |
| 93 | self.lockedhashfn = {} | 93 | self.lockedhashfn = {} |
| 94 | self.machine = data.getVar("MACHINE", True) | 94 | self.machine = data.getVar("MACHINE", True) |
| 95 | self.mismatch_msgs = [] | ||
| 95 | pass | 96 | pass |
| 96 | def rundep_check(self, fn, recipename, task, dep, depname, dataCache = None): | 97 | def rundep_check(self, fn, recipename, task, dep, depname, dataCache = None): |
| 97 | return sstate_rundepfilter(self, fn, recipename, task, dep, depname, dataCache) | 98 | return sstate_rundepfilter(self, fn, recipename, task, dep, depname, dataCache) |
| @@ -109,18 +110,24 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash): | |||
| 109 | return super(bb.siggen.SignatureGeneratorBasicHash, self).dump_sigs(dataCache, options) | 110 | return super(bb.siggen.SignatureGeneratorBasicHash, self).dump_sigs(dataCache, options) |
| 110 | 111 | ||
| 111 | def get_taskhash(self, fn, task, deps, dataCache): | 112 | def get_taskhash(self, fn, task, deps, dataCache): |
| 113 | h = super(bb.siggen.SignatureGeneratorBasicHash, self).get_taskhash(fn, task, deps, dataCache) | ||
| 114 | |||
| 112 | recipename = dataCache.pkg_fn[fn] | 115 | recipename = dataCache.pkg_fn[fn] |
| 113 | self.lockedpnmap[fn] = recipename | 116 | self.lockedpnmap[fn] = recipename |
| 114 | self.lockedhashfn[fn] = dataCache.hashfn[fn] | 117 | self.lockedhashfn[fn] = dataCache.hashfn[fn] |
| 115 | if recipename in self.lockedsigs: | 118 | if recipename in self.lockedsigs: |
| 116 | if task in self.lockedsigs[recipename]: | 119 | if task in self.lockedsigs[recipename]: |
| 117 | k = fn + "." + task | 120 | k = fn + "." + task |
| 118 | h = self.lockedsigs[recipename][task] | 121 | h_locked = self.lockedsigs[recipename][task] |
| 119 | self.lockedhashes[k] = h | 122 | self.lockedhashes[k] = h_locked |
| 120 | self.taskhash[k] = h | 123 | self.taskhash[k] = h_locked |
| 121 | #bb.warn("Using %s %s %s" % (recipename, task, h)) | 124 | #bb.warn("Using %s %s %s" % (recipename, task, h)) |
| 122 | return h | 125 | |
| 123 | h = super(bb.siggen.SignatureGeneratorBasicHash, self).get_taskhash(fn, task, deps, dataCache) | 126 | if h != h_locked: |
| 127 | self.mismatch_msgs.append('The %s:%s sig (%s) changed, use locked sig %s to instead' | ||
| 128 | % (recipename, task, h, h_locked)) | ||
| 129 | |||
| 130 | return h_locked | ||
| 124 | #bb.warn("%s %s %s" % (recipename, task, h)) | 131 | #bb.warn("%s %s %s" % (recipename, task, h)) |
| 125 | return h | 132 | return h |
| 126 | 133 | ||
| @@ -130,8 +137,11 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash): | |||
| 130 | return | 137 | return |
| 131 | super(bb.siggen.SignatureGeneratorBasicHash, self).dump_sigtask(fn, task, stampbase, runtime) | 138 | super(bb.siggen.SignatureGeneratorBasicHash, self).dump_sigtask(fn, task, stampbase, runtime) |
| 132 | 139 | ||
| 133 | def dump_lockedsigs(self): | 140 | def dump_lockedsigs(self, sigfile=None): |
| 134 | bb.plain("Writing locked sigs to " + os.getcwd() + "/locked-sigs.inc") | 141 | if not sigfile: |
| 142 | sigfile = os.getcwd() + "/locked-sigs.inc" | ||
| 143 | |||
| 144 | bb.plain("Writing locked sigs to %s" % sigfile) | ||
| 135 | types = {} | 145 | types = {} |
| 136 | for k in self.runtaskdeps: | 146 | for k in self.runtaskdeps: |
| 137 | fn = k.rsplit(".",1)[0] | 147 | fn = k.rsplit(".",1)[0] |
| @@ -140,11 +150,11 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash): | |||
| 140 | types[t] = [] | 150 | types[t] = [] |
| 141 | types[t].append(k) | 151 | types[t].append(k) |
| 142 | 152 | ||
| 143 | with open("locked-sigs.inc", "w") as f: | 153 | with open(sigfile, "w") as f: |
| 144 | for t in types: | 154 | for t in types: |
| 145 | f.write('SIGGEN_LOCKEDSIGS_%s = "\\\n' % t) | 155 | f.write('SIGGEN_LOCKEDSIGS_%s = "\\\n' % t) |
| 146 | types[t].sort() | 156 | types[t].sort() |
| 147 | sortedk = sorted(types[t], key=lambda k: self.lockedpnmap[k.rsplit(".",1)[0]]) | 157 | sortedk = sorted(types[t], key=lambda k: self.lockedpnmap[k.rsplit(".",1)[0]]) |
| 148 | for k in sortedk: | 158 | for k in sortedk: |
| 149 | fn = k.rsplit(".",1)[0] | 159 | fn = k.rsplit(".",1)[0] |
| 150 | task = k.rsplit(".",1)[1] | 160 | task = k.rsplit(".",1)[1] |
| @@ -155,17 +165,18 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash): | |||
| 155 | f.write('SIGGEN_LOCKEDSIGS_TYPES_%s = "%s"' % (self.machine, " ".join(types.keys()))) | 165 | f.write('SIGGEN_LOCKEDSIGS_TYPES_%s = "%s"' % (self.machine, " ".join(types.keys()))) |
| 156 | 166 | ||
| 157 | def checkhashes(self, missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d): | 167 | def checkhashes(self, missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d): |
| 158 | enforce = (d.getVar("SIGGEN_ENFORCE_LOCKEDSIGS", True) or "1") == "1" | 168 | checklevel = d.getVar("SIGGEN_LOCKEDSIGS_CHECK_LEVEL", True) |
| 159 | msgs = [] | ||
| 160 | for task in range(len(sq_fn)): | 169 | for task in range(len(sq_fn)): |
| 161 | if task not in ret: | 170 | if task not in ret: |
| 162 | for pn in self.lockedsigs: | 171 | for pn in self.lockedsigs: |
| 163 | if sq_hash[task] in self.lockedsigs[pn].itervalues(): | 172 | if sq_hash[task] in self.lockedsigs[pn].itervalues(): |
| 164 | msgs.append("Locked sig is set for %s:%s (%s) yet not in sstate cache?" % (pn, sq_task[task], sq_hash[task])) | 173 | self.mismatch_msgs.append("Locked sig is set for %s:%s (%s) yet not in sstate cache?" |
| 165 | if msgs and enforce: | 174 | % (pn, sq_task[task], sq_hash[task])) |
| 166 | bb.fatal("\n".join(msgs)) | 175 | |
| 167 | elif msgs: | 176 | if self.mismatch_msgs and checklevel == 'warn': |
| 168 | bb.warn("\n".join(msgs)) | 177 | bb.warn("\n".join(self.mismatch_msgs)) |
| 178 | elif self.mismatch_msgs and checklevel == 'error': | ||
| 179 | bb.fatal("\n".join(self.mismatch_msgs)) | ||
| 169 | 180 | ||
| 170 | 181 | ||
| 171 | # Insert these classes into siggen's namespace so it can see and select them | 182 | # Insert these classes into siggen's namespace so it can see and select them |
