summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2016-03-09 17:48:52 +1300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-03-09 17:00:29 +0000
commit91455005b65db1b6caededbcac0f08a0cfb660f3 (patch)
tree5b7e917a5560985f743d99475b722bc726f00660 /meta
parentd46827cfd322554b57c3fc774b4d914f6e449d75 (diff)
downloadpoky-91455005b65db1b6caededbcac0f08a0cfb660f3.tar.gz
recipetool: create: split npm module dependencies into packages
Rather than rolling all of an npm module's dependencies into the same package, split them into one module per package, setting the SUMMARY and PKGV values from the package.json file for each package. Additionally, mark each package with the appropriate license using the license scanning we already do, falling back to the license stated in the package.json file for the module if unknown. All of this is mostly in aid of ensuring all modules and their licenses now show up in the manifests for the image. Additionally we set the main LICENSE value more concretely once we've calculated the per-package licenses, since we have more information at that point. (From OE-Core rev: 8226805f83d21e7c1d2ba21969f3e8ee4b137496) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/npm.bbclass20
-rw-r--r--meta/lib/oe/package.py32
2 files changed, 52 insertions, 0 deletions
diff --git a/meta/classes/npm.bbclass b/meta/classes/npm.bbclass
index be76056c55..b5db99d2b9 100644
--- a/meta/classes/npm.bbclass
+++ b/meta/classes/npm.bbclass
@@ -18,6 +18,26 @@ npm_do_install() {
18 cp -a ${S}/* ${D}${libdir}/node_modules/${PN}/ --no-preserve=ownership 18 cp -a ${S}/* ${D}${libdir}/node_modules/${PN}/ --no-preserve=ownership
19} 19}
20 20
21python populate_packages_prepend () {
22 instdir = d.expand('${D}${libdir}/node_modules/${PN}')
23 extrapackages = oe.package.npm_split_package_dirs(instdir)
24 pkgnames = extrapackages.keys()
25 d.prependVar('PACKAGES', '%s ' % ' '.join(pkgnames))
26 for pkgname in pkgnames:
27 pkgrelpath, pdata = extrapackages[pkgname]
28 pkgpath = '${libdir}/node_modules/${PN}/' + pkgrelpath
29 expanded_pkgname = d.expand(pkgname)
30 d.setVar('FILES_%s' % expanded_pkgname, pkgpath)
31 if pdata:
32 version = pdata.get('version', None)
33 if version:
34 d.setVar('PKGV_%s' % expanded_pkgname, version.encode("utf8"))
35 description = pdata.get('description', None)
36 if description:
37 d.setVar('SUMMARY_%s' % expanded_pkgname, description.replace(u"\u2018", "'").replace(u"\u2019", "'").encode("utf8"))
38 d.appendVar('RDEPENDS_%s' % d.getVar('PN', True), ' %s' % ' '.join(pkgnames))
39}
40
21FILES_${PN} += " \ 41FILES_${PN} += " \
22 ${libdir}/node_modules/${PN} \ 42 ${libdir}/node_modules/${PN} \
23" 43"
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
index f176446b8b..dea443d658 100644
--- a/meta/lib/oe/package.py
+++ b/meta/lib/oe/package.py
@@ -123,3 +123,35 @@ def read_shlib_providers(d):
123 shlib_provider[s[0]] = {} 123 shlib_provider[s[0]] = {}
124 shlib_provider[s[0]][s[1]] = (dep_pkg, s[2]) 124 shlib_provider[s[0]][s[1]] = (dep_pkg, s[2])
125 return shlib_provider 125 return shlib_provider
126
127
128def npm_split_package_dirs(pkgdir):
129 """
130 Work out the packages fetched and unpacked by BitBake's npm fetcher
131 Returns a dict of packagename -> (relpath, package.json) ordered
132 such that it is suitable for use in PACKAGES and FILES
133 """
134 from collections import OrderedDict
135 import json
136 packages = {}
137 for root, dirs, files in os.walk(pkgdir):
138 if os.path.basename(root) == 'node_modules':
139 for dn in dirs:
140 relpth = os.path.relpath(os.path.join(root, dn), pkgdir)
141 pkgitems = ['${PN}']
142 for pathitem in relpth.split('/'):
143 if pathitem == 'node_modules':
144 continue
145 pkgitems.append(pathitem)
146 pkgname = '-'.join(pkgitems)
147 pkgfile = os.path.join(root, dn, 'package.json')
148 data = None
149 if os.path.exists(pkgfile):
150 with open(pkgfile, 'r') as f:
151 data = json.loads(f.read())
152 packages[pkgname] = (relpth, data)
153 # We want the main package for a module sorted *after* its subpackages
154 # (so that it doesn't otherwise steal the files for the subpackage), so
155 # this is a cheap way to do that whilst still having an otherwise
156 # alphabetical sort
157 return OrderedDict((key, packages[key]) for key in sorted(packages, key=lambda pkg: pkg + '~'))