Skip to content

Commit cc335fd

Browse files
googlewaltcopybara-github
authored andcommitted
Add support for expand_if_available for env_entry
PiperOrigin-RevId: 548694860 Change-Id: Iea82f7eed2727d08057bae98d597cbeaae8c3f28
1 parent 4714cd7 commit cc335fd

File tree

5 files changed

+91
-3
lines changed

5 files changed

+91
-3
lines changed

src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1527,8 +1527,13 @@ static EnvEntry envEntryFromStarlark(StarlarkInfo envEntryStruct) throws EvalExc
15271527
if (value == null || value.isEmpty()) {
15281528
throw infoError(envEntryStruct, "'value' parameter of env_entry must be a nonempty string.");
15291529
}
1530+
String expandIfAvailable =
1531+
getOptionalFieldFromStarlarkProvider(envEntryStruct, "expand_if_available", String.class);
15301532
StringValueParser parser = new StringValueParser(value);
1531-
return new EnvEntry(key, parser.getChunks());
1533+
return new EnvEntry(
1534+
key,
1535+
parser.getChunks(),
1536+
expandIfAvailable == null ? ImmutableSet.of() : ImmutableSet.of(expandIfAvailable));
15321537
}
15331538

15341539
/** Creates a {@link WithFeatureSet} from a {@link StarlarkInfo}. */

src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,16 +203,22 @@ public int hashCode() {
203203
public static class EnvEntry {
204204
private final String key;
205205
private final ImmutableList<StringChunk> valueChunks;
206+
private final ImmutableSet<String> expandIfAllAvailable;
206207

207208
private EnvEntry(CToolchain.EnvEntry envEntry) throws EvalException {
208209
this.key = envEntry.getKey();
209210
StringValueParser parser = new StringValueParser(envEntry.getValue());
210211
this.valueChunks = parser.getChunks();
212+
this.expandIfAllAvailable = ImmutableSet.copyOf(envEntry.getExpandIfAllAvailableList());
211213
}
212214

213-
EnvEntry(String key, ImmutableList<StringChunk> valueChunks) {
215+
EnvEntry(
216+
String key,
217+
ImmutableList<StringChunk> valueChunks,
218+
ImmutableSet<String> expandIfAllAvailable) {
214219
this.key = key;
215220
this.valueChunks = valueChunks;
221+
this.expandIfAllAvailable = expandIfAllAvailable;
216222
}
217223

218224
String getKey() {
@@ -227,13 +233,29 @@ String getValue() {
227233
.collect(ImmutableList.toImmutableList()));
228234
}
229235

236+
ImmutableSet<String> getExpandIfAllAvailable() {
237+
return expandIfAllAvailable;
238+
}
239+
240+
private boolean canBeExpanded(CcToolchainVariables variables) {
241+
for (String variable : expandIfAllAvailable) {
242+
if (!variables.isAvailable(variable)) {
243+
return false;
244+
}
245+
}
246+
return true;
247+
}
248+
230249
/**
231250
* Adds the key/value pair this object represents to the given map of environment variables. The
232251
* value of the entry is expanded with the given {@code variables}.
233252
*/
234253
public void addEnvEntry(
235254
CcToolchainVariables variables, ImmutableMap.Builder<String, String> envBuilder)
236255
throws ExpansionException {
256+
if (!canBeExpanded(variables)) {
257+
return;
258+
}
237259
StringBuilder value = new StringBuilder();
238260
for (StringChunk chunk : valueChunks) {
239261
value.append(chunk.expand(variables));

src/main/protobuf/crosstool_config.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ message CToolchain {
114114
message EnvEntry {
115115
required string key = 1;
116116
required string value = 2;
117+
repeated string expand_if_all_available = 3;
117118
}
118119

119120
// A set of features; used to support logical 'and' when specifying feature

src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,66 @@ public void testEnvVars() throws Exception {
300300
assertThat(env).doesNotContainEntry("doNotInclude", "doNotIncludePlease");
301301
}
302302

303+
@Test
304+
public void testEnvVarsWithMissingVariableIsNotExpanded() throws Exception {
305+
FeatureConfiguration configuration =
306+
CcToolchainTestHelper.buildFeatures(
307+
"feature {",
308+
" name: 'a'",
309+
" env_set {",
310+
" action: 'c++-compile'",
311+
" env_entry { key: 'foo', value: 'bar', expand_if_all_available: 'v' }",
312+
" }",
313+
"}")
314+
.getFeatureConfiguration(ImmutableSet.of("a"));
315+
316+
ImmutableMap<String, String> env =
317+
configuration.getEnvironmentVariables(CppActionNames.CPP_COMPILE, createVariables());
318+
319+
assertThat(env).doesNotContainEntry("foo", "bar");
320+
}
321+
322+
@Test
323+
public void testEnvVarsWithAllVariablesPresentAreExpanded() throws Exception {
324+
FeatureConfiguration configuration =
325+
CcToolchainTestHelper.buildFeatures(
326+
"feature {",
327+
" name: 'a'",
328+
" env_set {",
329+
" action: 'c++-compile'",
330+
" env_entry { key: 'foo', value: 'bar', expand_if_all_available: 'v' }",
331+
" }",
332+
"}")
333+
.getFeatureConfiguration(ImmutableSet.of("a"));
334+
335+
ImmutableMap<String, String> env =
336+
configuration.getEnvironmentVariables(
337+
CppActionNames.CPP_COMPILE, createVariables("v", "1"));
338+
339+
assertThat(env).containsExactly("foo", "bar").inOrder();
340+
}
341+
342+
@Test
343+
public void testEnvVarsWithAllVariablesPresentAreExpandedWithVariableExpansion()
344+
throws Exception {
345+
FeatureConfiguration configuration =
346+
CcToolchainTestHelper.buildFeatures(
347+
"feature {",
348+
" name: 'a'",
349+
" env_set {",
350+
" action: 'c++-compile'",
351+
" env_entry { key: 'foo', value: '%{v}', expand_if_all_available: 'v' }",
352+
" }",
353+
"}")
354+
.getFeatureConfiguration(ImmutableSet.of("a"));
355+
356+
ImmutableMap<String, String> env =
357+
configuration.getEnvironmentVariables(
358+
CppActionNames.CPP_COMPILE, createVariables("v", "1"));
359+
360+
assertThat(env).containsExactly("foo", "1").inOrder();
361+
}
362+
303363
private static String getExpansionOfFlag(String value) throws Exception {
304364
return getExpansionOfFlag(value, createVariables());
305365
}

src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1968,7 +1968,7 @@ public void testEnvEntry_string_string() throws Exception {
19681968
EnvEntry entry = CcModule.envEntryFromStarlark(entryProvider);
19691969
assertThat(entry).isNotNull();
19701970
StringValueParser parser = new StringValueParser("def");
1971-
assertThat(entry).isEqualTo(new EnvEntry("abc", parser.getChunks()));
1971+
assertThat(entry).isEqualTo(new EnvEntry("abc", parser.getChunks(), ImmutableSet.of()));
19721972
}
19731973

19741974
@Test

0 commit comments

Comments
 (0)