summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/data.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-11-27 21:16:16 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-17 08:52:28 +0000
commitf3bcd3c9a91f6212c30b9c778c11f3c8a9f6f1d4 (patch)
tree760b8dac27191ea1a625476d84c0651aa2788a5f /bitbake/lib/bb/data.py
parenta225aa3ec4726161172ca4b03d02751b1250e7ae (diff)
downloadpoky-f3bcd3c9a91f6212c30b9c778c11f3c8a9f6f1d4.tar.gz
bitbake: ast/data/codeparser: Add dependencies from python module functions
Moving code into python modules is a very effective way to reduce parsing time and overhead in recipes. The downside has always been that any dependency information on which variables those functions access is lost and the hashes can therefore become less reliable. This patch adds parsing of the imported module functions and that dependency information is them injected back into the hash dependency information. Intermodule function references are resolved to the full function call names in our module namespace to ensure interfunction dependencies are correctly handled too. (Bitbake rev: 605c478ce14cdc3c02d6ef6d57146a76d436a83c) (Bitbake rev: 91441e157e495b02db44e19e836afad366ee8924) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/data.py')
-rw-r--r--bitbake/lib/bb/data.py15
1 files changed, 11 insertions, 4 deletions
diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py
index bfaa0410ea..841369699e 100644
--- a/bitbake/lib/bb/data.py
+++ b/bitbake/lib/bb/data.py
@@ -261,7 +261,7 @@ def emit_func_python(func, o=sys.__stdout__, d = init()):
261 newdeps |= set((d.getVarFlag(dep, "vardeps") or "").split()) 261 newdeps |= set((d.getVarFlag(dep, "vardeps") or "").split())
262 newdeps -= seen 262 newdeps -= seen
263 263
264def build_dependencies(key, keys, shelldeps, varflagsexcl, ignored_vars, d): 264def build_dependencies(key, keys, mod_funcs, shelldeps, varflagsexcl, ignored_vars, d):
265 def handle_contains(value, contains, exclusions, d): 265 def handle_contains(value, contains, exclusions, d):
266 newvalue = [] 266 newvalue = []
267 if value: 267 if value:
@@ -289,6 +289,12 @@ def build_dependencies(key, keys, shelldeps, varflagsexcl, ignored_vars, d):
289 289
290 deps = set() 290 deps = set()
291 try: 291 try:
292 if key in mod_funcs:
293 exclusions = set()
294 moddep = bb.codeparser.modulecode_deps[key]
295 value = handle_contains("", moddep[3], exclusions, d)
296 return frozenset((moddep[0] | keys & moddep[1]) - ignored_vars), value
297
292 if key[-1] == ']': 298 if key[-1] == ']':
293 vf = key[:-1].split('[') 299 vf = key[:-1].split('[')
294 if vf[1] == "vardepvalueexclude": 300 if vf[1] == "vardepvalueexclude":
@@ -367,7 +373,8 @@ def build_dependencies(key, keys, shelldeps, varflagsexcl, ignored_vars, d):
367 373
368def generate_dependencies(d, ignored_vars): 374def generate_dependencies(d, ignored_vars):
369 375
370 keys = set(key for key in d if not key.startswith("__")) 376 mod_funcs = set(bb.codeparser.modulecode_deps.keys())
377 keys = set(key for key in d if not key.startswith("__")) | mod_funcs
371 shelldeps = set(key for key in d.getVar("__exportlist", False) if d.getVarFlag(key, "export", False) and not d.getVarFlag(key, "unexport", False)) 378 shelldeps = set(key for key in d.getVar("__exportlist", False) if d.getVarFlag(key, "export", False) and not d.getVarFlag(key, "unexport", False))
372 varflagsexcl = d.getVar('BB_SIGNATURE_EXCLUDE_FLAGS') 379 varflagsexcl = d.getVar('BB_SIGNATURE_EXCLUDE_FLAGS')
373 380
@@ -376,7 +383,7 @@ def generate_dependencies(d, ignored_vars):
376 383
377 tasklist = d.getVar('__BBTASKS', False) or [] 384 tasklist = d.getVar('__BBTASKS', False) or []
378 for task in tasklist: 385 for task in tasklist:
379 deps[task], values[task] = build_dependencies(task, keys, shelldeps, varflagsexcl, ignored_vars, d) 386 deps[task], values[task] = build_dependencies(task, keys, mod_funcs, shelldeps, varflagsexcl, ignored_vars, d)
380 newdeps = deps[task] 387 newdeps = deps[task]
381 seen = set() 388 seen = set()
382 while newdeps: 389 while newdeps:
@@ -385,7 +392,7 @@ def generate_dependencies(d, ignored_vars):
385 newdeps = set() 392 newdeps = set()
386 for dep in nextdeps: 393 for dep in nextdeps:
387 if dep not in deps: 394 if dep not in deps:
388 deps[dep], values[dep] = build_dependencies(dep, keys, shelldeps, varflagsexcl, ignored_vars, d) 395 deps[dep], values[dep] = build_dependencies(dep, keys, mod_funcs, shelldeps, varflagsexcl, ignored_vars, d)
389 newdeps |= deps[dep] 396 newdeps |= deps[dep]
390 newdeps -= seen 397 newdeps -= seen
391 #print "For %s: %s" % (task, str(deps[task])) 398 #print "For %s: %s" % (task, str(deps[task]))