[OE-core] [PATCH] license: improve handling of license files with identical basenames

Markus Lehtonen markus.lehtonen at linux.intel.com
Fri Aug 5 16:17:48 UTC 2016


Doing a quick check on core-image-minimal I found out that there are many
recipes whose do_populate_lic did not do the right thing:
Only in build1/tmp-glibc/deploy/licenses/binutils-cross-i586: COPYING
Only in build2/tmp-glibc/deploy/licenses/binutils-cross-i586: COPYING.0
Only in build2/tmp-glibc/deploy/licenses/binutils-cross-i586: COPYING.1
Only in build1/tmp-glibc/deploy/licenses/binutils-cross-i586: COPYING.LIB
Only in build2/tmp-glibc/deploy/licenses/binutils-cross-i586: COPYING.LIB.0
Only in build2/tmp-glibc/deploy/licenses/binutils-cross-i586: COPYING.LIB.1
Only in build1/tmp-glibc/deploy/licenses/binutils-native: COPYING
Only in build2/tmp-glibc/deploy/licenses/binutils-native: COPYING.0
Only in build2/tmp-glibc/deploy/licenses/binutils-native: COPYING.1
Only in build1/tmp-glibc/deploy/licenses/binutils-native: COPYING.LIB
Only in build2/tmp-glibc/deploy/licenses/binutils-native: COPYING.LIB.0
Only in build2/tmp-glibc/deploy/licenses/binutils-native: COPYING.LIB.1
Only in build1/tmp-glibc/deploy/licenses/glib-2.0: COPYING
Only in build2/tmp-glibc/deploy/licenses/glib-2.0: COPYING.0
Only in build2/tmp-glibc/deploy/licenses/glib-2.0: COPYING.1
Only in build2/tmp-glibc/deploy/licenses/glib-2.0: COPYING.2
Only in build1/tmp-glibc/deploy/licenses/glib-2.0-native: COPYING
Only in build2/tmp-glibc/deploy/licenses/glib-2.0-native: COPYING.0
Only in build2/tmp-glibc/deploy/licenses/glib-2.0-native: COPYING.1
Only in build2/tmp-glibc/deploy/licenses/glib-2.0-native: COPYING.2
Only in build1/tmp-glibc/deploy/licenses/m4-native: COPYING
Only in build2/tmp-glibc/deploy/licenses/m4-native: COPYING.0
Only in build2/tmp-glibc/deploy/licenses/m4-native: COPYING.1
Only in build1/tmp-glibc/deploy/licenses/util-linux: COPYING
Only in build2/tmp-glibc/deploy/licenses/util-linux: COPYING.0
Only in build2/tmp-glibc/deploy/licenses/util-linux: COPYING.1
Only in build2/tmp-glibc/deploy/licenses/util-linux: COPYING.2
Only in build1/tmp-glibc/deploy/licenses/util-linux-native: COPYING
Only in build2/tmp-glibc/deploy/licenses/util-linux-native: COPYING.0
Only in build2/tmp-glibc/deploy/licenses/util-linux-native: COPYING.1
Only in build2/tmp-glibc/deploy/licenses/util-linux-native: COPYING.2

 

On 05/08/16 19:04, "Markus Lehtonen"
<openembedded-core-bounces at lists.openembedded.org on behalf of
markus.lehtonen at linux.intel.com> wrote:

