aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2018-04-16 13:43:00 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-16 13:44:19 -0700
commit646f281496b9c46714f15813c32d2ca846ceb322 (patch)
tree5f115ee972721cee8cef6ebb64b7291e81fe2a38 /src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
parent559ffb7dd6578c961e775ba4901917ab8bffcb9d (diff)
Introduce tools attribute to ctx.actions.run and friends.
This will allow us to stop iterating all inputs in an expensive manner looking for tools so we can add their runfiles. If users specify the 'tools' attribute, it is assumed they know what they are doing and inputs will no longer be scanned for tools. RELNOTES: Introduce 'tools' attribute to ctx.actions.run. PiperOrigin-RevId: 193092258
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.java94
1 files changed, 80 insertions, 14 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 bc430f9340..691a1e23a9 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
@@ -306,7 +306,7 @@ public class SkylarkActionFactory implements SkylarkValue {
defaultValue = "[]",
named = true,
positional = false,
- doc = "List of the input files of the action."
+ doc = "List or depset of the input files of the action."
),
@Param(
name = "executable",
@@ -320,6 +320,21 @@ public class SkylarkActionFactory implements SkylarkValue {
doc = "The executable file to be called by the action."
),
@Param(
+ name = "tools",
+ allowedTypes = {
+ @ParamType(type = SkylarkList.class),
+ @ParamType(type = SkylarkNestedSet.class),
+ },
+ generic1 = Artifact.class,
+ defaultValue = "None",
+ named = true,
+ positional = false,
+ noneable = true,
+ doc =
+ "List or depset of any tools needed by the action. Tools are inputs with additional "
+ + "runfiles that are automatically made available to the action."
+ ),
+ @Param(
name = "arguments",
type = Object.class,
allowedTypes = {
@@ -396,19 +411,22 @@ public class SkylarkActionFactory implements SkylarkValue {
"(Experimental) sets the input runfiles metadata; "
+ "they are typically generated by resolve_command."
)
- }
+ },
+ useLocation = true
)
public void run(
SkylarkList outputs,
Object inputs,
Object executableUnchecked,
+ Object toolsUnchecked,
Object arguments,
Object mnemonicUnchecked,
Object progressMessage,
Boolean useDefaultShellEnv,
Object envUnchecked,
Object executionRequirementsUnchecked,
- Object inputManifestsUnchecked)
+ Object inputManifestsUnchecked,
+ Location location)
throws EvalException {
context.checkMutable("actions.run");
SpawnAction.Builder builder = new SpawnAction.Builder();
@@ -434,8 +452,18 @@ public class SkylarkActionFactory implements SkylarkValue {
+ EvalUtils.getDataTypeName(executableUnchecked)
+ " instead");
}
- registerSpawnAction(outputs, inputs, mnemonicUnchecked, progressMessage, useDefaultShellEnv,
- envUnchecked, executionRequirementsUnchecked, inputManifestsUnchecked, builder);
+ registerSpawnAction(
+ outputs,
+ inputs,
+ toolsUnchecked,
+ mnemonicUnchecked,
+ progressMessage,
+ useDefaultShellEnv,
+ envUnchecked,
+ executionRequirementsUnchecked,
+ inputManifestsUnchecked,
+ location,
+ builder);
}
/**
@@ -481,7 +509,22 @@ public class SkylarkActionFactory implements SkylarkValue {
defaultValue = "[]",
named = true,
positional = false,
- doc = "List of the input files of the action."
+ doc = "List or depset of the input files of the action."
+ ),
+ @Param(
+ name = "tools",
+ allowedTypes = {
+ @ParamType(type = SkylarkList.class),
+ @ParamType(type = SkylarkNestedSet.class),
+ },
+ generic1 = Artifact.class,
+ defaultValue = "None",
+ named = true,
+ positional = false,
+ noneable = true,
+ doc =
+ "List or depset of any tools needed by the action. Tools are inputs with additional "
+ + "runfiles that are automatically made available to the action."
),
@Param(
name = "arguments",
@@ -581,11 +624,13 @@ public class SkylarkActionFactory implements SkylarkValue {
"(Experimental) sets the input runfiles metadata; "
+ "they are typically generated by resolve_command."
)
- }
+ },
+ useLocation = true
)
public void runShell(
SkylarkList outputs,
Object inputs,
+ Object toolsUnchecked,
Object arguments,
Object mnemonicUnchecked,
Object commandUnchecked,
@@ -593,7 +638,8 @@ public class SkylarkActionFactory implements SkylarkValue {
Boolean useDefaultShellEnv,
Object envUnchecked,
Object executionRequirementsUnchecked,
- Object inputManifestsUnchecked)
+ Object inputManifestsUnchecked,
+ Location location)
throws EvalException {
context.checkMutable("actions.run_shell");
@@ -643,12 +689,14 @@ public class SkylarkActionFactory implements SkylarkValue {
registerSpawnAction(
outputs,
inputs,
+ toolsUnchecked,
mnemonicUnchecked,
progressMessage,
useDefaultShellEnv,
envUnchecked,
executionRequirementsUnchecked,
inputManifestsUnchecked,
+ location,
builder);
}
@@ -694,12 +742,14 @@ public class SkylarkActionFactory implements SkylarkValue {
private void registerSpawnAction(
SkylarkList outputs,
Object inputs,
+ Object toolsUnchecked,
Object mnemonicUnchecked,
Object progressMessage,
Boolean useDefaultShellEnv,
Object envUnchecked,
Object executionRequirementsUnchecked,
Object inputManifestsUnchecked,
+ Location location,
SpawnAction.Builder builder)
throws EvalException {
Iterable<Artifact> inputArtifacts;
@@ -713,12 +763,28 @@ public class SkylarkActionFactory implements SkylarkValue {
}
builder.addOutputs(outputs.getContents(Artifact.class, "outputs"));
- // The actual command can refer to an executable from the inputs, which could require
- // some runfiles. Consequently, we add the runfiles of all inputs of this action manually.
- for (Artifact current : inputArtifacts) {
- FilesToRunProvider provider = context.getExecutableRunfiles(current);
- if (provider != null) {
- builder.addTool(provider);
+ if (toolsUnchecked != Runtime.NONE) {
+ final Iterable<Artifact> toolsIterable;
+ if (toolsUnchecked instanceof SkylarkList) {
+ toolsIterable = ((SkylarkList) toolsUnchecked).getContents(Artifact.class, "tools");
+ } else {
+ toolsIterable = ((SkylarkNestedSet) toolsUnchecked).getSet(Artifact.class);
+ }
+ for (Artifact artifact : toolsIterable) {
+ builder.addInput(artifact);
+ FilesToRunProvider provider = context.getExecutableRunfiles(artifact);
+ if (provider != null) {
+ builder.addTool(provider);
+ }
+ }
+ } else {
+ // Users didn't pass 'tools', kick in compatibility modes
+ // Full legacy support -- add tools from inputs
+ for (Artifact artifact : inputArtifacts) {
+ FilesToRunProvider provider = context.getExecutableRunfiles(artifact);
+ if (provider != null) {
+ builder.addTool(provider);
+ }
}
}