summaryrefslogtreecommitdiffstats
path: root/scripts/lib/devtool/__init__.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2017-04-12 22:41:27 +1200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-04-12 22:16:55 +0100
commitacfdbd796c99882b8586023c8c6b848716105c8d (patch)
tree311eaa2c2987f1bf0ddfffdf9de5efddc57c5699 /scripts/lib/devtool/__init__.py
parentabe2955df2dc558de6068d9373dfcb47d690704b (diff)
downloadopenembedded-core-contrib-acfdbd796c99882b8586023c8c6b848716105c8d.tar.gz
devtool: add: fix node.js/npm handling with recipe specific sysroots
The change over to recipe specific sysroots means that we can no longer get a known location simply from configuration for the npm binary - we need to get the recipe sysroot for nodejs-native, look there for npm if we need to check it's present, and add that to PATH when calling out to npm. Unfortunately this means anywhere we need to get that path we have to have parsed all recipes, otherwise we have no reliable way of resolving nodejs-native. Thus we have to change recipetool create to always parse all recipes (the structure of the code does not allow us to do this conditionally). In the worst case, if npm hasn't already been added to its own sysroot and we are fetching from a source repository rather than an npm registry, this gets a bit ugly because we end up parsing recipes three times: 1) recipetool startup, which then fetches the code and determines it's a node.js module, finds that npm isn't available and then exits with a specific error to tell devtool it needs to build npm 2) when we invoke bitbake -c addto_recipe_sysroot nodejs-native 3) when we re-invoke recipetool This code is badly in need of refactoring, but now is unfortunately not the time to do that, so we're going to have to live with this ugliness for now. Fixes [YOCTO #10992]. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/devtool/__init__.py')
-rw-r--r--scripts/lib/devtool/__init__.py25
1 files changed, 14 insertions, 11 deletions
diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py
index 8c385beb89..d646b0cf63 100644
--- a/scripts/lib/devtool/__init__.py
+++ b/scripts/lib/devtool/__init__.py
@@ -261,23 +261,28 @@ def get_bbclassextend_targets(recipefile, pn):
targets.append('%s-%s' % (pn, variant))
return targets
-def ensure_npm(config, basepath, fixed_setup=False):
+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
"""
- tinfoil = setup_tinfoil(config_only=True, basepath=basepath)
- try:
- nativepath = tinfoil.config_data.getVar('STAGING_BINDIR_NATIVE')
- finally:
- tinfoil.shutdown()
+ 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
- npmpath = os.path.join(nativepath, 'npm')
- if not os.path.exists(npmpath):
+ if build_npm:
logger.info('Building nodejs-native')
try:
exec_build_env_command(config.init_path, basepath,
- 'bitbake -q nodejs-native', watch=True)
+ '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:
@@ -287,5 +292,3 @@ def ensure_npm(config, basepath, fixed_setup=False):
raise DevtoolError(msg)
else:
raise
- if not os.path.exists(npmpath):
- raise DevtoolError('Built nodejs-native but npm binary still could not be found at %s' % npmpath)