diff options
| -rw-r--r-- | meta/classes/base.bbclass | 3 | ||||
| -rw-r--r-- | meta/classes/license.bbclass | 45 | 
2 files changed, 46 insertions, 2 deletions
| diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass index e65a7220f5..f0c358ea32 100644 --- a/meta/classes/base.bbclass +++ b/meta/classes/base.bbclass @@ -398,9 +398,8 @@ python () {              dont_want_whitelist = (d.getVar('WHITELIST_%s' % dont_want_license, 1) or "").split()              if pn not in hosttools_whitelist and pn not in lgplv2_whitelist and pn not in dont_want_whitelist: -                import re                  this_license = d.getVar('LICENSE', 1) -                if this_license and re.search(dont_want_license, this_license): +                if incompatible_license(d,dont_want_license):                      bb.note("SKIPPING %s because it's %s" % (pn, this_license))                      raise bb.parse.SkipPackage("incompatible with license %s" % this_license) diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass index d351b5aaed..4b98e29916 100644 --- a/meta/classes/license.bbclass +++ b/meta/classes/license.bbclass @@ -237,6 +237,51 @@ python do_populate_lic() {  } +def incompatible_license(d,dont_want_license): +    """ +    This function checks if a package has only incompatible licenses. It also take into consideration 'or' +    operand. +    """ +    import re +    import oe.license +    from fnmatch import fnmatchcase as fnmatch + +    dont_want_licenses = [] +    dont_want_licenses.append(d.getVar('INCOMPATIBLE_LICENSE', 1)) +    if d.getVarFlag('SPDXLICENSEMAP', dont_want_license): +	dont_want_licenses.append(d.getVarFlag('SPDXLICENSEMAP', dont_want_license)) + +    def include_license(license): +	if any(fnmatch(license, pattern) for pattern in dont_want_licenses): +	    return False +	else: +	    spdx_license = d.getVarFlag('SPDXLICENSEMAP', license) +	    if spdx_license and any(fnmatch(spdx_license, pattern) for pattern in dont_want_licenses): +		return False +	    else: +		return True + +    def choose_licenses(a, b): +        if all(include_license(lic) for lic in a): +		return a +        else: +		return b + +    """ +    If you want to exlude license named generically 'X', we surely want to exlude 'X+' as well. +    In consequence, we will exclude the '+' character from LICENSE in case INCOMPATIBLE_LICENSE +    is not a 'X+' license. +    """ +    if not re.search(r'[+]',dont_want_license): +	licenses=oe.license.flattened_licenses(re.sub(r'[+]', '', d.getVar('LICENSE', True)), choose_licenses) +    else: +	licenses=oe.license.flattened_licenses(d.getVar('LICENSE', True), choose_licenses) + +    for onelicense in licenses: +	if not include_license(onelicense): +		return True +    return False +  SSTATETASKS += "do_populate_lic"  do_populate_lic[sstate-name] = "populate-lic"  do_populate_lic[sstate-inputdirs] = "${LICSSTATEDIR}" | 
