diff options
| author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2017-08-21 17:39:49 +1200 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-08-23 08:47:02 +0100 |
| commit | b1f237ebd0d4180c5d23a0ecd9aaf7193c63a48a (patch) | |
| tree | d49aba7187426b2f1d049787681c7140ebd1a4dd /scripts/lib/recipetool/create.py | |
| parent | a7baa47c876c7895499909731aaa451c6009610a (diff) | |
| download | poky-b1f237ebd0d4180c5d23a0ecd9aaf7193c63a48a.tar.gz | |
recipetool: allow plugins to set LICENSE and LIC_FILES_CHKSUM
We were being a bit prescriptive in setting LICENSE and
LIC_FILES_CHKSUM. We can't always trust what's in the metadata
accompanying some source which plugins will almost always be pulling
from, however we do want to allow plugins to set the LICENSE and
LIC_FILES_CHKSUM values. Merge what we find in our license file scan
with what the plugin sends back.
Additionally, plugins can now add a "license" item to the handled list
in order to inhibit the normal LICENSE / LIC_FILES_CHKSUM handling if
they have already taken care of it completely.
Thanks to Mark Horn <mark.d.horn@intel.com> for prompting, testing and
fixing this patch.
(From OE-Core rev: 1df60b09f7a60427795ec828c9c7180e4e52f98c)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/recipetool/create.py')
| -rw-r--r-- | scripts/lib/recipetool/create.py | 115 |
1 files changed, 77 insertions, 38 deletions
diff --git a/scripts/lib/recipetool/create.py b/scripts/lib/recipetool/create.py index 40bd3c820b..26011451dd 100644 --- a/scripts/lib/recipetool/create.py +++ b/scripts/lib/recipetool/create.py | |||
| @@ -618,9 +618,10 @@ def create_recipe(args): | |||
| 618 | # We need a blank line here so that patch_recipe_lines can rewind before the LICENSE comments | 618 | # We need a blank line here so that patch_recipe_lines can rewind before the LICENSE comments |
| 619 | lines_before.append('') | 619 | lines_before.append('') |
| 620 | 620 | ||
| 621 | handled = [] | 621 | # We'll come back and replace this later in handle_license_vars() |
| 622 | licvalues = handle_license_vars(srctree_use, lines_before, handled, extravalues, tinfoil.config_data) | 622 | lines_before.append('##LICENSE_PLACEHOLDER##') |
| 623 | 623 | ||
| 624 | handled = [] | ||
| 624 | classes = [] | 625 | classes = [] |
| 625 | 626 | ||
| 626 | # FIXME This is kind of a hack, we probably ought to be using bitbake to do this | 627 | # FIXME This is kind of a hack, we probably ought to be using bitbake to do this |
| @@ -751,6 +752,8 @@ def create_recipe(args): | |||
| 751 | if name_pv and not realpv: | 752 | if name_pv and not realpv: |
| 752 | realpv = name_pv | 753 | realpv = name_pv |
| 753 | 754 | ||
| 755 | licvalues = handle_license_vars(srctree_use, lines_before, handled, extravalues, tinfoil.config_data) | ||
| 756 | |||
| 754 | if not outfile: | 757 | if not outfile: |
| 755 | if not pn: | 758 | if not pn: |
| 756 | log_error_cond('Unable to determine short program name from source tree - please specify name with -N/--name or output file name with -o/--outfile', args.devtool) | 759 | log_error_cond('Unable to determine short program name from source tree - please specify name with -N/--name or output file name with -o/--outfile', args.devtool) |
| @@ -843,9 +846,6 @@ def create_recipe(args): | |||
| 843 | outlines.extend(lines_after) | 846 | outlines.extend(lines_after) |
| 844 | 847 | ||
| 845 | if extravalues: | 848 | if extravalues: |
| 846 | if 'LICENSE' in extravalues and not licvalues: | ||
| 847 | # Don't blow away 'CLOSED' value that comments say we set | ||
| 848 | del extravalues['LICENSE'] | ||
| 849 | _, outlines = oe.recipeutils.patch_recipe_lines(outlines, extravalues, trailing_newline=False) | 849 | _, outlines = oe.recipeutils.patch_recipe_lines(outlines, extravalues, trailing_newline=False) |
| 850 | 850 | ||
| 851 | if args.extract_to: | 851 | if args.extract_to: |
| @@ -889,55 +889,94 @@ def check_single_file(fn, fetchuri): | |||
| 889 | logger.error('Fetching "%s" returned a single HTML page - check the URL is correct and functional' % fetchuri) | 889 | logger.error('Fetching "%s" returned a single HTML page - check the URL is correct and functional' % fetchuri) |
| 890 | sys.exit(1) | 890 | sys.exit(1) |
| 891 | 891 | ||
| 892 | def split_value(value): | ||
| 893 | if isinstance(value, str): | ||
| 894 | return value.split() | ||
| 895 | else: | ||
| 896 | return value | ||
| 892 | 897 | ||
| 893 | def handle_license_vars(srctree, lines_before, handled, extravalues, d): | 898 | def handle_license_vars(srctree, lines_before, handled, extravalues, d): |
| 899 | lichandled = [x for x in handled if x[0] == 'license'] | ||
| 900 | if lichandled: | ||
| 901 | # Someone else has already handled the license vars, just return their value | ||
| 902 | return lichandled[0][1] | ||
| 903 | |||
| 894 | licvalues = guess_license(srctree, d) | 904 | licvalues = guess_license(srctree, d) |
| 905 | licenses = [] | ||
| 895 | lic_files_chksum = [] | 906 | lic_files_chksum = [] |
| 896 | lic_unknown = [] | 907 | lic_unknown = [] |
| 908 | lines = [] | ||
| 897 | if licvalues: | 909 | if licvalues: |
| 898 | licenses = [] | ||
| 899 | for licvalue in licvalues: | 910 | for licvalue in licvalues: |
| 900 | if not licvalue[0] in licenses: | 911 | if not licvalue[0] in licenses: |
| 901 | licenses.append(licvalue[0]) | 912 | licenses.append(licvalue[0]) |
| 902 | lic_files_chksum.append('file://%s;md5=%s' % (licvalue[1], licvalue[2])) | 913 | lic_files_chksum.append('file://%s;md5=%s' % (licvalue[1], licvalue[2])) |
| 903 | if licvalue[0] == 'Unknown': | 914 | if licvalue[0] == 'Unknown': |
| 904 | lic_unknown.append(licvalue[1]) | 915 | lic_unknown.append(licvalue[1]) |
| 905 | lines_before.append('# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is') | ||
| 906 | lines_before.append('# your responsibility to verify that the values are complete and correct.') | ||
| 907 | if len(licvalues) > 1: | ||
| 908 | lines_before.append('#') | ||
| 909 | lines_before.append('# NOTE: multiple licenses have been detected; they have been separated with &') | ||
| 910 | lines_before.append('# in the LICENSE value for now since it is a reasonable assumption that all') | ||
| 911 | lines_before.append('# of the licenses apply. If instead there is a choice between the multiple') | ||
| 912 | lines_before.append('# licenses then you should change the value to separate the licenses with |') | ||
| 913 | lines_before.append('# instead of &. If there is any doubt, check the accompanying documentation') | ||
| 914 | lines_before.append('# to determine which situation is applicable.') | ||
| 915 | if lic_unknown: | 916 | if lic_unknown: |
| 916 | lines_before.append('#') | 917 | lines.append('#') |
| 917 | lines_before.append('# The following license files were not able to be identified and are') | 918 | lines.append('# The following license files were not able to be identified and are') |
| 918 | lines_before.append('# represented as "Unknown" below, you will need to check them yourself:') | 919 | lines.append('# represented as "Unknown" below, you will need to check them yourself:') |
| 919 | for licfile in lic_unknown: | 920 | for licfile in lic_unknown: |
| 920 | lines_before.append('# %s' % licfile) | 921 | lines.append('# %s' % licfile) |
| 921 | lines_before.append('#') | 922 | |
| 922 | else: | 923 | extra_license = split_value(extravalues.pop('LICENSE', [])) |
| 923 | lines_before.append('# Unable to find any files that looked like license statements. Check the accompanying') | 924 | if '&' in extra_license: |
| 924 | lines_before.append('# documentation and source headers and set LICENSE and LIC_FILES_CHKSUM accordingly.') | 925 | extra_license.remove('&') |
| 925 | lines_before.append('#') | 926 | if extra_license: |
| 926 | lines_before.append('# NOTE: LICENSE is being set to "CLOSED" to allow you to at least start building - if') | ||
| 927 | lines_before.append('# this is not accurate with respect to the licensing of the software being built (it') | ||
| 928 | lines_before.append('# will not be in most cases) you must specify the correct value before using this') | ||
| 929 | lines_before.append('# recipe for anything other than initial testing/development!') | ||
| 930 | licenses = ['CLOSED'] | ||
| 931 | pkg_license = extravalues.pop('LICENSE', None) | ||
| 932 | if pkg_license: | ||
| 933 | if licenses == ['Unknown']: | 927 | if licenses == ['Unknown']: |
| 934 | lines_before.append('# NOTE: The following LICENSE value was determined from the original package metadata') | 928 | licenses = extra_license |
| 935 | licenses = [pkg_license] | ||
| 936 | else: | 929 | else: |
| 937 | lines_before.append('# NOTE: Original package metadata indicates license is: %s' % pkg_license) | 930 | for item in extra_license: |
| 938 | lines_before.append('LICENSE = "%s"' % ' & '.join(licenses)) | 931 | if item not in licenses: |
| 939 | lines_before.append('LIC_FILES_CHKSUM = "%s"' % ' \\\n '.join(lic_files_chksum)) | 932 | licenses.append(item) |
| 940 | lines_before.append('') | 933 | extra_lic_files_chksum = split_value(extravalues.pop('LIC_FILES_CHKSUM', [])) |
| 934 | for item in extra_lic_files_chksum: | ||
| 935 | if item not in lic_files_chksum: | ||
| 936 | lic_files_chksum.append(item) | ||
| 937 | |||
| 938 | if lic_files_chksum: | ||
| 939 | # We are going to set the vars, so prepend the standard disclaimer | ||
| 940 | lines.insert(0, '# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is') | ||
| 941 | lines.insert(1, '# your responsibility to verify that the values are complete and correct.') | ||
| 942 | else: | ||
| 943 | # Without LIC_FILES_CHKSUM we set LICENSE = "CLOSED" to allow the | ||
| 944 | # user to get started easily | ||
| 945 | lines.append('# Unable to find any files that looked like license statements. Check the accompanying') | ||
| 946 | lines.append('# documentation and source headers and set LICENSE and LIC_FILES_CHKSUM accordingly.') | ||
| 947 | lines.append('#') | ||
| 948 | lines.append('# NOTE: LICENSE is being set to "CLOSED" to allow you to at least start building - if') | ||
| 949 | lines.append('# this is not accurate with respect to the licensing of the software being built (it') | ||
| 950 | lines.append('# will not be in most cases) you must specify the correct value before using this') | ||
| 951 | lines.append('# recipe for anything other than initial testing/development!') | ||
| 952 | licenses = ['CLOSED'] | ||
| 953 | |||
| 954 | if extra_license and sorted(licenses) != sorted(extra_license): | ||
| 955 | lines.append('# NOTE: Original package / source metadata indicates license is: %s' % ' & '.join(extra_license)) | ||
| 956 | |||
| 957 | if len(licenses) > 1: | ||
| 958 | lines.append('#') | ||
| 959 | lines.append('# NOTE: multiple licenses have been detected; they have been separated with &') | ||
| 960 | lines.append('# in the LICENSE value for now since it is a reasonable assumption that all') | ||
| 961 | lines.append('# of the licenses apply. If instead there is a choice between the multiple') | ||
| 962 | lines.append('# licenses then you should change the value to separate the licenses with |') | ||
| 963 | lines.append('# instead of &. If there is any doubt, check the accompanying documentation') | ||
| 964 | lines.append('# to determine which situation is applicable.') | ||
| 965 | |||
| 966 | lines.append('LICENSE = "%s"' % ' & '.join(licenses)) | ||
| 967 | lines.append('LIC_FILES_CHKSUM = "%s"' % ' \\\n '.join(lic_files_chksum)) | ||
| 968 | lines.append('') | ||
| 969 | |||
| 970 | # Replace the placeholder so we get the values in the right place in the recipe file | ||
| 971 | try: | ||
| 972 | pos = lines_before.index('##LICENSE_PLACEHOLDER##') | ||
| 973 | except ValueError: | ||
| 974 | pos = -1 | ||
| 975 | if pos == -1: | ||
| 976 | lines_before.extend(lines) | ||
| 977 | else: | ||
| 978 | lines_before[pos:pos+1] = lines | ||
| 979 | |||
| 941 | handled.append(('license', licvalues)) | 980 | handled.append(('license', licvalues)) |
| 942 | return licvalues | 981 | return licvalues |
| 943 | 982 | ||
