Skip to contentSkip to conversation

license: Add support for handle INCOMPATIBLE_LICENSE

PATCH In review Aníbal Limón 1 participant 7 messages Mar 14, 2015

lore
Share & tools
lore
#0 lore raw

cover license: Add support for handle INCOMPATIBLE_LICENSE

The next changes was made to implement INCOMPATIBLE_LICENSE handling in manifest creation this implies to rewrite license_manifest_creation from shell to python.

Tests was made to guarantee compatibility and can be found at,

The last two patches are to avoid warnings in manifest creation due that these recipes don't collect licenses before.

The following changes since commit 7f30749fe026e9ceb75d73b89271145a45a60763:

oeqa/parselogs: Skip hda opcode errors (2015-03-12 12:50:24 +0000)

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib alimon/license-rebase
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/license-rebase

Aníbal Limón (5):
license_class: Reimplemented manifest creation in python
license_class: Generalize license_ok function
license: Add support for handle INCOMPATIBLE_LICENSE in manifest
creation
packagegroups: Add LIC_FILES_CHKSUM to avoid warnings in manifest
creation
glibc/glibc-collateral.inc: Add LIC_FILES_CHKSUM to avoid warnings in
manifest creation

 meta/classes/license.bbclass                       | 190 +++++++++++----------
 meta/lib/oe/license.py                             |  84 +++++++++
 meta/recipes-core/glibc/glibc-collateral.inc       |   2 +
 .../packagegroups/packagegroup-base.bb             |   1 +
 .../packagegroups/packagegroup-core-boot.bb        |   1 +
 .../packagegroup-core-buildessential.bb            |   1 +
 .../packagegroup-core-eclipse-debug.bb             |   1 +
 .../packagegroups/packagegroup-core-nfs.bb         |   1 +
 .../packagegroups/packagegroup-core-sdk.bb         |   1 +
 .../packagegroup-core-ssh-dropbear.bb              |   1 +
 .../packagegroups/packagegroup-core-ssh-openssh.bb |   1 +
 .../packagegroup-core-standalone-sdk-target.bb     |   1 +
 .../packagegroups/packagegroup-core-tools-debug.bb |   1 +
 .../packagegroup-core-tools-profile.bb             |   1 +
 .../packagegroups/packagegroup-cross-canadian.bb   |   1 +
 .../packagegroups/packagegroup-self-hosted.bb      |   1 +
 .../packagegroup-core-device-devel.bb              |   1 +
 .../packagegroup-core-full-cmdline.bb              |   1 +
 .../packagegroups/packagegroup-core-lsb.bb         |   1 +
 .../packagegroups/packagegroup-core-clutter.bb     |   1 +
 .../packagegroups/packagegroup-core-directfb.bb    |   1 +
 .../packagegroups/packagegroup-core-x11-base.bb    |   1 +
 .../packagegroups/packagegroup-core-x11-xserver.bb |   1 +
 .../packagegroups/packagegroup-core-x11.bb         |   1 +
 .../packagegroups/packagegroup-core-qt.bb          |   1 +
 .../packagegroups/packagegroup-core-qt4e.bb        |   1 +
 .../packagegroup-qt-toolchain-target.inc           |   1 +
 .../packagegroups/packagegroup-core-x11-sato.bb    |   1 +
 28 files changed, 212 insertions(+), 89 deletions(-)
Signature · 1 line
1.8.4.5
#1 lore raw

PATCH 1/5 license_class: Reimplemented manifest creation in python

Reimplemented license_manifest_create from shell to python for INCOMPATIBLE_LICENSE handle using oe.license module.

Optimizations are made to avoid license copy now uses a hardlink and symbolic link this helps to save space during build.

---
 meta/classes/license.bbclass | 148 ++++++++++++++++++++++---------------------
 1 file changed, 75 insertions(+), 73 deletions(-)
meta/classes/license.bbclass +75 -73
index 044b3b0..9988e35 100644
@@ -25,79 +25,81 @@ python write_package_manifest() {
         'w+').write(image_list_installed_packages(d))
 }
 
