Disable outputs param of rule function
This constitutes an incompatible change guarded by flag --incompatible_no_rule_outputs_param. See #7977 for further details.
Implementation for #7977.
RELNOTES: The `outputs` parameter of the `rule()` function is deprecated and attached to flag `--incompatible_no_rule_outputs_param`. Migrate rules to use `OutputGroupInfo` or `attr.output` instead. See https://github.com/bazelbuild/bazel/issues/7977 for more info.
PiperOrigin-RevId: 244032985
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 3bb2b55..58208a4 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
@@ -417,6 +417,18 @@
public boolean incompatibleNoOutputAttrDefault;
@Option(
+ name = "incompatible_no_rule_outputs_param",
+ 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, disables the `outputs` parameter of the `rule()` Starlark function.")
+ public boolean incompatibleNoRuleOutputsParam;
+
+ @Option(
name = "incompatible_no_support_tools_in_action_inputs",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS,
@@ -587,6 +599,7 @@
.incompatibleNoAttrLicense(incompatibleNoAttrLicense)
.incompatibleNoKwargsInBuildFiles(incompatibleNoKwargsInBuildFiles)
.incompatibleNoOutputAttrDefault(incompatibleNoOutputAttrDefault)
+ .incompatibleNoRuleOutputsParam(incompatibleNoRuleOutputsParam)
.incompatibleNoSupportToolsInActionInputs(incompatibleNoSupportToolsInActionInputs)
.incompatibleNoTargetOutputGroup(incompatibleNoTargetOutputGroup)
.incompatibleNoTransitiveLoads(incompatibleNoTransitiveLoads)
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 c2b82d1..c66e708 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
@@ -153,9 +153,10 @@
callbackEnabled = true,
noneable = true,
defaultValue = "None",
+ valueWhenDisabled = "None",
+ disableWithFlag = FlagIdentifier.INCOMPATIBLE_NO_RULE_OUTPUTS_PARAM,
doc =
- "<b>Experimental:</b> This API is in the process of being redesigned."
- + "<p>A schema for defining predeclared outputs. Unlike "
+ "A schema for defining predeclared outputs. Unlike "
+ "<a href='attr.html#output'><code>output</code></a> and "
+ "<a href='attr.html#output_list'><code>output_list</code></a> attributes, "
+ "the user does not specify the labels for these files. "
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 aaddb98..5d78a88 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
@@ -48,6 +48,7 @@
INCOMPATIBLE_DISABLE_OBJC_PROVIDER_RESOURCES(
StarlarkSemantics::incompatibleDisableObjcProviderResources),
INCOMPATIBLE_NO_OUTPUT_ATTR_DEFAULT(StarlarkSemantics::incompatibleNoOutputAttrDefault),
+ INCOMPATIBLE_NO_RULE_OUTPUTS_PARAM(StarlarkSemantics::incompatibleNoRuleOutputsParam),
INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP(StarlarkSemantics::incompatibleNoTargetOutputGroup),
INCOMPATIBLE_NO_ATTR_LICENSE(StarlarkSemantics::incompatibleNoAttrLicense),
INCOMPATIBLE_OBJC_FRAMEWORK_CLEANUP(StarlarkSemantics::incompatibleObjcFrameworkCleanup),
@@ -167,6 +168,8 @@
public abstract boolean incompatibleNoOutputAttrDefault();
+ public abstract boolean incompatibleNoRuleOutputsParam();
+
public abstract boolean incompatibleNoSupportToolsInActionInputs();
public abstract boolean incompatibleNoTargetOutputGroup();
@@ -229,6 +232,7 @@
.incompatibleNoAttrLicense(true)
.incompatibleNoKwargsInBuildFiles(false)
.incompatibleNoOutputAttrDefault(true)
+ .incompatibleNoRuleOutputsParam(false)
.incompatibleNoSupportToolsInActionInputs(false)
.incompatibleNoTargetOutputGroup(false)
.incompatibleNoTransitiveLoads(true)
@@ -300,6 +304,8 @@
public abstract Builder incompatibleNoOutputAttrDefault(boolean value);
+ public abstract Builder incompatibleNoRuleOutputsParam(boolean value);
+
public abstract Builder incompatibleNoSupportToolsInActionInputs(boolean value);
public abstract Builder incompatibleNoTargetOutputGroup(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 294d329..6b6e84b 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
@@ -151,6 +151,7 @@
"--incompatible_no_attr_license=" + rand.nextBoolean(),
"--incompatible_no_kwargs_in_build_files=" + rand.nextBoolean(),
"--incompatible_no_output_attr_default=" + rand.nextBoolean(),
+ "--incompatible_no_rule_outputs_param=" + rand.nextBoolean(),
"--incompatible_no_support_tools_in_action_inputs=" + rand.nextBoolean(),
"--incompatible_no_target_output_group=" + rand.nextBoolean(),
"--incompatible_no_transitive_loads=" + rand.nextBoolean(),
@@ -199,6 +200,7 @@
.incompatibleNoAttrLicense(rand.nextBoolean())
.incompatibleNoKwargsInBuildFiles(rand.nextBoolean())
.incompatibleNoOutputAttrDefault(rand.nextBoolean())
+ .incompatibleNoRuleOutputsParam(rand.nextBoolean())
.incompatibleNoSupportToolsInActionInputs(rand.nextBoolean())
.incompatibleNoTargetOutputGroup(rand.nextBoolean())
.incompatibleNoTransitiveLoads(rand.nextBoolean())
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index 43b5c4b..cb7f3d8 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -2893,6 +2893,30 @@
+ "--incompatible_disallow_struct_provider_syntax=false");
}
+ @Test
+ public void testNoRuleOutputsParam() throws Exception {
+ setSkylarkSemanticsOptions("--incompatible_no_rule_outputs_param=true");
+ scratch.file(
+ "test/skylark/test_rule.bzl",
+ "def _impl(ctx):",
+ " output = ctx.outputs.out",
+ " ctx.actions.write(output = output, content = 'hello')",
+ "",
+ "my_rule = rule(",
+ " implementation = _impl,",
+ " outputs = {\"out\": \"%{name}.txt\"})");
+ scratch.file(
+ "test/skylark/BUILD",
+ "load('//test/skylark:test_rule.bzl', 'my_rule')",
+ "my_rule(name = 'target')");
+
+ reporter.removeHandler(failFastHandler);
+ getConfiguredTarget("//test/skylark:target");
+ assertContainsEvent(
+ "parameter 'outputs' is deprecated and will be removed soon. It may be temporarily "
+ + "re-enabled by setting --incompatible_no_rule_outputs_param=false");
+ }
+
/**
* Skylark integration test that forces inlining.
*/
diff --git a/tools/build_defs/pkg/pkg.bzl b/tools/build_defs/pkg/pkg.bzl
index 8ef8c1a..1e1391c 100644
--- a/tools/build_defs/pkg/pkg.bzl
+++ b/tools/build_defs/pkg/pkg.bzl
@@ -212,6 +212,12 @@
inputs = [ctx.outputs.deb],
outputs = [ctx.outputs.out],
)
+ output_groups = {"out": [ctx.outputs.out]}
+ if hasattr(ctx.outputs, "out_deb"):
+ output_groups["deb"] = ctx.outputs.deb
+ if hasattr(ctx.outputs, "out_changes"):
+ output_groups["changes"] = ctx.outputs.changes
+ return OutputGroupInfo(**output_groups)
# A rule for creating a tar file, see README.md
_real_pkg_tar = rule(
@@ -226,6 +232,7 @@
"modes": attr.string_dict(),
"mtime": attr.int(default = -1),
"portable_mtime": attr.bool(default = True),
+ "out": attr.output(),
"owner": attr.string(default = "0.0"),
"ownername": attr.string(default = "."),
"owners": attr.string_dict(),
@@ -244,9 +251,6 @@
allow_files = True,
),
},
- outputs = {
- "out": "%{name}.%{extension}",
- },
)
def pkg_tar(**kwargs):
@@ -260,10 +264,17 @@
"This attribute was renamed to `srcs`. " +
"Consider renaming it in your BUILD file.")
kwargs["srcs"] = kwargs.pop("files")
- _real_pkg_tar(**kwargs)
+ if "extension" in kwargs and kwargs["extension"]:
+ extension = kwargs["extension"]
+ else:
+ extension = "tar"
+ _real_pkg_tar(
+ out = kwargs["name"] + "." + extension,
+ **kwargs
+ )
# A rule for creating a deb file, see README.md
-pkg_deb = rule(
+_pkg_deb = rule(
implementation = _pkg_deb_impl,
attrs = {
"data": attr.label(mandatory = True, allow_single_file = tar_filetype),
@@ -300,10 +311,27 @@
executable = True,
allow_files = True,
),
- },
- outputs = {
- "out": "%{name}.deb",
- "deb": "%{package}_%{version}_%{architecture}.deb",
- "changes": "%{package}_%{version}_%{architecture}.changes",
+ # Outputs.
+ "out": attr.output(mandatory = True),
+ "deb": attr.output(),
+ "changes": attr.output(),
},
)
+
+def pkg_deb(name, package, **kwargs):
+ """Creates a deb file. See README.md."""
+ version = kwargs.get("version", None)
+ architecture = kwargs.get("architecture", "all")
+ out_deb = None
+ out_changes = None
+ if version and architecture:
+ out_deb = "%s_%s_%s.deb" % (package, version, architecture)
+ out_changes = "%s_%s_%s.changes" % (package, version, architecture)
+ _pkg_deb(
+ name = name,
+ package = package,
+ out = name + ".deb",
+ deb = out_deb,
+ changes = out_changes,
+ **kwargs
+ )
diff --git a/tools/jdk/default_java_toolchain.bzl b/tools/jdk/default_java_toolchain.bzl
index 3fdcfc1..1824199 100644
--- a/tools/jdk/default_java_toolchain.bzl
+++ b/tools/jdk/default_java_toolchain.bzl
@@ -108,7 +108,7 @@
outs = [src],
)
-def _bootclasspath(ctx):
+def _bootclasspath_impl(ctx):
host_javabase = ctx.attr.host_javabase[java_common.JavaRuntimeInfo]
# explicitly list output files instead of using TreeArtifact to work around
@@ -141,7 +141,7 @@
arguments = [args],
)
- bootclasspath = ctx.outputs.jar
+ bootclasspath = ctx.outputs.output_jar
inputs = class_outputs + ctx.files.host_javabase
@@ -166,9 +166,13 @@
outputs = [bootclasspath],
arguments = [args],
)
+ return [
+ DefaultInfo(files = depset([bootclasspath])),
+ OutputGroupInfo(jar = [bootclasspath]),
+ ]
-bootclasspath = rule(
- implementation = _bootclasspath,
+_bootclasspath = rule(
+ implementation = _bootclasspath_impl,
attrs = {
"host_javabase": attr.label(
cfg = "host",
@@ -181,6 +185,13 @@
"target_javabase": attr.label(
providers = [java_common.JavaRuntimeInfo],
),
+ "output_jar": attr.output(mandatory = True),
},
- outputs = {"jar": "%{name}.jar"},
)
+
+def bootclasspath(name, **kwargs):
+ _bootclasspath(
+ name = name,
+ output_jar = name + ".jar",
+ **kwargs
+ )