summaryrefslogtreecommitdiffstats
path: root/scripts/lib/devtool/__init__.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2016-10-04 22:31:16 +1300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-10-05 10:10:11 +0100
commit18caacae069a025662fcdd96b846857fc3107e41 (patch)
tree3fbd57297f2548b45ee0a87ff80dfb79941674fe /scripts/lib/devtool/__init__.py
parentee697d84ba2a83b196bd3b927a0b6047464f5292 (diff)
downloadpoky-18caacae069a025662fcdd96b846857fc3107e41.tar.gz
devtool: add: build nodejs-native if npm is needed and not available
If the user runs devtool add on an npm:// URL (or source tree that uses node.js), and npm is not available, just build nodejs-native instead of telling the user they need to do it; if that fails because there isn't any such recipe (which would be the default, since it's not in OE-Core) then produce a slightly more readable error message hinting at what the user needs to do. Note that this forces the use of nodejs-native rather than npm on the host - this makes sense for two reasons: (1) we need it to be compatible with nodejs for the target, and (2) we have to have a recipe for that anyway, so allowing you to avoid having a recipe for the native version isn't really beneficial. There's a bit of a hack in here in order to allow this - for node.js sources that aren't fetched via npm we don't know that they are that until we've fetched and unpacked them, by which time we're inside recipetool and have an active tinfoil instance that will prevent bitbake being run. To avoid this being an issue, we allow recipetool to get to the point where we know we need npm and then exit with a specific exit code, at which point devtool can try to build it and then if that succeeds, it will re-execute recipetool. This is definitely not ideal, but it can't really be refactored and done properly until we do the tinfoil2 refactoring; in the mean time though we still want to be helpful to the user. Fixes [YOCTO #10337]. (From OE-Core rev: f40662bde5aab158c4e4c3c3ff5e68665a4194a5) 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__.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py
index b432e3d44e..e675133f63 100644
--- a/scripts/lib/devtool/__init__.py
+++ b/scripts/lib/devtool/__init__.py
@@ -259,3 +259,32 @@ def get_bbclassextend_targets(recipefile, pn):
259 elif variant in ['native', 'cross', 'crosssdk']: 259 elif variant in ['native', 'cross', 'crosssdk']:
260 targets.append('%s-%s' % (pn, variant)) 260 targets.append('%s-%s' % (pn, variant))
261 return targets 261 return targets
262
263def ensure_npm(config, basepath, fixed_setup=False):
264 """
265 Ensure that npm is available and either build it or show a
266 reasonable error message
267 """
268 tinfoil = setup_tinfoil(config_only=True, basepath=basepath)
269 try:
270 nativepath = tinfoil.config_data.getVar('STAGING_BINDIR_NATIVE', True)
271 finally:
272 tinfoil.shutdown()
273
274 npmpath = os.path.join(nativepath, 'npm')
275 if not os.path.exists(npmpath):
276 logger.info('Building nodejs-native')
277 try:
278 exec_build_env_command(config.init_path, basepath,
279 'bitbake -q nodejs-native', watch=True)
280 except bb.process.ExecutionError as e:
281 if "Nothing PROVIDES 'nodejs-native'" in e.stdout:
282 if fixed_setup:
283 msg = 'nodejs-native is required for npm but is not available within this SDK'
284 else:
285 msg = 'nodejs-native is required for npm but is not available - you will likely need to add a layer that provides nodejs'
286 raise DevtoolError(msg)
287 else:
288 raise
289 if not os.path.exists(npmpath):
290 raise DevtoolError('Built nodejs-native but npm binary still could not be found at %s' % npmpath)