diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java index 1c23c1e2ecb24e..d465c70c99da42 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java @@ -286,7 +286,7 @@ public BaseFunction rule( FuncallExpression ast, Environment funcallEnv, StarlarkContext context) - throws EvalException, ConversionException { + throws EvalException { SkylarkUtils.checkLoadingOrWorkspacePhase(funcallEnv, "rule", ast.getLocation()); BazelStarlarkContext bazelContext = (BazelStarlarkContext) context; @@ -398,8 +398,11 @@ public BaseFunction rule( execCompatibleWith.getContents(String.class, "exec_compatile_with"), ast.getLocation())); } + if (executionPlatformConstraintsAllowed) { builder.executionPlatformConstraintsAllowed(ExecutionPlatformConstraintsAllowed.PER_TARGET); + } else { + builder.executionPlatformConstraintsAllowed(ExecutionPlatformConstraintsAllowed.PER_RULE); } return new SkylarkRuleFunction(builder, type, attributes, ast.getLocation()); diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java index 24a16990fbe2cc..deb1d5f557301f 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java +++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java @@ -329,6 +329,20 @@ public class StarlarkSemanticsOptions extends OptionsBase implements Serializabl + "Use for example `cc_library` instead of `native.cc_library`.") public boolean incompatibleDisallowNativeInBuildFile; + @Option( + name = "incompatible_disallow_rule_execution_platform_constraints_allowed", + defaultValue = "False", + documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS, + effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS}, + metadataTags = { + OptionMetadataTag.INCOMPATIBLE_CHANGE, + OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES + }, + help = + "If set to true, disallow the use of the execution_platform_constraints_allowed " + + "attribute on rule().") + public boolean incompatibleDisallowRuleExecutionPlatformConstraintsAllowed; + @Option( name = "incompatible_string_join_requires_strings", defaultValue = "false", @@ -623,6 +637,8 @@ public StarlarkSemantics toSkylarkSemantics() { .incompatibleDisallowOldOctalNotation(incompatibleDisallowOldOctalNotation) .incompatibleDisallowOldStyleArgsAdd(incompatibleDisallowOldStyleArgsAdd) .incompatibleDisallowStructProviderSyntax(incompatibleDisallowStructProviderSyntax) + .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed( + incompatibleDisallowRuleExecutionPlatformConstraintsAllowed) .incompatibleExpandDirectories(incompatibleExpandDirectories) .incompatibleNewActionsApi(incompatibleNewActionsApi) .incompatibleNoAttrLicense(incompatibleNoAttrLicense) diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java index 247300a00a1b07..a35c698784b139 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java @@ -282,12 +282,17 @@ public interface SkylarkRuleFunctionsApi { named = true, positional = false, defaultValue = "False", + disableWithFlag = + FlagIdentifier.INCOMPATIBLE_DISALLOW_RULE_EXECUTION_PLATFORM_CONSTRAINTS_ALLOWED, + valueWhenDisabled = "True", doc = "If true, a special attribute named exec_compatible_with of " + "label-list type is added, which must not already exist in " + "attrs. Targets may use this attribute to specify additional " + "constraints on the execution platform beyond those given in the " - + "exec_compatible_with argument to rule()."), + + "exec_compatible_with argument to rule(). " + + "This will be deprecated and removed in the near future, and all rules will " + + "be able to use exec_compatible_with."), @Param( name = "exec_compatible_with", type = SkylarkList.class, diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java index bc025a36be0ba8..7aa845354b803a 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java @@ -54,6 +54,8 @@ public enum FlagIdentifier { INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP(StarlarkSemantics::incompatibleNoTargetOutputGroup), INCOMPATIBLE_NO_ATTR_LICENSE(StarlarkSemantics::incompatibleNoAttrLicense), INCOMPATIBLE_OBJC_FRAMEWORK_CLEANUP(StarlarkSemantics::incompatibleObjcFrameworkCleanup), + INCOMPATIBLE_DISALLOW_RULE_EXECUTION_PLATFORM_CONSTRAINTS_ALLOWED( + StarlarkSemantics::incompatibleDisallowRuleExecutionPlatformConstraintsAllowed), NONE(null); // Using a Function here makes the enum definitions far cleaner, and, since this is @@ -162,6 +164,8 @@ public boolean flagValue(FlagIdentifier flagIdentifier) { public abstract boolean incompatibleDisallowOldStyleArgsAdd(); + public abstract boolean incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(); + public abstract boolean incompatibleDisallowStructProviderSyntax(); public abstract boolean incompatibleExpandDirectories(); @@ -234,6 +238,7 @@ public static Builder builderWithDefaults() { .incompatibleDisallowNativeInBuildFile(false) .incompatibleDisallowOldOctalNotation(false) .incompatibleDisallowOldStyleArgsAdd(true) + .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(false) .incompatibleDisallowStructProviderSyntax(false) .incompatibleExpandDirectories(true) .incompatibleNewActionsApi(false) @@ -304,6 +309,9 @@ public abstract static class Builder { public abstract Builder incompatibleDisallowNativeInBuildFile(boolean value); + public abstract Builder incompatibleDisallowRuleExecutionPlatformConstraintsAllowed( + boolean value); + public abstract Builder incompatibleDisallowStructProviderSyntax(boolean value); public abstract Builder incompatibleExpandDirectories(boolean value); 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 7e2df6fe635fc4..7b5c18a4041515 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 @@ -148,6 +148,7 @@ private static StarlarkSemanticsOptions buildRandomOptions(Random rand) throws E "--incompatible_disallow_old_octal_notation=" + rand.nextBoolean(), "--incompatible_disallow_old_style_args_add=" + rand.nextBoolean(), "--incompatible_disallow_struct_provider_syntax=" + rand.nextBoolean(), + "--incompatible_disallow_rule_execution_platform_constraints_allowed=" + rand.nextBoolean(), "--incompatible_expand_directories=" + rand.nextBoolean(), "--incompatible_new_actions_api=" + rand.nextBoolean(), "--incompatible_no_attr_license=" + rand.nextBoolean(), @@ -199,6 +200,7 @@ private static StarlarkSemantics buildRandomSemantics(Random rand) { .incompatibleDisallowOldOctalNotation(rand.nextBoolean()) .incompatibleDisallowOldStyleArgsAdd(rand.nextBoolean()) .incompatibleDisallowStructProviderSyntax(rand.nextBoolean()) + .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(rand.nextBoolean()) .incompatibleExpandDirectories(rand.nextBoolean()) .incompatibleNewActionsApi(rand.nextBoolean()) .incompatibleNoAttrLicense(rand.nextBoolean()) diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java index 8c70a043f02853..7bda34c6a6310f 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java @@ -137,7 +137,7 @@ private RuleClass getRuleClass(String name) throws Exception { } private void registerDummyUserDefinedFunction() throws Exception { - eval("def impl():\n" + " return 0\n"); + eval("def impl():", " pass"); } @Test @@ -1739,7 +1739,14 @@ public void testRuleAddExecutionConstraints() throws Exception { } @Test - public void testTargetsCanAddExecutionPlatformConstraints() throws Exception { + public void testTargetsCanAddExecutionPlatformConstraints_enabled() throws Exception { + StarlarkSemantics semantics = + StarlarkSemantics.DEFAULT_SEMANTICS.toBuilder() + .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(false) + .build(); + ev = createEvaluationTestCase(semantics); + ev.initialize(); + registerDummyUserDefinedFunction(); scratch.file("test/BUILD", "toolchain_type(name = 'my_toolchain_type')"); evalAndExport( @@ -1752,6 +1759,47 @@ public void testTargetsCanAddExecutionPlatformConstraints() throws Exception { .isEqualTo(ExecutionPlatformConstraintsAllowed.PER_TARGET); } + @Test + public void testTargetsCanAddExecutionPlatformConstraints_notEnabled() throws Exception { + StarlarkSemantics semantics = + StarlarkSemantics.DEFAULT_SEMANTICS.toBuilder() + .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(false) + .build(); + ev = createEvaluationTestCase(semantics); + ev.initialize(); + + registerDummyUserDefinedFunction(); + scratch.file("test/BUILD", "toolchain_type(name = 'my_toolchain_type')"); + evalAndExport( + "r1 = rule(impl, ", + " toolchains=['//test:my_toolchain_type'],", + " execution_platform_constraints_allowed=False,", + ")"); + RuleClass c = ((SkylarkRuleFunction) lookup("r1")).getRuleClass(); + assertThat(c.executionPlatformConstraintsAllowed()) + .isEqualTo(ExecutionPlatformConstraintsAllowed.PER_RULE); + } + + @Test + public void testTargetsCanAddExecutionPlatformConstraints_disallowed() throws Exception { + StarlarkSemantics semantics = + StarlarkSemantics.DEFAULT_SEMANTICS.toBuilder() + .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(true) + .build(); + ev = createEvaluationTestCase(semantics); + ev.setFailFast(false); + ev.initialize(); + + registerDummyUserDefinedFunction(); + scratch.file("test/BUILD", "toolchain_type(name = 'my_toolchain_type')"); + evalAndExport( + "r1 = rule(impl, ", + " toolchains=['//test:my_toolchain_type'],", + " execution_platform_constraints_allowed=True,", + ")"); + ev.assertContainsError("parameter 'execution_platform_constraints_allowed' is deprecated"); + } + @Test public void testRuleFunctionReturnsNone() throws Exception { scratch.file("test/rule.bzl",