Blaze actions: add support for dependency pruning.
This adds the parameter "unused_inputs_list" to Skylark "actions.run" method.
This parameter take a file that contains a list of files that were present in the inputs but were not used.
This allows the action to not check for changes in those inputs.
RELNOTES:
PiperOrigin-RevId: 250275882
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index bdd8af9..2f3c401 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -132,6 +132,7 @@
+ rand.nextDouble(),
"--experimental_platforms_api=" + rand.nextBoolean(),
"--experimental_starlark_config_transitions=" + rand.nextBoolean(),
+ "--experimental_starlark_unused_inputs_list=" + rand.nextBoolean(),
"--incompatible_bzl_disallow_load_after_statement=" + rand.nextBoolean(),
"--incompatible_depset_for_libraries_to_link_getter=" + rand.nextBoolean(),
"--incompatible_depset_is_not_iterable=" + rand.nextBoolean(),
@@ -184,6 +185,7 @@
ImmutableList.of(String.valueOf(rand.nextDouble()), String.valueOf(rand.nextDouble())))
.experimentalPlatformsApi(rand.nextBoolean())
.experimentalStarlarkConfigTransitions(rand.nextBoolean())
+ .experimentalStarlarkUnusedInputsList(rand.nextBoolean())
.incompatibleBzlDisallowLoadAfterStatement(rand.nextBoolean())
.incompatibleDepsetForLibrariesToLinkGetter(rand.nextBoolean())
.incompatibleDepsetIsNotIterable(rand.nextBoolean())
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/BUILD b/src/test/java/com/google/devtools/build/lib/skylark/BUILD
index 6f3d861..399d0c4 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skylark/BUILD
@@ -86,6 +86,7 @@
"//third_party:jsr305",
"//third_party:junit4",
"//third_party:truth",
+ "//third_party:truth8",
],
)
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index 7e2428b..907f941 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -16,6 +16,7 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.Truth8.assertThat;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
@@ -31,7 +32,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
-import com.google.devtools.build.lib.analysis.actions.SpawnAction;
+import com.google.devtools.build.lib.analysis.actions.StarlarkAction;
import com.google.devtools.build.lib.analysis.configuredtargets.FileConfiguredTarget;
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
import com.google.devtools.build.lib.analysis.util.MockRule;
@@ -679,19 +680,57 @@
SkylarkRuleContext ruleContext = createRuleContext("//foo:androidlib");
evalRuleContextCode(
ruleContext,
- "ruleContext.actions.run(\n"
- + " inputs = ruleContext.files.srcs,\n"
- + " outputs = ruleContext.files.srcs,\n"
- + " arguments = ['--a','--b'],\n"
- + " executable = ruleContext.executable._idlclass)\n");
- SpawnAction action =
- (SpawnAction)
+ "ruleContext.actions.run(",
+ " inputs = ruleContext.files.srcs,",
+ " outputs = ruleContext.files.srcs,",
+ " arguments = ['--a','--b'],",
+ " executable = ruleContext.executable._idlclass)");
+ StarlarkAction action =
+ (StarlarkAction)
Iterables.getOnlyElement(
ruleContext.getRuleContext().getAnalysisEnvironment().getRegisteredActions());
assertThat(action.getCommandFilename()).matches("^.*/IdlClass(\\.exe){0,1}$");
}
@Test
+ public void testCreateStarlarkActionArgumentsWithUnusedInputsList() throws Exception {
+ setSkylarkSemanticsOptions("--experimental_starlark_unused_inputs_list=True");
+ SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
+ evalRuleContextCode(
+ ruleContext,
+ "ruleContext.actions.run(",
+ " inputs = ruleContext.files.srcs,",
+ " outputs = ruleContext.files.srcs,",
+ " executable = 'executable',",
+ " unused_inputs_list = ruleContext.files.srcs[0])");
+ StarlarkAction action =
+ (StarlarkAction)
+ Iterables.getOnlyElement(
+ ruleContext.getRuleContext().getAnalysisEnvironment().getRegisteredActions());
+ assertThat(action.getUnusedInputsList()).isPresent();
+ assertThat(action.getUnusedInputsList().get().getFilename()).isEqualTo("a.txt");
+ assertThat(action.discoversInputs()).isTrue();
+ }
+
+ @Test
+ public void testCreateStarlarkActionArgumentsWithoutUnusedInputsList() throws Exception {
+ SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
+ evalRuleContextCode(
+ ruleContext,
+ "ruleContext.actions.run(",
+ " inputs = ruleContext.files.srcs,",
+ " outputs = ruleContext.files.srcs,",
+ " executable = 'executable',",
+ " unused_inputs_list = None)");
+ StarlarkAction action =
+ (StarlarkAction)
+ Iterables.getOnlyElement(
+ ruleContext.getRuleContext().getAnalysisEnvironment().getRegisteredActions());
+ assertThat(action.getUnusedInputsList()).isEmpty();
+ assertThat(action.discoversInputs()).isFalse();
+ }
+
+ @Test
public void testOutputs() throws Exception {
SkylarkRuleContext ruleContext = createRuleContext("//foo:bar");
Iterable<?> result = (Iterable<?>) evalRuleContextCode(ruleContext, "ruleContext.outputs.outs");