summaryrefslogtreecommitdiff
path: root/poky/scripts/lib/recipetool
diff options
context:
space:
mode:
Diffstat (limited to 'poky/scripts/lib/recipetool')
-rw-r--r--poky/scripts/lib/recipetool/create.py42
-rw-r--r--poky/scripts/lib/recipetool/create_go.py4
-rw-r--r--poky/scripts/lib/recipetool/create_npm.py95
3 files changed, 74 insertions, 67 deletions
diff --git a/poky/scripts/lib/recipetool/create.py b/poky/scripts/lib/recipetool/create.py
index 066366e34f..ea2ef5be63 100644
--- a/poky/scripts/lib/recipetool/create.py
+++ b/poky/scripts/lib/recipetool/create.py
@@ -960,7 +960,7 @@ def handle_license_vars(srctree, lines_before, handled, extravalues, d):
# Someone else has already handled the license vars, just return their value
return lichandled[0][1]
- licvalues = guess_license(srctree, d)
+ licvalues = find_licenses(srctree, d)
licenses = []
lic_files_chksum = []
lic_unknown = []
@@ -1216,13 +1216,7 @@ def crunch_license(licfile):
lictext = ''
return md5val, lictext
-def guess_license(srctree, d):
- import bb
- md5sums = get_license_md5sums(d)
-
- crunched_md5sums = crunch_known_licenses(d)
-
- licenses = []
+def find_license_files(srctree):
licspecs = ['*LICEN[CS]E*', 'COPYING*', '*[Ll]icense*', 'LEGAL*', '[Ll]egal*', '*GPL*', 'README.lic*', 'COPYRIGHT*', '[Cc]opyright*', 'e[dp]l-v10']
skip_extensions = (".html", ".js", ".json", ".svg", ".ts", ".go")
licfiles = []
@@ -1235,11 +1229,22 @@ def guess_license(srctree, d):
fullpath = os.path.join(root, fn)
if not fullpath in licfiles:
licfiles.append(fullpath)
+
+ return licfiles
+
+def match_licenses(licfiles, srctree, d):
+ import bb
+ md5sums = get_license_md5sums(d)
+
+ crunched_md5sums = crunch_known_licenses(d)
+
+ licenses = []
for licfile in sorted(licfiles):
- md5value = bb.utils.md5_file(licfile)
+ resolved_licfile = d.expand(licfile)
+ md5value = bb.utils.md5_file(resolved_licfile)
license = md5sums.get(md5value, None)
if not license:
- crunched_md5, lictext = crunch_license(licfile)
+ crunched_md5, lictext = crunch_license(resolved_licfile)
license = crunched_md5sums.get(crunched_md5, None)
if lictext and not license:
license = 'Unknown'
@@ -1249,13 +1254,19 @@ def guess_license(srctree, d):
if license:
licenses.append((license, os.path.relpath(licfile, srctree), md5value))
+ return licenses
+
+def find_licenses(srctree, d):
+ licfiles = find_license_files(srctree)
+ licenses = match_licenses(licfiles, srctree, d)
+
# FIXME should we grab at least one source file with a license header and add that too?
return licenses
def split_pkg_licenses(licvalues, packages, outlines, fallback_licenses=None, pn='${PN}'):
"""
- Given a list of (license, path, md5sum) as returned by guess_license(),
+ Given a list of (license, path, md5sum) as returned by match_licenses(),
a dict of package name to path mappings, write out a set of
package-specific LICENSE values.
"""
@@ -1284,6 +1295,14 @@ def split_pkg_licenses(licvalues, packages, outlines, fallback_licenses=None, pn
outlicenses[pkgname] = licenses
return outlicenses
+def generate_common_licenses_chksums(common_licenses, d):
+ lic_files_chksums = []
+ for license in tidy_licenses(common_licenses):
+ licfile = '${COMMON_LICENSE_DIR}/' + license
+ md5value = bb.utils.md5_file(d.expand(licfile))
+ lic_files_chksums.append('file://%s;md5=%s' % (licfile, md5value))
+ return lic_files_chksums
+
def read_pkgconfig_provides(d):
pkgdatadir = d.getVar('PKGDATA_DIR')
pkgmap = {}
@@ -1418,4 +1437,3 @@ def register_commands(subparsers):
parser_create.add_argument('--devtool', action="store_true", help=argparse.SUPPRESS)
parser_create.add_argument('--mirrors', action="store_true", help='Enable PREMIRRORS and MIRRORS for source tree fetching (disabled by default).')
parser_create.set_defaults(func=create_recipe)
-
diff --git a/poky/scripts/lib/recipetool/create_go.py b/poky/scripts/lib/recipetool/create_go.py
index a85a2f2786..5cc53931f0 100644
--- a/poky/scripts/lib/recipetool/create_go.py
+++ b/poky/scripts/lib/recipetool/create_go.py
@@ -14,7 +14,7 @@ from collections import namedtuple
from enum import Enum
from html.parser import HTMLParser
from recipetool.create import RecipeHandler, handle_license_vars
-from recipetool.create import guess_license, tidy_licenses, fixup_license
+from recipetool.create import find_licenses, tidy_licenses, fixup_license
from recipetool.create import determine_from_url
from urllib.error import URLError, HTTPError
@@ -624,7 +624,7 @@ class GoRecipeHandler(RecipeHandler):
licenses = []
lic_files_chksum = []
- licvalues = guess_license(tmp_vendor_dir, d)
+ licvalues = find_licenses(tmp_vendor_dir, d)
shutil.rmtree(tmp_vendor_dir)
if licvalues:
diff --git a/poky/scripts/lib/recipetool/create_npm.py b/poky/scripts/lib/recipetool/create_npm.py
index 113a89f6a6..3363a0e7ee 100644
--- a/poky/scripts/lib/recipetool/create_npm.py
+++ b/poky/scripts/lib/recipetool/create_npm.py
@@ -16,8 +16,7 @@ from bb.fetch2.npm import NpmEnvironment
from bb.fetch2.npm import npm_package
from bb.fetch2.npmsw import foreach_dependencies
from recipetool.create import RecipeHandler
-from recipetool.create import get_license_md5sums
-from recipetool.create import guess_license
+from recipetool.create import match_licenses, find_license_files, generate_common_licenses_chksums
from recipetool.create import split_pkg_licenses
logger = logging.getLogger('recipetool')
@@ -112,40 +111,54 @@ class NpmRecipeHandler(RecipeHandler):
"""Return the extra license files and the list of packages"""
licfiles = []
packages = {}
+ # Licenses from package.json will point to COMMON_LICENSE_DIR so we need
+ # to associate them explicitely to packages for split_pkg_licenses()
+ fallback_licenses = dict()
+
+ def _find_package_licenses(destdir):
+ """Either find license files, or use package.json metadata"""
+ def _get_licenses_from_package_json(package_json):
+ with open(os.path.join(srctree, package_json), "r") as f:
+ data = json.load(f)
+ if "license" in data:
+ licenses = data["license"].split(" ")
+ licenses = [license.strip("()") for license in licenses if license != "OR" and license != "AND"]
+ return [], licenses
+ else:
+ return [package_json], None
- # Handle the parent package
- packages["${PN}"] = ""
-
- def _licfiles_append_fallback_readme_files(destdir):
- """Append README files as fallback to license files if a license files is missing"""
-
- fallback = True
- readmes = []
basedir = os.path.join(srctree, destdir)
- for fn in os.listdir(basedir):
- upper = fn.upper()
- if upper.startswith("README"):
- fullpath = os.path.join(basedir, fn)
- readmes.append(fullpath)
- if upper.startswith("COPYING") or "LICENCE" in upper or "LICENSE" in upper:
- fallback = False
- if fallback:
- for readme in readmes:
- licfiles.append(os.path.relpath(readme, srctree))
+ licfiles = find_license_files(basedir)
+ if len(licfiles) > 0:
+ return licfiles, None
+ else:
+ # A license wasn't found in the package directory, so we'll use the package.json metadata
+ pkg_json = os.path.join(basedir, "package.json")
+ return _get_licenses_from_package_json(pkg_json)
+
+ def _get_package_licenses(destdir, package):
+ (package_licfiles, package_licenses) = _find_package_licenses(destdir)
+ if package_licfiles:
+ licfiles.extend(package_licfiles)
+ else:
+ fallback_licenses[package] = package_licenses
# Handle the dependencies
def _handle_dependency(name, params, destdir):
deptree = destdir.split('node_modules/')
suffix = "-".join([npm_package(dep) for dep in deptree])
packages["${PN}" + suffix] = destdir
- _licfiles_append_fallback_readme_files(destdir)
+ _get_package_licenses(destdir, "${PN}" + suffix)
with open(shrinkwrap_file, "r") as f:
shrinkwrap = json.load(f)
-
foreach_dependencies(shrinkwrap, _handle_dependency, dev)
- return licfiles, packages
+ # Handle the parent package
+ packages["${PN}"] = ""
+ _get_package_licenses(srctree, "${PN}")
+
+ return licfiles, packages, fallback_licenses
# Handle the peer dependencies
def _handle_peer_dependency(self, shrinkwrap_file):
@@ -266,36 +279,12 @@ class NpmRecipeHandler(RecipeHandler):
fetcher.unpack(srctree)
bb.note("Handling licences ...")
- (licfiles, packages) = self._handle_licenses(srctree, shrinkwrap_file, dev)
-
- def _guess_odd_license(licfiles):
- import bb
-
- md5sums = get_license_md5sums(d, linenumbers=True)
-
- chksums = []
- licenses = []
- for licfile in licfiles:
- f = os.path.join(srctree, licfile)
- md5value = bb.utils.md5_file(f)
- (license, beginline, endline, md5) = md5sums.get(md5value,
- (None, "", "", ""))
- if not license:
- license = "Unknown"
- logger.info("Please add the following line for '%s' to a "
- "'lib/recipetool/licenses.csv' and replace `Unknown`, "
- "`X`, `Y` and `MD5` with the license, begin line, "
- "end line and partial MD5 checksum:\n" \
- "%s,Unknown,X,Y,MD5" % (licfile, md5value))
- chksums.append("file://%s%s%s;md5=%s" % (licfile,
- ";beginline=%s" % (beginline) if beginline else "",
- ";endline=%s" % (endline) if endline else "",
- md5 if md5 else md5value))
- licenses.append((license, licfile, md5value))
- return (licenses, chksums)
-
- (licenses, extravalues["LIC_FILES_CHKSUM"]) = _guess_odd_license(licfiles)
- split_pkg_licenses([*licenses, *guess_license(srctree, d)], packages, lines_after)
+ (licfiles, packages, fallback_licenses) = self._handle_licenses(srctree, shrinkwrap_file, dev)
+ licvalues = match_licenses(licfiles, srctree, d)
+ split_pkg_licenses(licvalues, packages, lines_after, fallback_licenses)
+ fallback_licenses_flat = [license for sublist in fallback_licenses.values() for license in sublist]
+ extravalues["LIC_FILES_CHKSUM"] = generate_common_licenses_chksums(fallback_licenses_flat, d)
+ extravalues["LICENSE"] = fallback_licenses_flat
classes.append("npm")
handled.append("buildsystem")