[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