diff options
author | Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com> | 2021-12-15 17:08:11 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-12-20 15:29:01 +0000 |
commit | 32f56de27851714082bcef2de9e783140e282cb0 (patch) | |
tree | 1f24a59db6f33fa6b23a71b42051c00f8614bf6e /scripts/lib/recipetool/create.py | |
parent | 2be34ea6edde2d8a7ca035089b2a52dff76b5652 (diff) | |
download | poky-32f56de27851714082bcef2de9e783140e282cb0.tar.gz |
recipetool: Separate licenses with & operator
Separate licenses with & operator since it should be satisfied most use
cases and it is a reasonable assumption that all the licenses apply.
Furthermore flat, split and sort the licenses to minimize license string
changes.
Separate package licenses with & operator:
-LICENSE:${PN} = "MIT ISC"
+LICENSE:${PN} = "ISC & MIT"
Respect | and brackets in LICENSE:
-LICENSE = "BSD-3-Clause & (ISC & | & MIT)"
+LICENSE = "BSD-3-Clause & (ISC | MIT)"
Sort licenses:
-LICENSE = "MIT & BSD-3-Clause & ISC"
+LICENSE = "BSD-3-Clause & ISC & MIT"
Remove duplicates:
-LICENSE = "MIT & ISC & MIT"
+LICENSE = "ISC & MIT"
(From OE-Core rev: 60a84ecc53d20118c5e7f86dd3e3cafbfed1cf0a)
Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/recipetool/create.py')
-rw-r--r-- | scripts/lib/recipetool/create.py | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/scripts/lib/recipetool/create.py b/scripts/lib/recipetool/create.py index 28224dbc24..507a230511 100644 --- a/scripts/lib/recipetool/create.py +++ b/scripts/lib/recipetool/create.py | |||
@@ -919,6 +919,22 @@ def split_value(value): | |||
919 | else: | 919 | else: |
920 | return value | 920 | return value |
921 | 921 | ||
922 | def fixup_license(value): | ||
923 | # Ensure licenses with OR starts and ends with brackets | ||
924 | if '|' in value: | ||
925 | return '(' + value + ')' | ||
926 | return value | ||
927 | |||
928 | def tidy_licenses(value): | ||
929 | """Flat, split and sort licenses""" | ||
930 | from oe.license import flattened_licenses | ||
931 | def _choose(a, b): | ||
932 | str_a, str_b = sorted((" & ".join(a), " & ".join(b)), key=str.casefold) | ||
933 | return ["(%s | %s)" % (str_a, str_b)] | ||
934 | if not isinstance(value, str): | ||
935 | value = " & ".join(value) | ||
936 | return sorted(list(set(flattened_licenses(value, _choose))), key=str.casefold) | ||
937 | |||
922 | def handle_license_vars(srctree, lines_before, handled, extravalues, d): | 938 | def handle_license_vars(srctree, lines_before, handled, extravalues, d): |
923 | lichandled = [x for x in handled if x[0] == 'license'] | 939 | lichandled = [x for x in handled if x[0] == 'license'] |
924 | if lichandled: | 940 | if lichandled: |
@@ -932,10 +948,13 @@ def handle_license_vars(srctree, lines_before, handled, extravalues, d): | |||
932 | lines = [] | 948 | lines = [] |
933 | if licvalues: | 949 | if licvalues: |
934 | for licvalue in licvalues: | 950 | for licvalue in licvalues: |
935 | if not licvalue[0] in licenses: | 951 | license = licvalue[0] |
936 | licenses.append(licvalue[0]) | 952 | lics = tidy_licenses(fixup_license(license)) |
953 | lics = [lic for lic in lics if lic not in licenses] | ||
954 | if len(lics): | ||
955 | licenses.extend(lics) | ||
937 | lic_files_chksum.append('file://%s;md5=%s' % (licvalue[1], licvalue[2])) | 956 | lic_files_chksum.append('file://%s;md5=%s' % (licvalue[1], licvalue[2])) |
938 | if licvalue[0] == 'Unknown': | 957 | if license == 'Unknown': |
939 | lic_unknown.append(licvalue[1]) | 958 | lic_unknown.append(licvalue[1]) |
940 | if lic_unknown: | 959 | if lic_unknown: |
941 | lines.append('#') | 960 | lines.append('#') |
@@ -944,9 +963,7 @@ def handle_license_vars(srctree, lines_before, handled, extravalues, d): | |||
944 | for licfile in lic_unknown: | 963 | for licfile in lic_unknown: |
945 | lines.append('# %s' % licfile) | 964 | lines.append('# %s' % licfile) |
946 | 965 | ||
947 | extra_license = split_value(extravalues.pop('LICENSE', [])) | 966 | extra_license = tidy_licenses(extravalues.pop('LICENSE', '')) |
948 | if '&' in extra_license: | ||
949 | extra_license.remove('&') | ||
950 | if extra_license: | 967 | if extra_license: |
951 | if licenses == ['Unknown']: | 968 | if licenses == ['Unknown']: |
952 | licenses = extra_license | 969 | licenses = extra_license |
@@ -987,7 +1004,7 @@ def handle_license_vars(srctree, lines_before, handled, extravalues, d): | |||
987 | lines.append('# instead of &. If there is any doubt, check the accompanying documentation') | 1004 | lines.append('# instead of &. If there is any doubt, check the accompanying documentation') |
988 | lines.append('# to determine which situation is applicable.') | 1005 | lines.append('# to determine which situation is applicable.') |
989 | 1006 | ||
990 | lines.append('LICENSE = "%s"' % ' & '.join(licenses)) | 1007 | lines.append('LICENSE = "%s"' % ' & '.join(sorted(licenses, key=str.casefold))) |
991 | lines.append('LIC_FILES_CHKSUM = "%s"' % ' \\\n '.join(lic_files_chksum)) | 1008 | lines.append('LIC_FILES_CHKSUM = "%s"' % ' \\\n '.join(lic_files_chksum)) |
992 | lines.append('') | 1009 | lines.append('') |
993 | 1010 | ||
@@ -1226,6 +1243,7 @@ def split_pkg_licenses(licvalues, packages, outlines, fallback_licenses=[], pn=' | |||
1226 | """ | 1243 | """ |
1227 | pkglicenses = {pn: []} | 1244 | pkglicenses = {pn: []} |
1228 | for license, licpath, _ in licvalues: | 1245 | for license, licpath, _ in licvalues: |
1246 | license = fixup_license(license) | ||
1229 | for pkgname, pkgpath in packages.items(): | 1247 | for pkgname, pkgpath in packages.items(): |
1230 | if licpath.startswith(pkgpath + '/'): | 1248 | if licpath.startswith(pkgpath + '/'): |
1231 | if pkgname in pkglicenses: | 1249 | if pkgname in pkglicenses: |
@@ -1238,11 +1256,14 @@ def split_pkg_licenses(licvalues, packages, outlines, fallback_licenses=[], pn=' | |||
1238 | pkglicenses[pn].append(license) | 1256 | pkglicenses[pn].append(license) |
1239 | outlicenses = {} | 1257 | outlicenses = {} |
1240 | for pkgname in packages: | 1258 | for pkgname in packages: |
1241 | license = ' '.join(list(set(pkglicenses.get(pkgname, ['Unknown'])))) or 'Unknown' | 1259 | # Assume AND operator between license files |
1260 | license = ' & '.join(list(set(pkglicenses.get(pkgname, ['Unknown'])))) or 'Unknown' | ||
1242 | if license == 'Unknown' and pkgname in fallback_licenses: | 1261 | if license == 'Unknown' and pkgname in fallback_licenses: |
1243 | license = fallback_licenses[pkgname] | 1262 | license = fallback_licenses[pkgname] |
1263 | licenses = tidy_licenses(license) | ||
1264 | license = ' & '.join(licenses) | ||
1244 | outlines.append('LICENSE:%s = "%s"' % (pkgname, license)) | 1265 | outlines.append('LICENSE:%s = "%s"' % (pkgname, license)) |
1245 | outlicenses[pkgname] = license.split() | 1266 | outlicenses[pkgname] = licenses |
1246 | return outlicenses | 1267 | return outlicenses |
1247 | 1268 | ||
1248 | def read_pkgconfig_provides(d): | 1269 | def read_pkgconfig_provides(d): |