mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00

Fixes [YOCTO #11028] When dealing with node modules which use "node-gyp" [1] to build native addons to node. Some temporary build files stay in the image: object files, static library files, dependency files, ... This commit does not keep only the required files, but remove the files which can leads to QA issues (staticdev with static library files). [1]: https://github.com/nodejs/node-gyp (From OE-Core rev: bac9075f51f6acba2fcfbe9f79f97f5171186d9c) Signed-off-by: Jean-Marie LEMETAYER <jean-marie.lemetayer@savoirfairelinux.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
95 lines
3.2 KiB
Plaintext
95 lines
3.2 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 = "${libdir}/node_modules/${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 ${D}${libdir}/node_modules
|
|
local NPM_PACKFILE=$(npm pack .)
|
|
npm install --prefix ${D}${prefix} -g --arch=${NPM_ARCH} --target_arch=${NPM_ARCH} --production --no-registry ${NPM_PACKFILE}
|
|
ln -fs node_modules ${D}${libdir}/node
|
|
find ${D}${NPM_INSTALLDIR} -type f \( -name "*.a" -o -name "*.d" -o -name "*.o" \) -delete
|
|
if [ -d ${D}${prefix}/etc ] ; then
|
|
# This will be empty
|
|
rmdir ${D}${prefix}/etc
|
|
fi
|
|
}
|
|
|
|
python populate_packages_prepend () {
|
|
instdir = d.expand('${D}${NPM_INSTALLDIR}')
|
|
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 = '${NPM_INSTALLDIR}/' + 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} += " \
|
|
${bindir} \
|
|
${libdir}/node \
|
|
${NPM_INSTALLDIR} \
|
|
"
|
|
|
|
EXPORT_FUNCTIONS do_compile do_install
|