aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Greg Estren <gregce@google.com>2015-11-21 01:25:17 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2015-11-24 14:40:35 +0000
commit7f5834d41233830814f8748a6b126e74f297c013 (patch)
tree6d8a22bc90891cfe91903570d3d449d23b308022 /src
parent1c9c98ef5058a7abe95ef31d9011dd9a7d778993 (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')
-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] -->