mirror of
https://git.yoctoproject.org/poky
synced 2026-02-12 19:53:03 +01:00
The node binary searches for packages in a number of locations, the last of which is $PREFIX/lib/node (here: /usr/lib/node) from the list of GLOBAL_FOLDERS [1]. Change the installation directory for all packages depending on npm.bbclass to that location. This removes the need to define the NODE_PATH variable to the non-standard /usr/lib/node_modules value. While the Tips for Package Managers [2] discusses installing packages to /usr/lib/node_modules/<name>/<version>, this has several drawbacks: * it does not work for the REPL as mentioned in the documentation * it also does not work for any code _not_ installed as a global package under /usr/lib/node_modules (e.g. /usr/share/foo.js will not find any packages below /usr/lib) * using the non-default location and then having to set NODE_PATH barely saves any time: there are only two file-system lookups (to the legacy $HOME/.node_modules and $HOME/.node_libraries) directories before the library would be found And the suggestion was made in the context of deduping the node_modules tree by installing all packages in a flat hierarchy and using symlinks to the correct version of each dependency. This is not what OpenEmbedded does, so none of those benefits (deduping, cleaner packages) are being had by shifting the installation directory to /usr/lib/node_modules. [1]: https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders [2]: https://nodejs.org/api/modules.html#modules_addenda_package_manager_tips (From OE-Core rev: 2036137151929b541293154ff529475071cd92b0) Signed-off-by: Olaf Mandel <o.mandel@menlosystems.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
91 lines
3.0 KiB
Plaintext
91 lines
3.0 KiB
Plaintext
DEPENDS_prepend = "nodejs-native "
|
|
RDEPENDS_${PN}_prepend = "nodejs "
|
|
S = "${WORKDIR}/npmpkg"
|
|
|
|
def node_pkgname(d):
|
|
bpn = d.getVar('BPN')
|
|
if bpn.startswith("node-"):
|
|
return bpn[5:]
|
|
return bpn
|
|
|
|
NPMPN ?= "${@node_pkgname(d)}"
|
|
|
|
NPM_INSTALLDIR = "${D}${libdir}/node/${NPMPN}"
|
|
|
|
# function maps arch names to npm arch names
|
|
def npm_oe_arch_map(target_arch, d):
|
|
import re
|
|
if re.match('p(pc|owerpc)(|64)', target_arch): return 'ppc'
|
|
elif re.match('i.86$', target_arch): return 'ia32'
|
|
elif re.match('x86_64$', target_arch): return 'x64'
|
|
elif re.match('arm64$', target_arch): return 'arm'
|
|
return target_arch
|
|
|
|
NPM_ARCH ?= "${@npm_oe_arch_map(d.getVar('TARGET_ARCH'), d)}"
|
|
NPM_INSTALL_DEV = "0"
|
|
|
|
npm_do_compile() {
|
|
# Copy in any additionally fetched modules
|
|
if [ -d ${WORKDIR}/node_modules ] ; then
|
|
cp -a ${WORKDIR}/node_modules ${S}/
|
|
fi
|
|
# changing the home directory to the working directory, the .npmrc will
|
|
# be created in this directory
|
|
export HOME=${WORKDIR}
|
|
if [ "${NPM_INSTALL_DEV}" = "1" ]; then
|
|
npm config set dev true
|
|
else
|
|
npm config set dev false
|
|
fi
|
|
npm set cache ${WORKDIR}/npm_cache
|
|
# clear cache before every build
|
|
npm cache clear --force
|
|
# Install pkg into ${S} without going to the registry
|
|
if [ "${NPM_INSTALL_DEV}" = "1" ]; then
|
|
npm --arch=${NPM_ARCH} --target_arch=${NPM_ARCH} --no-registry install
|
|
else
|
|
npm --arch=${NPM_ARCH} --target_arch=${NPM_ARCH} --production --no-registry install
|
|
fi
|
|
}
|
|
|
|
npm_do_install() {
|
|
# changing the home directory to the working directory, the .npmrc will
|
|
# be created in this directory
|
|
export HOME=${WORKDIR}
|
|
mkdir -p ${NPM_INSTALLDIR}/
|
|
npm pack .
|
|
npm install --prefix ${D}${prefix} -g --arch=${NPM_ARCH} --target_arch=${NPM_ARCH} --production --no-registry ${NPMPN}-${PV}.tgz
|
|
if [ -d ${D}${prefix}/etc ] ; then
|
|
# This will be empty
|
|
rmdir ${D}${prefix}/etc
|
|
fi
|
|
}
|
|
|
|
python populate_packages_prepend () {
|
|
instdir = d.expand('${D}${libdir}/node_modules/${NPMPN}')
|
|
extrapackages = oe.package.npm_split_package_dirs(instdir)
|
|
pkgnames = extrapackages.keys()
|
|
d.prependVar('PACKAGES', '%s ' % ' '.join(pkgnames))
|
|
for pkgname in pkgnames:
|
|
pkgrelpath, pdata = extrapackages[pkgname]
|
|
pkgpath = '${libdir}/node_modules/${NPMPN}/' + pkgrelpath
|
|
# package names can't have underscores but npm packages sometimes use them
|
|
oe_pkg_name = pkgname.replace('_', '-')
|
|
expanded_pkgname = d.expand(oe_pkg_name)
|
|
d.setVar('FILES_%s' % expanded_pkgname, pkgpath)
|
|
if pdata:
|
|
version = pdata.get('version', None)
|
|
if version:
|
|
d.setVar('PKGV_%s' % expanded_pkgname, version)
|
|
description = pdata.get('description', None)
|
|
if description:
|
|
d.setVar('SUMMARY_%s' % expanded_pkgname, description.replace(u"\u2018", "'").replace(u"\u2019", "'"))
|
|
d.appendVar('RDEPENDS_%s' % d.getVar('PN'), ' %s' % ' '.join(pkgnames).replace('_', '-'))
|
|
}
|
|
|
|
FILES_${PN} += " \
|
|
${libdir}/node_modules/${NPMPN} \
|
|
"
|
|
|
|
EXPORT_FUNCTIONS do_compile do_install
|