diff options
-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): %s""" % msg) +# Check flags associated with a tuning. +def check_toolchain_tune_args(data, tune, multilib, errs): + found_errors = False + if check_toolchain_args_present(data, tune, multilib, errs, 'CCARGS'): + found_errors = True + if check_toolchain_args_present(data, tune, multilib, errs, 'ASARGS'): + found_errors = True + if check_toolchain_args_present(data, tune, multilib, errs, 'LDARGS'): + found_errors = True + + return found_errors + +def check_toolchain_args_present(data, tune, multilib, tune_errors, which): + args_set = (data.getVar("TUNE_%s" % which, True) or "").split() + args_wanted = (data.getVar("TUNEABI_REQUIRED_%s_tune-%s" % (which, tune), True) or "").split() + args_missing = [] + + # If no args are listed/required, we are done. + if not args_wanted: + return + for arg in args_wanted: + if arg not in args_set: + args_missing.append(arg) + + found_errors = False + if args_missing: + found_errors = True + tune_errors.append("TUNEABI for %s requires '%s' in TUNE_%s (%s)." % + (tune, ' '.join(args_missing), which, ' '.join(args_set))) + return found_errors + # Check a single tune for validity. def check_toolchain_tune(data, tune, multilib): tune_errors = [] if not tune: return "No tuning found for %s multilib." % multilib + localdata = bb.data.createCopy(data) + if multilib != "default": + # Apply the overrides so we can look at the details. + overrides = localdata.getVar("OVERRIDES", False) + ":virtclass-multilib-" + multilib + localdata.setVar("OVERRIDES", overrides) + bb.data.update_data(localdata) bb.debug(2, "Sanity-checking tuning '%s' (%s) features:" % (tune, multilib)) - features = (data.getVar("TUNE_FEATURES_tune-%s" % tune, True) or "").split() + features = (localdata.getVar("TUNE_FEATURES_tune-%s" % tune, True) or "").split() if not features: return "Tuning '%s' has no defined features, and cannot be used." % tune - valid_tunes = data.getVarFlags('TUNEVALID') or {} - conflicts = data.getVarFlags('TUNECONFLICTS') or {} + valid_tunes = localdata.getVarFlags('TUNEVALID') or {} + conflicts = localdata.getVarFlags('TUNECONFLICTS') or {} # [doc] is the documentation for the variable, not a real feature if 'doc' in valid_tunes: del valid_tunes['doc'] @@ -113,15 +150,18 @@ def check_toolchain_tune(data, tune, multilib): bb.debug(2, " %s: %s" % (feature, valid_tunes[feature])) else: tune_errors.append("Feature '%s' is not defined." % feature) - whitelist = data.getVar("TUNEABI_WHITELIST", True) or '' - override = data.getVar("TUNEABI_OVERRIDE", True) or '' + whitelist = localdata.getVar("TUNEABI_WHITELIST", True) or '' + override = localdata.getVar("TUNEABI_OVERRIDE", True) or '' if whitelist: - tuneabi = data.getVar("TUNEABI_tune-%s" % tune, True) or '' + tuneabi = localdata.getVar("TUNEABI_tune-%s" % tune, True) or '' if not tuneabi: tuneabi = tune if True not in [x in whitelist.split() for x in tuneabi.split()]: tune_errors.append("Tuning '%s' (%s) cannot be used with any supported tuning/ABI." % (tune, tuneabi)) + else: + if not check_toolchain_tune_args(localdata, tuneabi, multilib, tune_errors): + bb.debug(2, "Sanity check: Compiler args OK for %s." % tune) if tune_errors: return "Tuning '%s' has the following errors:\n" % tune + '\n'.join(tune_errors) |