archiver.bbclass: make it can filter the license
* Filter the license (default: no), the recipe whose license in COPYLEFT_LICENSE_INCLUDE will be included, and in COPYLEFT_LICENSE_EXCLUDE will be excluded. * The user can set the recipe type that would be archived (native, target, and so on), deafult to all. The copyleft_filter.bbclass is come from copyleft_compliance.bbclass, which is used by both copyleft_compliance.bbclass and archiver.bbclass. [YOCTO #5740] (From OE-Core rev: 0e798d5cbcf585535e19633828dc540a282261fc) Signed-off-by: Robert Yang <liezhi.yang@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
39ea97470f
commit
4a91e1449b
|
@ -12,9 +12,23 @@
|
|||
# 5) The environment data, similar to 'bitbake -e recipe':
|
||||
# ARCHIVER_MODE[dumpdata] = "1"
|
||||
# 6) The recipe (.bb and .inc): ARCHIVER_MODE[recipe] = "1"
|
||||
# 7) Whether output the .src.rpm package:
|
||||
# ARCHIVER_MODE[srpm] = "1"
|
||||
# 8) Filter the license, the recipe whose license in
|
||||
# COPYLEFT_LICENSE_INCLUDE will be included, and in
|
||||
# COPYLEFT_LICENSE_EXCLUDE will be excluded.
|
||||
# COPYLEFT_LICENSE_INCLUDE = 'GPL* LGPL*'
|
||||
# COPYLEFT_LICENSE_EXCLUDE = 'CLOSED Proprietary'
|
||||
# 9) The recipe type that will be archived:
|
||||
# COPYLEFT_RECIPE_TYPES = 'target'
|
||||
#
|
||||
# All of the above can be packed into a .src.rpm package: (when PACKAGES != "")
|
||||
# ARCHIVER_MODE[srpm] = "1"
|
||||
|
||||
# Don't filter the license by default
|
||||
COPYLEFT_LICENSE_INCLUDE ?= ''
|
||||
COPYLEFT_LICENSE_EXCLUDE ?= ''
|
||||
# Create archive for all the recipe types
|
||||
COPYLEFT_RECIPE_TYPES ?= 'target native nativesdk cross crosssdk cross-canadian'
|
||||
inherit copyleft_filter
|
||||
|
||||
ARCHIVER_MODE[srpm] ?= "0"
|
||||
ARCHIVER_MODE[src] ?= "patched"
|
||||
|
@ -38,6 +52,15 @@ do_ar_original[dirs] = "${ARCHIVER_OUTDIR} ${ARCHIVER_WORKDIR}"
|
|||
python () {
|
||||
pn = d.getVar('PN', True)
|
||||
|
||||
if d.getVar('COPYLEFT_LICENSE_INCLUDE', True) or \
|
||||
d.getVar('COPYLEFT_LICENSE_EXCLUDE', True):
|
||||
included, reason = copyleft_should_include(d)
|
||||
if not included:
|
||||
bb.debug(1, 'archiver: %s is excluded: %s' % (pn, reason))
|
||||
return
|
||||
else:
|
||||
bb.debug(1, 'archiver: %s is included: %s' % (pn, reason))
|
||||
|
||||
ar_src = d.getVarFlag('ARCHIVER_MODE', 'src', True)
|
||||
ar_dumpdata = d.getVarFlag('ARCHIVER_MODE', 'dumpdata', True)
|
||||
ar_recipe = d.getVarFlag('ARCHIVER_MODE', 'recipe', True)
|
||||
|
|
|
@ -2,66 +2,12 @@
|
|||
# Defaults to using symlinks, as it's a quick operation, and one can easily
|
||||
# follow the links when making use of the files (e.g. tar with the -h arg).
|
||||
#
|
||||
# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
|
||||
#
|
||||
# vi:sts=4:sw=4:et
|
||||
|
||||
COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
|
||||
COPYLEFT_LICENSE_INCLUDE[type] = 'list'
|
||||
COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'
|
||||
|
||||
COPYLEFT_LICENSE_EXCLUDE ?= 'CLOSED Proprietary'
|
||||
COPYLEFT_LICENSE_EXCLUDE[type] = 'list'
|
||||
COPYLEFT_LICENSE_EXCLUDE[doc] = 'Space separated list of globs which exclude licenses'
|
||||
|
||||
COPYLEFT_RECIPE_TYPE ?= '${@copyleft_recipe_type(d)}'
|
||||
COPYLEFT_RECIPE_TYPE[doc] = 'The "type" of the current recipe (e.g. target, native, cross)'
|
||||
|
||||
COPYLEFT_RECIPE_TYPES ?= 'target'
|
||||
COPYLEFT_RECIPE_TYPES[type] = 'list'
|
||||
COPYLEFT_RECIPE_TYPES[doc] = 'Space separated list of recipe types to include'
|
||||
|
||||
COPYLEFT_AVAILABLE_RECIPE_TYPES = 'target native nativesdk cross crosssdk cross-canadian'
|
||||
COPYLEFT_AVAILABLE_RECIPE_TYPES[type] = 'list'
|
||||
COPYLEFT_AVAILABLE_RECIPE_TYPES[doc] = 'Space separated list of available recipe types'
|
||||
inherit copyleft_filter
|
||||
|
||||
COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
|
||||
|
||||
def copyleft_recipe_type(d):
|
||||
for recipe_type in oe.data.typed_value('COPYLEFT_AVAILABLE_RECIPE_TYPES', d):
|
||||
if oe.utils.inherits(d, recipe_type):
|
||||
return recipe_type
|
||||
return 'target'
|
||||
|
||||
def copyleft_should_include(d):
|
||||
"""
|
||||
Determine if this recipe's sources should be deployed for compliance
|
||||
"""
|
||||
import ast
|
||||
import oe.license
|
||||
from fnmatch import fnmatchcase as fnmatch
|
||||
|
||||
recipe_type = d.getVar('COPYLEFT_RECIPE_TYPE', True)
|
||||
if recipe_type not in oe.data.typed_value('COPYLEFT_RECIPE_TYPES', d):
|
||||
return False, 'recipe type "%s" is excluded' % recipe_type
|
||||
|
||||
include = oe.data.typed_value('COPYLEFT_LICENSE_INCLUDE', d)
|
||||
exclude = oe.data.typed_value('COPYLEFT_LICENSE_EXCLUDE', d)
|
||||
|
||||
try:
|
||||
is_included, reason = oe.license.is_included(d.getVar('LICENSE', True), include, exclude)
|
||||
except oe.license.LicenseError as exc:
|
||||
bb.fatal('%s: %s' % (d.getVar('PF', True), exc))
|
||||
else:
|
||||
if is_included:
|
||||
if reason:
|
||||
return True, 'recipe has included licenses: %s' % ', '.join(reason)
|
||||
else:
|
||||
return False, 'recipe does not include a copyleft license'
|
||||
else:
|
||||
return False, 'recipe has excluded licenses: %s' % ', '.join(reason)
|
||||
|
||||
|
||||
python do_prepare_copyleft_sources () {
|
||||
"""Populate a tree of the recipe sources and emit patch series files"""
|
||||
import os.path
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
# Filter the license, the copyleft_should_include returns True for the
|
||||
# COPYLEFT_LICENSE_INCLUDE recipe, and False for the
|
||||
# COPYLEFT_LICENSE_EXCLUDE.
|
||||
#
|
||||
# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
|
||||
#
|
||||
# vi:sts=4:sw=4:et
|
||||
|
||||
COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
|
||||
COPYLEFT_LICENSE_INCLUDE[type] = 'list'
|
||||
COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'
|
||||
|
||||
COPYLEFT_LICENSE_EXCLUDE ?= 'CLOSED Proprietary'
|
||||
COPYLEFT_LICENSE_EXCLUDE[type] = 'list'
|
||||
COPYLEFT_LICENSE_EXCLUDE[doc] = 'Space separated list of globs which exclude licenses'
|
||||
|
||||
COPYLEFT_RECIPE_TYPE ?= '${@copyleft_recipe_type(d)}'
|
||||
COPYLEFT_RECIPE_TYPE[doc] = 'The "type" of the current recipe (e.g. target, native, cross)'
|
||||
|
||||
COPYLEFT_RECIPE_TYPES ?= 'target'
|
||||
COPYLEFT_RECIPE_TYPES[type] = 'list'
|
||||
COPYLEFT_RECIPE_TYPES[doc] = 'Space separated list of recipe types to include'
|
||||
|
||||
COPYLEFT_AVAILABLE_RECIPE_TYPES = 'target native nativesdk cross crosssdk cross-canadian'
|
||||
COPYLEFT_AVAILABLE_RECIPE_TYPES[type] = 'list'
|
||||
COPYLEFT_AVAILABLE_RECIPE_TYPES[doc] = 'Space separated list of available recipe types'
|
||||
|
||||
def copyleft_recipe_type(d):
|
||||
for recipe_type in oe.data.typed_value('COPYLEFT_AVAILABLE_RECIPE_TYPES', d):
|
||||
if oe.utils.inherits(d, recipe_type):
|
||||
return recipe_type
|
||||
return 'target'
|
||||
|
||||
def copyleft_should_include(d):
|
||||
"""
|
||||
Determine if this recipe's sources should be deployed for compliance
|
||||
"""
|
||||
import ast
|
||||
import oe.license
|
||||
from fnmatch import fnmatchcase as fnmatch
|
||||
|
||||
recipe_type = d.getVar('COPYLEFT_RECIPE_TYPE', True)
|
||||
if recipe_type not in oe.data.typed_value('COPYLEFT_RECIPE_TYPES', d):
|
||||
return False, 'recipe type "%s" is excluded' % recipe_type
|
||||
|
||||
include = oe.data.typed_value('COPYLEFT_LICENSE_INCLUDE', d)
|
||||
exclude = oe.data.typed_value('COPYLEFT_LICENSE_EXCLUDE', d)
|
||||
|
||||
try:
|
||||
is_included, reason = oe.license.is_included(d.getVar('LICENSE', True), include, exclude)
|
||||
except oe.license.LicenseError as exc:
|
||||
bb.fatal('%s: %s' % (d.getVar('PF', True), exc))
|
||||
else:
|
||||
if is_included:
|
||||
if reason:
|
||||
return True, 'recipe has included licenses: %s' % ', '.join(reason)
|
||||
else:
|
||||
return False, 'recipe does not include a copyleft license'
|
||||
else:
|
||||
return False, 'recipe has excluded licenses: %s' % ', '.join(reason)
|
||||
|
||||
|
Loading…
Reference in New Issue