Skip to content

Commit efb3b59

Browse files
calpeyserCopybara-Service
authored and
Copybara-Service
committed
Genrules do not override c++ toolchain Make variables using the toolchains attribute.
This fixes an issue where CC_FLAGS was being overwritten. PiperOrigin-RevId: 181463694
1 parent b247935 commit efb3b59

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java

+22-8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
package com.google.devtools.build.lib.rules.genrule;
1616

17+
import com.google.common.base.Joiner;
1718
import com.google.common.collect.ImmutableList;
1819
import com.google.common.collect.ImmutableMap;
1920
import com.google.common.collect.Iterables;
@@ -56,13 +57,22 @@
5657
*/
5758
public abstract class GenRuleBase implements RuleConfiguredTargetFactory {
5859

59-
private static final Pattern CROSSTOOL_MAKE_VARIABLE =
60-
Pattern.compile("\\$\\((CC|CC_FLAGS|AR|NM|OBJCOPY|STRIP|GCOVTOOL)\\)");
61-
private static final Pattern JDK_MAKE_VARIABLE =
62-
Pattern.compile("\\$\\((JAVABASE|JAVA)\\)");
60+
private static final ImmutableList<String> CROSSTOOL_MAKE_VARIABLES = ImmutableList.of("CC",
61+
"CC_FLAGS", "AR", "NM", "OBJCOPY", "STRIP", "GCOVTOOL");
62+
63+
private static final ImmutableList<String> JDK_MAKE_VARIABLES = ImmutableList.of("JAVABASE",
64+
"JAVA");
65+
66+
private static Pattern matchesMakeVariables(Iterable<String> variables) {
67+
return Pattern.compile("\\$\\((" + Joiner.on("|").join(variables) + ")\\)");
68+
}
69+
70+
private static final Pattern CROSSTOOL_MAKE_VARIABLE_PATTERN =
71+
matchesMakeVariables(CROSSTOOL_MAKE_VARIABLES);
72+
private static final Pattern JDK_MAKE_VARIABLE = matchesMakeVariables(JDK_MAKE_VARIABLES);
6373

6474
protected static boolean requiresCrosstool(String command) {
65-
return CROSSTOOL_MAKE_VARIABLE.matcher(command).find();
75+
return CROSSTOOL_MAKE_VARIABLE_PATTERN.matcher(command).find();
6676
}
6777

6878
protected boolean requiresJdk(String command) {
@@ -341,9 +351,13 @@ public String lookupVariable(String variableName) throws ExpansionException {
341351
}
342352
}
343353

344-
String valueFromToolchains = resolveVariableFromToolchains(variableName);
345-
if (valueFromToolchains != null) {
346-
return valueFromToolchains;
354+
// Make variables provided by the :cc_toolchain attributes should not be overridden by
355+
// those provided by the toolchains attribute.
356+
if (!CROSSTOOL_MAKE_VARIABLES.contains(variableName)) {
357+
String valueFromToolchains = resolveVariableFromToolchains(variableName);
358+
if (valueFromToolchains != null) {
359+
return valueFromToolchains;
360+
}
347361
}
348362

349363
return super.lookupVariable(variableName);

src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleConfiguredTargetTest.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -104,23 +104,23 @@ protected ConfiguredRuleClassProvider getRuleClassProvider() {
104104
}
105105

106106
@Test
107-
public void testToolchainMakeVariableExpansion() throws Exception {
107+
public void testToolchainOverridesJavabase() throws Exception {
108108
scratch.file("a/BUILD",
109-
"genrule(name='gr', srcs=[], outs=['out'], cmd='$(FOO)', toolchains=[':v'])",
110-
"make_variable_tester(name='v', variables={'FOO': 'FOOBAR'})");
109+
"genrule(name='gr', srcs=[], outs=['out'], cmd='JAVABASE=$(JAVABASE)', toolchains=[':v'])",
110+
"make_variable_tester(name='v', variables={'JAVABASE': 'REPLACED'})");
111111

112112
String cmd = getCommand("//a:gr");
113-
assertThat(cmd).endsWith("FOOBAR");
113+
assertThat(cmd).endsWith("JAVABASE=REPLACED");
114114
}
115115

116116
@Test
117-
public void testToolchainOverridesConfiguration() throws Exception {
117+
public void testToolchainDoesNotOverrideCcFlags() throws Exception {
118118
scratch.file("a/BUILD",
119-
"genrule(name='gr', srcs=[], outs=['out'], cmd='JAVABASE=$(JAVABASE)', toolchains=[':v'])",
120-
"make_variable_tester(name='v', variables={'JAVABASE': 'REPLACED'})");
119+
"genrule(name='gr', srcs=[], outs=['out'], cmd='CC_FLAGS=$(CC_FLAGS)', toolchains=[':v'])",
120+
"make_variable_tester(name='v', variables={'CC_FLAGS': 'REPLACED'})");
121121

122122
String cmd = getCommand("//a:gr");
123-
assertThat(cmd).endsWith("JAVABASE=REPLACED");
123+
assertThat(cmd).doesNotContain("CC_FLAGS=REPLACED");
124124
}
125125

126126
@Test

0 commit comments

Comments
 (0)