diff options
author | Joshua Watt <jpewhacker@gmail.com> | 2017-02-10 21:35:37 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-02-15 20:06:41 -0800 |
commit | 8279d6f257440fdcc60d5668daa4081044370265 (patch) | |
tree | 68d88b5856d5877a13ff2d2639c564a6563bc470 /meta/classes | |
parent | 2c749295558660955e3f05e1cd42c18a5c656c68 (diff) | |
download | poky-8279d6f257440fdcc60d5668daa4081044370265.tar.gz |
classes/license: Respect beginline and endline
Recipes have the option of specifying a 'beginline' and 'endline'
options in LIC_FILES_CHKSUM which will cause the license bbclass to
only extract those specific lines from the license file when generating
the license database.
(From OE-Core rev: 515f4c129ad27e9502621738d0bf7f5552627f19)
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes')
-rw-r--r-- | meta/classes/license.bbclass | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass index 44467d09bf..9923aac4ec 100644 --- a/meta/classes/license.bbclass +++ b/meta/classes/license.bbclass | |||
@@ -345,7 +345,7 @@ def copy_license_files(lic_files_paths, destdir): | |||
345 | import errno | 345 | import errno |
346 | 346 | ||
347 | bb.utils.mkdirhier(destdir) | 347 | bb.utils.mkdirhier(destdir) |
348 | for (basename, path) in lic_files_paths: | 348 | for (basename, path, beginline, endline) in lic_files_paths: |
349 | try: | 349 | try: |
350 | src = path | 350 | src = path |
351 | dst = os.path.join(destdir, basename) | 351 | dst = os.path.join(destdir, basename) |
@@ -353,7 +353,7 @@ def copy_license_files(lic_files_paths, destdir): | |||
353 | os.remove(dst) | 353 | os.remove(dst) |
354 | if os.path.islink(src): | 354 | if os.path.islink(src): |
355 | src = os.path.realpath(src) | 355 | src = os.path.realpath(src) |
356 | canlink = os.access(src, os.W_OK) and (os.stat(src).st_dev == os.stat(destdir).st_dev) | 356 | canlink = os.access(src, os.W_OK) and (os.stat(src).st_dev == os.stat(destdir).st_dev) and beginline is None and endline is None |
357 | if canlink: | 357 | if canlink: |
358 | try: | 358 | try: |
359 | os.link(src, dst) | 359 | os.link(src, dst) |
@@ -377,7 +377,15 @@ def copy_license_files(lic_files_paths, destdir): | |||
377 | else: | 377 | else: |
378 | raise | 378 | raise |
379 | if not canlink: | 379 | if not canlink: |
380 | shutil.copyfile(src, dst) | 380 | begin_idx = int(beginline)-1 if beginline is not None else None |
381 | end_idx = int(endline) if endline is not None else None | ||
382 | if begin_idx is None and end_idx is None: | ||
383 | shutil.copyfile(src, dst) | ||
384 | else: | ||
385 | with open(src, 'r') as src_f: | ||
386 | with open(dst, 'w') as dst_f: | ||
387 | dst_f.write(''.join(src_f.readlines()[begin_idx:end_idx])) | ||
388 | |||
381 | except Exception as e: | 389 | except Exception as e: |
382 | bb.warn("Could not copy license file %s to %s: %s" % (src, dst, e)) | 390 | bb.warn("Could not copy license file %s to %s: %s" % (src, dst, e)) |
383 | 391 | ||
@@ -447,7 +455,8 @@ def find_license_files(d): | |||
447 | # we really should copy to generic_ + spdx_generic, however, that ends up messing the manifest | 455 | # we really should copy to generic_ + spdx_generic, however, that ends up messing the manifest |
448 | # audit up. This should be fixed in emit_pkgdata (or, we actually got and fix all the recipes) | 456 | # audit up. This should be fixed in emit_pkgdata (or, we actually got and fix all the recipes) |
449 | 457 | ||
450 | lic_files_paths.append(("generic_" + license_type, os.path.join(license_source, spdx_generic))) | 458 | lic_files_paths.append(("generic_" + license_type, os.path.join(license_source, spdx_generic), |
459 | None, None)) | ||
451 | 460 | ||
452 | # The user may attempt to use NO_GENERIC_LICENSE for a generic license which doesn't make sense | 461 | # The user may attempt to use NO_GENERIC_LICENSE for a generic license which doesn't make sense |
453 | # and should not be allowed, warn the user in this case. | 462 | # and should not be allowed, warn the user in this case. |
@@ -458,7 +467,7 @@ def find_license_files(d): | |||
458 | # if NO_GENERIC_LICENSE is set, we copy the license files from the fetched source | 467 | # if NO_GENERIC_LICENSE is set, we copy the license files from the fetched source |
459 | # of the package rather than the license_source_dirs. | 468 | # of the package rather than the license_source_dirs. |
460 | lic_files_paths.append(("generic_" + license_type, | 469 | lic_files_paths.append(("generic_" + license_type, |
461 | os.path.join(srcdir, non_generic_lic))) | 470 | os.path.join(srcdir, non_generic_lic), None, None)) |
462 | else: | 471 | else: |
463 | # Add explicity avoid of CLOSED license because this isn't generic | 472 | # Add explicity avoid of CLOSED license because this isn't generic |
464 | if license_type != 'CLOSED': | 473 | if license_type != 'CLOSED': |
@@ -476,7 +485,9 @@ def find_license_files(d): | |||
476 | bb.fatal("%s: LIC_FILES_CHKSUM contains an invalid URL: %s" % (d.getVar('PF'), url)) | 485 | bb.fatal("%s: LIC_FILES_CHKSUM contains an invalid URL: %s" % (d.getVar('PF'), url)) |
477 | # We want the license filename and path | 486 | # We want the license filename and path |
478 | chksum = parm['md5'] if 'md5' in parm else parm['sha256'] | 487 | chksum = parm['md5'] if 'md5' in parm else parm['sha256'] |
479 | lic_chksums[path] = chksum | 488 | beginline = parm.get('beginline') |
489 | endline = parm.get('endline') | ||
490 | lic_chksums[path] = (chksum, beginline, endline) | ||
480 | 491 | ||
481 | v = FindVisitor() | 492 | v = FindVisitor() |
482 | try: | 493 | try: |
@@ -488,16 +499,17 @@ def find_license_files(d): | |||
488 | 499 | ||
489 | # Add files from LIC_FILES_CHKSUM to list of license files | 500 | # Add files from LIC_FILES_CHKSUM to list of license files |
490 | lic_chksum_paths = defaultdict(OrderedDict) | 501 | lic_chksum_paths = defaultdict(OrderedDict) |
491 | for path, chksum in lic_chksums.items(): | 502 | for path, data in lic_chksums.items(): |
492 | lic_chksum_paths[os.path.basename(path)][chksum] = os.path.join(srcdir, path) | 503 | lic_chksum_paths[os.path.basename(path)][data] = (os.path.join(srcdir, path), data[1], data[2]) |
493 | for basename, files in lic_chksum_paths.items(): | 504 | for basename, files in lic_chksum_paths.items(): |
494 | if len(files) == 1: | 505 | if len(files) == 1: |
495 | lic_files_paths.append((basename, list(files.values())[0])) | 506 | data = list(files.values())[0] |
507 | lic_files_paths.append(tuple([basename] + list(data))) | ||
496 | else: | 508 | else: |
497 | # If there are multiple different license files with identical | 509 | # If there are multiple different license files with identical |
498 | # basenames we rename them to <file>.0, <file>.1, ... | 510 | # basenames we rename them to <file>.0, <file>.1, ... |
499 | for i, path in enumerate(files.values()): | 511 | for i, data in enumerate(files.values()): |
500 | lic_files_paths.append(("%s.%d" % (basename, i), path)) | 512 | lic_files_paths.append(tuple(["%s.%d" % (basename, i)] + list(data))) |
501 | 513 | ||
502 | return lic_files_paths | 514 | return lic_files_paths |
503 | 515 | ||