summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorChris Laplante <chris.laplante@agilent.com>2019-06-07 14:24:04 -0400
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-06-11 13:27:19 +0100
commitf77badd46a62d8b594ec04b0fa955a19135eacb7 (patch)
treeee974c38615a25522c937d6d01986ce679d25fde /bitbake
parent768746959089f8fa0e6e73f3917abebfae22d652 (diff)
downloadpoky-f77badd46a62d8b594ec04b0fa955a19135eacb7.tar.gz
bitbake: build: implement custom progress handlers injected via OE_EXTRA_IMPORTS
A separate patch to base.bbclass (in poky) will add the OE_EXTRA_IMPORTS variable. The contents are appended into OE_IMPORTS. This provides a mechanism by which layers (in their layer.conf) can make custom progress handlers available. As a backup, individual recipes can inject progress handlers into __builtins__. Custom handlers are expected to have this __init__ signature: def __init__(self, d, outfile=None, otherargs=None): Recipes can then use the handlers like this: do_task[progress] = "custom:mylayer.util.ProgressHandler[:args]" The last part (everything after and including the second colon) is optional. If provided, it is passed to HandlerClass's __init__ as otherargs="args". Otherwise, otherargs=None. (Bitbake rev: 20289d62c84c393990dd3deb0cca1b17c09092e6) Signed-off-by: Chris Laplante <chris.laplante@agilent.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/build.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index 85ad8ea689..e2f91fa3b7 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -356,6 +356,27 @@ def create_progress_handler(func, progress, logfile, d):
356 elif progress.startswith('outof:'): 356 elif progress.startswith('outof:'):
357 # Use specified regex 357 # Use specified regex
358 return bb.progress.OutOfProgressHandler(d, regex=progress.split(':', 1)[1], outfile=logfile) 358 return bb.progress.OutOfProgressHandler(d, regex=progress.split(':', 1)[1], outfile=logfile)
359 elif progress.startswith("custom:"):
360 # Use a custom progress handler that was injected via OE_EXTRA_IMPORTS or __builtins__
361 import functools
362 from types import ModuleType
363
364 parts = progress.split(":", 2)
365 _, cls, otherargs = parts[0], parts[1], (parts[2] or None) if parts[2:] else None
366 if cls:
367 def resolve(x, y):
368 if not x:
369 return None
370 if isinstance(x, ModuleType):
371 return getattr(x, y, None)
372 return x.get(y)
373 cls_obj = functools.reduce(resolve, cls.split("."), bb.utils._context)
374 if not cls_obj:
375 # Fall-back on __builtins__
376 cls_obj = functools.reduce(lambda x, y: x.get(y), cls.split("."), __builtins__)
377 if cls_obj:
378 return cls_obj(d, outfile=logfile, otherargs=otherargs)
379 bb.warn('%s: unknown custom progress handler in task progress varflag value "%s", ignoring' % (func, cls))
359 else: 380 else:
360 bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress)) 381 bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress))
361 382