[OE-core] [PATCH 4/6] devtool: also load plugins from BBPATH
Paul Eggleton
paul.eggleton at linux.intel.com
Wed Jul 29 09:56:56 UTC 2015
Hmm, I guess we will have to add a command-line parameter to specify BBPATH
(or the full plugin search path) so that tinfoil doesn't have to be
instantiated when it's specified.
Cheers,
Paul
On Wednesday 29 July 2015 14:58:37 ChenQi wrote:
> Hi Christopher,
>
> I suspect this patch is causing failure for 'populate_sdk_ext' task.
> Could you please take a look at it?
>
> See error message below.
>
> Best Regards,
> Chen Qi
>
> =======================
>
> ERROR: Error executing a python function in
> /buildarea2/chenqi/poky/meta/recipes-core/images/core-image-minimal.bb:
>
> The stack trace of python calls that resulted in this exception/failure was:
> File: 'copy_buildsystem', lineno: 127, function: <module>
> 0123: with open(baseoutpath + '/conf/work-config.inc', 'w') as f:
> 0124: pass
> 0125:
> 0126:
> *** 0127:copy_buildsystem(d)
> 0128:
> File: 'copy_buildsystem', lineno: 53, function: copy_buildsystem
> 0049: with open(os.path.join(baseoutpath, 'conf',
> 'devtool.conf'), 'w') as f:
> 0050: config.write(f)
> 0051:
> 0052: # Create a layer for new recipes / appends
> *** 0053: bb.process.run("devtool --basepath %s create-workspace
> --create-only %s" % (baseoutpath, os.path.join(baseoutpath, 'workspace')))
> 0054:
> 0055: # Create bblayers.conf
> 0056: bb.utils.mkdirhier(baseoutpath + '/conf')
> 0057: with open(baseoutpath + '/conf/bblayers.conf', 'w') as f:
> File: '/buildarea2/chenqi/poky/bitbake/lib/bb/process.py', lineno: 152,
> function: run
> 0148: else:
> 0149: stdout, stderr = pipe.communicate(input)
> 0150:
> 0151: if pipe.returncode != 0:
> *** 0152: raise ExecutionError(cmd, pipe.returncode, stdout,
> stderr)
> 0153: return stdout, stderr
> Exception: ExecutionError: Execution of 'devtool --basepath
> /buildarea2/chenqi/poky/build-systemd/tmp-2/work/qemuarm-poky-linux-gnueabi/
> core-image-minimal/1.0-r0/sdk-ext/image//opt/poky/1.8+snapshot
> create-workspace --create-only
> /buildarea2/chenqi/poky/build-systemd/tmp-2/work/qemuarm-poky-linux-gnueabi/
> core-image-minimal/1.0-r0/sdk-ext/image//opt/poky/1.8+snapshot/workspace'
> failed with exit code 1:
> ERROR: Only one copy of bitbake should be run against a build directory
> Traceback (most recent call last):
> File "/buildarea2/chenqi/poky/scripts/devtool", line 281, in <module>
> ret = main()
> File "/buildarea2/chenqi/poky/scripts/devtool", line 242, in main
> tinfoil = setup_tinfoil(config_only=True)
> File "/buildarea2/chenqi/poky/scripts/lib/devtool/__init__.py", line
> 108, in setup_tinfoil
> tinfoil = bb.tinfoil.Tinfoil()
> File
> "/buildarea2/chenqi/poky/build-systemd/tmp-2/work/qemuarm-poky-linux-gnueabi
> /core-image-minimal/1.0-r0/sdk-ext/image//opt/poky/1.8+snapshot/layers/poky/
> bitbake/lib/bb/tinfoil.py", line 54, in __init__
> self.cooker = BBCooker(self.config, features)
> File
> "/buildarea2/chenqi/poky/build-systemd/tmp-2/work/qemuarm-poky-linux-gnueabi
> /core-image-minimal/1.0-r0/sdk-ext/image//opt/poky/1.8+snapshot/layers/poky/
> bitbake/lib/bb/cooker.py", line 155, in __init__
> bb.fatal("Only one copy of bitbake should be run against a build
> directory")
> BBHandledException
>
>
> ERROR: Function failed: copy_buildsystem
> ERROR: Logfile of failure stored in:
> /buildarea2/chenqi/poky/build-systemd/tmp-2/work/qemuarm-poky-linux-gnueabi/
> core-image-minimal/1.0-r0/temp/log.do_populate_sdk_ext.3616 ERROR: Task 12
> (/buildarea2/chenqi/poky/meta/recipes-core/images/core-image-minimal.bb,
> do_populate_sdk_ext) failed with exit code '1'
>
> On 07/14/2015 11:57 PM, Christopher Larson wrote:
> > From: Christopher Larson <chris_larson at mentor.com>
> >
> > This makes it easier to extend, as a layer can add its own sub-commands.
> >
> > tinfoil is now passed into the commands, as we needed to parse the
> > configuration metadata to get BBPATH, and we don't want to construct
> > tinfoil more than once, otherwise we have to deal with startup and
> > shutdown of cooker.
> >
> > [YOCTO #7625]
> >
> > Signed-off-by: Christopher Larson <chris_larson at mentor.com>
> > ---
> >
> > scripts/devtool | 57
> > +++++++++++++++++++++++++----------------
> > scripts/lib/devtool/__init__.py | 4 +--
> > scripts/lib/devtool/deploy.py | 6 ++---
> > scripts/lib/devtool/standard.py | 15 +++++------
> > 4 files changed, 46 insertions(+), 36 deletions(-)
> >
> > diff --git a/scripts/devtool b/scripts/devtool
> > index fa799f6..01bb412 100755
> > --- a/scripts/devtool
> > +++ b/scripts/devtool
> > @@ -35,7 +35,7 @@ context = None
> >
> > scripts_path = os.path.dirname(os.path.realpath(__file__))
> > lib_path = scripts_path + '/lib'
> > sys.path = sys.path + [lib_path]
> >
> > -from devtool import DevtoolError
> > +from devtool import DevtoolError, setup_tinfoil
> >
> > import scriptutils
> > logger = scriptutils.logger_create('devtool')
> >
> > @@ -186,37 +186,28 @@ def main():
> > pth = os.path.dirname(pth)
> >
> > parser = argparse.ArgumentParser(description="OpenEmbedded
> > development tool",>
> > + add_help=False,
> >
> > epilog="Use %(prog)s <subcommand>
> > --help to get help on a specific
> > command")>
> > parser.add_argument('--basepath', help='Base directory of SDK /
> > build directory') parser.add_argument('-d', '--debug', help='Enable
> > debug output', action='store_true') parser.add_argument('-q',
> > '--quiet', help='Print only errors', action='store_true')
> > parser.add_argument('--color', choices=['auto', 'always', 'never'],
> > default='auto', help='Colorize output (where %(metavar)s is
> > %(choices)s)', metavar='COLOR')>
> > - subparsers = parser.add_subparsers(dest="subparser_name",
> > title='subcommands', metavar='<subcommand>') + initial_args,
> > unparsed_args = parser.parse_known_args()
> >
> > - if not context.fixed_setup:
> > - parser_create_workspace =
> > subparsers.add_parser('create-workspace', -
> > help='Set up a workspace', -
> > description='Sets up a new workspace.
> > NOTE: other devtool subcommands will create a workspace automatically as
> > needed, so you only need to use %(prog)s if you want to specify where the
> > workspace should be located.') -
> > parser_create_workspace.add_argument('layerpath', nargs='?', help='Path
> > in which the workspace layer should be created') -
> > parser_create_workspace.add_argument('--create-only',
> > action="store_true", help='Only create the workspace layer, do not alter
> > configuration') -
> > parser_create_workspace.set_defaults(func=create_workspace) + # Help
> > is added here rather than via add_help=True, as we don't want it to +
> > # be handled by parse_known_args()
> > + parser.add_argument('-h', '--help', action='help',
> > default=argparse.SUPPRESS, + help='show this help
> > message and exit')
> >
> > - scriptutils.load_plugins(logger, plugins, os.path.join(scripts_path,
> > 'lib', 'devtool')) - for plugin in plugins:
> > - if hasattr(plugin, 'register_commands'):
> > - plugin.register_commands(subparsers, context)
> > -
> > - args = parser.parse_args()
> > -
> > - if args.debug:
> >
> > + if initial_args.debug:
> > logger.setLevel(logging.DEBUG)
> >
> > - elif args.quiet:
> >
> > + elif initial_args.quiet:
> > logger.setLevel(logging.ERROR)
> >
> > - if args.basepath:
> >
> > + if initial_args.basepath:
> > # Override
> >
> > - basepath = args.basepath
> > + basepath = initial_args.basepath
> >
> > elif not context.fixed_setup:
> > basepath = os.environ.get('BUILDDIR')
> >
> > if not basepath:
> > @@ -246,13 +237,35 @@ def main():
> > logger.debug('Using standard bitbake path %s' % bitbakepath)
> > scriptpath.add_oe_lib_path()
> >
> > - scriptutils.logger_setup_color(logger, args.color)
> > + scriptutils.logger_setup_color(logger, initial_args.color)
> > +
> > + tinfoil = setup_tinfoil(config_only=True)
> > + for path in ([scripts_path] +
> > + tinfoil.config_data.getVar('BBPATH', True).split(':')):
> > + pluginpath = os.path.join(path, 'lib', 'devtool')
> > + scriptutils.load_plugins(logger, plugins, pluginpath)
> > +
> > + subparsers = parser.add_subparsers(dest="subparser_name",
> > title='subcommands', metavar='<subcommand>') +
> > + if not context.fixed_setup:
> > + parser_create_workspace =
> > subparsers.add_parser('create-workspace', +
> > help='Set up a workspace', +
> > description='Sets up a new workspace.
> > NOTE: other devtool subcommands will create a workspace automatically as
> > needed, so you only need to use %(prog)s if you want to specify where the
> > workspace should be located.') +
> > parser_create_workspace.add_argument('layerpath', nargs='?', help='Path
> > in which the workspace layer should be created') +
> > parser_create_workspace.add_argument('--create-only',
> > action="store_true", help='Only create the workspace layer, do not alter
> > configuration') +
> > parser_create_workspace.set_defaults(func=create_workspace) +
> > + for plugin in plugins:
> > + if hasattr(plugin, 'register_commands'):
> > + plugin.register_commands(subparsers, context)
> > +
> > + args = parser.parse_args(unparsed_args, namespace=initial_args)
> >
> > if args.subparser_name != 'create-workspace':
> > read_workspace()
> >
> > try:
> > - ret = args.func(args, config, basepath, workspace)
> > + ret = args.func(args, config, basepath, workspace, tinfoil)
> >
> > except DevtoolError as err:
> > if str(err):
> > logger.error(str(err))
> >
> > diff --git a/scripts/lib/devtool/__init__.py
> > b/scripts/lib/devtool/__init__.py index 61b810c..b54ddf5 100644
> > --- a/scripts/lib/devtool/__init__.py
> > +++ b/scripts/lib/devtool/__init__.py
> >
> > @@ -96,7 +96,7 @@ def exec_fakeroot(d, cmd, **kwargs):
> > newenv[splitval[0]] = splitval[1]
> >
> > return subprocess.call("%s %s" % (fakerootcmd, cmd), env=newenv,
> > **kwargs)
> >
> > -def setup_tinfoil():
> >
> > +def setup_tinfoil(config_only=False):
> > """Initialize tinfoil api from bitbake"""
> > import scriptpath
> > bitbakepath = scriptpath.add_bitbake_lib_path()
> >
> > @@ -106,7 +106,7 @@ def setup_tinfoil():
> > import bb.tinfoil
> > tinfoil = bb.tinfoil.Tinfoil()
> >
> > - tinfoil.prepare(False)
> > + tinfoil.prepare(config_only)
> >
> > tinfoil.logger.setLevel(logger.getEffectiveLevel())
> > return tinfoil
> >
> > diff --git a/scripts/lib/devtool/deploy.py b/scripts/lib/devtool/deploy.py
> > index 448db96..3bc59de 100644
> > --- a/scripts/lib/devtool/deploy.py
> > +++ b/scripts/lib/devtool/deploy.py
> >
> > @@ -28,7 +28,7 @@ def plugin_init(pluginlist):
> > pass
> >
> > -def deploy(args, config, basepath, workspace):
> >
> > +def deploy(args, config, basepath, workspace, tinfoil):
> > """Entry point for the devtool 'deploy' subcommand"""
> > import re
> > import oe.recipeutils
> >
> > @@ -46,7 +46,7 @@ def deploy(args, config, basepath, workspace):
> > deploy_dir = os.path.join(basepath, 'target_deploy', args.target)
> > deploy_file = os.path.join(deploy_dir, args.recipename + '.list')
> >
> > - tinfoil = setup_tinfoil()
> > + tinfoil.parseRecipes()
> >
> > try:
> > rd = oe.recipeutils.parse_recipe_simple(tinfoil.cooker,
> > args.recipename, tinfoil.config_data)>
> > except Exception as e:
> > @@ -100,7 +100,7 @@ def deploy(args, config, basepath, workspace):
> > return 0
> >
> > -def undeploy(args, config, basepath, workspace):
> >
> > +def undeploy(args, config, basepath, workspace, tinfoil):
> > """Entry point for the devtool 'undeploy' subcommand"""
> > deploy_file = os.path.join(basepath, 'target_deploy', args.target,
> > args.recipename + '.list')>
> > if not os.path.exists(deploy_file):
> > diff --git a/scripts/lib/devtool/standard.py
> > b/scripts/lib/devtool/standard.py index ea21877..8fe32b7 100644
> > --- a/scripts/lib/devtool/standard.py
> > +++ b/scripts/lib/devtool/standard.py
> >
> > @@ -193,12 +193,11 @@ def _ls_tree(directory):
> > return ret
> >
> > -def extract(args, config, basepath, workspace):
> >
> > +def extract(args, config, basepath, workspace, tinfoil):
> > """Entry point for the devtool 'extract' subcommand"""
> > import bb
> >
> > - tinfoil = setup_tinfoil()
> > -
> > + tinfoil.parseRecipes()
> >
> > rd = _parse_recipe(config, tinfoil, args.recipename, True)
> >
> > if not rd:
> > return 1
> >
> > @@ -409,7 +408,7 @@ def _check_preserve(config, recipename):
> > tf.write(line)
> >
> > os.rename(newfile, origfile)
> >
> > -def modify(args, config, basepath, workspace):
> >
> > +def modify(args, config, basepath, workspace, tinfoil):
> > """Entry point for the devtool 'modify' subcommand"""
> > import bb
> > import oe.recipeutils
> >
> > @@ -423,8 +422,7 @@ def modify(args, config, basepath, workspace):
> > "(specify -x to extract source from recipe)"
> > %
> > args.srctree)
> >
> > - tinfoil = setup_tinfoil()
> > -
> > + tinfoil.parseRecipes()
> >
> > rd = _parse_recipe(config, tinfoil, args.recipename, True)
> >
> > if not rd:
> > return 1
> >
> > @@ -747,7 +745,7 @@ def _update_recipe_patch(args, config, srctree, rd,
config_data):
> > _remove_patch_files(args, removepatches, destpath)
> >
> > -def update_recipe(args, config, basepath, workspace):
> >
> > +def update_recipe(args, config, basepath, workspace, tinfoil):
> > """Entry point for the devtool 'update-recipe' subcommand"""
> >
> > if not args.recipename in workspace:
> > raise DevtoolError("no recipe named %s in your workspace" %
> >
> > @@ -761,8 +759,7 @@ def update_recipe(args, config, basepath, workspace):
> > raise DevtoolError('conf/layer.conf not found in bbappend '
> >
> > 'destination layer "%s"' % args.append)
> >
> > - tinfoil = setup_tinfoil()
> > -
> > + tinfoil.parseRecipes()
> >
> > rd = _parse_recipe(config, tinfoil, args.recipename, True)
> >
> > if not rd:
> > return 1
--
Paul Eggleton
Intel Open Source Technology Centre
More information about the Openembedded-core
mailing list