aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
index 88080e05eb..2433cdb6c7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.actions.RunfilesSupplier;
import com.google.devtools.build.lib.actions.extra.SpawnInfo;
+import com.google.devtools.build.lib.analysis.CommandHelper;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.PseudoAction;
import com.google.devtools.build.lib.analysis.RuleContext;
@@ -34,6 +35,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.skylarkinterface.Param;
import com.google.devtools.build.lib.skylarkinterface.ParamType;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -72,6 +74,8 @@ public class SkylarkActionFactory implements SkylarkValue {
private final SkylarkRuleContext context;
private final SkylarkSemanticsOptions skylarkSemanticsOptions;
private RuleContext ruleContext;
+ /** Counter for actions.run_shell helper scripts. Every script must have a unique name. */
+ private int runShellOutputCounter = 0;
public SkylarkActionFactory(
SkylarkRuleContext context,
@@ -573,7 +577,23 @@ public class SkylarkActionFactory implements SkylarkValue {
}
if (commandUnchecked instanceof String) {
- builder.setShellCommand((String) commandUnchecked);
+ Map<String, String> executionInfo =
+ ImmutableMap.copyOf(TargetUtils.getExecutionInfo(ruleContext.getRule()));
+ String helperScriptSuffix = String.format(".run_shell_%d.sh", runShellOutputCounter++);
+ String command = (String) commandUnchecked;
+ Artifact helperScript =
+ CommandHelper.shellCommandHelperScriptMaybe(
+ ruleContext, command, helperScriptSuffix, executionInfo);
+ if (helperScript == null) {
+ builder.setShellCommand(command);
+ } else {
+ builder.setShellCommand(helperScript.getExecPathString());
+ builder.addInput(helperScript);
+ FilesToRunProvider provider = context.getExecutableRunfiles(helperScript);
+ if (provider != null) {
+ builder.addTool(provider);
+ }
+ }
} else if (commandUnchecked instanceof SkylarkList) {
SkylarkList commandList = (SkylarkList) commandUnchecked;
if (commandList.size() < 3) {
@@ -601,18 +621,20 @@ public class SkylarkActionFactory implements SkylarkValue {
}
/**
- * Stup for spawn actions common between {@link #run} and {@link #runShell}.
+ * Setup for spawn actions common between {@link #run} and {@link #runShell}.
*
- * {@code builder} should have either executable or a command set.
+ * <p>{@code builder} should have either executable or a command set.
*/
private void registerSpawnAction(
SkylarkList outputs,
Object inputs,
Object mnemonicUnchecked,
Object progressMessage,
- Boolean useDefaultShellEnv, Object envUnchecked,
+ Boolean useDefaultShellEnv,
+ Object envUnchecked,
Object executionRequirementsUnchecked,
- Object inputManifestsUnchecked, SpawnAction.Builder builder)
+ Object inputManifestsUnchecked,
+ SpawnAction.Builder builder)
throws EvalException {
// TODO(bazel-team): builder still makes unnecessary copies of inputs, outputs and args.
Iterable<Artifact> inputArtifacts;