>Previously, find_license_files() in license.bbclass just blindly assumed
>that all different licenses specified in LIC_FILES_CHKSUM have unique
>filenames. As a consequence, only the last one of these similarly named
>license files was copied and the rest were "lost". This patch changes
>the behavior so that all license files get copied. However, if multiple
>identically names files are found, they are names to <file>.0, <file>.1
>etc.
>
>The patch also changes the handling of NO_GENERIC_LICENSE slightly.
>Previously, only basenames of NO_GENERIC_LICENSE and LIC_FILES_CHKSUM
>were compared when searching for the correct license file. After this
>patch NO_GENERIC_LICENSE must have the full path, matching what is
>specified in LIC_FILES_CHKSUM. This is required in order to be able
>handle identical filenames (basenames) consistently. For example, if
>you have:
>LICENSE = "my-custom-license"
>LIC_FILES_CHKSUM =
>"file://src/LICENCE;md5=d41d8cd98f00b204e9800998ecf8427e"
>
>you must specify:
>NO_GENERIC_LICENSE[my-custom-license] = "src/LICENCE"
>
>Signed-off-by: Markus Lehtonen <markus.lehtonen at linux.intel.com>
>---
> meta/classes/license.bbclass | 30 ++++++++++++++++++++++--------
> 1 file changed, 22 insertions(+), 8 deletions(-)
>
>diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass
>index 26c297d..1313fda 100644
>--- a/meta/classes/license.bbclass
>+++ b/meta/classes/license.bbclass
>@@ -385,6 +385,7 @@ def find_license_files(d):
>     """
>     import shutil
>     import oe.license
>+    from collections import defaultdict, OrderedDict
> 
>     pn = d.getVar('PN', True)
>     for package in d.getVar('PACKAGES', True):
>@@ -409,6 +410,8 @@ def find_license_files(d):
>     generic_directory = d.getVar('COMMON_LICENSE_DIR', True)
>     # List of basename, path tuples
>     lic_files_paths = []
>+    # Entries from LIC_FILES_CHKSUM
>+    lic_chksums = {}
>     license_source_dirs = []
>     license_source_dirs.append(generic_directory)
>     try:
>@@ -438,7 +441,6 @@ def find_license_files(d):
>         license_source = None
>         # If the generic does not exist we need to check to see if there
>is an SPDX mapping to it,
>         # unless NO_GENERIC_LICENSE is set.
>-
>         for lic_dir in license_source_dirs:
>             if not os.path.isfile(os.path.join(lic_dir, license_type)):
>                 if d.getVarFlag('SPDXLICENSEMAP', license_type, True) !=
>None:
>@@ -452,6 +454,7 @@ def find_license_files(d):
>                 license_source = lic_dir
>                 break
> 
>+        non_generic_lic = d.getVarFlag('NO_GENERIC_LICENSE',
>license_type, True)
>         if spdx_generic and license_source:
>             # we really should copy to generic_ + spdx_generic, however,
>that ends up messing the manifest
>             # audit up. This should be fixed in emit_pkgdata (or, we
>actually got and fix all the recipes)
>@@ -463,13 +466,11 @@ def find_license_files(d):
>             if d.getVarFlag('NO_GENERIC_LICENSE', license_type, True):
>                 bb.warn("%s: %s is a generic license, please don't use
>NO_GENERIC_LICENSE for it." % (pn, license_type))
> 
>-        elif d.getVarFlag('NO_GENERIC_LICENSE', license_type, True):
>+        elif non_generic_lic and non_generic_lic in lic_chksums:
>             # if NO_GENERIC_LICENSE is set, we copy the license files
>from the fetched source
>             # of the package rather than the license_source_dirs.
>-            for (basename, path) in lic_files_paths:
>-                if d.getVarFlag('NO_GENERIC_LICENSE', license_type,
>True) == basename:
>-                    lic_files_paths.append(("generic_" + license_type,
>path))
>-                    break
>+            lic_files_paths.append(("generic_" + license_type,
>+                                    os.path.join(srcdir,
>non_generic_lic)))
>         else:
>             # Add explicity avoid of CLOSED license because this isn't
>generic
>             if license_type != 'CLOSED':
>@@ -492,8 +493,8 @@ def find_license_files(d):
>         except bb.fetch.MalformedUrl:
>             raise bb.build.FuncFailed("%s: LIC_FILES_CHKSUM contains an
>invalid URL:  %s" % (d.getVar('PF', True), url))
>         # We want the license filename and path
>-        srclicfile = os.path.join(srcdir, path)
>-        lic_files_paths.append((os.path.basename(path), srclicfile))
>+        chksum = parm['md5'] if 'md5' in parm else parm['sha256']
>+        lic_chksums[path] = chksum
> 
>     v = FindVisitor()
>     try:
>@@ -503,6 +504,19 @@ def find_license_files(d):
>     except SyntaxError:
>         bb.warn("%s: Failed to parse it's LICENSE field." %
>(d.getVar('PF', True)))
> 
>+    # Add files from LIC_FILES_CHKSUM to list of license files
>+    lic_chksum_paths = defaultdict(OrderedDict)
>+    for path, chksum in lic_chksums.items():
>+        lic_chksum_paths[os.path.basename(path)][chksum] =
>os.path.join(srcdir, path)
>+    for basename, files in lic_chksum_paths.items():
>+        if len(files) == 1:
>+            lic_files_paths.append((basename, list(files.values())[0]))
>+        else:
>+            # If there are multiple different license files with
>identical
>+            # basenames we rename them to <file>.0, <file>.1, ...
>+            for i, path in enumerate(files.values()):
>+                lic_files_paths.append(("%s.%d" % (basename, i), path))
>+
>     return lic_files_paths
> 
> def return_spdx(d, license):
>-- 
>2.6.6
>
>-- 
>_______________________________________________
>Openembedded-core mailing list
>Openembedded-core at lists.openembedded.org
>http://lists.openembedded.org/mailman/listinfo/openembedded-core





More information about the Openembedded-core mailing list