aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergei Miroshnichenko <sergeimir@emcraft.com>2016-07-26 10:53:03 +0300
committerSergei Miroshnichenko <sergeimir@emcraft.com>2016-10-18 13:14:57 +0300
commit42e7af2a1758a911705d3bd26d8ab6b33262e5fa (patch)
tree73e8c7f942298ab25e0ac83b799b26049f86cd50
parente03af24c38baf47019c21e47ee5427ce3c8a90ce (diff)
downloadopenembedded-core-contrib-42e7af2a1758a911705d3bd26d8ab6b33262e5fa.tar.gz
license: Add support for SPDX 2.0 operators
LICENSE can contain "OR", "AND" and "WITH" operators of SPDX: map them to "|" and "&" accordingly. Signed-off-by: Sergei Miroshnichenko <sergeimir@emcraft.com>
-rw-r--r--meta/classes/license.bbclass19
-rw-r--r--meta/lib/oe/license.py21
2 files changed, 28 insertions, 12 deletions
diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass
index 2de3113557..96fff5e567 100644
--- a/meta/classes/license.bbclass
+++ b/meta/classes/license.bbclass
@@ -59,6 +59,7 @@ python license_create_manifest() {
def write_license_files(d, license_manifest, pkg_dic):
import re
+ from oe.license import license_operator
bad_licenses = (d.getVar("INCOMPATIBLE_LICENSE", True) or "").split()
bad_licenses = map(lambda l: canonical_license(d, l), bad_licenses)
@@ -76,6 +77,7 @@ def write_license_files(d, license_manifest, pkg_dic):
else:
pkg_dic[pkg]["LICENSES"] = re.sub('[|&()*]', ' ', pkg_dic[pkg]["LICENSE"])
pkg_dic[pkg]["LICENSES"] = re.sub(' *', ' ', pkg_dic[pkg]["LICENSES"])
+ pkg_dic[pkg]["LICENSES"] = license_operator.sub(r' ', pkg_dic[pkg]["LICENSES"])
pkg_dic[pkg]["LICENSES"] = pkg_dic[pkg]["LICENSES"].split()
if not "IMAGE_MANIFEST" in pkg_dic[pkg]:
@@ -647,20 +649,23 @@ def check_license_format(d):
"""
pn = d.getVar('PN', True)
licenses = d.getVar('LICENSE', True)
- from oe.license import license_operator, license_operator_chars, license_pattern
+ from oe.license import license_operator, license_pattern
elements = list(filter(lambda x: x.strip(), license_operator.split(licenses)))
for pos, element in enumerate(elements):
- if license_pattern.match(element):
- if pos > 0 and license_pattern.match(elements[pos - 1]):
+ operator_match = license_operator.match(element)
+ license_match = license_pattern.match(element)
+
+ if license_match and not operator_match:
+ if pos > 0 and license_pattern.match(elements[pos - 1]) and not license_operator.match(elements[pos - 1]):
bb.warn('%s: LICENSE value "%s" has an invalid format - license names ' \
- 'must be separated by the following characters to indicate ' \
+ 'must be separated by the following operators to indicate ' \
'the license selection: %s' %
- (pn, licenses, license_operator_chars))
- elif not license_operator.match(element):
+ (pn, licenses, license_operator.pattern))
+ elif not operator_match:
bb.warn('%s: LICENSE value "%s" has an invalid separator "%s" that is not ' \
'in the valid list of separators (%s)' %
- (pn, licenses, element, license_operator_chars))
+ (pn, licenses, element, license_operator.pattern))
SSTATETASKS += "do_populate_lic"
do_populate_lic[sstate-inputdirs] = "${LICSSTATEDIR}"
diff --git a/meta/lib/oe/license.py b/meta/lib/oe/license.py
index 8d2fd1709c..44f130df3f 100644
--- a/meta/lib/oe/license.py
+++ b/meta/lib/oe/license.py
@@ -40,8 +40,13 @@ class InvalidLicense(LicenseError):
return "invalid characters in license '%s'" % self.license
license_operator_chars = '&|() '
-license_operator = re.compile('([' + license_operator_chars + '])')
-license_pattern = re.compile('[a-zA-Z0-9.+_\-]+$')
+license_operator = re.compile('([' + license_operator_chars + ']|AND|OR|WITH)')
+license_pattern = re.compile('^(?:DocumentRef-[a-zA-Z0-9.\-]+:)?(?:LicenseRef-)?([a-zA-Z0-9_.+\-]+)$')
+
+license_operator_map = {}
+license_operator_map["OR"] = '|'
+license_operator_map["AND"] = '&'
+license_operator_map["WITH"] = '&'
class LicenseVisitor(ast.NodeVisitor):
"""Get elements based on OpenEmbedded license strings"""
@@ -49,11 +54,17 @@ class LicenseVisitor(ast.NodeVisitor):
new_elements = []
elements = list([x for x in license_operator.split(licensestr) if x.strip()])
for pos, element in enumerate(elements):
- if license_pattern.match(element):
- if pos > 0 and license_pattern.match(elements[pos-1]):
+ operator_match = license_operator.match(element)
+ license_match = license_pattern.match(element)
+ if operator_match:
+ if license_operator_map.get(element, None) != None:
+ element = license_operator_map.get(element)
+ elif license_match:
+ if pos > 0 and license_pattern.match(elements[pos-1]) and not license_operator.match(elements[pos-1]):
new_elements.append('&')
+ element = license_match.group(1)
element = '"' + element + '"'
- elif not license_operator.match(element):
+ else:
raise InvalidLicense(element)
new_elements.append(element)