diff options
Diffstat (limited to 'src/main/java/com')
4 files changed, 66 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 a13b2818f0..bb39ec5ee2 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 @@ -13,7 +13,10 @@ // limitations under the License. package com.google.devtools.build.lib.analysis.skylark; +import static java.util.stream.Collectors.toList; + import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Action; @@ -392,11 +395,45 @@ public class SkylarkActionFactory implements SkylarkActionFactoryApi { } } 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); + if (skylarkSemantics.incompatibleNoSupportToolsInActionInputs()) { + // In this mode we error out if we find any tools among the inputs + List<Artifact> tools = null; + for (Artifact artifact : inputArtifacts) { + FilesToRunProvider provider = context.getExecutableRunfiles(artifact); + if (provider != null) { + tools = tools != null ? tools : new ArrayList<>(1); + tools.add(artifact); + } + } + if (tools != null) { + String toolsAsString = + Joiner.on(", ") + .join( + tools + .stream() + .map(Artifact::getExecPathString) + .map(s -> "'" + s + "'") + .collect(toList())); + throw new EvalException( + location, + String.format( + "Found tool(s) %s in inputs. " + + "A tool is an input with executable=True set. " + + "All tools should be passed using the 'tools' " + + "argument instead of 'inputs' in order to make their runfiles available " + + "to the action. This safety check will not be performed once the action " + + "is modified to take a 'tools' argument. " + + "To temporarily disable this check, " + + "set --incompatible_no_support_tools_in_action_inputs=false.", + toolsAsString)); + } + } else { + // Full legacy support -- add tools from inputs + for (Artifact artifact : inputArtifacts) { + FilesToRunProvider provider = context.getExecutableRunfiles(artifact); + if (provider != null) { + builder.addTool(provider); + } } } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java index 28b3c6747a..758eb39155 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java @@ -53,6 +53,7 @@ public final class SkylarkSemanticsCodec implements ObjectCodec<SkylarkSemantics codedOut.writeBoolNoTag(semantics.incompatibleDisallowOldStyleArgsAdd()); codedOut.writeBoolNoTag(semantics.incompatibleDisallowSlashOperator()); codedOut.writeBoolNoTag(semantics.incompatibleNewActionsApi()); + codedOut.writeBoolNoTag(semantics.incompatibleNoSupportToolsInActionInputs()); codedOut.writeBoolNoTag(semantics.incompatiblePackageNameIsAFunction()); codedOut.writeBoolNoTag(semantics.incompatibleRemoveNativeGitRepository()); codedOut.writeBoolNoTag(semantics.incompatibleRemoveNativeHttpArchive()); @@ -76,6 +77,7 @@ public final class SkylarkSemanticsCodec implements ObjectCodec<SkylarkSemantics builder.incompatibleDisallowOldStyleArgsAdd(codedIn.readBool()); builder.incompatibleDisallowSlashOperator(codedIn.readBool()); builder.incompatibleNewActionsApi(codedIn.readBool()); + builder.incompatibleNoSupportToolsInActionInputs(codedIn.readBool()); builder.incompatiblePackageNameIsAFunction(codedIn.readBool()); builder.incompatibleRemoveNativeGitRepository(codedIn.readBool()); builder.incompatibleRemoveNativeHttpArchive(codedIn.readBool()); diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java index 82c89a025a..bc8a1390f0 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java @@ -200,6 +200,22 @@ public class SkylarkSemanticsOptions extends OptionsBase implements Serializable public boolean incompatibleNewActionsApi; @Option( + name = "incompatible_no_support_tools_in_action_inputs", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, + effectTags = {OptionEffectTag.UNKNOWN}, + metadataTags = { + OptionMetadataTag.INCOMPATIBLE_CHANGE, + OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES + }, + help = + "If set to true, tools should be passed to `ctx.actions.run()` and " + + "`ctx.actions.run_shell()` using the `tools` parameter instead of the `inputs` " + + "parameter. Furthermore, if this flag is set and a `tools` parameter is not " + + "passed to the action, it is an error for any tools to appear in the `inputs`.") + public boolean incompatibleNoSupportToolsInActionInputs; + + @Option( name = "incompatible_package_name_is_a_function", defaultValue = "false", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, @@ -282,6 +298,7 @@ public class SkylarkSemanticsOptions extends OptionsBase implements Serializable .incompatibleDisallowOldStyleArgsAdd(incompatibleDisallowOldStyleArgsAdd) .incompatibleDisallowSlashOperator(incompatibleDisallowSlashOperator) .incompatibleNewActionsApi(incompatibleNewActionsApi) + .incompatibleNoSupportToolsInActionInputs(incompatibleNoSupportToolsInActionInputs) .incompatiblePackageNameIsAFunction(incompatiblePackageNameIsAFunction) .incompatibleRemoveNativeGitRepository(incompatibleRemoveNativeGitRepository) .incompatibleRemoveNativeHttpArchive(incompatibleRemoveNativeHttpArchive) diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java index d19b2db21c..1a5cc170b6 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java @@ -59,6 +59,8 @@ public abstract class SkylarkSemantics { public abstract boolean incompatibleNewActionsApi(); + public abstract boolean incompatibleNoSupportToolsInActionInputs(); + public abstract boolean incompatiblePackageNameIsAFunction(); public abstract boolean incompatibleRemoveNativeGitRepository(); @@ -94,6 +96,7 @@ public abstract class SkylarkSemantics { .incompatibleDisallowOldStyleArgsAdd(false) .incompatibleDisallowSlashOperator(false) .incompatibleNewActionsApi(false) + .incompatibleNoSupportToolsInActionInputs(false) .incompatiblePackageNameIsAFunction(false) .incompatibleRemoveNativeGitRepository(false) .incompatibleRemoveNativeHttpArchive(false) @@ -126,6 +129,8 @@ public abstract class SkylarkSemantics { public abstract Builder incompatibleNewActionsApi(boolean value); + public abstract Builder incompatibleNoSupportToolsInActionInputs(boolean value); + public abstract Builder incompatiblePackageNameIsAFunction(boolean value); public abstract Builder incompatibleRemoveNativeGitRepository(boolean value); |