mirror of
https://git.yoctoproject.org/poky
synced 2026-09-14 21:49:33 +02:00
bitbake: bitbake: Rename basehas and taskhash filtering variables
In line with the inclusive language migration defined at: https://wiki.yoctoproject.org/wiki/Inclusive_language rename: BB_HASHBASE_WHITELIST -> BB_BASEHASH_IGNORE_VARS BB_HASHTASK_WHITELIST -> BB_TASKHASH_IGNORE_TASKS the derived code variables basewhitelist and taskwhitelist have been renamed to basehash_ignore_vars and taskhash_ignore_tasks, respectively. [RP: Added compatibility mapping code and tweaked naming] (Bitbake rev: efaafc9ec2e8c0475e3fb27e877a1c0a5532a0e5) Signed-off-by: Scott Murray <scott.murray@konsulko.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
478cb0ce2c
commit
8a16bf5321
@@ -477,7 +477,7 @@ changes because it should not affect the output for target packages. The
|
|||||||
simplistic approach for excluding the working directory is to set it to
|
simplistic approach for excluding the working directory is to set it to
|
||||||
some fixed value and create the checksum for the "run" script. BitBake
|
some fixed value and create the checksum for the "run" script. BitBake
|
||||||
goes one step better and uses the
|
goes one step better and uses the
|
||||||
:term:`BB_HASHBASE_WHITELIST` variable
|
:term:`BB_BASEHASH_IGNORE_VARS` variable
|
||||||
to define a list of variables that should never be included when
|
to define a list of variables that should never be included when
|
||||||
generating the signatures.
|
generating the signatures.
|
||||||
|
|
||||||
@@ -538,7 +538,7 @@ in a list of global variable dependency excludes - variables never
|
|||||||
included in any checksum. This example uses variables from OpenEmbedded
|
included in any checksum. This example uses variables from OpenEmbedded
|
||||||
to help illustrate the concept::
|
to help illustrate the concept::
|
||||||
|
|
||||||
BB_HASHBASE_WHITELIST ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH DL_DIR \
|
BB_BASEHASH_IGNORE_VARS ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH DL_DIR \
|
||||||
SSTATE_DIR THISDIR FILESEXTRAPATHS FILE_DIRNAME HOME LOGNAME SHELL \
|
SSTATE_DIR THISDIR FILESEXTRAPATHS FILE_DIRNAME HOME LOGNAME SHELL \
|
||||||
USER FILESPATH STAGING_DIR_HOST STAGING_DIR_TARGET COREBASE PRSERV_HOST \
|
USER FILESPATH STAGING_DIR_HOST STAGING_DIR_TARGET COREBASE PRSERV_HOST \
|
||||||
PRSERV_DUMPDIR PRSERV_DUMPFILE PRSERV_LOCKDOWN PARALLEL_MAKE \
|
PRSERV_DUMPDIR PRSERV_DUMPFILE PRSERV_LOCKDOWN PARALLEL_MAKE \
|
||||||
|
|||||||
@@ -337,7 +337,7 @@ overview of their function and contents.
|
|||||||
|
|
||||||
For example usage, see :term:`BB_GIT_SHALLOW`.
|
For example usage, see :term:`BB_GIT_SHALLOW`.
|
||||||
|
|
||||||
:term:`BB_HASHBASE_WHITELIST`
|
:term:`BB_BASEHASH_IGNORE_VARS`
|
||||||
Lists variables that are excluded from checksum and dependency data.
|
Lists variables that are excluded from checksum and dependency data.
|
||||||
Variables that are excluded can therefore change without affecting
|
Variables that are excluded can therefore change without affecting
|
||||||
the checksum mechanism. A common example would be the variable for
|
the checksum mechanism. A common example would be the variable for
|
||||||
|
|||||||
@@ -369,7 +369,7 @@ def build_dependencies(key, keys, shelldeps, varflagsexcl, d):
|
|||||||
#bb.note("Variable %s references %s and calls %s" % (key, str(deps), str(execs)))
|
#bb.note("Variable %s references %s and calls %s" % (key, str(deps), str(execs)))
|
||||||
#d.setVarFlag(key, "vardeps", deps)
|
#d.setVarFlag(key, "vardeps", deps)
|
||||||
|
|
||||||
def generate_dependencies(d, whitelist):
|
def generate_dependencies(d, ignored_vars):
|
||||||
|
|
||||||
keys = set(key for key in d if not key.startswith("__"))
|
keys = set(key for key in d if not key.startswith("__"))
|
||||||
shelldeps = set(key for key in d.getVar("__exportlist", False) if d.getVarFlag(key, "export", False) and not d.getVarFlag(key, "unexport", False))
|
shelldeps = set(key for key in d.getVar("__exportlist", False) if d.getVarFlag(key, "export", False) and not d.getVarFlag(key, "unexport", False))
|
||||||
@@ -384,7 +384,7 @@ def generate_dependencies(d, whitelist):
|
|||||||
newdeps = deps[task]
|
newdeps = deps[task]
|
||||||
seen = set()
|
seen = set()
|
||||||
while newdeps:
|
while newdeps:
|
||||||
nextdeps = newdeps - whitelist
|
nextdeps = newdeps - ignored_vars
|
||||||
seen |= nextdeps
|
seen |= nextdeps
|
||||||
newdeps = set()
|
newdeps = set()
|
||||||
for dep in nextdeps:
|
for dep in nextdeps:
|
||||||
@@ -395,7 +395,7 @@ def generate_dependencies(d, whitelist):
|
|||||||
#print "For %s: %s" % (task, str(deps[task]))
|
#print "For %s: %s" % (task, str(deps[task]))
|
||||||
return tasklist, deps, values
|
return tasklist, deps, values
|
||||||
|
|
||||||
def generate_dependency_hash(tasklist, gendeps, lookupcache, whitelist, fn):
|
def generate_dependency_hash(tasklist, gendeps, lookupcache, ignored_vars, fn):
|
||||||
taskdeps = {}
|
taskdeps = {}
|
||||||
basehash = {}
|
basehash = {}
|
||||||
|
|
||||||
@@ -408,7 +408,7 @@ def generate_dependency_hash(tasklist, gendeps, lookupcache, whitelist, fn):
|
|||||||
else:
|
else:
|
||||||
data = [data]
|
data = [data]
|
||||||
|
|
||||||
gendeps[task] -= whitelist
|
gendeps[task] -= ignored_vars
|
||||||
newdeps = gendeps[task]
|
newdeps = gendeps[task]
|
||||||
seen = set()
|
seen = set()
|
||||||
while newdeps:
|
while newdeps:
|
||||||
@@ -416,9 +416,9 @@ def generate_dependency_hash(tasklist, gendeps, lookupcache, whitelist, fn):
|
|||||||
seen |= nextdeps
|
seen |= nextdeps
|
||||||
newdeps = set()
|
newdeps = set()
|
||||||
for dep in nextdeps:
|
for dep in nextdeps:
|
||||||
if dep in whitelist:
|
if dep in ignored_vars:
|
||||||
continue
|
continue
|
||||||
gendeps[dep] -= whitelist
|
gendeps[dep] -= ignored_vars
|
||||||
newdeps |= gendeps[dep]
|
newdeps |= gendeps[dep]
|
||||||
newdeps -= seen
|
newdeps -= seen
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ __whitespace_split__ = re.compile(r'(\s)')
|
|||||||
__override_regexp__ = re.compile(r'[a-z0-9]+')
|
__override_regexp__ = re.compile(r'[a-z0-9]+')
|
||||||
|
|
||||||
bitbake_renamed_vars = {
|
bitbake_renamed_vars = {
|
||||||
|
"BB_HASHBASE_WHITELIST": "BB_BASEHASH_IGNORE_VARS",
|
||||||
|
"BB_HASHTASK_WHITELIST": "BB_TASKHASH_IGNORE_TASKS",
|
||||||
}
|
}
|
||||||
|
|
||||||
def infer_caller_details(loginfo, parent = False, varval = True):
|
def infer_caller_details(loginfo, parent = False, varval = True):
|
||||||
|
|||||||
@@ -172,8 +172,8 @@ class SignatureGeneratorBasic(SignatureGenerator):
|
|||||||
self.gendeps = {}
|
self.gendeps = {}
|
||||||
self.lookupcache = {}
|
self.lookupcache = {}
|
||||||
self.setscenetasks = set()
|
self.setscenetasks = set()
|
||||||
self.basewhitelist = set((data.getVar("BB_HASHBASE_WHITELIST") or "").split())
|
self.basehash_ignore_vars = set((data.getVar("BB_BASEHASH_IGNORE_VARS") or "").split())
|
||||||
self.taskwhitelist = None
|
self.taskhash_ignore_tasks = None
|
||||||
self.init_rundepcheck(data)
|
self.init_rundepcheck(data)
|
||||||
checksum_cache_file = data.getVar("BB_HASH_CHECKSUM_CACHE_FILE")
|
checksum_cache_file = data.getVar("BB_HASH_CHECKSUM_CACHE_FILE")
|
||||||
if checksum_cache_file:
|
if checksum_cache_file:
|
||||||
@@ -188,18 +188,18 @@ class SignatureGeneratorBasic(SignatureGenerator):
|
|||||||
self.tidtopn = {}
|
self.tidtopn = {}
|
||||||
|
|
||||||
def init_rundepcheck(self, data):
|
def init_rundepcheck(self, data):
|
||||||
self.taskwhitelist = data.getVar("BB_HASHTASK_WHITELIST") or None
|
self.taskhash_ignore_tasks = data.getVar("BB_TASKHASH_IGNORE_TASKS") or None
|
||||||
if self.taskwhitelist:
|
if self.taskhash_ignore_tasks:
|
||||||
self.twl = re.compile(self.taskwhitelist)
|
self.twl = re.compile(self.taskhash_ignore_tasks)
|
||||||
else:
|
else:
|
||||||
self.twl = None
|
self.twl = None
|
||||||
|
|
||||||
def _build_data(self, fn, d):
|
def _build_data(self, fn, d):
|
||||||
|
|
||||||
ignore_mismatch = ((d.getVar("BB_HASH_IGNORE_MISMATCH") or '') == '1')
|
ignore_mismatch = ((d.getVar("BB_HASH_IGNORE_MISMATCH") or '') == '1')
|
||||||
tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d, self.basewhitelist)
|
tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d, self.basehash_ignore_vars)
|
||||||
|
|
||||||
taskdeps, basehash = bb.data.generate_dependency_hash(tasklist, gendeps, lookupcache, self.basewhitelist, fn)
|
taskdeps, basehash = bb.data.generate_dependency_hash(tasklist, gendeps, lookupcache, self.basehash_ignore_vars, fn)
|
||||||
|
|
||||||
for task in tasklist:
|
for task in tasklist:
|
||||||
tid = fn + ":" + task
|
tid = fn + ":" + task
|
||||||
@@ -253,7 +253,8 @@ class SignatureGeneratorBasic(SignatureGenerator):
|
|||||||
|
|
||||||
def rundep_check(self, fn, recipename, task, dep, depname, dataCaches):
|
def rundep_check(self, fn, recipename, task, dep, depname, dataCaches):
|
||||||
# Return True if we should keep the dependency, False to drop it
|
# Return True if we should keep the dependency, False to drop it
|
||||||
# We only manipulate the dependencies for packages not in the whitelist
|
# We only manipulate the dependencies for packages not in the ignore
|
||||||
|
# list
|
||||||
if self.twl and not self.twl.search(recipename):
|
if self.twl and not self.twl.search(recipename):
|
||||||
# then process the actual dependencies
|
# then process the actual dependencies
|
||||||
if self.twl.search(depname):
|
if self.twl.search(depname):
|
||||||
@@ -372,15 +373,15 @@ class SignatureGeneratorBasic(SignatureGenerator):
|
|||||||
|
|
||||||
data = {}
|
data = {}
|
||||||
data['task'] = task
|
data['task'] = task
|
||||||
data['basewhitelist'] = self.basewhitelist
|
data['basehash_ignore_vars'] = self.basehash_ignore_vars
|
||||||
data['taskwhitelist'] = self.taskwhitelist
|
data['taskhash_ignore_tasks'] = self.taskhash_ignore_tasks
|
||||||
data['taskdeps'] = self.taskdeps[fn][task]
|
data['taskdeps'] = self.taskdeps[fn][task]
|
||||||
data['basehash'] = self.basehash[tid]
|
data['basehash'] = self.basehash[tid]
|
||||||
data['gendeps'] = {}
|
data['gendeps'] = {}
|
||||||
data['varvals'] = {}
|
data['varvals'] = {}
|
||||||
data['varvals'][task] = self.lookupcache[fn][task]
|
data['varvals'][task] = self.lookupcache[fn][task]
|
||||||
for dep in self.taskdeps[fn][task]:
|
for dep in self.taskdeps[fn][task]:
|
||||||
if dep in self.basewhitelist:
|
if dep in self.basehash_ignore_vars:
|
||||||
continue
|
continue
|
||||||
data['gendeps'][dep] = self.gendeps[fn][dep]
|
data['gendeps'][dep] = self.gendeps[fn][dep]
|
||||||
data['varvals'][dep] = self.lookupcache[fn][dep]
|
data['varvals'][dep] = self.lookupcache[fn][dep]
|
||||||
@@ -794,6 +795,16 @@ def clean_basepaths_list(a):
|
|||||||
b.append(clean_basepath(x))
|
b.append(clean_basepath(x))
|
||||||
return b
|
return b
|
||||||
|
|
||||||
|
# Handled renamed fields
|
||||||
|
def handle_renames(data):
|
||||||
|
if 'basewhitelist' in data:
|
||||||
|
data['basehash_ignore_vars'] = data['basewhitelist']
|
||||||
|
del data['basewhitelist']
|
||||||
|
if 'taskwhitelist' in data:
|
||||||
|
data['taskhash_ignore_tasks'] = data['taskwhitelist']
|
||||||
|
del data['taskwhitelist']
|
||||||
|
|
||||||
|
|
||||||
def compare_sigfiles(a, b, recursecb=None, color=False, collapsed=False):
|
def compare_sigfiles(a, b, recursecb=None, color=False, collapsed=False):
|
||||||
output = []
|
output = []
|
||||||
|
|
||||||
@@ -819,13 +830,16 @@ def compare_sigfiles(a, b, recursecb=None, color=False, collapsed=False):
|
|||||||
with bb.compress.zstd.open(b, "rt", encoding="utf-8", num_threads=1) as f:
|
with bb.compress.zstd.open(b, "rt", encoding="utf-8", num_threads=1) as f:
|
||||||
b_data = json.load(f, object_hook=SetDecoder)
|
b_data = json.load(f, object_hook=SetDecoder)
|
||||||
|
|
||||||
def dict_diff(a, b, whitelist=set()):
|
for data in [a_data, b_data]:
|
||||||
|
handle_renames(data)
|
||||||
|
|
||||||
|
def dict_diff(a, b, ignored_vars=set()):
|
||||||
sa = set(a.keys())
|
sa = set(a.keys())
|
||||||
sb = set(b.keys())
|
sb = set(b.keys())
|
||||||
common = sa & sb
|
common = sa & sb
|
||||||
changed = set()
|
changed = set()
|
||||||
for i in common:
|
for i in common:
|
||||||
if a[i] != b[i] and i not in whitelist:
|
if a[i] != b[i] and i not in ignored_vars:
|
||||||
changed.add(i)
|
changed.add(i)
|
||||||
added = sb - sa
|
added = sb - sa
|
||||||
removed = sa - sb
|
removed = sa - sb
|
||||||
@@ -864,15 +878,15 @@ def compare_sigfiles(a, b, recursecb=None, color=False, collapsed=False):
|
|||||||
removed = [x[0] for x in removed]
|
removed = [x[0] for x in removed]
|
||||||
return changed, added, removed
|
return changed, added, removed
|
||||||
|
|
||||||
if 'basewhitelist' in a_data and a_data['basewhitelist'] != b_data['basewhitelist']:
|
if 'basehash_ignore_vars' in a_data and a_data['basehash_ignore_vars'] != b_data['basehash_ignore_vars']:
|
||||||
output.append(color_format("{color_title}basewhitelist changed{color_default} from '%s' to '%s'") % (a_data['basewhitelist'], b_data['basewhitelist']))
|
output.append(color_format("{color_title}basehash_ignore_vars changed{color_default} from '%s' to '%s'") % (a_data['basehash_ignore_vars'], b_data['basehash_ignore_vars']))
|
||||||
if a_data['basewhitelist'] and b_data['basewhitelist']:
|
if a_data['basehash_ignore_vars'] and b_data['basehash_ignore_vars']:
|
||||||
output.append("changed items: %s" % a_data['basewhitelist'].symmetric_difference(b_data['basewhitelist']))
|
output.append("changed items: %s" % a_data['basehash_ignore_vars'].symmetric_difference(b_data['basehash_ignore_vars']))
|
||||||
|
|
||||||
if 'taskwhitelist' in a_data and a_data['taskwhitelist'] != b_data['taskwhitelist']:
|
if 'taskhash_ignore_tasks' in a_data and a_data['taskhash_ignore_tasks'] != b_data['taskhash_ignore_tasks']:
|
||||||
output.append(color_format("{color_title}taskwhitelist changed{color_default} from '%s' to '%s'") % (a_data['taskwhitelist'], b_data['taskwhitelist']))
|
output.append(color_format("{color_title}taskhash_ignore_tasks changed{color_default} from '%s' to '%s'") % (a_data['taskhash_ignore_tasks'], b_data['taskhash_ignore_tasks']))
|
||||||
if a_data['taskwhitelist'] and b_data['taskwhitelist']:
|
if a_data['taskhash_ignore_tasks'] and b_data['taskhash_ignore_tasks']:
|
||||||
output.append("changed items: %s" % a_data['taskwhitelist'].symmetric_difference(b_data['taskwhitelist']))
|
output.append("changed items: %s" % a_data['taskhash_ignore_tasks'].symmetric_difference(b_data['taskhash_ignore_tasks']))
|
||||||
|
|
||||||
if a_data['taskdeps'] != b_data['taskdeps']:
|
if a_data['taskdeps'] != b_data['taskdeps']:
|
||||||
output.append(color_format("{color_title}Task dependencies changed{color_default} from:\n%s\nto:\n%s") % (sorted(a_data['taskdeps']), sorted(b_data['taskdeps'])))
|
output.append(color_format("{color_title}Task dependencies changed{color_default} from:\n%s\nto:\n%s") % (sorted(a_data['taskdeps']), sorted(b_data['taskdeps'])))
|
||||||
@@ -880,7 +894,7 @@ def compare_sigfiles(a, b, recursecb=None, color=False, collapsed=False):
|
|||||||
if a_data['basehash'] != b_data['basehash'] and not collapsed:
|
if a_data['basehash'] != b_data['basehash'] and not collapsed:
|
||||||
output.append(color_format("{color_title}basehash changed{color_default} from %s to %s") % (a_data['basehash'], b_data['basehash']))
|
output.append(color_format("{color_title}basehash changed{color_default} from %s to %s") % (a_data['basehash'], b_data['basehash']))
|
||||||
|
|
||||||
changed, added, removed = dict_diff(a_data['gendeps'], b_data['gendeps'], a_data['basewhitelist'] & b_data['basewhitelist'])
|
changed, added, removed = dict_diff(a_data['gendeps'], b_data['gendeps'], a_data['basehash_ignore_vars'] & b_data['basehash_ignore_vars'])
|
||||||
if changed:
|
if changed:
|
||||||
for dep in sorted(changed):
|
for dep in sorted(changed):
|
||||||
output.append(color_format("{color_title}List of dependencies for variable %s changed from '{color_default}%s{color_title}' to '{color_default}%s{color_title}'") % (dep, a_data['gendeps'][dep], b_data['gendeps'][dep]))
|
output.append(color_format("{color_title}List of dependencies for variable %s changed from '{color_default}%s{color_title}' to '{color_default}%s{color_title}'") % (dep, a_data['gendeps'][dep], b_data['gendeps'][dep]))
|
||||||
@@ -1054,9 +1068,11 @@ def dump_sigfile(a):
|
|||||||
with bb.compress.zstd.open(a, "rt", encoding="utf-8", num_threads=1) as f:
|
with bb.compress.zstd.open(a, "rt", encoding="utf-8", num_threads=1) as f:
|
||||||
a_data = json.load(f, object_hook=SetDecoder)
|
a_data = json.load(f, object_hook=SetDecoder)
|
||||||
|
|
||||||
output.append("basewhitelist: %s" % (sorted(a_data['basewhitelist'])))
|
handle_renames(a_data)
|
||||||
|
|
||||||
output.append("taskwhitelist: %s" % (sorted(a_data['taskwhitelist'] or [])))
|
output.append("basehash_ignore_vars: %s" % (sorted(a_data['basehash_ignore_vars'])))
|
||||||
|
|
||||||
|
output.append("taskhash_ignore_tasks: %s" % (sorted(a_data['taskhash_ignore_tasks'] or [])))
|
||||||
|
|
||||||
output.append("Task dependencies: %s" % (sorted(a_data['taskdeps'])))
|
output.append("Task dependencies: %s" % (sorted(a_data['taskdeps'])))
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,6 @@ STAMP = "${TMPDIR}/stamps/${PN}"
|
|||||||
T = "${TMPDIR}/workdir/${PN}/temp"
|
T = "${TMPDIR}/workdir/${PN}/temp"
|
||||||
BB_NUMBER_THREADS = "4"
|
BB_NUMBER_THREADS = "4"
|
||||||
|
|
||||||
BB_HASHBASE_WHITELIST = "BB_CURRENT_MC BB_HASHSERVE TMPDIR TOPDIR SLOWTASKS SSTATEVALID FILE BB_CURRENTTASK"
|
BB_BASEHASH_IGNORE_VARS = "BB_CURRENT_MC BB_HASHSERVE TMPDIR TOPDIR SLOWTASKS SSTATEVALID FILE BB_CURRENTTASK"
|
||||||
|
|
||||||
include conf/multiconfig/${BB_CURRENT_MC}.conf
|
include conf/multiconfig/${BB_CURRENT_MC}.conf
|
||||||
|
|||||||
Reference in New Issue
Block a user