diff options
Diffstat (limited to 'scripts/lib/recipetool/create_npm.py')
| -rw-r--r-- | scripts/lib/recipetool/create_npm.py | 57 |
1 files changed, 41 insertions, 16 deletions
diff --git a/scripts/lib/recipetool/create_npm.py b/scripts/lib/recipetool/create_npm.py index 113a89f6a6..dd0ac01c3e 100644 --- a/scripts/lib/recipetool/create_npm.py +++ b/scripts/lib/recipetool/create_npm.py | |||
| @@ -112,40 +112,52 @@ class NpmRecipeHandler(RecipeHandler): | |||
| 112 | """Return the extra license files and the list of packages""" | 112 | """Return the extra license files and the list of packages""" |
| 113 | licfiles = [] | 113 | licfiles = [] |
| 114 | packages = {} | 114 | packages = {} |
| 115 | # Licenses from package.json point to COMMON_LICENSE_DIR so we need | ||
| 116 | # to associate them explicitely for split_pkg_licenses() | ||
| 117 | fallback_licenses = dict() | ||
| 115 | 118 | ||
| 116 | # Handle the parent package | 119 | # Handle the parent package |
| 117 | packages["${PN}"] = "" | 120 | packages["${PN}"] = "" |
| 118 | 121 | ||
| 119 | def _licfiles_append_fallback_readme_files(destdir): | 122 | def _licfiles_append_fallback_package_files(destdir): |
| 120 | """Append README files as fallback to license files if a license files is missing""" | 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): | ||
| 125 | with open(os.path.join(srctree, package_json), "r") as f: | ||
| 126 | data = json.load(f) | ||
| 127 | if "license" in data: | ||
| 128 | licenses = data["license"].split(" ") | ||
| 129 | licenses = [license.strip("()") for license in licenses if license != "OR" and license != "AND"] | ||
| 130 | return ["${COMMON_LICENSE_DIR}/" + license for license in licenses], licenses | ||
| 131 | else: | ||
| 132 | return [package_json], None | ||
| 121 | 133 | ||
| 122 | fallback = True | 134 | fallback = True |
| 123 | readmes = [] | ||
| 124 | basedir = os.path.join(srctree, destdir) | 135 | basedir = os.path.join(srctree, destdir) |
| 125 | for fn in os.listdir(basedir): | 136 | for fn in os.listdir(basedir): |
| 126 | upper = fn.upper() | 137 | upper = fn.upper() |
| 127 | if upper.startswith("README"): | ||
| 128 | fullpath = os.path.join(basedir, fn) | ||
| 129 | readmes.append(fullpath) | ||
| 130 | if upper.startswith("COPYING") or "LICENCE" in upper or "LICENSE" in upper: | 138 | if upper.startswith("COPYING") or "LICENCE" in upper or "LICENSE" in upper: |
| 131 | fallback = False | 139 | fallback = False |
| 132 | if fallback: | 140 | if fallback: |
| 133 | for readme in readmes: | 141 | pkg_json = os.path.join(basedir, "package.json") |
| 134 | licfiles.append(os.path.relpath(readme, srctree)) | 142 | return _get_licenses_from_package_json(pkg_json) |
| 143 | return [], None | ||
| 135 | 144 | ||
| 136 | # Handle the dependencies | 145 | # Handle the dependencies |
| 137 | def _handle_dependency(name, params, destdir): | 146 | def _handle_dependency(name, params, destdir): |
| 138 | deptree = destdir.split('node_modules/') | 147 | deptree = destdir.split('node_modules/') |
| 139 | suffix = "-".join([npm_package(dep) for dep in deptree]) | 148 | suffix = "-".join([npm_package(dep) for dep in deptree]) |
| 140 | packages["${PN}" + suffix] = destdir | 149 | packages["${PN}" + suffix] = destdir |
| 141 | _licfiles_append_fallback_readme_files(destdir) | 150 | (fallback_licfiles, common_lics) = _licfiles_append_fallback_package_files(destdir) |
| 151 | licfiles.extend(fallback_licfiles) | ||
| 152 | if common_lics: | ||
| 153 | fallback_licenses["${PN}" + suffix] = common_lics | ||
| 142 | 154 | ||
| 143 | with open(shrinkwrap_file, "r") as f: | 155 | with open(shrinkwrap_file, "r") as f: |
| 144 | shrinkwrap = json.load(f) | 156 | shrinkwrap = json.load(f) |
| 145 | 157 | ||
| 146 | foreach_dependencies(shrinkwrap, _handle_dependency, dev) | 158 | foreach_dependencies(shrinkwrap, _handle_dependency, dev) |
| 147 | 159 | ||
| 148 | return licfiles, packages | 160 | return licfiles, packages, fallback_licenses |
| 149 | 161 | ||
| 150 | # Handle the peer dependencies | 162 | # Handle the peer dependencies |
| 151 | def _handle_peer_dependency(self, shrinkwrap_file): | 163 | def _handle_peer_dependency(self, shrinkwrap_file): |
| @@ -266,18 +278,31 @@ class NpmRecipeHandler(RecipeHandler): | |||
| 266 | fetcher.unpack(srctree) | 278 | fetcher.unpack(srctree) |
| 267 | 279 | ||
| 268 | bb.note("Handling licences ...") | 280 | bb.note("Handling licences ...") |
| 269 | (licfiles, packages) = self._handle_licenses(srctree, shrinkwrap_file, dev) | 281 | (licfiles, packages, fallback_licenses) = self._handle_licenses(srctree, shrinkwrap_file, dev) |
| 270 | 282 | ||
| 271 | def _guess_odd_license(licfiles): | 283 | def _guess_odd_license(licfiles): |
| 272 | import bb | 284 | import bb |
| 273 | 285 | ||
| 274 | md5sums = get_license_md5sums(d, linenumbers=True) | 286 | md5sums = get_license_md5sums(d, linenumbers=True) |
| 275 | 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 | |||
| 276 | chksums = [] | 297 | chksums = [] |
| 277 | licenses = [] | 298 | licenses = [] |
| 299 | md5value = None | ||
| 278 | for licfile in licfiles: | 300 | for licfile in licfiles: |
| 279 | f = os.path.join(srctree, licfile) | 301 | f = _resolve_licfile(srctree, licfile) |
| 280 | md5value = bb.utils.md5_file(f) | 302 | try: |
| 303 | md5value = bb.utils.md5_file(f) | ||
| 304 | except FileNotFoundError: | ||
| 305 | logger.info("Could not determine license for '%s'" % licfile) | ||
| 281 | (license, beginline, endline, md5) = md5sums.get(md5value, | 306 | (license, beginline, endline, md5) = md5sums.get(md5value, |
| 282 | (None, "", "", "")) | 307 | (None, "", "", "")) |
| 283 | if not license: | 308 | if not license: |
| @@ -292,10 +317,10 @@ class NpmRecipeHandler(RecipeHandler): | |||
| 292 | ";endline=%s" % (endline) if endline else "", | 317 | ";endline=%s" % (endline) if endline else "", |
| 293 | md5 if md5 else md5value)) | 318 | md5 if md5 else md5value)) |
| 294 | licenses.append((license, licfile, md5value)) | 319 | licenses.append((license, licfile, md5value)) |
| 295 | return (licenses, chksums) | 320 | return (licenses, chksums, fallback_licenses) |
| 296 | 321 | ||
| 297 | (licenses, extravalues["LIC_FILES_CHKSUM"]) = _guess_odd_license(licfiles) | 322 | (licenses, extravalues["LIC_FILES_CHKSUM"], fallback_licenses) = _guess_odd_license(licfiles) |
| 298 | split_pkg_licenses([*licenses, *guess_license(srctree, d)], packages, lines_after) | 323 | split_pkg_licenses([*licenses, *guess_license(srctree, d)], packages, lines_after, fallback_licenses) |
| 299 | 324 | ||
| 300 | classes.append("npm") | 325 | classes.append("npm") |
| 301 | handled.append("buildsystem") | 326 | handled.append("buildsystem") |
