summaryrefslogtreecommitdiff
path: root/poky/meta/classes
diff options
context:
space:
mode:
Diffstat (limited to 'poky/meta/classes')
-rw-r--r--poky/meta/classes/archiver.bbclass13
-rw-r--r--poky/meta/classes/features_check.bbclass125
-rw-r--r--poky/meta/classes/insane.bbclass12
3 files changed, 64 insertions, 86 deletions
diff --git a/poky/meta/classes/archiver.bbclass b/poky/meta/classes/archiver.bbclass
index 780c562b6..c2c049c34 100644
--- a/poky/meta/classes/archiver.bbclass
+++ b/poky/meta/classes/archiver.bbclass
@@ -345,13 +345,12 @@ python do_ar_mirror() {
fetcher = bb.fetch2.Fetch(src_uri, d)
- for url in fetcher.urls:
- if is_excluded(url):
- bb.note('Skipping excluded url: %s' % (url))
+ for ud in fetcher.expanded_urldata():
+ if is_excluded(ud.url):
+ bb.note('Skipping excluded url: %s' % (ud.url))
continue
- bb.note('Archiving url: %s' % (url))
- ud = fetcher.ud[url]
+ bb.note('Archiving url: %s' % (ud.url))
ud.setup_localpath(d)
localpath = None
@@ -367,7 +366,7 @@ python do_ar_mirror() {
if len(ud.mirrortarballs) and not localpath:
bb.warn('Mirror tarballs are listed for a source but none are present. ' \
'Falling back to original download.\n' \
- 'SRC_URI = %s' % (url))
+ 'SRC_URI = %s' % (ud.url))
# Check original download
if not localpath:
@@ -376,7 +375,7 @@ python do_ar_mirror() {
if not localpath or not os.path.exists(localpath):
bb.fatal('Original download is missing for a source.\n' \
- 'SRC_URI = %s' % (url))
+ 'SRC_URI = %s' % (ud.url))
# We now have an appropriate localpath
bb.note('Copying source mirror')
diff --git a/poky/meta/classes/features_check.bbclass b/poky/meta/classes/features_check.bbclass
index 876d32e31..b3c804786 100644
--- a/poky/meta/classes/features_check.bbclass
+++ b/poky/meta/classes/features_check.bbclass
@@ -1,23 +1,13 @@
-# Allow checking of required and conflicting DISTRO_FEATURES
+# Allow checking of required and conflicting features
#
-# ANY_OF_DISTRO_FEATURES: ensure at least one item on this list is included
-# in DISTRO_FEATURES.
-# REQUIRED_DISTRO_FEATURES: ensure every item on this list is included
-# in DISTRO_FEATURES.
-# CONFLICT_DISTRO_FEATURES: ensure no item in this list is included in
-# DISTRO_FEATURES.
-# ANY_OF_MACHINE_FEATURES: ensure at least one item on this list is included
-# in MACHINE_FEATURES.
-# REQUIRED_MACHINE_FEATURES: ensure every item on this list is included
-# in MACHINE_FEATURES.
-# CONFLICT_MACHINE_FEATURES: ensure no item in this list is included in
-# MACHINE_FEATURES.
-# ANY_OF_COMBINED_FEATURES: ensure at least one item on this list is included
-# in COMBINED_FEATURES.
-# REQUIRED_COMBINED_FEATURES: ensure every item on this list is included
-# in COMBINED_FEATURES.
-# CONFLICT_COMBINED_FEATURES: ensure no item in this list is included in
-# COMBINED_FEATURES.
+# xxx = [DISTRO,MACHINE,COMBINED]
+#
+# ANY_OF_xxx_FEATURES: ensure at least one item on this list is included
+# in xxx_FEATURES.
+# REQUIRED_xxx_FEATURES: ensure every item on this list is included
+# in xxx_FEATURES.
+# CONFLICT_xxx_FEATURES: ensure no item in this list is included in
+# xxx_FEATURES.
#
# Copyright 2019 (C) Texas Instruments Inc.
# Copyright 2013 (C) O.S. Systems Software LTDA.
@@ -26,63 +16,42 @@ python () {
if d.getVar('PARSE_ALL_RECIPES', False):
return
- # Assume at least one var is set.
- distro_features = set((d.getVar('DISTRO_FEATURES') or '').split())
-
- any_of_distro_features = set((d.getVar('ANY_OF_DISTRO_FEATURES') or '').split())
- if any_of_distro_features:
- if set.isdisjoint(any_of_distro_features, distro_features):
- raise bb.parse.SkipRecipe("one of '%s' needs to be in DISTRO_FEATURES" % ' '.join(any_of_distro_features))
-
- required_distro_features = set((d.getVar('REQUIRED_DISTRO_FEATURES') or '').split())
- if required_distro_features:
- missing = set.difference(required_distro_features, distro_features)
- if missing:
- raise bb.parse.SkipRecipe("missing required distro feature%s '%s' (not in DISTRO_FEATURES)" % ('s' if len(missing) > 1 else '', ' '.join(missing)))
-
- conflict_distro_features = set((d.getVar('CONFLICT_DISTRO_FEATURES') or '').split())
- if conflict_distro_features:
- conflicts = set.intersection(conflict_distro_features, distro_features)
- if conflicts:
- raise bb.parse.SkipRecipe("conflicting distro feature%s '%s' (in DISTRO_FEATURES)" % ('s' if len(conflicts) > 1 else '', ' '.join(conflicts)))
-
- # Assume at least one var is set.
- machine_features = set((d.getVar('MACHINE_FEATURES') or '').split())
-
- any_of_machine_features = set((d.getVar('ANY_OF_MACHINE_FEATURES') or '').split())
- if any_of_machine_features:
- if set.isdisjoint(any_of_machine_features, machine_features):
- raise bb.parse.SkipRecipe("one of '%s' needs to be in MACHINE_FEATURES" % ' '.join(any_of_machine_features))
-
- required_machine_features = set((d.getVar('REQUIRED_MACHINE_FEATURES') or '').split())
- if required_machine_features:
- missing = set.difference(required_machine_features, machine_features)
- if missing:
- raise bb.parse.SkipRecipe("missing required machine feature%s '%s' (not in MACHINE_FEATURES)" % ('s' if len(missing) > 1 else '', ' '.join(missing)))
-
- conflict_machine_features = set((d.getVar('CONFLICT_MACHINE_FEATURES') or '').split())
- if conflict_machine_features:
- conflicts = set.intersection(conflict_machine_features, machine_features)
- if conflicts:
- raise bb.parse.SkipRecipe("conflicting machine feature%s '%s' (in MACHINE_FEATURES)" % ('s' if len(conflicts) > 1 else '', ' '.join(conflicts)))
-
- # Assume at least one var is set.
- combined_features = set((d.getVar('COMBINED_FEATURES') or '').split())
-
- any_of_combined_features = set((d.getVar('ANY_OF_COMBINED_FEATURES') or '').split())
- if any_of_combined_features:
- if set.isdisjoint(any_of_combined_features, combined_features):
- raise bb.parse.SkipRecipe("one of '%s' needs to be in COMBINED_FEATURES" % ' '.join(any_of_combined_features))
-
- required_combined_features = set((d.getVar('REQUIRED_COMBINED_FEATURES') or '').split())
- if required_combined_features:
- missing = set.difference(required_combined_features, combined_features)
- if missing:
- raise bb.parse.SkipRecipe("missing required machine feature%s '%s' (not in COMBINED_FEATURES)" % ('s' if len(missing) > 1 else '', ' '.join(missing)))
-
- conflict_combined_features = set((d.getVar('CONFLICT_COMBINED_FEATURES') or '').split())
- if conflict_combined_features:
- conflicts = set.intersection(conflict_combined_features, combined_features)
- if conflicts:
- raise bb.parse.SkipRecipe("conflicting machine feature%s '%s' (in COMBINED_FEATURES)" % ('s' if len(conflicts) > 1 else '', ' '.join(conflicts)))
+ unused = True
+
+ for kind in ['DISTRO', 'MACHINE', 'COMBINED']:
+ if d.getVar('ANY_OF_' + kind + '_FEATURES') is None and \
+ d.overridedata.get('ANY_OF_' + kind + '_FEATURES') is None and \
+ d.getVar('REQUIRED_' + kind + '_FEATURES') is None and \
+ d.overridedata.get('REQUIRED_' + kind + '_FEATURES') is None and \
+ d.getVar('CONFLICT_' + kind + '_FEATURES') is None and \
+ d.overridedata.get('CONFLICT_' + kind + '_FEATURES') is None:
+ continue
+
+ unused = False
+
+ # Assume at least one var is set.
+ features = set((d.getVar(kind + '_FEATURES') or '').split())
+
+ any_of_features = set((d.getVar('ANY_OF_' + kind + '_FEATURES') or '').split())
+ if any_of_features:
+ if set.isdisjoint(any_of_features, features):
+ raise bb.parse.SkipRecipe("one of '%s' needs to be in %s_FEATURES"
+ % (' '.join(any_of_features), kind))
+
+ required_features = set((d.getVar('REQUIRED_' + kind + '_FEATURES') or '').split())
+ if required_features:
+ missing = set.difference(required_features, features)
+ if missing:
+ raise bb.parse.SkipRecipe("missing required %s feature%s '%s' (not in %s_FEATURES)"
+ % (kind.lower(), 's' if len(missing) > 1 else '', ' '.join(missing), kind))
+
+ conflict_features = set((d.getVar('CONFLICT_' + kind + '_FEATURES') or '').split())
+ if conflict_features:
+ conflicts = set.intersection(conflict_features, features)
+ if conflicts:
+ raise bb.parse.SkipRecipe("conflicting %s feature%s '%s' (in %s_FEATURES)"
+ % (kind.lower(), 's' if len(conflicts) > 1 else '', ' '.join(conflicts), kind))
+
+ if unused:
+ bb.warn("Recipe inherits features_check but doesn't use it")
}
diff --git a/poky/meta/classes/insane.bbclass b/poky/meta/classes/insane.bbclass
index b7c613880..649aea1da 100644
--- a/poky/meta/classes/insane.bbclass
+++ b/poky/meta/classes/insane.bbclass
@@ -26,7 +26,7 @@ WARN_QA ?= " libdir xorg-driver-abi \
textrel incompatible-license files-invalid \
infodir build-deps src-uri-bad symlink-to-sysroot multilib \
invalid-packageconfig host-user-contaminated uppercase-pn patch-fuzz \
- mime mime-xdg unlisted-pkg-lics \
+ mime mime-xdg unlisted-pkg-lics unhandled-features-check \
"
ERROR_QA ?= "dev-so debug-deps dev-deps debug-files arch pkgconfig la \
perms dep-cmp pkgvarcheck perm-config perm-line perm-link \
@@ -980,6 +980,16 @@ def package_qa_check_src_uri(pn, d, messages):
if re.search(r"github\.com/.+/.+/archive/.+", url):
package_qa_handle_error("src-uri-bad", "%s: SRC_URI uses unstable GitHub archives" % pn, d)
+QARECIPETEST[unhandled-features-check] = "package_qa_check_unhandled_features_check"
+def package_qa_check_unhandled_features_check(pn, d, messages):
+ if not bb.data.inherits_class('features_check', d):
+ var_set = False
+ for kind in ['DISTRO', 'MACHINE', 'COMBINED']:
+ for var in ['ANY_OF_' + kind + '_FEATURES', 'REQUIRED_' + kind + '_FEATURES', 'CONFLICT_' + kind + '_FEATURES']:
+ if d.getVar(var) is not None or d.overridedata.get(var) is not None:
+ var_set = True
+ if var_set:
+ package_qa_handle_error("unhandled-features-check", "%s: recipe doesn't inherit features_check" % pn, d)
# The PACKAGE FUNC to scan each package
python do_package_qa () {