diff options
-rw-r--r-- | meta/classes/license_image.bbclass | 10 | ||||
-rw-r--r-- | meta/lib/oeqa/selftest/cases/incompatible_lic.py | 34 |
2 files changed, 43 insertions, 1 deletions
diff --git a/meta/classes/license_image.bbclass b/meta/classes/license_image.bbclass index 3f102d0fbc..b5399b6d96 100644 --- a/meta/classes/license_image.bbclass +++ b/meta/classes/license_image.bbclass | |||
@@ -43,10 +43,16 @@ def write_license_files(d, license_manifest, pkg_dic, rootfs=True): | |||
43 | bad_licenses = [canonical_license(d, l) for l in bad_licenses] | 43 | bad_licenses = [canonical_license(d, l) for l in bad_licenses] |
44 | bad_licenses = expand_wildcard_licenses(d, bad_licenses) | 44 | bad_licenses = expand_wildcard_licenses(d, bad_licenses) |
45 | 45 | ||
46 | whitelist = [] | ||
47 | for lic in bad_licenses: | ||
48 | whitelist.extend((d.getVar("WHITELIST_" + lic) or "").split()) | ||
49 | |||
46 | with open(license_manifest, "w") as license_file: | 50 | with open(license_manifest, "w") as license_file: |
47 | for pkg in sorted(pkg_dic): | 51 | for pkg in sorted(pkg_dic): |
48 | if bad_licenses: | 52 | if bad_licenses and pkg not in whitelist: |
49 | try: | 53 | try: |
54 | if incompatible_pkg_license(d, bad_licenses, pkg_dic[pkg]["LICENSE"]): | ||
55 | bb.fatal("Package %s has an incompatible license %s and cannot be installed into the image." %(pkg, pkg_dic[pkg]["LICENSE"])) | ||
50 | (pkg_dic[pkg]["LICENSE"], pkg_dic[pkg]["LICENSES"]) = \ | 56 | (pkg_dic[pkg]["LICENSE"], pkg_dic[pkg]["LICENSES"]) = \ |
51 | oe.license.manifest_licenses(pkg_dic[pkg]["LICENSE"], | 57 | oe.license.manifest_licenses(pkg_dic[pkg]["LICENSE"], |
52 | bad_licenses, canonical_license, d) | 58 | bad_licenses, canonical_license, d) |
@@ -56,6 +62,8 @@ def write_license_files(d, license_manifest, pkg_dic, rootfs=True): | |||
56 | pkg_dic[pkg]["LICENSES"] = re.sub(r'[|&()*]', ' ', pkg_dic[pkg]["LICENSE"]) | 62 | pkg_dic[pkg]["LICENSES"] = re.sub(r'[|&()*]', ' ', pkg_dic[pkg]["LICENSE"]) |
57 | pkg_dic[pkg]["LICENSES"] = re.sub(r' *', ' ', pkg_dic[pkg]["LICENSES"]) | 63 | pkg_dic[pkg]["LICENSES"] = re.sub(r' *', ' ', pkg_dic[pkg]["LICENSES"]) |
58 | pkg_dic[pkg]["LICENSES"] = pkg_dic[pkg]["LICENSES"].split() | 64 | pkg_dic[pkg]["LICENSES"] = pkg_dic[pkg]["LICENSES"].split() |
65 | if pkg in whitelist: | ||
66 | bb.warn("Including %s with an incompatible license %s into the image, because it has been whitelisted." %(pkg, pkg_dic[pkg]["LICENSE"])) | ||
59 | 67 | ||
60 | if not "IMAGE_MANIFEST" in pkg_dic[pkg]: | 68 | if not "IMAGE_MANIFEST" in pkg_dic[pkg]: |
61 | # Rootfs manifest | 69 | # Rootfs manifest |
diff --git a/meta/lib/oeqa/selftest/cases/incompatible_lic.py b/meta/lib/oeqa/selftest/cases/incompatible_lic.py index 8fb93af8a8..424a9e69c3 100644 --- a/meta/lib/oeqa/selftest/cases/incompatible_lic.py +++ b/meta/lib/oeqa/selftest/cases/incompatible_lic.py | |||
@@ -39,3 +39,37 @@ class IncompatibleLicenseTests(OESelftestTestCase): | |||
39 | # INCOMPATIBLE_LICENSE contains this license | 39 | # INCOMPATIBLE_LICENSE contains this license |
40 | def test_incompatible_nonspdx_license(self): | 40 | def test_incompatible_nonspdx_license(self): |
41 | self.lic_test('incompatible-nonspdx-license', 'FooLicense', 'FooLicense') | 41 | self.lic_test('incompatible-nonspdx-license', 'FooLicense', 'FooLicense') |
42 | |||
43 | class IncompatibleLicensePerImageTests(OESelftestTestCase): | ||
44 | def default_config(self): | ||
45 | return """ | ||
46 | IMAGE_INSTALL_append = "bash" | ||
47 | INCOMPATIBLE_LICENSE_pn-core-image-minimal = "GPL-3.0 LGPL-3.0" | ||
48 | """ | ||
49 | |||
50 | def test_bash_default(self): | ||
51 | self.write_config(self.default_config()) | ||
52 | error_msg = "ERROR: core-image-minimal-1.0-r0 do_rootfs: Package bash has an incompatible license GPLv3+ and cannot be installed into the image." | ||
53 | |||
54 | result = bitbake('core-image-minimal', ignore_status=True) | ||
55 | if error_msg not in result.output: | ||
56 | raise AssertionError(result.output) | ||
57 | |||
58 | def test_bash_and_license(self): | ||
59 | self.write_config(self.default_config() + '\nLICENSE_append_pn-bash = " & SomeLicense"') | ||
60 | error_msg = "ERROR: core-image-minimal-1.0-r0 do_rootfs: Package bash has an incompatible license GPLv3+ & SomeLicense and cannot be installed into the image." | ||
61 | |||
62 | result = bitbake('core-image-minimal', ignore_status=True) | ||
63 | if error_msg not in result.output: | ||
64 | raise AssertionError(result.output) | ||
65 | |||
66 | def test_bash_or_license(self): | ||
67 | self.write_config(self.default_config() + '\nLICENSE_append_pn-bash = " | SomeLicense"') | ||
68 | |||
69 | bitbake('core-image-minimal') | ||
70 | |||
71 | def test_bash_whitelist(self): | ||
72 | self.write_config(self.default_config() + '\nWHITELIST_GPL-3.0_pn-core-image-minimal = "bash"') | ||
73 | |||
74 | bitbake('core-image-minimal') | ||
75 | |||