Make cc_binary extendable
Allow implicit outputs in the parent rule. That's needed for cc_binary.
PiperOrigin-RevId: 630991406
Change-Id: Ia05d00d5c4c4eae1e656908fbbc6f7fa18bf87b3
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index 45ad110..e3ad389 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -819,6 +819,13 @@
allowlistCheckers.addAll(parent.getAllowlistCheckers());
advertisedProviders.addParent(parent.getAdvertisedProviders());
+
+ if (parent.getDefaultImplicitOutputsFunction() != SafeImplicitOutputsFunction.NONE) {
+ if (implicitOutputsFunction != SafeImplicitOutputsFunction.NONE) {
+ throw new IllegalArgumentException("Only a single parent may set implicit outputs");
+ }
+ implicitOutputsFunction = parent.getDefaultImplicitOutputsFunction();
+ }
}
// TODO(bazel-team): move this testonly attribute setting to somewhere else
// preferably to some base RuleClass implementation.
@@ -892,7 +899,6 @@
if (starlark
&& (type == RuleClassType.NORMAL || type == RuleClassType.TEST)
- && implicitOutputsFunction == SafeImplicitOutputsFunction.NONE
&& outputsToBindir
&& !starlarkTestable
&& !isAnalysisTest
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
index c421069..9ea4363 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
@@ -4373,6 +4373,41 @@
}
@Test
+ public void extendRule_ccBinary() throws Exception {
+ mockToolsConfig.overwrite(
+ "tools/allowlists/extend_rule_allowlist/BUILD",
+ """
+ package_group(
+ name = "extend_rule_allowlist",
+ packages = ["//..."],
+ )
+ """);
+ scratch.file(
+ "extend_rule_testing/child.bzl",
+ """
+ def _impl(ctx):
+ return ctx.super()
+
+ my_binary = rule(
+ implementation = _impl,
+ parent = native.cc_binary,
+ )
+ """);
+ scratch.file(
+ "extend_rule_testing/BUILD",
+ """
+ load(":child.bzl", "my_binary")
+
+ my_binary(
+ name = "my_target",
+ srcs = ["a.cc"],
+ )
+ """);
+
+ getConfiguredTarget("//extend_rule_testing:my_target");
+ }
+
+ @Test
public void extendRule_basicUse() throws Exception {
scratchParentRule("parent_library"); // parent has srcs and deps attribute
scratch.file(
@@ -5209,9 +5244,6 @@
ev.update("config", new StarlarkConfig());
ev.execAndExport("parent_library = rule(impl, build_setting = config.int())");
ev.checkEvalError(notExtendableError("parent_library"), "rule(impl, parent = parent_library)");
-
- ev.execAndExport("parent_library = rule(impl, outputs = {'deploy': '%{name}_deploy.jar'})");
- ev.checkEvalError(notExtendableError("parent_library"), "rule(impl, parent = parent_library)");
}
@Test