On 6/9/20 4:34 PM, Martin Jansa wrote:
Seeing how many cases like this exist(ed), this look very useful, but it would be even better if we can catch the opposite case when e.g. REQUIRED_DISTRO_FEATURES are set in recipe, but doesn't do anything because of missing features_check inherit.
Yes, that would be a good test for insane.
But I understand that such check might be more controversial as it would need to be checked globally (outside this bbclass), maybe something in insane.bbclass catching both cases as QA issue?
I didn't want to add this check to insane since I like that you only pay for the check if you actually use the class.
Not sure if that is worth pushing for, but I think I recall someone saying that a large part of the parsing time is spent running the anonyous python(?).
Jacob
On Tue, Jun 9, 2020 at 4:11 PM Jacob Kroon <[email protected] <mailto:[email protected]>> wrote:Signed-off-by: Jacob Kroon <[email protected] <mailto:[email protected]>> --- meta/classes/features_check.bbclass | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/meta/classes/features_check.bbclass b/meta/classes/features_check.bbclass index 4ba827d4ab..31ce600374 100644 --- a/meta/classes/features_check.bbclass +++ b/meta/classes/features_check.bbclass @@ -12,11 +12,25 @@ # Copyright 2019 (C) Texas Instruments Inc. # Copyright 2013 (C) O.S. Systems Software LTDA. +FEATURES_CHECK_INCLUDE_STACK := "${BBINCLUDESTACK}" + python () { if d.getVar('PARSE_ALL_RECIPES', False): return + 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()) @@ -39,4 +53,10 @@ python () { 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)) + + # Only warn if inherited directly in a .bb-file; if the class is inherited + # via an .inc/.bbclass it could be a false positive + inherited_from_bb = d.getVar('FEATURES_CHECK_INCLUDE_STACK').split()[-1].endswith('.bb') + if unused and inherited_from_bb: + bb.warn("Recipe inherits features_check but doesn't use it") }
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#139374): https://lists.openembedded.org/g/openembedded-core/message/139374 Mute This Topic: https://lists.openembedded.org/mt/74774873/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
