diff options
Diffstat (limited to 'scripts/lib/recipetool/create_npm.py')
-rw-r--r-- | scripts/lib/recipetool/create_npm.py | 92 |
1 files changed, 28 insertions, 64 deletions
diff --git a/scripts/lib/recipetool/create_npm.py b/scripts/lib/recipetool/create_npm.py index 78dc248f31..3363a0e7ee 100644 --- a/scripts/lib/recipetool/create_npm.py +++ b/scripts/lib/recipetool/create_npm.py | |||
@@ -16,8 +16,7 @@ from bb.fetch2.npm import NpmEnvironment | |||
16 | from bb.fetch2.npm import npm_package | 16 | from bb.fetch2.npm import npm_package |
17 | from bb.fetch2.npmsw import foreach_dependencies | 17 | from bb.fetch2.npmsw import foreach_dependencies |
18 | from recipetool.create import RecipeHandler | 18 | from recipetool.create import RecipeHandler |
19 | from recipetool.create import get_license_md5sums | 19 | from recipetool.create import match_licenses, find_license_files, generate_common_licenses_chksums |
20 | from recipetool.create import find_licenses | ||
21 | from recipetool.create import split_pkg_licenses | 20 | from recipetool.create import split_pkg_licenses |
22 | logger = logging.getLogger('recipetool') | 21 | logger = logging.getLogger('recipetool') |
23 | 22 | ||
@@ -112,51 +111,53 @@ class NpmRecipeHandler(RecipeHandler): | |||
112 | """Return the extra license files and the list of packages""" | 111 | """Return the extra license files and the list of packages""" |
113 | licfiles = [] | 112 | licfiles = [] |
114 | packages = {} | 113 | packages = {} |
115 | # Licenses from package.json point to COMMON_LICENSE_DIR so we need | 114 | # Licenses from package.json will point to COMMON_LICENSE_DIR so we need |
116 | # to associate them explicitely for split_pkg_licenses() | 115 | # to associate them explicitely to packages for split_pkg_licenses() |
117 | fallback_licenses = dict() | 116 | fallback_licenses = dict() |
118 | 117 | ||
119 | # Handle the parent package | 118 | def _find_package_licenses(destdir): |
120 | packages["${PN}"] = "" | 119 | """Either find license files, or use package.json metadata""" |
121 | |||
122 | def _licfiles_append_fallback_package_files(destdir): | ||
123 | """Append package.json files as fallback to license files if a license files is missing""" | ||
124 | def _get_licenses_from_package_json(package_json): | 120 | def _get_licenses_from_package_json(package_json): |
125 | with open(os.path.join(srctree, package_json), "r") as f: | 121 | with open(os.path.join(srctree, package_json), "r") as f: |
126 | data = json.load(f) | 122 | data = json.load(f) |
127 | if "license" in data: | 123 | if "license" in data: |
128 | licenses = data["license"].split(" ") | 124 | licenses = data["license"].split(" ") |
129 | licenses = [license.strip("()") for license in licenses if license != "OR" and license != "AND"] | 125 | licenses = [license.strip("()") for license in licenses if license != "OR" and license != "AND"] |
130 | return ["${COMMON_LICENSE_DIR}/" + license for license in licenses], licenses | 126 | return [], licenses |
131 | else: | 127 | else: |
132 | return [package_json], None | 128 | return [package_json], None |
133 | 129 | ||
134 | fallback = True | ||
135 | basedir = os.path.join(srctree, destdir) | 130 | basedir = os.path.join(srctree, destdir) |
136 | for fn in os.listdir(basedir): | 131 | licfiles = find_license_files(basedir) |
137 | upper = fn.upper() | 132 | if len(licfiles) > 0: |
138 | if upper.startswith("COPYING") or "LICENCE" in upper or "LICENSE" in upper: | 133 | return licfiles, None |
139 | fallback = False | 134 | else: |
140 | if fallback: | 135 | # A license wasn't found in the package directory, so we'll use the package.json metadata |
141 | pkg_json = os.path.join(basedir, "package.json") | 136 | pkg_json = os.path.join(basedir, "package.json") |
142 | return _get_licenses_from_package_json(pkg_json) | 137 | return _get_licenses_from_package_json(pkg_json) |
143 | return [], None | 138 | |
139 | def _get_package_licenses(destdir, package): | ||
140 | (package_licfiles, package_licenses) = _find_package_licenses(destdir) | ||
141 | if package_licfiles: | ||
142 | licfiles.extend(package_licfiles) | ||
143 | else: | ||
144 | fallback_licenses[package] = package_licenses | ||
144 | 145 | ||
145 | # Handle the dependencies | 146 | # Handle the dependencies |
146 | def _handle_dependency(name, params, destdir): | 147 | def _handle_dependency(name, params, destdir): |
147 | deptree = destdir.split('node_modules/') | 148 | deptree = destdir.split('node_modules/') |
148 | suffix = "-".join([npm_package(dep) for dep in deptree]) | 149 | suffix = "-".join([npm_package(dep) for dep in deptree]) |
149 | packages["${PN}" + suffix] = destdir | 150 | packages["${PN}" + suffix] = destdir |
150 | (fallback_licfiles, common_lics) = _licfiles_append_fallback_package_files(destdir) | 151 | _get_package_licenses(destdir, "${PN}" + suffix) |
151 | licfiles.extend(fallback_licfiles) | ||
152 | if common_lics: | ||
153 | fallback_licenses["${PN}" + suffix] = common_lics | ||
154 | 152 | ||
155 | with open(shrinkwrap_file, "r") as f: | 153 | with open(shrinkwrap_file, "r") as f: |
156 | shrinkwrap = json.load(f) | 154 | shrinkwrap = json.load(f) |
157 | |||
158 | foreach_dependencies(shrinkwrap, _handle_dependency, dev) | 155 | foreach_dependencies(shrinkwrap, _handle_dependency, dev) |
159 | 156 | ||
157 | # Handle the parent package | ||
158 | packages["${PN}"] = "" | ||
159 | _get_package_licenses(srctree, "${PN}") | ||
160 | |||
160 | return licfiles, packages, fallback_licenses | 161 | return licfiles, packages, fallback_licenses |
161 | 162 | ||
162 | # Handle the peer dependencies | 163 | # Handle the peer dependencies |
@@ -279,48 +280,11 @@ class NpmRecipeHandler(RecipeHandler): | |||
279 | 280 | ||
280 | bb.note("Handling licences ...") | 281 | bb.note("Handling licences ...") |
281 | (licfiles, packages, fallback_licenses) = self._handle_licenses(srctree, shrinkwrap_file, dev) | 282 | (licfiles, packages, fallback_licenses) = self._handle_licenses(srctree, shrinkwrap_file, dev) |
282 | 283 | licvalues = match_licenses(licfiles, srctree, d) | |
283 | def _guess_odd_license(licfiles): | 284 | split_pkg_licenses(licvalues, packages, lines_after, fallback_licenses) |
284 | import bb | 285 | fallback_licenses_flat = [license for sublist in fallback_licenses.values() for license in sublist] |
285 | 286 | extravalues["LIC_FILES_CHKSUM"] = generate_common_licenses_chksums(fallback_licenses_flat, d) | |
286 | md5sums = get_license_md5sums(d, linenumbers=True) | 287 | extravalues["LICENSE"] = fallback_licenses_flat |
287 | |||
288 | def _resolve_licfile(srctree, licfile): | ||
289 | match = re.search(r'\$\{COMMON_LICENSE_DIR\}/(.+)$', licfile) | ||
290 | if match: | ||
291 | license = match.group(1) | ||
292 | commonlicdir = d.getVar('COMMON_LICENSE_DIR') | ||
293 | return os.path.join(commonlicdir, license) | ||
294 | |||
295 | return os.path.join(srctree, licfile) | ||
296 | |||
297 | chksums = [] | ||
298 | licenses = [] | ||
299 | md5value = None | ||
300 | for licfile in licfiles: | ||
301 | f = _resolve_licfile(srctree, licfile) | ||
302 | try: | ||
303 | md5value = bb.utils.md5_file(f) | ||
304 | except FileNotFoundError: | ||
305 | logger.info("Could not determine license for '%s'" % licfile) | ||
306 | (license, beginline, endline, md5) = md5sums.get(md5value, | ||
307 | (None, "", "", "")) | ||
308 | if not license: | ||
309 | license = "Unknown" | ||
310 | logger.info("Please add the following line for '%s' to a " | ||
311 | "'lib/recipetool/licenses.csv' and replace `Unknown`, " | ||
312 | "`X`, `Y` and `MD5` with the license, begin line, " | ||
313 | "end line and partial MD5 checksum:\n" \ | ||
314 | "%s,Unknown,X,Y,MD5" % (licfile, md5value)) | ||
315 | chksums.append("file://%s%s%s;md5=%s" % (licfile, | ||
316 | ";beginline=%s" % (beginline) if beginline else "", | ||
317 | ";endline=%s" % (endline) if endline else "", | ||
318 | md5 if md5 else md5value)) | ||
319 | licenses.append((license, licfile, md5value)) | ||
320 | return (licenses, chksums, fallback_licenses) | ||
321 | |||
322 | (licenses, extravalues["LIC_FILES_CHKSUM"], fallback_licenses) = _guess_odd_license(licfiles) | ||
323 | split_pkg_licenses([*licenses, *find_licenses(srctree, d)], packages, lines_after, fallback_licenses) | ||
324 | 288 | ||
325 | classes.append("npm") | 289 | classes.append("npm") |
326 | handled.append("buildsystem") | 290 | handled.append("buildsystem") |