From patchwork Wed May 30 16:17:18 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel,5/5] bitbake: include varflags in checksums Date: Wed, 30 May 2012 16:17:18 -0000 From: Paul Eggleton X-Patchwork-Id: 28957 Message-Id: To: bitbake-devel@lists.openembedded.org Add a dependency to each variable on a filtered list of its varflags. This is intended to catch things such as SRC_URI checksums, varflags controlling extra functionality from classes (e.g. the recently updated update-alternatives class in OE-Core), etc. and ensure their values influence the sstate checksums. There is an exclusion list which needs to be set via bitbake.conf (BB_SIGNATURE_EXCLUDE_FLAGS), if this is not set then the functionality is disabled. The existing vardepsexclude mechanism can also be used to exclude undesired varflags, but they must be fully specified, e.g.: do_patch[vardepsexclude] += "do_patch[someflag]" Implements [YOCTO #2517]. Signed-off-by: Paul Eggleton --- bitbake/lib/bb/data.py | 20 +++++++++++++++++++- bitbake/lib/bb/siggen.py | 4 ++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index c0636e1..e3ffefe 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py @@ -279,7 +279,12 @@ def build_dependencies(key, keys, shelldeps, vardepvals, d): deps = set() vardeps = d.getVarFlag(key, "vardeps", True) try: - value = d.getVar(key, False) + if key[-1] == ']': + vf = key[:-1].split('[') + value = d.getVarFlag(vf[0], vf[1], False) + else: + value = d.getVar(key, False) + if key in vardepvals: value = d.getVarFlag(key, "vardepvalue", True) elif d.getVarFlag(key, "func"): @@ -301,6 +306,19 @@ def build_dependencies(key, keys, shelldeps, vardepvals, d): parser = d.expandWithRefs(value, key) deps |= parser.references deps = deps | (keys & parser.execs) + + # Add varflags, assuming an exclusion list is set + varflagsexcl = d.getVar('BB_SIGNATURE_EXCLUDE_FLAGS', True) + if varflagsexcl: + varfdeps = [] + varflags = d.getVarFlags(key) + if varflags: + for f in varflags: + if f not in varflagsexcl: + varfdeps.append('%s[%s]' % (key, f)) + if varfdeps: + deps |= set(varfdeps) + deps |= set((vardeps or "").split()) deps -= set((d.getVarFlag(key, "vardepsexclude", True) or "").split()) except: diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index daf5677..c4b7c39 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py @@ -108,6 +108,10 @@ class SignatureGeneratorBasic(SignatureGenerator): data = data + dep if dep in lookupcache: var = lookupcache[dep] + elif dep[-1] == ']': + vf = dep[:-1].split('[') + var = d.getVarFlag(vf[0], vf[1], False) + lookupcache[dep] = var else: var = d.getVar(dep, False) lookupcache[dep] = var