-license_create_manifest() {
-        # Test if BUILD_IMAGES_FROM_FEEDS is defined in env
-        if [ -n "${BUILD_IMAGES_FROM_FEEDS}" ]; then
-          exit 0
-        fi
-
-	INSTALLED_PKGS=`cat ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest`
-	LICENSE_MANIFEST="${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest"
-	# remove existing license.manifest file
-	if [ -f ${LICENSE_MANIFEST} ]; then
-		rm ${LICENSE_MANIFEST}
-	fi
-	touch ${LICENSE_MANIFEST}
-	for pkg in ${INSTALLED_PKGS}; do
-		filename=`ls ${PKGDATA_DIR}/runtime-reverse/${pkg}| head -1`
-		pkged_pn="$(sed -n 's/^PN: //p' ${filename})"
-
-		# check to see if the package name exists in the manifest. if so, bail.
-		if grep -q "^PACKAGE NAME: ${pkg}" ${LICENSE_MANIFEST}; then
-			continue
-		fi
-
-		pkged_pv="$(sed -n 's/^PV: //p' ${filename})"
-		pkged_name="$(basename $(readlink ${filename}))"
-		pkged_lic="$(sed -n "/^LICENSE_${pkged_name}: /{ s/^LICENSE_${pkged_name}: //; p }" ${filename})"
-		if [ -z "${pkged_lic}" ]; then
-			# fallback checking value of LICENSE
-			pkged_lic="$(sed -n "/^LICENSE: /{ s/^LICENSE: //; p }" ${filename})"
-		fi
-
-		echo "PACKAGE NAME:" ${pkg} >> ${LICENSE_MANIFEST}
-		echo "PACKAGE VERSION:" ${pkged_pv} >> ${LICENSE_MANIFEST}
-		echo "RECIPE NAME:" ${pkged_pn} >> ${LICENSE_MANIFEST}
-		echo "LICENSE:" ${pkged_lic} >> ${LICENSE_MANIFEST}
-		echo "" >> ${LICENSE_MANIFEST}
-
-		lics="$(echo ${pkged_lic} | sed "s/[|&()*]/ /g" | sed "s/  */ /g" )"
-		for lic in ${lics}; do
-			# to reference a license file trim trailing + symbol
-			if ! [ -e "${LICENSE_DIRECTORY}/${pkged_pn}/generic_${lic%+}" ]; then
-				bbwarn "The license listed ${lic} was not in the licenses collected for ${pkged_pn}"
-			fi
-		done
-	done
-
-	# Two options here:
-	# - Just copy the manifest
-	# - Copy the manifest and the license directories
-	# With both options set we see a .5 M increase in core-image-minimal
-	if [ "${COPY_LIC_MANIFEST}" = "1" ]; then
-		mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/
-		cp ${LICENSE_MANIFEST} ${IMAGE_ROOTFS}/usr/share/common-licenses/license.manifest
-		if [ "${COPY_LIC_DIRS}" = "1" ]; then
-			for pkg in ${INSTALLED_PKGS}; do
-				mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg}
-				pkged_pn="$(oe-pkgdata-util -p ${PKGDATA_DIR} lookup-recipe ${pkg})"
-				for lic in `ls ${LICENSE_DIRECTORY}/${pkged_pn}`; do
-					# Really don't need to copy the generics as they're 
-					# represented in the manifest and in the actual pkg licenses
-					# Doing so would make your image quite a bit larger
-					if [ "${lic#generic_}" = "${lic}" ]; then
-						cp ${LICENSE_DIRECTORY}/${pkged_pn}/${lic} ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg}/${lic}
-					else
-						if [ ! -f ${IMAGE_ROOTFS}/usr/share/common-licenses/${lic} ]; then
-							cp ${LICENSE_DIRECTORY}/${pkged_pn}/${lic} ${IMAGE_ROOTFS}/usr/share/common-licenses/
-						fi
-						ln -sf ../${lic} ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg}/${lic}
-					fi
-				done
-			done
-		fi
-	fi
-
+python license_create_manifest() {
+    import re
+    import oe.packagedata
+
+    build_images_from_feeds = d.getVar('BUILD_IMAGES_FROM_FEEDS', True)
+    if build_images_from_feeds == "1":
+        return 0
+
+    pkg_dic = {}
+    package_manifest = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
+                        d.getVar('IMAGE_NAME', True), 'package.manifest')
+    with open(package_manifest, "r") as package_file:
+        pkg_list = package_file.read().split()
+        for pkg in pkg_list:
+            pkg_info = os.path.join(d.getVar('PKGDATA_DIR', True),
+                                    'runtime-reverse', pkg)
+
+            pkg_lic_name = "LICENSE_" + os.path.basename(os.readlink(pkg_info))
+            pkg_dic[pkg] = oe.packagedata.read_pkgdatafile(pkg_info)
+            if not "LICENSE" in pkg_dic[pkg].keys():
+                pkg_dic[pkg]["LICENSE"] = pkg_dic[pkg][pkg_lic_name]
+
+    license_manifest = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
+                        d.getVar('IMAGE_NAME', True), 'license.manifest')
+    with open(license_manifest, "w") as license_file:
+        for pkg in sorted(pkg_dic):
+            license_file.write("PACKAGE NAME: %s\n" % pkg)
+            license_file.write("PACKAGE VERSION: %s\n" % pkg_dic[pkg]["PV"])
+            license_file.write("RECIPE NAME: %s\n" % pkg_dic[pkg]["PN"])
+            license_file.write("LICENSE: %s\n\n" % pkg_dic[pkg]["LICENSE"])
+
+            licenses = re.sub('[|&()*]', '', pkg_dic[pkg]["LICENSE"])
+            licenses = re.sub('  *', ' ', licenses)
+            for lic in licenses.split():
+                lic_file = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
+                                        pkg_dic[pkg]["PN"], "generic_%s" % 
+                                        re.sub('\+', '', lic))
+                if not os.path.exists(lic_file):
+                   bb.warn("The license listed %s was not in the "\ 
+                            "licenses collected for recipe %s" 
+                            % (lic, pkg_dic[pkg]["PN"]))
+
+    # Two options here:
+    # - Just copy the manifest
+    # - Copy the manifest and the license directories
+    # With both options set we see a .5 M increase in core-image-minimal
+    copy_lic_manifest = d.getVar('COPY_LIC_MANIFEST', True)
+    copy_lic_dirs = d.getVar('COPY_LIC_DIRS', True)
+    if copy_lic_manifest == "1":
+        rootfs_license_dir = os.path.join(d.getVar('IMAGE_ROOTFS', 'True'), 
+                                'usr', 'share', 'common-licenses')
+        os.makedirs(rootfs_license_dir)
+        rootfs_license_manifest = os.path.join(rootfs_license_dir,
+                                                'license.manifest')
+        os.link(license_manifest, rootfs_license_manifest)
+
+        if copy_lic_dirs == "1":
+            for pkg in sorted(pkg_dic):
+                pkg_rootfs_license_dir = os.path.join(rootfs_license_dir, pkg)
+                os.makedirs(pkg_rootfs_license_dir)
+                pkg_license_dir = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
+                                            pkg_dic[pkg]["PN"]) 
+                licenses = os.listdir(pkg_license_dir)
+                for lic in licenses:
+                    rootfs_license = os.path.join(rootfs_license_dir, lic)
+                    pkg_license = os.path.join(pkg_license_dir, lic)
+                    pkg_rootfs_license = os.path.join(pkg_rootfs_license_dir, lic)
+
+                    if re.match("^generic_.*$", lic):
+                        if not os.path.exists(rootfs_license):
+                            os.link(pkg_license, rootfs_license)
+
+                        os.symlink(os.path.join('..', lic), pkg_rootfs_license)
+                    else:
+                        os.link(pkg_license, pkg_rootfs_license)
 }
 
 python do_populate_lic() {
Signature · 1 line
1.8.4.5
#2 lore raw

PATCH 2/5 license_class: Generalize license_ok function

In reply to Aníbal Limón

Add dont_want_licenses as parameter to license_ok function and move it to oe.license module in order to use in other modules.

---
 meta/classes/license.bbclass | 21 ++++-----------------
 meta/lib/oe/license.py       | 14 ++++++++++++++
 2 files changed, 18 insertions(+), 17 deletions(-)
meta/classes/license.bbclass +4 -17
index 9988e35..4e8e96b 100644
@@ -319,36 +319,23 @@ def incompatible_license(d, dont_want_licenses, package=None):
     take into consideration 'or' operand.  dont_want_licenses should be passed
     as canonical (SPDX) names.
     """
-    import re
     import oe.license
-    from fnmatch import fnmatchcase as fnmatch
     license = d.getVar("LICENSE_%s" % package, True) if package else None
     if not license:
         license = d.getVar('LICENSE', True)
 
-    def license_ok(license):
-        for dwl in dont_want_licenses:
-            # If you want to exclude license named generically 'X', we
-            # surely want to exclude 'X+' as well.  In consequence, we
-            # will exclude a trailing '+' character from LICENSE in
-            # case INCOMPATIBLE_LICENSE is not a 'X+' license.
-            lic = license
-            if not re.search('\+$', dwl):
-                lic = re.sub('\+', '', license)
-            if fnmatch(lic, dwl):
-                return False
-        return True
-
     # Handles an "or" or two license sets provided by
     # flattened_licenses(), pick one that works if possible.
     def choose_lic_set(a, b):
-        return a if all(license_ok(lic) for lic in a) else b
+        return a if all(oe.license.license_ok(lic, dont_want_licenses) \
+		 for lic in a) else b
 
     try:
         licenses = oe.license.flattened_licenses(license, choose_lic_set)
     except oe.license.LicenseError as exc:
         bb.fatal('%s: %s' % (d.getVar('P', True), exc))
-    return any(not license_ok(canonical_license(d, l)) for l in licenses)
+    return any(not oe.license.license_ok(canonical_license(d, l), \
+		dont_want_licenses) for l in licenses)
 
 def check_license_flags(d):
     """
meta/lib/oe/license.py +14 -0
index 31ca15b..bc146a2 100644
@@ -5,6 +5,20 @@ import ast
 import re
 from fnmatch import fnmatchcase as fnmatch
 
+def license_ok(license, dont_want_licenses):
+    """ Return False if License exist in dont_want_licenses else True """
+    for dwl in dont_want_licenses:
+        # If you want to exclude license named generically 'X', we
+        # surely want to exclude 'X+' as well.  In consequence, we
+        # will exclude a trailing '+' character from LICENSE in
+        # case INCOMPATIBLE_LICENSE is not a 'X+' license.
+        lic = license
+        if not re.search('\+$', dwl):
+            lic = re.sub('\+', '', license)
+        if fnmatch(lic, dwl):
+            return False
+    return True
+
 class LicenseError(Exception):
     pass
 
Signature · 1 line
1.8.4.5
#3 lore raw

PATCH 3/5 license: Add support for handle INCOMPATIBLE_LICENSE in manifest creation

In reply to Aníbal Limón

When INCOMPATIBLE_LICENSE's is specified it need to be removed from license.manifest and also avoid copy to target image.

Add ManifestVisitor that walk the license string searching for INCOMPATIBLE_LICENSE's if found remove it also add validation for avoid copy INCOMPATIBLE_LICENSE's to target image.

[YOCTO #6765]

---
 meta/classes/license.bbclass | 29 ++++++++++++++++--
 meta/lib/oe/license.py       | 70 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+), 3 deletions(-)
meta/classes/license.bbclass +26 -3
index 4e8e96b..3cdee5d 100644
@@ -29,6 +29,10 @@ python license_create_manifest() {
     import re
     import oe.packagedata
 
+    bad_licenses = (d.getVar("INCOMPATIBLE_LICENSE", True) or "").split()
+    bad_licenses = map(lambda l: canonical_license(d, l), bad_licenses)
+    bad_licenses = expand_wildcard_licenses(d, bad_licenses)
+
     build_images_from_feeds = d.getVar('BUILD_IMAGES_FROM_FEEDS', True)
     if build_images_from_feeds == "1":
         return 0
@@ -51,14 +55,24 @@ python license_create_manifest() {
                         d.getVar('IMAGE_NAME', True), 'license.manifest')
     with open(license_manifest, "w") as license_file:
         for pkg in sorted(pkg_dic):
+            if bad_licenses:
+                try:
+                    (pkg_dic[pkg]["LICENSE"], pkg_dic[pkg]["LICENSES"]) = \
+                        oe.license.manifest_licenses(pkg_dic[pkg]["LICENSE"],
+                        bad_licenses, canonical_license, d)
+                except oe.license.LicenseError as exc:
+                    bb.fatal('%s: %s' % (d.getVar('P', True), exc))
+            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"] = pkg_dic[pkg]["LICENSES"].split()
+
             license_file.write("PACKAGE NAME: %s\n" % pkg)
             license_file.write("PACKAGE VERSION: %s\n" % pkg_dic[pkg]["PV"])
             license_file.write("RECIPE NAME: %s\n" % pkg_dic[pkg]["PN"])
             license_file.write("LICENSE: %s\n\n" % pkg_dic[pkg]["LICENSE"])
 
-            licenses = re.sub('[|&()*]', '', pkg_dic[pkg]["LICENSE"])
-            licenses = re.sub('  *', ' ', licenses)
-            for lic in licenses.split():
+            for lic in pkg_dic[pkg]["LICENSES"]:
                 lic_file = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
                                         pkg_dic[pkg]["PN"], "generic_%s" % 
                                         re.sub('\+', '', lic))
@@ -94,11 +108,20 @@ python license_create_manifest() {
                     pkg_rootfs_license = os.path.join(pkg_rootfs_license_dir, lic)
 
                     if re.match("^generic_.*$", lic):
+                        generic_lic = re.search("^generic_(.*)$", lic).group(1)
+                        if oe.license.license_ok(canonical_license(d,
+                            generic_lic), bad_licenses) == False:
+                            continue
+
                         if not os.path.exists(rootfs_license):
                             os.link(pkg_license, rootfs_license)
 
                         os.symlink(os.path.join('..', lic), pkg_rootfs_license)
                     else:
+                        if oe.license.license_ok(canonical_license(d,
+                            lic), bad_licenses) == False:
+                            continue
+
                         os.link(pkg_license, pkg_rootfs_license)
 }
 
meta/lib/oe/license.py +70 -0

73 lines not on this page · raw message

Signature · 1 line
1.8.4.5
#4 lore raw

PATCH 4/5 packagegroups: Add LIC_FILES_CHKSUM to avoid warnings in manifest creation

In reply to Aníbal Limón
---
 meta/recipes-core/packagegroups/packagegroup-base.bb                     | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-boot.bb                | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-buildessential.bb      | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-eclipse-debug.bb       | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-nfs.bb                 | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-sdk.bb                 | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-ssh-dropbear.bb        | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-ssh-openssh.bb         | 1 +
 .../packagegroups/packagegroup-core-standalone-sdk-target.bb             | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-tools-debug.bb         | 1 +
 meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb       | 1 +
 meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb           | 1 +
 meta/recipes-core/packagegroups/packagegroup-self-hosted.bb              | 1 +
 meta/recipes-devtools/packagegroups/packagegroup-core-device-devel.bb    | 1 +
 meta/recipes-extended/packagegroups/packagegroup-core-full-cmdline.bb    | 1 +
 meta/recipes-extended/packagegroups/packagegroup-core-lsb.bb             | 1 +
 meta/recipes-graphics/packagegroups/packagegroup-core-clutter.bb         | 1 +
 meta/recipes-graphics/packagegroups/packagegroup-core-directfb.bb        | 1 +
 meta/recipes-graphics/packagegroups/packagegroup-core-x11-base.bb        | 1 +
 meta/recipes-graphics/packagegroups/packagegroup-core-x11-xserver.bb     | 1 +
 meta/recipes-graphics/packagegroups/packagegroup-core-x11.bb             | 1 +
 meta/recipes-qt/packagegroups/packagegroup-core-qt.bb                    | 1 +
 meta/recipes-qt/packagegroups/packagegroup-core-qt4e.bb                  | 1 +
 meta/recipes-qt/packagegroups/packagegroup-qt-toolchain-target.inc       | 1 +
 meta/recipes-sato/packagegroups/packagegroup-core-x11-sato.bb            | 1 +
 25 files changed, 25 insertions(+)
meta/recipes-core/packagegroups/packagegroup-base.bb +1 -0
index 369b63e..0c0c404 100644
@@ -1,5 +1,6 @@
 SUMMARY = "Merge machine and distro options to create a basic machine task/package"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r83"
 
 #
meta/recipes-core/packagegroups/packagegroup-core-boot.bb +1 -0
index 09f5373..8ce4b53 100644
@@ -5,6 +5,7 @@
 SUMMARY = "Minimal boot requirements"
 DESCRIPTION = "The minimal set of packages required to boot the system"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r17"
 
 PACKAGE_ARCH = "${MACHINE_ARCH}"
meta/recipes-core/packagegroups/packagegroup-core-buildessential.bb +1 -0
index 74ed247..e97522c 100644
@@ -5,6 +5,7 @@
 
 SUMMARY = "Essential build dependencies"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 inherit packagegroup
 
meta/recipes-core/packagegroups/packagegroup-core-eclipse-debug.bb +1 -0
index e7b013d..e67c131 100644
@@ -1,5 +1,6 @@
 SUMMARY = "Remote debugging tools for Eclipse integration"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 inherit packagegroup
 
meta/recipes-core/packagegroups/packagegroup-core-nfs.bb +1 -0
index 247a30e..1d3fb96 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "NFS package groups"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r2"
 
 inherit packagegroup
meta/recipes-core/packagegroups/packagegroup-core-sdk.bb +1 -0
index a41eada..f52b6c2 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "Software development tools"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r9"
 
 PACKAGE_ARCH = "${MACHINE_ARCH}"
meta/recipes-core/packagegroups/packagegroup-core-ssh-dropbear.bb +1 -0
index e99946f..8b82f80 100644
@@ -1,5 +1,6 @@
 SUMMARY = "Dropbear SSH client/server"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r1"
 
 inherit packagegroup
meta/recipes-core/packagegroups/packagegroup-core-ssh-openssh.bb +1 -0
index 32d20e6..0dba895 100644
@@ -1,5 +1,6 @@
 SUMMARY = "OpenSSH SSH client/server"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r1"
 
 inherit packagegroup
meta/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bb +1 -0
index 154a55c..c84f4f4 100644
@@ -1,6 +1,7 @@
 SUMMARY = "Target packages for the standalone SDK"
 PR = "r8"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 inherit packagegroup
 
meta/recipes-core/packagegroups/packagegroup-core-tools-debug.bb +1 -0
index 82347b9..f2783cf 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "Debugging tools"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 inherit packagegroup
 
meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb +1 -0
index 6f4842f..89b4c72 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "Profiling tools"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 PR = "r3"
 
meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb +1 -0
index e3b1c18..c4b474e 100644
@@ -1,6 +1,7 @@
 SUMMARY = "Host SDK package for cross canadian toolchain"
 PN = "packagegroup-cross-canadian-${MACHINE}"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 # Save TRANSLATED_TARGET_ARCH before allarch tramples it
 TRANSLATED_TARGET_ARCH = "${@d.getVar('TUNE_ARCH', True).replace('_', '-')}"
meta/recipes-core/packagegroups/packagegroup-self-hosted.bb +1 -0
index 47589b6..62c3286 100644
@@ -6,6 +6,7 @@ SUMMARY = "Self-hosting"
 DESCRIPTION = "Packages required to run the build system"
 PR = "r13"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 inherit packagegroup  distro_features_check
 # rdepends on libx11-dev
meta/recipes-devtools/packagegroups/packagegroup-core-device-devel.bb +1 -0
index e831860..c570be4 100644
@@ -1,5 +1,6 @@
 SUMMARY = "Provides a small set of tools for development on the device"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 PR = "r1"
 
meta/recipes-extended/packagegroups/packagegroup-core-full-cmdline.bb +1 -0
index ad3f240..2f4e2a9 100644
@@ -6,6 +6,7 @@ SUMMARY = "Standard full-featured Linux system"
 DESCRIPTION = "Package group bringing in packages needed for a more traditional full-featured Linux system"
 PR = "r6"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 inherit packagegroup
 
meta/recipes-extended/packagegroups/packagegroup-core-lsb.bb +1 -0
index e0f32e0..832b2fc 100644
@@ -6,6 +6,7 @@ SUMMARY = "Linux Standard Base (LSB)"
 DESCRIPTION = "Packages required to satisfy the Linux Standard Base (LSB) specification"
 PR = "r10"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 inherit packagegroup
 
meta/recipes-graphics/packagegroups/packagegroup-core-clutter.bb +1 -0
index 7540821..b44447a 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "Clutter package groups"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 PR = "r6"
 
meta/recipes-graphics/packagegroups/packagegroup-core-directfb.bb +1 -0
index 53dc0ae..b2a5946 100644
@@ -1,5 +1,6 @@
 SUMMARY = "DirectFB without X11"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 PACKAGE_ARCH = "${MACHINE_ARCH}"
 
meta/recipes-graphics/packagegroups/packagegroup-core-x11-base.bb +1 -0
index 17301a0..f4a182d 100644
@@ -1,6 +1,7 @@
 SUMMARY = "Basic X11 session"
 DESCRIPTION = "Packages required to set up a basic working X11 session"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r1"
 
 inherit packagegroup distro_features_check
meta/recipes-graphics/packagegroups/packagegroup-core-x11-xserver.bb +1 -0
index c53f1b7..5502c36 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "X11 display server"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r40"
 
 PACKAGE_ARCH = "${MACHINE_ARCH}"
meta/recipes-graphics/packagegroups/packagegroup-core-x11.bb +1 -0
index 3537d8c..0098056 100644
@@ -3,6 +3,7 @@
 #
 
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r40"
 
 inherit packagegroup distro_features_check
meta/recipes-qt/packagegroups/packagegroup-core-qt.bb +1 -0
index 5f6916a..9e7e439 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "Qt package groups"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r4"
 
 # Qt4 could NOT be built on MIPS64 with 64 bits userspace
meta/recipes-qt/packagegroups/packagegroup-core-qt4e.bb +1 -0
index d4f0fd1..df6a9d3 100644
@@ -1,6 +1,7 @@
 SUMMARY = "Qt for Embedded Linux (Qt without X11)"
 PR = "r2"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 # Qt4 could NOT be built on MIPS64 with 64 bits userspace
 COMPATIBLE_HOST_mips64 = "null"
meta/recipes-qt/packagegroups/packagegroup-qt-toolchain-target.inc +1 -0
index 02a0326..0777b26 100644
@@ -1,4 +1,5 @@
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 
 # Qt4 could NOT be built on MIPS64 with 64 bits userspace
 COMPATIBLE_HOST_mips64 = "null"
meta/recipes-sato/packagegroups/packagegroup-core-x11-sato.bb +1 -0
index 2d046c4..2507302 100644
@@ -4,6 +4,7 @@
 
 SUMMARY = "Sato desktop"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
 PR = "r33"
 
 PACKAGE_ARCH = "${MACHINE_ARCH}"
Signature · 1 line
1.8.4.5
#5 lore raw

PATCH 5/5 glibc/glibc-collateral.inc: Add LIC_FILES_CHKSUM to avoid warnings in manifest creation

In reply to Aníbal Limón

Add licenses point to COMMON_LICENSE_DIR because glibc-collateral.inc is a recipe that don't provide tarball/repo with LICENSE files.

---
 meta/recipes-core/glibc/glibc-collateral.inc | 2 ++
 1 file changed, 2 insertions(+)
meta/recipes-core/glibc/glibc-collateral.inc +2 -0
index dfcebae..f82db06 100644
@@ -1,5 +1,7 @@
 INHIBIT_DEFAULT_DEPS = "1"
 LICENSE = "GPLv2 & LGPLv2.1"
+LIC_FILES_CHKSUM ?= "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6 \
+                     file://${COMMON_LICENSE_DIR}/LGPL-2.1;md5=1a6d268fd218675ffea8be556788b780"
 HOMEPAGE = "http://www.gnu.org/software/libc/index.html"
 
 # This needs to match with glibc.inc, otherwise glibc-scripts and glibc-locale
Signature · 1 line
1.8.4.5
#6 lore raw
In reply to Aníbal Limón

Sorry i forget to put test result url.

Cheers,
alimon

Quoted 4 lines · Aníbal Limón

The next changes was made to implement INCOMPATIBLE_LICENSE handling in manifest creation this implies to rewrite license_manifest_creation from shell to python.

Tests was made to guarantee compatibility and can be found at,

https://bugzilla.yoctoproject.org/attachment.cgi?id=2443

Quoted 52 lines

The last two patches are to avoid warnings in manifest creation due that these recipes don't collect licenses before.

The following changes since commit 7f30749fe026e9ceb75d73b89271145a45a60763:

   oeqa/parselogs: Skip hda opcode errors (2015-03-12 12:50:24 +0000)

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib alimon/license-rebase
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/license-rebase

Aníbal Limón (5):
license_class: Reimplemented manifest creation in python
license_class: Generalize license_ok function
license: Add support for handle INCOMPATIBLE_LICENSE in manifest
creation
packagegroups: Add LIC_FILES_CHKSUM to avoid warnings in manifest
creation
glibc/glibc-collateral.inc: Add LIC_FILES_CHKSUM to avoid warnings in
manifest creation

  meta/classes/license.bbclass                       | 190 +++++++++++----------
  meta/lib/oe/license.py                             |  84 +++++++++
  meta/recipes-core/glibc/glibc-collateral.inc       |   2 +
  .../packagegroups/packagegroup-base.bb             |   1 +
  .../packagegroups/packagegroup-core-boot.bb        |   1 +
  .../packagegroup-core-buildessential.bb            |   1 +
  .../packagegroup-core-eclipse-debug.bb             |   1 +
  .../packagegroups/packagegroup-core-nfs.bb         |   1 +
  .../packagegroups/packagegroup-core-sdk.bb         |   1 +
  .../packagegroup-core-ssh-dropbear.bb              |   1 +
  .../packagegroups/packagegroup-core-ssh-openssh.bb |   1 +
  .../packagegroup-core-standalone-sdk-target.bb     |   1 +
  .../packagegroups/packagegroup-core-tools-debug.bb |   1 +
  .../packagegroup-core-tools-profile.bb             |   1 +
  .../packagegroups/packagegroup-cross-canadian.bb   |   1 +
  .../packagegroups/packagegroup-self-hosted.bb      |   1 +
  .../packagegroup-core-device-devel.bb              |   1 +
  .../packagegroup-core-full-cmdline.bb              |   1 +
  .../packagegroups/packagegroup-core-lsb.bb         |   1 +
  .../packagegroups/packagegroup-core-clutter.bb     |   1 +
  .../packagegroups/packagegroup-core-directfb.bb    |   1 +
  .../packagegroups/packagegroup-core-x11-base.bb    |   1 +
  .../packagegroups/packagegroup-core-x11-xserver.bb |   1 +
  .../packagegroups/packagegroup-core-x11.bb         |   1 +
  .../packagegroups/packagegroup-core-qt.bb          |   1 +
  .../packagegroups/packagegroup-core-qt4e.bb        |   1 +
  .../packagegroup-qt-toolchain-target.inc           |   1 +
  .../packagegroups/packagegroup-core-x11-sato.bb    |   1 +
  28 files changed, 212 insertions(+), 89 deletions(-)