fix behaviour of copyleft_compliance

Submitted by Eric BENARD on March 30, 2012, 5:21 p.m. | Patch ID: 24943


Message ID
State New
Headers show

Commit Message

Eric BENARD March 30, 2012, 5:21 p.m.
actually if a package has a license in its LICENSE variable
which is not in the whitelist nor in the blacklist and even
if an other license in this variable is in the whitelist,
the package gets excluded and is not taken in account in the
This patch solves this by excluding a recipe if the LICENSE
variable includes a pattern from the blacklist and doesn't
include a variable from the whitelist.

Example in busybox which has LICENSE="GPLv2 & BSD-4-Clause",
with the actual behaviour (where he blacklist contains only
CLOSED Proprietary) we get :
DEBUG: copyleft: busybox-1.19.4 is excluded: recipe has excluded licenses: BSD-4-Clause
which is not sane because busybox is covered by a copyleft license
which is GPLv2 and should match the default whitelist which is

Signed-off-by: Eric BĂ©nard <>
 meta/lib/oe/ |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/meta/lib/oe/ b/meta/lib/oe/
index 5914506..c19911e 100644
--- a/meta/lib/oe/
+++ b/meta/lib/oe/
@@ -86,8 +86,10 @@  def is_included(licensestr, whitelist=None, blacklist=None):
     def include_license(license):
-        return (any(fnmatch(license, pattern) for pattern in whitelist) and not
-                any(fnmatch(license, pattern) for pattern in blacklist))
+        return any(fnmatch(license, pattern) for pattern in whitelist)
+    def exclude_license(license):
+        return any(fnmatch(license, pattern) for pattern in blacklist)
     def choose_licenses(alpha, beta):
         """Select the option in an OR which is the 'best' (has the most
@@ -106,8 +108,9 @@  def is_included(licensestr, whitelist=None, blacklist=None):
         blacklist = []
     licenses = flattened_licenses(licensestr, choose_licenses)
-    excluded = filter(lambda lic: not include_license(lic), licenses)
-    if excluded:
+    excluded = filter(lambda lic: exclude_license(lic), licenses)
+    included = filter(lambda lic: include_license(lic), licenses)
+    if excluded and not included:
         return False, excluded
         return True, None