summaryrefslogtreecommitdiffstats
path: root/import-layers/yocto-poky/scripts/devtool
diff options
context:
space:
mode:
Diffstat (limited to 'import-layers/yocto-poky/scripts/devtool')
-rwxr-xr-ximport-layers/yocto-poky/scripts/devtool349
1 files changed, 0 insertions, 349 deletions
diff --git a/import-layers/yocto-poky/scripts/devtool b/import-layers/yocto-poky/scripts/devtool
deleted file mode 100755
index d681a1929..000000000
--- a/import-layers/yocto-poky/scripts/devtool
+++ /dev/null
@@ -1,349 +0,0 @@
-#!/usr/bin/env python3
-
-# OpenEmbedded Development tool
-#
-# Copyright (C) 2014-2015 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-import sys
-import os
-import argparse
-import glob
-import re
-import configparser
-import subprocess
-import logging
-
-basepath = ''
-workspace = {}
-config = None
-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, setup_tinfoil
-import scriptutils
-import argparse_oe
-logger = scriptutils.logger_create('devtool')
-
-plugins = []
-
-
-class ConfigHandler(object):
- config_file = ''
- config_obj = None
- init_path = ''
- workspace_path = ''
-
- def __init__(self, filename):
- self.config_file = filename
- self.config_obj = configparser.SafeConfigParser()
-
- def get(self, section, option, default=None):
- try:
- ret = self.config_obj.get(section, option)
- except (configparser.NoOptionError, configparser.NoSectionError):
- if default != None:
- ret = default
- else:
- raise
- return ret
-
- def read(self):
- if os.path.exists(self.config_file):
- self.config_obj.read(self.config_file)
-
- if self.config_obj.has_option('General', 'init_path'):
- pth = self.get('General', 'init_path')
- self.init_path = os.path.join(basepath, pth)
- if not os.path.exists(self.init_path):
- logger.error('init_path %s specified in config file cannot be found' % pth)
- return False
- else:
- self.config_obj.add_section('General')
-
- self.workspace_path = self.get('General', 'workspace_path', os.path.join(basepath, 'workspace'))
- return True
-
-
- def write(self):
- logger.debug('writing to config file %s' % self.config_file)
- self.config_obj.set('General', 'workspace_path', self.workspace_path)
- with open(self.config_file, 'w') as f:
- self.config_obj.write(f)
-
- def set(self, section, option, value):
- if not self.config_obj.has_section(section):
- self.config_obj.add_section(section)
- self.config_obj.set(section, option, value)
-
-class Context:
- def __init__(self, **kwargs):
- self.__dict__.update(kwargs)
-
-
-def read_workspace():
- global workspace
- workspace = {}
- if not os.path.exists(os.path.join(config.workspace_path, 'conf', 'layer.conf')):
- if context.fixed_setup:
- logger.error("workspace layer not set up")
- sys.exit(1)
- else:
- logger.info('Creating workspace layer in %s' % config.workspace_path)
- _create_workspace(config.workspace_path, config, basepath)
- if not context.fixed_setup:
- _enable_workspace_layer(config.workspace_path, config, basepath)
-
- logger.debug('Reading workspace in %s' % config.workspace_path)
- externalsrc_re = re.compile(r'^EXTERNALSRC(_pn-([^ =]+))? *= *"([^"]*)"$')
- for fn in glob.glob(os.path.join(config.workspace_path, 'appends', '*.bbappend')):
- with open(fn, 'r') as f:
- pnvalues = {}
- for line in f:
- res = externalsrc_re.match(line.rstrip())
- if res:
- recipepn = os.path.splitext(os.path.basename(fn))[0].split('_')[0]
- pn = res.group(2) or recipepn
- # Find the recipe file within the workspace, if any
- bbfile = os.path.basename(fn).replace('.bbappend', '.bb').replace('%', '*')
- recipefile = glob.glob(os.path.join(config.workspace_path,
- 'recipes',
- recipepn,
- bbfile))
- if recipefile:
- recipefile = recipefile[0]
- pnvalues['srctree'] = res.group(3)
- pnvalues['bbappend'] = fn
- pnvalues['recipefile'] = recipefile
- elif line.startswith('# srctreebase: '):
- pnvalues['srctreebase'] = line.split(':', 1)[1].strip()
- if pnvalues:
- if not pnvalues.get('srctreebase', None):
- pnvalues['srctreebase'] = pnvalues['srctree']
- logger.debug('Found recipe %s' % pnvalues)
- workspace[pn] = pnvalues
-
-def create_workspace(args, config, basepath, workspace):
- if args.layerpath:
- workspacedir = os.path.abspath(args.layerpath)
- else:
- workspacedir = os.path.abspath(os.path.join(basepath, 'workspace'))
- _create_workspace(workspacedir, config, basepath)
- if not args.create_only:
- _enable_workspace_layer(workspacedir, config, basepath)
-
-def _create_workspace(workspacedir, config, basepath):
- import bb
-
- confdir = os.path.join(workspacedir, 'conf')
- if os.path.exists(os.path.join(confdir, 'layer.conf')):
- logger.info('Specified workspace already set up, leaving as-is')
- else:
- # Add a config file
- bb.utils.mkdirhier(confdir)
- with open(os.path.join(confdir, 'layer.conf'), 'w') as f:
- f.write('# ### workspace layer auto-generated by devtool ###\n')
- f.write('BBPATH =. "$' + '{LAYERDIR}:"\n')
- f.write('BBFILES += "$' + '{LAYERDIR}/recipes/*/*.bb \\\n')
- f.write(' $' + '{LAYERDIR}/appends/*.bbappend"\n')
- f.write('BBFILE_COLLECTIONS += "workspacelayer"\n')
- f.write('BBFILE_PATTERN_workspacelayer = "^$' + '{LAYERDIR}/"\n')
- f.write('BBFILE_PATTERN_IGNORE_EMPTY_workspacelayer = "1"\n')
- f.write('BBFILE_PRIORITY_workspacelayer = "99"\n')
- f.write('LAYERSERIES_COMPAT_workspacelayer = "${LAYERSERIES_COMPAT_core}"\n')
- # Add a README file
- with open(os.path.join(workspacedir, 'README'), 'w') as f:
- f.write('This layer was created by the OpenEmbedded devtool utility in order to\n')
- f.write('contain recipes and bbappends that are currently being worked on. The idea\n')
- f.write('is that the contents is temporary - once you have finished working on a\n')
- f.write('recipe you use the appropriate method to move the files you have been\n')
- f.write('working on to a proper layer. In most instances you should use the\n')
- f.write('devtool utility to manage files within it rather than modifying files\n')
- f.write('directly (although recipes added with "devtool add" will often need\n')
- f.write('direct modification.)\n')
- f.write('\nIf you no longer need to use devtool or the workspace layer\'s contents\n')
- f.write('you can remove the path to this workspace layer from your conf/bblayers.conf\n')
- f.write('file (and then delete the layer, if you wish).\n')
- f.write('\nNote that by default, if devtool fetches and unpacks source code, it\n')
- f.write('will place it in a subdirectory of a "sources" subdirectory of the\n')
- f.write('layer. If you prefer it to be elsewhere you can specify the source\n')
- f.write('tree path on the command line.\n')
-
-def _enable_workspace_layer(workspacedir, config, basepath):
- """Ensure the workspace layer is in bblayers.conf"""
- import bb
- bblayers_conf = os.path.join(basepath, 'conf', 'bblayers.conf')
- if not os.path.exists(bblayers_conf):
- logger.error('Unable to find bblayers.conf')
- return
- if os.path.abspath(workspacedir) != os.path.abspath(config.workspace_path):
- removedir = config.workspace_path
- else:
- removedir = None
- _, added = bb.utils.edit_bblayers_conf(bblayers_conf, workspacedir, removedir)
- if added:
- logger.info('Enabling workspace layer in bblayers.conf')
- if config.workspace_path != workspacedir:
- # Update our config to point to the new location
- config.workspace_path = workspacedir
- config.write()
-
-
-def main():
- global basepath
- global config
- global context
-
- if sys.getfilesystemencoding() != "utf-8":
- sys.exit("Please use a locale setting which supports utf-8.\nPython can't change the filesystem locale after loading so we need a utf-8 when python starts or things won't work.")
-
- context = Context(fixed_setup=False)
-
- # Default basepath
- basepath = os.path.dirname(os.path.abspath(__file__))
-
- parser = argparse_oe.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('--bbpath', help='Explicitly specify the BBPATH, rather than getting it from the metadata')
- 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')
-
- global_args, unparsed_args = parser.parse_known_args()
-
- # 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')
-
- if global_args.debug:
- logger.setLevel(logging.DEBUG)
- elif global_args.quiet:
- logger.setLevel(logging.ERROR)
-
- if global_args.basepath:
- # Override
- basepath = global_args.basepath
- if os.path.exists(os.path.join(basepath, '.devtoolbase')):
- context.fixed_setup = True
- else:
- pth = basepath
- while pth != '' and pth != os.sep:
- if os.path.exists(os.path.join(pth, '.devtoolbase')):
- context.fixed_setup = True
- basepath = pth
- break
- pth = os.path.dirname(pth)
-
- if not context.fixed_setup:
- basepath = os.environ.get('BUILDDIR')
- if not basepath:
- logger.error("This script can only be run after initialising the build environment (e.g. by using oe-init-build-env)")
- sys.exit(1)
-
- logger.debug('Using basepath %s' % basepath)
-
- config = ConfigHandler(os.path.join(basepath, 'conf', 'devtool.conf'))
- if not config.read():
- return -1
- context.config = config
-
- bitbake_subdir = config.get('General', 'bitbake_subdir', '')
- if bitbake_subdir:
- # Normally set for use within the SDK
- logger.debug('Using bitbake subdir %s' % bitbake_subdir)
- sys.path.insert(0, os.path.join(basepath, bitbake_subdir, 'lib'))
- core_meta_subdir = config.get('General', 'core_meta_subdir')
- sys.path.insert(0, os.path.join(basepath, core_meta_subdir, 'lib'))
- else:
- # Standard location
- import scriptpath
- bitbakepath = scriptpath.add_bitbake_lib_path()
- if not bitbakepath:
- logger.error("Unable to find bitbake by searching parent directory of this script or PATH")
- sys.exit(1)
- logger.debug('Using standard bitbake path %s' % bitbakepath)
- scriptpath.add_oe_lib_path()
-
- scriptutils.logger_setup_color(logger, global_args.color)
-
- if global_args.bbpath is None:
- try:
- tinfoil = setup_tinfoil(config_only=True, basepath=basepath)
- try:
- global_args.bbpath = tinfoil.config_data.getVar('BBPATH')
- finally:
- tinfoil.shutdown()
- except bb.BBHandledException:
- return 2
-
- # Search BBPATH first to allow layers to override plugins in scripts_path
- for path in global_args.bbpath.split(':') + [scripts_path]:
- pluginpath = os.path.join(path, 'lib', 'devtool')
- scriptutils.load_plugins(logger, plugins, pluginpath)
-
- subparsers = parser.add_subparsers(dest="subparser_name", title='subcommands', metavar='<subcommand>')
- subparsers.required = True
-
- subparsers.add_subparser_group('sdk', 'SDK maintenance', -2)
- subparsers.add_subparser_group('advanced', 'Advanced', -1)
- subparsers.add_subparser_group('starting', 'Beginning work on a recipe', 100)
- subparsers.add_subparser_group('info', 'Getting information')
- subparsers.add_subparser_group('working', 'Working on a recipe in the workspace')
- subparsers.add_subparser_group('testbuild', 'Testing changes on target')
-
- if not context.fixed_setup:
- parser_create_workspace = subparsers.add_parser('create-workspace',
- help='Set up workspace in an alternative location',
- 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.',
- group='advanced')
- 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, no_workspace=True)
-
- for plugin in plugins:
- if hasattr(plugin, 'register_commands'):
- plugin.register_commands(subparsers, context)
-
- args = parser.parse_args(unparsed_args, namespace=global_args)
-
- if not getattr(args, 'no_workspace', False):
- read_workspace()
-
- try:
- ret = args.func(args, config, basepath, workspace)
- except DevtoolError as err:
- if str(err):
- logger.error(str(err))
- ret = err.exitcode
- except argparse_oe.ArgumentUsageError as ae:
- parser.error_subcommand(ae.message, ae.subcommand)
-
- return ret
-
-
-if __name__ == "__main__":
- try:
- ret = main()
- except Exception:
- ret = 1
- import traceback
- traceback.print_exc()
- sys.exit(ret)
OpenPOWER on IntegriCloud