summaryrefslogtreecommitdiffstats
path: root/scripts/lib/recipetool/create.py
diff options
context:
space:
mode:
authorStefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>2021-12-15 17:08:11 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-12-20 15:29:01 +0000
commit32f56de27851714082bcef2de9e783140e282cb0 (patch)
tree1f24a59db6f33fa6b23a71b42051c00f8614bf6e /scripts/lib/recipetool/create.py
parent2be34ea6edde2d8a7ca035089b2a52dff76b5652 (diff)
downloadpoky-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.py39
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
922def fixup_license(value):
923 # Ensure licenses with OR starts and ends with brackets
924 if '|' in value:
925 return '(' + value + ')'
926 return value
927
928def 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
922def handle_license_vars(srctree, lines_before, handled, extravalues, d): 938def 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
1248def read_pkgconfig_provides(d): 1269def read_pkgconfig_provides(d):