Skip to content

Commit c64fa6d

Browse files
tjgqcopybara-github
authored andcommitted
Use the execution platform to determine which genrule.cmd* to run.
Currently the host platform is used, which fails when using a Windows remote executor from a non-Windows host. Also change GenRuleWindowsConfiguredTargetTest to run on every host platform. Fixes #18584. Closes #18590. PiperOrigin-RevId: 538174757 Change-Id: I305caa706ce8dd0b9a2bee6eb9addcb2ff519f70
1 parent 5a89879 commit c64fa6d

File tree

8 files changed

+78
-58
lines changed

8 files changed

+78
-58
lines changed

src/main/java/com/google/devtools/build/lib/analysis/BUILD

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2181,6 +2181,12 @@ java_library(
21812181
java_library(
21822182
name = "constraints/constraint_constants",
21832183
srcs = ["constraints/ConstraintConstants.java"],
2184+
deps = [
2185+
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
2186+
"//src/main/java/com/google/devtools/build/lib/cmdline",
2187+
"//src/main/java/com/google/devtools/build/lib/util:os",
2188+
"//third_party:guava",
2189+
],
21842190
)
21852191

21862192
java_library(

src/main/java/com/google/devtools/build/lib/analysis/ShToolchain.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
package com.google.devtools.build.lib.analysis;
1616

17+
import static com.google.devtools.build.lib.analysis.constraints.ConstraintConstants.OS_TO_CONSTRAINTS;
18+
1719
import com.google.common.base.Preconditions;
1820
import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
1921
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
@@ -63,9 +65,7 @@ public static PathFragment getPathForPlatform(
6365

6466
if (platformInfo != null) {
6567
for (OS os : ShellConfiguration.getShellExecutables().keySet()) {
66-
if (platformInfo
67-
.constraints()
68-
.hasConstraintValue(ShellConfiguration.OS_TO_CONSTRAINTS.get(os))) {
68+
if (platformInfo.constraints().hasConstraintValue(OS_TO_CONSTRAINTS.get(os))) {
6969
return ShellConfiguration.getShellExecutables().get(os);
7070
}
7171
}

src/main/java/com/google/devtools/build/lib/analysis/ShellConfiguration.java

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,10 @@
1313
// limitations under the License.
1414
package com.google.devtools.build.lib.analysis;
1515

16-
import com.google.common.collect.ImmutableMap;
1716
import com.google.devtools.build.lib.analysis.config.BuildOptions;
1817
import com.google.devtools.build.lib.analysis.config.Fragment;
1918
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
2019
import com.google.devtools.build.lib.analysis.config.RequiresOptions;
21-
import com.google.devtools.build.lib.analysis.platform.ConstraintSettingInfo;
22-
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
23-
import com.google.devtools.build.lib.cmdline.Label;
2420
import com.google.devtools.build.lib.util.OS;
2521
import com.google.devtools.build.lib.util.OptionsUtils.PathFragmentConverter;
2622
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -37,10 +33,6 @@ public class ShellConfiguration extends Fragment {
3733

3834
private static Map<OS, PathFragment> shellExecutables;
3935

40-
private static final ConstraintSettingInfo OS_CONSTRAINT_SETTING =
41-
ConstraintSettingInfo.create(
42-
Label.parseCanonicalUnchecked("@platforms//os:os"));
43-
4436
private static Function<Options, PathFragment> optionsBasedDefault;
4537

4638
/**
@@ -65,35 +57,6 @@ public static void injectShellExecutableFinder(Map<OS, PathFragment> osToShellMa
6557
optionsBasedDefault = (options) -> null;
6658
shellExecutables = osToShellMap;
6759
}
68-
// Standard mapping between OS and the corresponding platform constraints.
69-
static final ImmutableMap<OS, ConstraintValueInfo> OS_TO_CONSTRAINTS =
70-
ImmutableMap.<OS, ConstraintValueInfo>builder()
71-
.put(
72-
OS.DARWIN,
73-
ConstraintValueInfo.create(
74-
OS_CONSTRAINT_SETTING,
75-
Label.parseCanonicalUnchecked("@platforms//os:osx")))
76-
.put(
77-
OS.WINDOWS,
78-
ConstraintValueInfo.create(
79-
OS_CONSTRAINT_SETTING,
80-
Label.parseCanonicalUnchecked("@platforms//os:windows")))
81-
.put(
82-
OS.FREEBSD,
83-
ConstraintValueInfo.create(
84-
OS_CONSTRAINT_SETTING,
85-
Label.parseCanonicalUnchecked("@platforms//os:freebsd")))
86-
.put(
87-
OS.OPENBSD,
88-
ConstraintValueInfo.create(
89-
OS_CONSTRAINT_SETTING,
90-
Label.parseCanonicalUnchecked("@platforms//os:openbsd")))
91-
.put(
92-
OS.UNKNOWN,
93-
ConstraintValueInfo.create(
94-
OS_CONSTRAINT_SETTING,
95-
Label.parseCanonicalUnchecked("@platforms//os:none")))
96-
.buildOrThrow();
9760

9861
private final boolean useShBinaryStubScript;
9962

src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintConstants.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,51 @@
1313
// limitations under the License.
1414
package com.google.devtools.build.lib.analysis.constraints;
1515

16+
import com.google.common.collect.ImmutableMap;
17+
import com.google.devtools.build.lib.analysis.platform.ConstraintSettingInfo;
18+
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
19+
import com.google.devtools.build.lib.cmdline.Label;
20+
import com.google.devtools.build.lib.util.OS;
21+
1622
/** Constants needed for use of the constraints system. */
1723
public final class ConstraintConstants {
1824

1925
public static final String ENVIRONMENT_RULE = "environment";
2026

27+
private static final ConstraintSettingInfo OS_CONSTRAINT_SETTING =
28+
ConstraintSettingInfo.create(
29+
Label.parseCanonicalUnchecked("@platforms//os:os"));
30+
31+
// Standard mapping between OS and the corresponding platform constraints.
32+
public static final ImmutableMap<OS, ConstraintValueInfo> OS_TO_CONSTRAINTS =
33+
ImmutableMap.<OS, ConstraintValueInfo>builder()
34+
.put(
35+
OS.DARWIN,
36+
ConstraintValueInfo.create(
37+
OS_CONSTRAINT_SETTING,
38+
Label.parseCanonicalUnchecked("@platforms//os:osx")))
39+
.put(
40+
OS.WINDOWS,
41+
ConstraintValueInfo.create(
42+
OS_CONSTRAINT_SETTING,
43+
Label.parseCanonicalUnchecked("@platforms//os:windows")))
44+
.put(
45+
OS.FREEBSD,
46+
ConstraintValueInfo.create(
47+
OS_CONSTRAINT_SETTING,
48+
Label.parseCanonicalUnchecked("@platforms//os:freebsd")))
49+
.put(
50+
OS.OPENBSD,
51+
ConstraintValueInfo.create(
52+
OS_CONSTRAINT_SETTING,
53+
Label.parseCanonicalUnchecked("@platforms//os:openbsd")))
54+
.put(
55+
OS.UNKNOWN,
56+
ConstraintValueInfo.create(
57+
OS_CONSTRAINT_SETTING,
58+
Label.parseCanonicalUnchecked("@platforms//os:none")))
59+
.buildOrThrow();
60+
2161
// No-op constructor to keep this from being instantiated.
2262
private ConstraintConstants() {}
2363
}

src/main/java/com/google/devtools/build/lib/rules/genrule/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ java_library(
2222
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
2323
"//src/main/java/com/google/devtools/build/lib/analysis:config/execution_transition_factory",
2424
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
25+
"//src/main/java/com/google/devtools/build/lib/analysis:constraints/constraint_constants",
2526
"//src/main/java/com/google/devtools/build/lib/analysis:file_provider",
2627
"//src/main/java/com/google/devtools/build/lib/analysis:make_variable_supplier",
2728
"//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package com.google.devtools.build.lib.rules.genrule;
1616

1717
import static com.google.common.collect.ImmutableMap.toImmutableMap;
18+
import static com.google.devtools.build.lib.analysis.constraints.ConstraintConstants.OS_TO_CONSTRAINTS;
1819

1920
import com.google.common.collect.ImmutableList;
2021
import com.google.common.collect.ImmutableMap;
@@ -94,8 +95,10 @@ enum CommandType {
9495
private static Pair<CommandType, String> determineCommandTypeAndAttribute(
9596
RuleContext ruleContext) {
9697
AttributeMap attributeMap = ruleContext.attributes();
97-
// TODO(pcloudy): This should match the execution platform instead of using OS.getCurrent()
98-
if (OS.getCurrent() == OS.WINDOWS) {
98+
if (ruleContext
99+
.getExecutionPlatform()
100+
.constraints()
101+
.hasConstraintValue(OS_TO_CONSTRAINTS.get(OS.WINDOWS))) {
99102
if (attributeMap.isAttributeValueExplicitlySpecified("cmd_ps")) {
100103
return Pair.of(CommandType.WINDOWS_POWERSHELL, "cmd_ps");
101104
}

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,7 @@ filegroup(
1515

1616
java_library(
1717
name = "GenruleTests_lib",
18-
srcs = glob(
19-
["*.java"],
20-
exclude = ["GenRuleWindowsConfiguredTargetTest.java"],
21-
) +
22-
# If we are on windows add back the test
23-
select({
24-
"//conditions:default": [],
25-
"//src/conditions:windows": ["GenRuleWindowsConfiguredTargetTest.java"],
26-
}),
18+
srcs = glob(["*.java"]),
2719
deps = [
2820
"//src/main/java/com/google/devtools/build/lib/actions",
2921
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",

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

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
package com.google.devtools.build.lib.bazel.rules.genrule;
1616

1717
import static com.google.common.truth.Truth.assertThat;
18+
import static org.junit.Assume.assumeTrue;
1819

1920
import com.google.devtools.build.lib.actions.Artifact;
20-
import com.google.devtools.build.lib.analysis.ShToolchain;
2121
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
2222
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
23-
import com.google.devtools.build.lib.util.OS;
2423
import java.util.regex.Matcher;
2524
import java.util.regex.Pattern;
25+
import org.junit.Before;
2626
import org.junit.Test;
2727
import org.junit.runner.RunWith;
2828
import org.junit.runners.JUnit4;
@@ -58,6 +58,20 @@ private static String getWindowsPath(Artifact artifact) {
5858
return artifact.getExecPathString().replace('/', '\\');
5959
}
6060

61+
@Before
62+
public void assumeBazel() throws Exception {
63+
// The cmd_{bash,bat,ps} attributes don't exist in Blaze.
64+
assumeTrue(analysisMock.isThisBazel());
65+
}
66+
67+
@Before
68+
public void createWindowsPlatform() throws Exception {
69+
scratch.file(
70+
"platforms/BUILD",
71+
"platform(name = 'windows', constraint_values = ['@platforms//os:windows'])");
72+
useConfiguration("--host_platform=//platforms:windows");
73+
}
74+
6175
@Test
6276
public void testCmdBatchIsPreferred() throws Exception {
6377
scratch.file(
@@ -163,8 +177,7 @@ public void testCmdBashIsPreferred() throws Exception {
163177
assertThat(shellAction.getOutputs()).containsExactly(messageArtifact);
164178

165179
String expected = "echo \"Hello, Bash cmd.\" >" + messageArtifact.getExecPathString();
166-
assertThat(shellAction.getArguments().get(0))
167-
.isEqualTo(ShToolchain.getPathForHost(targetConfig).getPathString());
180+
assertThat(shellAction.getArguments().get(0)).isEqualTo("c:/tools/msys64/usr/bin/bash.exe");
168181
assertThat(shellAction.getArguments().get(1)).isEqualTo("-c");
169182
assertBashCommandEquals(expected, shellAction.getArguments().get(2));
170183
}
@@ -181,9 +194,11 @@ public void testMissingCmdAttributeError() throws Exception {
181194

182195
@Test
183196
public void testMissingCmdAttributeErrorOnNonWindowsPlatform() throws Exception {
184-
if (OS.getCurrent() == OS.WINDOWS) {
185-
return;
186-
}
197+
scratch.overwriteFile(
198+
"platforms/BUILD",
199+
"platform(name = 'nonwindows', constraint_values = ['@platforms//os:linux'])");
200+
useConfiguration("--host_platform=//platforms:nonwindows");
201+
187202
checkError(
188203
"foo",
189204
"bar",

0 commit comments

Comments
 (0)