diff options
Diffstat (limited to 'scripts/lib')
-rw-r--r-- | scripts/lib/devtool/__init__.py | 31 | ||||
-rw-r--r-- | scripts/lib/devtool/standard.py | 34 | ||||
-rw-r--r-- | scripts/lib/recipetool/create.py | 21 | ||||
-rw-r--r-- | scripts/lib/recipetool/create_npm.py | 27 |
4 files changed, 34 insertions, 79 deletions
diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py index 29c4c05071..bba0721543 100644 --- a/scripts/lib/devtool/__init__.py +++ b/scripts/lib/devtool/__init__.py @@ -261,34 +261,3 @@ def get_bbclassextend_targets(recipefile, pn): targets.append('%s-%s' % (pn, variant)) return targets -def ensure_npm(config, basepath, fixed_setup=False, check_exists=True): - """ - Ensure that npm is available and either build it or show a - reasonable error message - """ - if check_exists: - tinfoil = setup_tinfoil(config_only=False, basepath=basepath) - try: - rd = tinfoil.parse_recipe('nodejs-native') - nativepath = rd.getVar('STAGING_BINDIR_NATIVE') - finally: - tinfoil.shutdown() - npmpath = os.path.join(nativepath, 'npm') - build_npm = not os.path.exists(npmpath) - else: - build_npm = True - - if build_npm: - logger.info('Building nodejs-native') - try: - exec_build_env_command(config.init_path, basepath, - 'bitbake -q nodejs-native -c addto_recipe_sysroot', watch=True) - except bb.process.ExecutionError as e: - if "Nothing PROVIDES 'nodejs-native'" in e.stdout: - if fixed_setup: - msg = 'nodejs-native is required for npm but is not available within this SDK' - else: - msg = 'nodejs-native is required for npm but is not available - you will likely need to add a layer that provides nodejs' - raise DevtoolError(msg) - else: - raise diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py index 0104e675db..54558ce799 100644 --- a/scripts/lib/devtool/standard.py +++ b/scripts/lib/devtool/standard.py @@ -30,7 +30,7 @@ import errno import glob import filecmp from collections import OrderedDict -from devtool import exec_build_env_command, setup_tinfoil, check_workspace_recipe, use_external_build, setup_git_repo, recipe_to_append, get_bbclassextend_targets, ensure_npm, DevtoolError +from devtool import exec_build_env_command, setup_tinfoil, check_workspace_recipe, use_external_build, setup_git_repo, recipe_to_append, get_bbclassextend_targets, DevtoolError from devtool import parse_recipe logger = logging.getLogger('devtool') @@ -128,9 +128,6 @@ def add(args, config, basepath, workspace): color = args.color extracmdopts = '' if args.fetchuri: - if args.fetchuri.startswith('npm://'): - ensure_npm(config, basepath, args.fixed_setup) - source = args.fetchuri if srctree: extracmdopts += ' -x %s' % srctree @@ -155,28 +152,13 @@ def add(args, config, basepath, workspace): tempdir = tempfile.mkdtemp(prefix='devtool') try: - builtnpm = False - while True: - try: - stdout, _ = exec_build_env_command(config.init_path, basepath, 'recipetool --color=%s create --devtool -o %s \'%s\' %s' % (color, tempdir, source, extracmdopts), watch=True) - except bb.process.ExecutionError as e: - if e.exitcode == 14: - if builtnpm: - raise DevtoolError('Re-running recipetool still failed to find npm') - # FIXME this is a horrible hack that is unfortunately - # necessary due to the fact that we can't run bitbake from - # inside recipetool since recipetool keeps tinfoil active - # with references to it throughout the code, so we have - # to exit out and come back here to do it. - ensure_npm(config, basepath, args.fixed_setup, check_exists=False) - logger.info('Re-running recipe creation process after building nodejs') - builtnpm = True - continue - elif e.exitcode == 15: - raise DevtoolError('Could not auto-determine recipe name, please specify it on the command line') - else: - raise DevtoolError('Command \'%s\' failed' % e.command) - break + try: + stdout, _ = exec_build_env_command(config.init_path, basepath, 'recipetool --color=%s create --devtool -o %s \'%s\' %s' % (color, tempdir, source, extracmdopts), watch=True) + except bb.process.ExecutionError as e: + if e.exitcode == 15: + raise DevtoolError('Could not auto-determine recipe name, please specify it on the command line') + else: + raise DevtoolError('Command \'%s\' failed' % e.command) recipes = glob.glob(os.path.join(tempdir, '*.bb')) if recipes: diff --git a/scripts/lib/recipetool/create.py b/scripts/lib/recipetool/create.py index 2a6a28ba91..359eb9adfc 100644 --- a/scripts/lib/recipetool/create.py +++ b/scripts/lib/recipetool/create.py @@ -1152,22 +1152,6 @@ def convert_rpm_xml(xmlfile): return values -def check_npm(tinfoil, debugonly=False): - try: - rd = tinfoil.parse_recipe('nodejs-native') - except bb.providers.NoProvider: - # We still conditionally show the message and exit with the special - # return code, otherwise we can't show the proper message for eSDK - # users - log_error_cond('nodejs-native is required for npm but is not available - you will likely need to add a layer that provides nodejs', debugonly) - sys.exit(14) - bindir = rd.getVar('STAGING_BINDIR_NATIVE') - npmpath = os.path.join(bindir, 'npm') - if not os.path.exists(npmpath): - log_error_cond('npm required to process specified source, but npm is not available - you need to run bitbake -c addto_recipe_sysroot nodejs-native first', debugonly) - sys.exit(14) - return bindir - def register_commands(subparsers): parser_create = subparsers.add_parser('create', help='Create a new recipe', @@ -1185,8 +1169,5 @@ def register_commands(subparsers): parser_create.add_argument('--keep-temp', action="store_true", help='Keep temporary directory (for debugging)') parser_create.add_argument('--fetch-dev', action="store_true", help='For npm, also fetch devDependencies') parser_create.add_argument('--devtool', action="store_true", help=argparse.SUPPRESS) - # FIXME I really hate having to set parserecipes for this, but given we may need - # to call into npm (and we don't know in advance if we will or not) and in order - # to do so we need to know npm's recipe sysroot path, there's not much alternative - parser_create.set_defaults(func=create_recipe, parserecipes=True) + parser_create.set_defaults(func=create_recipe) diff --git a/scripts/lib/recipetool/create_npm.py b/scripts/lib/recipetool/create_npm.py index ba7e39a406..885d5438e3 100644 --- a/scripts/lib/recipetool/create_npm.py +++ b/scripts/lib/recipetool/create_npm.py @@ -21,7 +21,7 @@ import subprocess import tempfile import shutil import json -from recipetool.create import RecipeHandler, split_pkg_licenses, handle_license_vars, check_npm +from recipetool.create import RecipeHandler, split_pkg_licenses, handle_license_vars logger = logging.getLogger('recipetool') @@ -36,6 +36,27 @@ def tinfoil_init(instance): class NpmRecipeHandler(RecipeHandler): lockdownpath = None + def _ensure_npm(self, fixed_setup=False): + if not tinfoil.recipes_parsed: + tinfoil.parse_recipes() + try: + rd = tinfoil.parse_recipe('nodejs-native') + except bb.providers.NoProvider: + if fixed_setup: + msg = 'nodejs-native is required for npm but is not available within this SDK' + else: + msg = 'nodejs-native is required for npm but is not available - you will likely need to add a layer that provides nodejs' + logger.error(msg) + return None + bindir = rd.getVar('STAGING_BINDIR_NATIVE') + npmpath = os.path.join(bindir, 'npm') + if not os.path.exists(npmpath): + tinfoil.build_targets('nodejs-native', 'addto_recipe_sysroot') + if not os.path.exists(npmpath): + logger.error('npm required to process specified source, but nodejs-native did not seem to populate it') + return None + return bindir + def _handle_license(self, data): ''' Handle the license value from an npm package.json file @@ -189,7 +210,9 @@ class NpmRecipeHandler(RecipeHandler): files = RecipeHandler.checkfiles(srctree, ['package.json']) if files: d = bb.data.createCopy(tinfoil.config_data) - npm_bindir = check_npm(tinfoil, self._devtool) + npm_bindir = self._ensure_npm() + if not npm_bindir: + sys.exit(14) d.prependVar('PATH', '%s:' % npm_bindir) data = read_package_json(files[0]) |