Expose additional_outputs in C++ linking API
This CL also makes additional_inputs accept both lists and depsets.
The original motivaton for this change was to allow the re-write of native rules into Starlark; however, additional_outputs is exposed publicly due to interest expressed here:
https://github.com/bazelbuild/bazel/pull/12883
RELNOTES:none
PiperOrigin-RevId: 354301244
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index 059963f..672ded4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -157,7 +157,7 @@
String outputType,
boolean linkDepsStatically,
StarlarkInt stamp,
- Sequence<?> additionalInputs, // <Artifact> expected
+ Object additionalInputs, // <Artifact> expected
Object grepIncludes,
Object linkArtifactNameSuffix,
Object neverLink,
@@ -168,6 +168,7 @@
Object wholeArchive,
Object additionalLinkstampDefines,
Object onlyForDynamicLibs,
+ Object linkerOutputs,
StarlarkThread thread)
throws InterruptedException, EvalException {
return super.link(
@@ -193,6 +194,7 @@
wholeArchive,
additionalLinkstampDefines,
onlyForDynamicLibs,
+ linkerOutputs,
thread);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 1c14092..60f4a4e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -2106,7 +2106,7 @@
String outputType,
boolean linkDepsStatically,
StarlarkInt stamp,
- Sequence<?> additionalInputs,
+ Object additionalInputs,
Object grepIncludes,
Object linkedArtifactNameSuffixObject,
Object neverLinkObject,
@@ -2117,6 +2117,7 @@
Object wholeArchiveObject,
Object additionalLinkstampDefines,
Object onlyForDynamicLibsObject,
+ Object linkerOutputsObject,
StarlarkThread thread)
throws InterruptedException, EvalException {
if (checkObjectsBound(
@@ -2157,6 +2158,12 @@
} else {
throw Starlark.errorf("Language '%s' does not support %s", language, outputType);
}
+ NestedSet<Artifact> additionalInputsSet =
+ additionalInputs instanceof Depset
+ ? Depset.cast(additionalInputs, Artifact.class, "additional_inputs")
+ : NestedSetBuilder.<Artifact>compileOrder()
+ .addAll(Sequence.cast(additionalInputs, Artifact.class, "additional_inputs"))
+ .build();
FeatureConfiguration actualFeatureConfiguration =
featureConfiguration.getFeatureConfiguration();
CppConfiguration cppConfiguration =
@@ -2164,6 +2171,7 @@
.getActionConstructionContext()
.getConfiguration()
.getFragment(CppConfiguration.class);
+ ImmutableList<Artifact> linkerOutputs = asClassImmutableList(linkerOutputsObject);
CcLinkingHelper helper =
new CcLinkingHelper(
actions.getActionConstructionContext().getRuleErrorConsumer(),
@@ -2183,8 +2191,7 @@
.setGrepIncludes(convertFromNoneable(grepIncludes, /* defaultValue= */ null))
.setLinkingMode(linkDepsStatically ? LinkingMode.STATIC : LinkingMode.DYNAMIC)
.setIsStampingEnabled(isStampingEnabled)
- .addNonCodeLinkerInputs(
- Sequence.cast(additionalInputs, Artifact.class, "additional_inputs"))
+ .addTransitiveAdditionalLinkerInputs(additionalInputsSet)
.setDynamicLinkType(dynamicLinkTargetType)
.addCcLinkingContexts(
Sequence.cast(linkingContexts, CcLinkingContext.class, "linking_contexts"))
@@ -2205,7 +2212,8 @@
dynamicLinkTargetType == LinkTargetType.DYNAMIC_LIBRARY
&& actualFeatureConfiguration.isEnabled(CppRuleClasses.TARGETS_WINDOWS)
&& CppHelper.useInterfaceSharedLibraries(
- cppConfiguration, ccToolchainProvider, actualFeatureConfiguration));
+ cppConfiguration, ccToolchainProvider, actualFeatureConfiguration))
+ .addLinkerOutputs(linkerOutputs);
if (!asDict(variablesExtension).isEmpty()) {
helper.addVariableExtension(new UserVariablesExtension(asDict(variablesExtension)));
}
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
index 53d44c4..21bef87 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
@@ -415,7 +415,11 @@
doc = "For additional inputs to the linking action, e.g.: linking scripts.",
positional = false,
named = true,
- defaultValue = "[]"),
+ defaultValue = "[]",
+ allowedTypes = {
+ @ParamType(type = Sequence.class),
+ @ParamType(type = Depset.class),
+ }),
@Param(
name = "grep_includes",
positional = false,
@@ -488,6 +492,13 @@
documented = false,
allowedTypes = {@ParamType(type = Boolean.class)},
defaultValue = "unbound"),
+ @Param(
+ name = "additional_outputs",
+ doc = "For additional outputs to the linking action, e.g.: map files.",
+ positional = false,
+ named = true,
+ allowedTypes = {@ParamType(type = Sequence.class)},
+ defaultValue = "unbound")
})
LinkingOutputsT link(
StarlarkActionFactoryT starlarkActionFactoryApi,
@@ -501,7 +512,7 @@
String outputType,
boolean linkDepsStatically,
StarlarkInt stamp,
- Sequence<?> additionalInputs, // <FileT> expected
+ Object additionalInputs, // <FileT> expected
Object grepIncludes,
Object linkArtifactNameSuffix,
Object neverLink,
@@ -512,6 +523,7 @@
Object wholeArchive,
Object additionalLinkstampDefines,
Object onlyForDynamicLibs,
+ Object linkerOutputs,
StarlarkThread thread)
throws InterruptedException, EvalException;
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index ce5a9c1..e0df56f 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -334,7 +334,7 @@
String outputType,
boolean linkDepsStatically,
StarlarkInt stamp,
- Sequence<?> additionalInputs,
+ Object additionalInputs,
Object grepIncludes,
Object linkArtifactNameSuffix,
Object neverLink,
@@ -345,6 +345,7 @@
Object wholeArchive,
Object additionalLinkstampDefines,
Object onlyForDynamicLibs,
+ Object linkerOutputs,
StarlarkThread thread)
throws InterruptedException, EvalException {
return null;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
index 3f916e7..f4ce422 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
@@ -6193,8 +6193,7 @@
")");
}
- private static void setupTestTransitiveLink(Scratch scratch, String... additionalLines)
- throws Exception {
+ private static void createCcBinRule(Scratch scratch, String... additionalLines) throws Exception {
String fragments = " fragments = ['google_cpp', 'cpp'],";
if (AnalysisMock.get().isThisBazel()) {
fragments = " fragments = ['cpp'],";
@@ -6248,9 +6247,15 @@
" default = Label('//tools/cpp/grep_includes:grep-includes'),",
" cfg = 'host'",
" ),",
+ " 'additional_outputs': attr.output_list(),",
" },",
fragments,
")");
+ }
+
+ private static void setupTestTransitiveLink(Scratch scratch, String... additionalLines)
+ throws Exception {
+ createCcBinRule(scratch, additionalLines);
scratch.file(
"foo/BUILD",
"load('//tools/build_defs:extension.bzl', 'cc_bin')",
@@ -7347,6 +7352,25 @@
}
}
+ @Test
+ public void testAdditionalLinkingOutputsAppearAsOutputsOfLinkAction() throws Exception {
+ createCcBinRule(scratch, "additional_outputs=ctx.outputs.additional_outputs");
+ scratch.file(
+ "foo/BUILD",
+ "load('//tools/build_defs:extension.bzl', 'cc_bin')",
+ "cc_bin(",
+ " name = 'bin',",
+ " objects = ['file.o'],",
+ " pic_objects = ['file.pic.o'],",
+ " additional_outputs = [':bin.map'],",
+ ")");
+ ConfiguredTarget target = getConfiguredTarget("//foo:bin");
+ assertThat(target).isNotNull();
+ CppLinkAction action =
+ (CppLinkAction) getGeneratingAction(artifactByPath(getFilesToBuild(target), ".map"));
+ assertThat(artifactsToStrings(action.getOutputs())).contains("bin foo/bin.map");
+ }
+
private String getVariablesExtensionStarlarkRule(String call, String dictionaryEntries) {
return Joiner.on("\n")
.join(