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 223285b7990ba8..c1c91a854eba06 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 @@ -354,6 +354,18 @@ public class SkylarkSemanticsOptions extends OptionsBase implements Serializable ) public boolean incompatibleNewActionsApi; + @Option( + name = "incompatible_no_attr_license", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS, + effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS}, + metadataTags = { + OptionMetadataTag.INCOMPATIBLE_CHANGE, + OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES + }, + help = "If set to true, disables the function `attr.license`.") + public boolean incompatibleNoAttrLicense; + @Option( name = "incompatible_no_output_attr_default", defaultValue = "false", @@ -531,6 +543,7 @@ public SkylarkSemantics toSkylarkSemantics() { .incompatibleExpandDirectories(incompatibleExpandDirectories) .incompatibleGenerateJavaCommonSourceJar(incompatibleGenerateJavaCommonSourceJar) .incompatibleNewActionsApi(incompatibleNewActionsApi) + .incompatibleNoAttrLicense(incompatibleNoAttrLicense) .incompatibleNoOutputAttrDefault(incompatibleNoOutputAttrDefault) .incompatibleNoSupportToolsInActionInputs(incompatibleNoSupportToolsInActionInputs) .incompatibleNoTargetOutputGroup(incompatibleNoTargetOutputGroup) diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java index b688d70c1bf63d..8b44f65e27e58f 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.syntax.FuncallExpression; import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkList; +import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier; import com.google.devtools.build.lib.syntax.UserDefinedFunction; /** @@ -979,6 +980,7 @@ public Descriptor stringListDictAttribute( positional = false, doc = MANDATORY_DOC) }, + disableWithFlag = FlagIdentifier.INCOMPATIBLE_NO_ATTR_LICENSE, useAst = true, useEnvironment = true) public Descriptor licenseAttribute( 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 f09875c1687ddb..5af8f655af92c1 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 @@ -48,6 +48,7 @@ public enum FlagIdentifier { SkylarkSemantics::incompatibleDisableObjcProviderResources), INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP( SkylarkSemantics::incompatibleNoTargetOutputGroup), + INCOMPATIBLE_NO_ATTR_LICENSE(SkylarkSemantics::incompatibleNoAttrLicense), NONE(null); // Using a Function here makes the enum definitions far cleaner, and, since this is @@ -152,6 +153,8 @@ public boolean isFeatureEnabledBasedOnTogglingFlags( public abstract boolean incompatibleNewActionsApi(); + public abstract boolean incompatibleNoAttrLicense(); + public abstract boolean incompatibleNoOutputAttrDefault(); public abstract boolean incompatibleNoSupportToolsInActionInputs(); @@ -212,6 +215,7 @@ public static Builder builderWithDefaults() { .incompatibleExpandDirectories(false) .incompatibleGenerateJavaCommonSourceJar(false) .incompatibleNewActionsApi(false) + .incompatibleNoAttrLicense(false) .incompatibleNoOutputAttrDefault(false) .incompatibleNoSupportToolsInActionInputs(false) .incompatibleNoTargetOutputGroup(false) @@ -276,6 +280,8 @@ public abstract static class Builder { public abstract Builder incompatibleNewActionsApi(boolean value); + public abstract Builder incompatibleNoAttrLicense(boolean value); + public abstract Builder incompatibleNoOutputAttrDefault(boolean value); public abstract Builder incompatibleNoSupportToolsInActionInputs(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 9360d9425cf546..7fcda270ed7b5d 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 @@ -144,6 +144,7 @@ private static SkylarkSemanticsOptions buildRandomOptions(Random rand) throws Ex "--incompatible_expand_directories=" + rand.nextBoolean(), "--incompatible_generate_javacommon_source_jar=" + rand.nextBoolean(), "--incompatible_new_actions_api=" + rand.nextBoolean(), + "--incompatible_no_attr_license=" + rand.nextBoolean(), "--incompatible_no_output_attr_default=" + rand.nextBoolean(), "--incompatible_no_support_tools_in_action_inputs=" + rand.nextBoolean(), "--incompatible_no_target_output_group=" + rand.nextBoolean(), @@ -188,6 +189,7 @@ private static SkylarkSemantics buildRandomSemantics(Random rand) { .incompatibleExpandDirectories(rand.nextBoolean()) .incompatibleGenerateJavaCommonSourceJar(rand.nextBoolean()) .incompatibleNewActionsApi(rand.nextBoolean()) + .incompatibleNoAttrLicense(rand.nextBoolean()) .incompatibleNoOutputAttrDefault(rand.nextBoolean()) .incompatibleNoSupportToolsInActionInputs(rand.nextBoolean()) .incompatibleNoTargetOutputGroup(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 3337f0746f32c0..69511a06d91ba4 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 @@ -643,6 +643,19 @@ public void testAttrDoc() throws Exception { buildAttribute("a13", "attr.string_list_dict(doc='foo')"); } + @Test + public void testNoAttrLicense() throws Exception { + ev = + createEvaluationTestCase( + SkylarkSemantics.DEFAULT_SEMANTICS.toBuilder().incompatibleNoAttrLicense(true).build()); + ev.initialize(); + + EvalException expected = assertThrows(EvalException.class, () -> eval("attr.license()")); + assertThat(expected) + .hasMessageThat() + .contains("type 'attr (a language module)' has no method license()"); + } + @Test public void testAttrDocValueBadType() throws Exception { checkErrorContains(