diff options
Diffstat (limited to 'meta/classes/sanity.bbclass')
-rw-r--r-- | meta/classes/sanity.bbclass | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass index 1ad663a057..b5fab6a668 100644 --- a/meta/classes/sanity.bbclass +++ b/meta/classes/sanity.bbclass | |||
@@ -87,17 +87,54 @@ def raise_sanity_error(msg, d, network_error=False): | |||
87 | 87 | ||
88 | %s""" % msg) | 88 | %s""" % msg) |
89 | 89 | ||
90 | # Check flags associated with a tuning. | ||
91 | def check_toolchain_tune_args(data, tune, multilib, errs): | ||
92 | found_errors = False | ||
93 | if check_toolchain_args_present(data, tune, multilib, errs, 'CCARGS'): | ||
94 | found_errors = True | ||
95 | if check_toolchain_args_present(data, tune, multilib, errs, 'ASARGS'): | ||
96 | found_errors = True | ||
97 | if check_toolchain_args_present(data, tune, multilib, errs, 'LDARGS'): | ||
98 | found_errors = True | ||
99 | |||
100 | return found_errors | ||
101 | |||
102 | def check_toolchain_args_present(data, tune, multilib, tune_errors, which): | ||
103 | args_set = (data.getVar("TUNE_%s" % which, True) or "").split() | ||
104 | args_wanted = (data.getVar("TUNEABI_REQUIRED_%s_tune-%s" % (which, tune), True) or "").split() | ||
105 | args_missing = [] | ||
106 | |||
107 | # If no args are listed/required, we are done. | ||
108 | if not args_wanted: | ||
109 | return | ||
110 | for arg in args_wanted: | ||
111 | if arg not in args_set: | ||
112 | args_missing.append(arg) | ||
113 | |||
114 | found_errors = False | ||
115 | if args_missing: | ||
116 | found_errors = True | ||
117 | tune_errors.append("TUNEABI for %s requires '%s' in TUNE_%s (%s)." % | ||
118 | (tune, ' '.join(args_missing), which, ' '.join(args_set))) | ||
119 | return found_errors | ||
120 | |||
90 | # Check a single tune for validity. | 121 | # Check a single tune for validity. |
91 | def check_toolchain_tune(data, tune, multilib): | 122 | def check_toolchain_tune(data, tune, multilib): |
92 | tune_errors = [] | 123 | tune_errors = [] |
93 | if not tune: | 124 | if not tune: |
94 | return "No tuning found for %s multilib." % multilib | 125 | return "No tuning found for %s multilib." % multilib |
126 | localdata = bb.data.createCopy(data) | ||
127 | if multilib != "default": | ||
128 | # Apply the overrides so we can look at the details. | ||
129 | overrides = localdata.getVar("OVERRIDES", False) + ":virtclass-multilib-" + multilib | ||
130 | localdata.setVar("OVERRIDES", overrides) | ||
131 | bb.data.update_data(localdata) | ||
95 | bb.debug(2, "Sanity-checking tuning '%s' (%s) features:" % (tune, multilib)) | 132 | bb.debug(2, "Sanity-checking tuning '%s' (%s) features:" % (tune, multilib)) |
96 | features = (data.getVar("TUNE_FEATURES_tune-%s" % tune, True) or "").split() | 133 | features = (localdata.getVar("TUNE_FEATURES_tune-%s" % tune, True) or "").split() |
97 | if not features: | 134 | if not features: |
98 | return "Tuning '%s' has no defined features, and cannot be used." % tune | 135 | return "Tuning '%s' has no defined features, and cannot be used." % tune |
99 | valid_tunes = data.getVarFlags('TUNEVALID') or {} | 136 | valid_tunes = localdata.getVarFlags('TUNEVALID') or {} |
100 | conflicts = data.getVarFlags('TUNECONFLICTS') or {} | 137 | conflicts = localdata.getVarFlags('TUNECONFLICTS') or {} |
101 | # [doc] is the documentation for the variable, not a real feature | 138 | # [doc] is the documentation for the variable, not a real feature |
102 | if 'doc' in valid_tunes: | 139 | if 'doc' in valid_tunes: |
103 | del valid_tunes['doc'] | 140 | del valid_tunes['doc'] |
@@ -113,15 +150,18 @@ def check_toolchain_tune(data, tune, multilib): | |||
113 | bb.debug(2, " %s: %s" % (feature, valid_tunes[feature])) | 150 | bb.debug(2, " %s: %s" % (feature, valid_tunes[feature])) |
114 | else: | 151 | else: |
115 | tune_errors.append("Feature '%s' is not defined." % feature) | 152 | tune_errors.append("Feature '%s' is not defined." % feature) |
116 | whitelist = data.getVar("TUNEABI_WHITELIST", True) or '' | 153 | whitelist = localdata.getVar("TUNEABI_WHITELIST", True) or '' |
117 | override = data.getVar("TUNEABI_OVERRIDE", True) or '' | 154 | override = localdata.getVar("TUNEABI_OVERRIDE", True) or '' |
118 | if whitelist: | 155 | if whitelist: |
119 | tuneabi = data.getVar("TUNEABI_tune-%s" % tune, True) or '' | 156 | tuneabi = localdata.getVar("TUNEABI_tune-%s" % tune, True) or '' |
120 | if not tuneabi: | 157 | if not tuneabi: |
121 | tuneabi = tune | 158 | tuneabi = tune |
122 | if True not in [x in whitelist.split() for x in tuneabi.split()]: | 159 | if True not in [x in whitelist.split() for x in tuneabi.split()]: |
123 | tune_errors.append("Tuning '%s' (%s) cannot be used with any supported tuning/ABI." % | 160 | tune_errors.append("Tuning '%s' (%s) cannot be used with any supported tuning/ABI." % |
124 | (tune, tuneabi)) | 161 | (tune, tuneabi)) |
162 | else: | ||
163 | if not check_toolchain_tune_args(localdata, tuneabi, multilib, tune_errors): | ||
164 | bb.debug(2, "Sanity check: Compiler args OK for %s." % tune) | ||
125 | if tune_errors: | 165 | if tune_errors: |
126 | return "Tuning '%s' has the following errors:\n" % tune + '\n'.join(tune_errors) | 166 | return "Tuning '%s' has the following errors:\n" % tune + '\n'.join(tune_errors) |
127 | 167 | ||