summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2015-03-30 13:29:33 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-01-17 17:51:56 +0000
commitd9a695e9e546cf3a158c88b0ecf2ecc132fb52e5 (patch)
tree3ce4b39520651be5584d56be58f6d14b8da821b9
parentaa56ab0593b36abb4d7d2303ab19eb80d9cee93d (diff)
downloadbitbake-d9a695e9e546cf3a158c88b0ecf2ecc132fb52e5.tar.gz
cooker: Ensure bbappend files are processed in a determistic order1.22
self.appendlist is a dict and as such unordered. This can lead to cases where appends with different names (e.g. x_%.bbappend vs. x_123.bbappend) can be reordered in application which in turn reorders the variables that those bbappend files might touch. Reorderd variables changes the sstate cache signatures causing real world issues. To avoid this, use a list for the append files instead. This patch is conservative and just adds a new data structure alongside the existing one and uses it to resolve the core issue. Later patches (post release) can handle some of the wider but less problematic ones (e.g. issues in bitbake-layers flatten). [YOCTO #7511] Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/cooker.py16
1 files changed, 9 insertions, 7 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index f44a08889..a2c9b1023 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -1408,6 +1408,7 @@ class CookerExit(bb.event.Event):
class CookerCollectFiles(object):
def __init__(self, priorities):
self.appendlist = {}
+ self.bbappends = []
self.appliedappendlist = []
self.bbfile_config_priorities = priorities
@@ -1502,6 +1503,7 @@ class CookerCollectFiles(object):
# Build a list of .bbappend files for each .bb file
for f in bbappend:
base = os.path.basename(f).replace('.bbappend', '.bb')
+ self.bbappends.append((base, f))
if not base in self.appendlist:
self.appendlist[base] = []
if f not in self.appendlist[base]:
@@ -1527,11 +1529,11 @@ class CookerCollectFiles(object):
"""
filelist = []
f = os.path.basename(fn)
- for bbappend in self.appendlist:
+ for b in self.bbappends:
+ (bbappend, filename) = b
if (bbappend == f) or ('%' in bbappend and bbappend.startswith(f[:bbappend.index('%')])):
self.appliedappendlist.append(bbappend)
- for filename in self.appendlist[bbappend]:
- filelist.append(filename)
+ filelist.append(filename)
return filelist
def collection_priorities(self, pkgfns):
@@ -1551,10 +1553,10 @@ class CookerCollectFiles(object):
unmatched.add(regex)
def findmatch(regex):
- for bbfile in self.appendlist:
- for append in self.appendlist[bbfile]:
- if regex.match(append):
- return True
+ for b in self.bbappends:
+ (bbfile, append) = b
+ if regex.match(append):
+ return True
return False
for unmatch in unmatched.copy():