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");