diff options
author | 2015-11-21 01:25:17 +0000 | |
---|---|---|
committer | 2015-11-24 14:40:35 +0000 | |
commit | 7f5834d41233830814f8748a6b126e74f297c013 (patch) | |
tree | 6d8a22bc90891cfe91903570d3d449d23b308022 /src/main/java/com/google/devtools/build/lib/analysis/config | |
parent | 1c9c98ef5058a7abe95ef31d9011dd9a7d778993 (diff) |
config_setting rules with 'values = {"cpu": "foo"}'
need the C++ fragment.
This option, specifically, requires special processing
because it's declared in BuildConfiguration.Options but
its "real" value is determined in CppConfiguration after
reading a CROSSTOOL.
--
MOS_MIGRATED_REVID=108394235
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/config')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/config/ConfigRuleClasses.java | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigRuleClasses.java index 3703fed081..8ad856f795 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigRuleClasses.java @@ -171,14 +171,37 @@ public class ConfigRuleClasses { ImmutableList.builder(); AttributeMap attributes = NonconfigurableAttributeMapper.of(rule); for (String optionName : attributes.get(SETTINGS_ATTRIBUTE, Type.STRING_DICT).keySet()) { - Class<? extends BuildConfiguration.Fragment> value = optionsToFragmentMap.get(optionName); - // Null values come directly from BuildConfiguration.Options, which is implicitly included. - if (value != null) { - builder.add(value); + if (optionName.equals("cpu")) { + // The "cpu" flag is special: it's defined in BuildConfiguration.Options but its value + // is set in CppConfiguration (which reads a CROSSTOOL to determine that value). + // So this requires a special mapping. + builder.add(getCppConfiguration(optionsToFragmentMap.values())); + } else { + Class<? extends BuildConfiguration.Fragment> value = optionsToFragmentMap.get(optionName); + // Null values come from BuildConfiguration.Options, which is implicitly included. + if (value != null) { + builder.add(value); + } } } return builder.build(); } + + /** + * We can't directly reference CppConfiguration.class because it's in a different Bazel library. + * While we could add that library as a dep, that would bring in a bunch of unnecessary C++ and + * crosstool code to what's otherwise a language-agnostic library. So we use a bit of + * introspection instead. + */ + private static Class<? extends BuildConfiguration.Fragment> getCppConfiguration( + Iterable<Class<? extends BuildConfiguration.Fragment>> configs) { + for (Class<? extends BuildConfiguration.Fragment> clazz : configs) { + if (clazz.getSimpleName().equals("CppConfiguration")) { + return clazz; + } + } + throw new IllegalStateException("Couldn't find the C++ fragment"); + } } /*<!-- #BLAZE_RULE (NAME = config_setting, TYPE = OTHER, FAMILY = General)[GENERIC_RULE] --> |