aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ConfigRuleClasses.java31
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] -->