diff options
-rw-r--r-- | meta/classes/base.bbclass | 67 | ||||
-rw-r--r-- | meta/classes/license_image.bbclass | 33 | ||||
-rw-r--r-- | meta/classes/multilib.bbclass | 6 | ||||
-rw-r--r-- | meta/conf/bitbake.conf | 11 | ||||
-rw-r--r-- | meta/lib/oe/license.py | 5 | ||||
-rw-r--r-- | meta/lib/oeqa/selftest/cases/incompatible_lic.py | 4 |
6 files changed, 63 insertions, 63 deletions
diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass index 55f654d37d..1d5db96afb 100644 --- a/meta/classes/base.bbclass +++ b/meta/classes/base.bbclass | |||
@@ -595,46 +595,35 @@ python () { | |||
595 | if check_license and bad_licenses: | 595 | if check_license and bad_licenses: |
596 | bad_licenses = expand_wildcard_licenses(d, bad_licenses) | 596 | bad_licenses = expand_wildcard_licenses(d, bad_licenses) |
597 | 597 | ||
598 | whitelist = [] | 598 | exceptions = (d.getVar("INCOMPATIBLE_LICENSE_EXCEPTIONS") or "").split() |
599 | for lic in bad_licenses: | 599 | |
600 | spdx_license = return_spdx(d, lic) | 600 | pkgs = d.getVar('PACKAGES').split() |
601 | whitelist.extend((d.getVar("WHITELIST_" + lic) or "").split()) | 601 | skipped_pkgs = {} |
602 | if spdx_license: | 602 | unskipped_pkgs = [] |
603 | whitelist.extend((d.getVar("WHITELIST_" + spdx_license) or "").split()) | 603 | for pkg in pkgs: |
604 | 604 | remaining_bad_licenses = oe.license.apply_pkg_license_exception(pkg, bad_licenses, exceptions) | |
605 | if pn in whitelist: | 605 | |
606 | ''' | 606 | incompatible_lic = incompatible_license(d, remaining_bad_licenses, pkg) |
607 | We need to track what we are whitelisting and why. If pn is | 607 | if incompatible_lic: |
608 | incompatible we need to be able to note that the image that | 608 | skipped_pkgs[pkg] = incompatible_lic |
609 | is created may infact contain incompatible licenses despite | ||
610 | INCOMPATIBLE_LICENSE being set. | ||
611 | ''' | ||
612 | bb.note("Including %s as buildable despite it having an incompatible license because it has been whitelisted" % pn) | ||
613 | else: | ||
614 | pkgs = d.getVar('PACKAGES').split() | ||
615 | skipped_pkgs = {} | ||
616 | unskipped_pkgs = [] | ||
617 | for pkg in pkgs: | ||
618 | incompatible_lic = incompatible_license(d, bad_licenses, pkg) | ||
619 | if incompatible_lic: | ||
620 | skipped_pkgs[pkg] = incompatible_lic | ||
621 | else: | ||
622 | unskipped_pkgs.append(pkg) | ||
623 | if unskipped_pkgs: | ||
624 | for pkg in skipped_pkgs: | ||
625 | bb.debug(1, "Skipping the package %s at do_rootfs because of incompatible license(s): %s" % (pkg, ' '.join(skipped_pkgs[pkg]))) | ||
626 | d.setVar('_exclude_incompatible-' + pkg, ' '.join(skipped_pkgs[pkg])) | ||
627 | for pkg in unskipped_pkgs: | ||
628 | bb.debug(1, "Including the package %s" % pkg) | ||
629 | else: | 609 | else: |
630 | incompatible_lic = incompatible_license(d, bad_licenses) | 610 | unskipped_pkgs.append(pkg) |
631 | for pkg in skipped_pkgs: | 611 | |
632 | incompatible_lic += skipped_pkgs[pkg] | 612 | if unskipped_pkgs: |
633 | incompatible_lic = sorted(list(set(incompatible_lic))) | 613 | for pkg in skipped_pkgs: |
634 | 614 | bb.debug(1, "Skipping the package %s at do_rootfs because of incompatible license(s): %s" % (pkg, ' '.join(skipped_pkgs[pkg]))) | |
635 | if incompatible_lic: | 615 | d.setVar('_exclude_incompatible-' + pkg, ' '.join(skipped_pkgs[pkg])) |
636 | bb.debug(1, "Skipping recipe %s because of incompatible license(s): %s" % (pn, ' '.join(incompatible_lic))) | 616 | for pkg in unskipped_pkgs: |
637 | raise bb.parse.SkipRecipe("it has incompatible license(s): %s" % ' '.join(incompatible_lic)) | 617 | bb.debug(1, "Including the package %s" % pkg) |
618 | else: | ||
619 | incompatible_lic = incompatible_license(d, bad_licenses) | ||
620 | for pkg in skipped_pkgs: | ||
621 | incompatible_lic += skipped_pkgs[pkg] | ||
622 | incompatible_lic = sorted(list(set(incompatible_lic))) | ||
623 | |||
624 | if incompatible_lic: | ||
625 | bb.debug(1, "Skipping recipe %s because of incompatible license(s): %s" % (pn, ' '.join(incompatible_lic))) | ||
626 | raise bb.parse.SkipRecipe("it has incompatible license(s): %s" % ' '.join(incompatible_lic)) | ||
638 | 627 | ||
639 | needsrcrev = False | 628 | needsrcrev = False |
640 | srcuri = d.getVar('SRC_URI') | 629 | srcuri = d.getVar('SRC_URI') |
diff --git a/meta/classes/license_image.bbclass b/meta/classes/license_image.bbclass index bf70bee99b..0a5ea0a2fb 100644 --- a/meta/classes/license_image.bbclass +++ b/meta/classes/license_image.bbclass | |||
@@ -54,28 +54,23 @@ def write_license_files(d, license_manifest, pkg_dic, rootfs=True): | |||
54 | bad_licenses = (d.getVar("INCOMPATIBLE_LICENSE") or "").split() | 54 | bad_licenses = (d.getVar("INCOMPATIBLE_LICENSE") or "").split() |
55 | bad_licenses = expand_wildcard_licenses(d, bad_licenses) | 55 | bad_licenses = expand_wildcard_licenses(d, bad_licenses) |
56 | 56 | ||
57 | whitelist = [] | 57 | exceptions = (d.getVar("INCOMPATIBLE_LICENSE_EXCEPTIONS") or "").split() |
58 | for lic in bad_licenses: | ||
59 | whitelist.extend((d.getVar("WHITELIST_" + lic) or "").split()) | ||
60 | |||
61 | with open(license_manifest, "w") as license_file: | 58 | with open(license_manifest, "w") as license_file: |
62 | for pkg in sorted(pkg_dic): | 59 | for pkg in sorted(pkg_dic): |
63 | if bad_licenses and pkg not in whitelist: | 60 | remaining_bad_licenses = oe.license.apply_pkg_license_exception(pkg, bad_licenses, exceptions) |
64 | try: | 61 | incompatible_licenses = incompatible_pkg_license(d, remaining_bad_licenses, pkg_dic[pkg]["LICENSE"]) |
65 | licenses = incompatible_pkg_license(d, bad_licenses, pkg_dic[pkg]["LICENSE"]) | 62 | if incompatible_licenses: |
66 | if licenses: | 63 | bb.fatal("Package %s cannot be installed into the image because it has incompatible license(s): %s" %(pkg, ' '.join(incompatible_licenses))) |
67 | bb.fatal("Package %s cannot be installed into the image because it has incompatible license(s): %s" %(pkg, ' '.join(licenses))) | ||
68 | (pkg_dic[pkg]["LICENSE"], pkg_dic[pkg]["LICENSES"]) = \ | ||
69 | oe.license.manifest_licenses(pkg_dic[pkg]["LICENSE"], | ||
70 | bad_licenses, canonical_license, d) | ||
71 | except oe.license.LicenseError as exc: | ||
72 | bb.fatal('%s: %s' % (d.getVar('P'), exc)) | ||
73 | else: | 64 | else: |
74 | pkg_dic[pkg]["LICENSES"] = re.sub(r'[|&()*]', ' ', pkg_dic[pkg]["LICENSE"]) | 65 | incompatible_licenses = incompatible_pkg_license(d, bad_licenses, pkg_dic[pkg]["LICENSE"]) |
75 | pkg_dic[pkg]["LICENSES"] = re.sub(r' *', ' ', pkg_dic[pkg]["LICENSES"]) | 66 | if incompatible_licenses: |
76 | pkg_dic[pkg]["LICENSES"] = pkg_dic[pkg]["LICENSES"].split() | 67 | oe.qa.handle_error('license-incompatible', "Including %s with incompatible license(s) %s into the image, because it has been allowed by exception list." %(pkg, ' '.join(incompatible_licenses)), d) |
77 | if pkg in whitelist: | 68 | try: |
78 | oe.qa.handle_error('license-incompatible', "Including %s with an incompatible license %s into the image, because it has been whitelisted." %(pkg, pkg_dic[pkg]["LICENSE"]), d) | 69 | (pkg_dic[pkg]["LICENSE"], pkg_dic[pkg]["LICENSES"]) = \ |
70 | oe.license.manifest_licenses(pkg_dic[pkg]["LICENSE"], | ||
71 | remaining_bad_licenses, canonical_license, d) | ||
72 | except oe.license.LicenseError as exc: | ||
73 | bb.fatal('%s: %s' % (d.getVar('P'), exc)) | ||
79 | 74 | ||
80 | if not "IMAGE_MANIFEST" in pkg_dic[pkg]: | 75 | if not "IMAGE_MANIFEST" in pkg_dic[pkg]: |
81 | # Rootfs manifest | 76 | # Rootfs manifest |
diff --git a/meta/classes/multilib.bbclass b/meta/classes/multilib.bbclass index 1ad654f546..5859ca8d21 100644 --- a/meta/classes/multilib.bbclass +++ b/meta/classes/multilib.bbclass | |||
@@ -75,12 +75,12 @@ python multilib_virtclass_handler () { | |||
75 | e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False)) | 75 | e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False)) |
76 | e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override) | 76 | e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override) |
77 | 77 | ||
78 | # Expand WHITELIST_GPL-3.0 with multilib prefix | 78 | # Expand INCOMPATIBLE_LICENSE_EXCEPTIONS with multilib prefix |
79 | pkgs = e.data.getVar("WHITELIST_GPL-3.0") | 79 | pkgs = e.data.getVar("INCOMPATIBLE_LICENSE_EXCEPTIONS") |
80 | if pkgs: | 80 | if pkgs: |
81 | for pkg in pkgs.split(): | 81 | for pkg in pkgs.split(): |
82 | pkgs += " " + variant + "-" + pkg | 82 | pkgs += " " + variant + "-" + pkg |
83 | e.data.setVar("WHITELIST_GPL-3.0", pkgs) | 83 | e.data.setVar("INCOMPATIBLE_LICENSE_EXCEPTIONS", pkgs) |
84 | 84 | ||
85 | # DEFAULTTUNE can change TARGET_ARCH override so expand this now before update_data | 85 | # DEFAULTTUNE can change TARGET_ARCH override so expand this now before update_data |
86 | newtune = e.data.getVar("DEFAULTTUNE:" + "virtclass-multilib-" + variant, False) | 86 | newtune = e.data.getVar("DEFAULTTUNE:" + "virtclass-multilib-" + variant, False) |
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf index 6fb7bfeb23..7705415a4f 100644 --- a/meta/conf/bitbake.conf +++ b/meta/conf/bitbake.conf | |||
@@ -110,6 +110,17 @@ BB_RENAMED_VARIABLES[INHERIT_BLACKLIST] = "is a deprecated variable and no longe | |||
110 | BB_RENAMED_VARIABLES[TUNEABI_WHITELIST] = "is a deprecated variable and support has been removed" | 110 | BB_RENAMED_VARIABLES[TUNEABI_WHITELIST] = "is a deprecated variable and support has been removed" |
111 | BB_RENAMED_VARIABLES[LICENSE_FLAGS_WHITELIST] = "LICENSE_FLAGS_ACCEPTED" | 111 | BB_RENAMED_VARIABLES[LICENSE_FLAGS_WHITELIST] = "LICENSE_FLAGS_ACCEPTED" |
112 | 112 | ||
113 | BB_RENAMED_VARIABLES[WHITELIST_GPL-3.0-only] = "INCOMPATIBLE_LICENSE_EXCEPTIONS" | ||
114 | BB_RENAMED_VARIABLES[WHITELIST_GPL-3.0-or-later] = "INCOMPATIBLE_LICENSE_EXCEPTIONS" | ||
115 | BB_RENAMED_VARIABLES[WHITELIST_LGPL-3.0-only] = "INCOMPATIBLE_LICENSE_EXCEPTIONS" | ||
116 | BB_RENAMED_VARIABLES[WHITELIST_LGPL-3.0-or-later] = "INCOMPATIBLE_LICENSE_EXCEPTIONS" | ||
117 | |||
118 | # These are deprecated version and should be updated to approved names | ||
119 | BB_RENAMED_VARIABLES[WHITELIST_GPL-3.0] = "is deprecated, convert to INCOMPATIBLE_LICENSE_EXCEPTIONS = '<pkg>:GPL-3.0-only'" | ||
120 | BB_RENAMED_VARIABLES[WHITELIST_GPL-3.0+] = "is deprecated, convert to INCOMPATIBLE_LICENSE_EXCEPTIONS = '<pkg>:GPL-3.0-or-later'" | ||
121 | BB_RENAMED_VARIABLES[WHITELIST_LGPL-3.0] = "is deprecated, convert to INCOMPATIBLE_LICENSE_EXCEPTIONS = '<pkg>:LGPL-3.0-only'" | ||
122 | BB_RENAMED_VARIABLES[WHITELIST_LGPL-3.0+] = "is deprecated, convert to INCOMPATIBLE_LICENSE_EXCEPTIONS = '<pkg>:LGPL-3.0-or-later'" | ||
123 | |||
113 | ################################################################## | 124 | ################################################################## |
114 | # Architecture-dependent build variables. | 125 | # Architecture-dependent build variables. |
115 | ################################################################## | 126 | ################################################################## |
diff --git a/meta/lib/oe/license.py b/meta/lib/oe/license.py index 8955cbdeb2..29412dfe46 100644 --- a/meta/lib/oe/license.py +++ b/meta/lib/oe/license.py | |||
@@ -242,3 +242,8 @@ def list_licenses(licensestr): | |||
242 | except SyntaxError as exc: | 242 | except SyntaxError as exc: |
243 | raise LicenseSyntaxError(licensestr, exc) | 243 | raise LicenseSyntaxError(licensestr, exc) |
244 | return visitor.licenses | 244 | return visitor.licenses |
245 | |||
246 | def apply_pkg_license_exception(pkg, bad_licenses, exceptions): | ||
247 | """Return remaining bad licenses after removing any package exceptions""" | ||
248 | |||
249 | return [lic for lic in bad_licenses if pkg + ':' + lic not in exceptions] | ||
diff --git a/meta/lib/oeqa/selftest/cases/incompatible_lic.py b/meta/lib/oeqa/selftest/cases/incompatible_lic.py index fd3b3f409e..c68f920555 100644 --- a/meta/lib/oeqa/selftest/cases/incompatible_lic.py +++ b/meta/lib/oeqa/selftest/cases/incompatible_lic.py | |||
@@ -110,8 +110,8 @@ INCOMPATIBLE_LICENSE:pn-core-image-minimal = "GPL-3.0 LGPL-3.0" | |||
110 | 110 | ||
111 | bitbake('core-image-minimal') | 111 | bitbake('core-image-minimal') |
112 | 112 | ||
113 | def test_bash_whitelist(self): | 113 | def test_bash_license_exceptions(self): |
114 | self.write_config(self.default_config() + '\nWHITELIST_GPL-3.0:pn-core-image-minimal = "bash"') | 114 | self.write_config(self.default_config() + '\nINCOMPATIBLE_LICENSE_EXCEPTIONS:pn-core-image-minimal = "bash:GPL-3.0-or-later"') |
115 | 115 | ||
116 | bitbake('core-image-minimal') | 116 | bitbake('core-image-minimal') |
117 | 117 | ||