summaryrefslogtreecommitdiffstats
path: root/scripts/lib/recipetool/create_npm.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-13 10:54:10 +0100
commitbb8f141d0c2c668c4c98afe7760a3084756c92b9 (patch)
treeb75f31b6be5a0b4596deec63fadb75637f6a077c /scripts/lib/recipetool/create_npm.py
parent0440cbccda83f34232bff9b450a2a45eda7ff596 (diff)
downloadpoky-bb8f141d0c2c668c4c98afe7760a3084756c92b9.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]. (From OE-Core rev: acfdbd796c99882b8586023c8c6b848716105c8d) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/recipetool/create_npm.py')
-rw-r--r--scripts/lib/recipetool/create_npm.py20
1 files changed, 11 insertions, 9 deletions
diff --git a/scripts/lib/recipetool/create_npm.py b/scripts/lib/recipetool/create_npm.py
index eb19555a8e..a79a9afbb1 100644
--- a/scripts/lib/recipetool/create_npm.py
+++ b/scripts/lib/recipetool/create_npm.py
@@ -65,9 +65,9 @@ class NpmRecipeHandler(RecipeHandler):
65 'SEE-LICENSE-IN-EULA') 65 'SEE-LICENSE-IN-EULA')
66 return license 66 return license
67 67
68 def _shrinkwrap(self, srctree, localfilesdir, extravalues, lines_before): 68 def _shrinkwrap(self, srctree, localfilesdir, extravalues, lines_before, d):
69 try: 69 try:
70 runenv = dict(os.environ, PATH=tinfoil.config_data.getVar('PATH')) 70 runenv = dict(os.environ, PATH=d.getVar('PATH'))
71 bb.process.run('npm shrinkwrap', cwd=srctree, stderr=subprocess.STDOUT, env=runenv, shell=True) 71 bb.process.run('npm shrinkwrap', cwd=srctree, stderr=subprocess.STDOUT, env=runenv, shell=True)
72 except bb.process.ExecutionError as e: 72 except bb.process.ExecutionError as e:
73 logger.warn('npm shrinkwrap failed:\n%s' % e.stdout) 73 logger.warn('npm shrinkwrap failed:\n%s' % e.stdout)
@@ -79,8 +79,8 @@ class NpmRecipeHandler(RecipeHandler):
79 extravalues['extrafiles']['npm-shrinkwrap.json'] = tmpfile 79 extravalues['extrafiles']['npm-shrinkwrap.json'] = tmpfile
80 lines_before.append('NPM_SHRINKWRAP := "${THISDIR}/${PN}/npm-shrinkwrap.json"') 80 lines_before.append('NPM_SHRINKWRAP := "${THISDIR}/${PN}/npm-shrinkwrap.json"')
81 81
82 def _lockdown(self, srctree, localfilesdir, extravalues, lines_before): 82 def _lockdown(self, srctree, localfilesdir, extravalues, lines_before, d):
83 runenv = dict(os.environ, PATH=tinfoil.config_data.getVar('PATH')) 83 runenv = dict(os.environ, PATH=d.getVar('PATH'))
84 if not NpmRecipeHandler.lockdownpath: 84 if not NpmRecipeHandler.lockdownpath:
85 NpmRecipeHandler.lockdownpath = tempfile.mkdtemp('recipetool-npm-lockdown') 85 NpmRecipeHandler.lockdownpath = tempfile.mkdtemp('recipetool-npm-lockdown')
86 bb.process.run('npm install lockdown --prefix %s' % NpmRecipeHandler.lockdownpath, 86 bb.process.run('npm install lockdown --prefix %s' % NpmRecipeHandler.lockdownpath,
@@ -188,7 +188,9 @@ class NpmRecipeHandler(RecipeHandler):
188 188
189 files = RecipeHandler.checkfiles(srctree, ['package.json']) 189 files = RecipeHandler.checkfiles(srctree, ['package.json'])
190 if files: 190 if files:
191 check_npm(tinfoil.config_data) 191 d = bb.data.createCopy(tinfoil.config_data)
192 npm_bindir = check_npm(tinfoil)
193 d.prependVar('PATH', '%s:' % npm_bindir)
192 194
193 data = read_package_json(files[0]) 195 data = read_package_json(files[0])
194 if 'name' in data and 'version' in data: 196 if 'name' in data and 'version' in data:
@@ -203,17 +205,17 @@ class NpmRecipeHandler(RecipeHandler):
203 205
204 fetchdev = extravalues['fetchdev'] or None 206 fetchdev = extravalues['fetchdev'] or None
205 deps, optdeps, devdeps = self.get_npm_package_dependencies(data, fetchdev) 207 deps, optdeps, devdeps = self.get_npm_package_dependencies(data, fetchdev)
206 updated = self._handle_dependencies(tinfoil.config_data, deps, optdeps, devdeps, lines_before, srctree) 208 updated = self._handle_dependencies(d, deps, optdeps, devdeps, lines_before, srctree)
207 if updated: 209 if updated:
208 # We need to redo the license stuff 210 # We need to redo the license stuff
209 self._replace_license_vars(srctree, lines_before, handled, extravalues, tinfoil.config_data) 211 self._replace_license_vars(srctree, lines_before, handled, extravalues, d)
210 212
211 # Shrinkwrap 213 # Shrinkwrap
212 localfilesdir = tempfile.mkdtemp(prefix='recipetool-npm') 214 localfilesdir = tempfile.mkdtemp(prefix='recipetool-npm')
213 self._shrinkwrap(srctree, localfilesdir, extravalues, lines_before) 215 self._shrinkwrap(srctree, localfilesdir, extravalues, lines_before, d)
214 216
215 # Lockdown 217 # Lockdown
216 self._lockdown(srctree, localfilesdir, extravalues, lines_before) 218 self._lockdown(srctree, localfilesdir, extravalues, lines_before, d)
217 219
218 # Split each npm module out to is own package 220 # Split each npm module out to is own package
219 npmpackages = oe.package.npm_split_package_dirs(srctree) 221 npmpackages = oe.package.npm_split_package_dirs(srctree)