diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java index d50dbe0a0c6c7e..cd66c58173c031 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSetMultimap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcLinkingOutputsApi; import com.google.devtools.build.lib.vfs.FileSystemUtils; import javax.annotation.Nullable; @@ -35,14 +36,17 @@ public class CcLinkingOutputs implements CcLinkingOutputsApi allLtoArtifacts; + private final ImmutableList linkActionInputs; private CcLinkingOutputs( LibraryToLink libraryToLink, Artifact executable, - ImmutableList allLtoArtifacts) { + ImmutableList allLtoArtifacts, + ImmutableList linkActionInputs) { this.libraryToLink = libraryToLink; this.executable = executable; this.allLtoArtifacts = allLtoArtifacts; + this.linkActionInputs = linkActionInputs; } @Override @@ -68,6 +72,10 @@ public Sequence getAllLtoArtifactsForStarlark(StarlarkThrea return StarlarkList.immutableCopyOf(getAllLtoArtifacts()); } + public ImmutableList getLinkActionInputs() { + return linkActionInputs; + } + public boolean isEmpty() { return libraryToLink == null; } @@ -121,9 +129,11 @@ private Builder() { // same list return the .pdb file for Windows. private final ImmutableList.Builder allLtoArtifacts = ImmutableList.builder(); + private final ImmutableList.Builder linkActionInputs = ImmutableList.builder(); public CcLinkingOutputs build() { - return new CcLinkingOutputs(libraryToLink, executable, allLtoArtifacts.build()); + return new CcLinkingOutputs( + libraryToLink, executable, allLtoArtifacts.build(), linkActionInputs.build()); } public Builder setLibraryToLink(LibraryToLink libraryToLink) { @@ -140,5 +150,10 @@ public Builder addAllLtoArtifacts(Iterable allLtoArtifacts) this.allLtoArtifacts.addAll(allLtoArtifacts); return this; } + + public Builder addLinkActionInputs(NestedSet linkActionInputs) { + this.linkActionInputs.addAll(linkActionInputs.toList()); + return this; + } } } 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 old mode 100755 new mode 100644 index 50710c744a33c6..af13bb8e9042e7 --- 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 @@ -635,6 +635,12 @@ public LibraryToLink createLibraryLinkerInput( "If you pass '%s_library', you must also pass a 'feature_configuration'", library); } } + if (nopicObjects != null && staticLibrary == null) { + throw Starlark.errorf("If you pass 'objects' you must also pass a 'static_library'"); + } + if (picObjects != null && picStaticLibrary == null) { + throw Starlark.errorf("If you pass 'pic_objects' you must also pass a 'pic_static_library'"); + } if (notNullArtifactForIdentifier == null) { throw Starlark.errorf("Must pass at least one artifact"); } @@ -1798,7 +1804,7 @@ public Tuple createLinkingContextFromCompilationOutputs( CcToolchainProvider starlarkCcToolchainProvider, CcCompilationOutputs compilationOutputs, Sequence userLinkFlags, // expected - Sequence linkingContextsObjects, // expected + Sequence linkingContexts, // expected String name, String languageString, boolean alwayslink, @@ -1808,11 +1814,9 @@ public Tuple createLinkingContextFromCompilationOutputs( Object grepIncludes, Object variablesExtension, Object stamp, - Object linkedDllNameSuffix, - Object winDefFile, StarlarkThread thread) throws InterruptedException, EvalException { - if (checkObjectsBound(stamp, linkedDllNameSuffix, winDefFile)) { + if (checkObjectsBound(stamp)) { CcModule.checkPrivateStarlarkificationAllowlist(thread); } Language language = parseLanguage(languageString); @@ -1841,8 +1845,6 @@ public Tuple createLinkingContextFromCompilationOutputs( } else { staticLinkTargetType = LinkTargetType.OBJC_ARCHIVE; } - List ccLinkingContexts = - Sequence.cast(linkingContextsObjects, CcLinkingContext.class, "linking_contexts"); CcLinkingHelper helper = new CcLinkingHelper( actions.getActionConstructionContext().getRuleErrorConsumer(), @@ -1866,42 +1868,43 @@ public Tuple createLinkingContextFromCompilationOutputs( .addNonCodeLinkerInputs( Sequence.cast(additionalInputs, Artifact.class, "additional_inputs")) .setShouldCreateStaticLibraries(!disallowStaticLibraries) - .addCcLinkingContexts(ccLinkingContexts) .setShouldCreateDynamicLibrary( !disallowDynamicLibraries - && (!featureConfiguration - .getFeatureConfiguration() - .isEnabled(CppRuleClasses.TARGETS_WINDOWS) - || winDefFile != null)) + && !featureConfiguration + .getFeatureConfiguration() + .isEnabled(CppRuleClasses.TARGETS_WINDOWS)) .setStaticLinkType(staticLinkTargetType) .setDynamicLinkType(LinkTargetType.NODEPS_DYNAMIC_LIBRARY) .emitInterfaceSharedLibraries(true) - .setLinkedDLLNameSuffix( - convertFromNoneable(linkedDllNameSuffix, /* defaultValue= */ "")) - .setDefFile(convertFromNoneable(winDefFile, /* defaultValue= */ null)) .setIsStampingEnabled(isStampingEnabled) .addLinkopts(Sequence.cast(userLinkFlags, String.class, "user_link_flags")); if (!asDict(variablesExtension).isEmpty()) { helper.addVariableExtension(new UserVariablesExtension(asDict(variablesExtension))); } try { + CcLinkingOutputs ccLinkingOutputs = CcLinkingOutputs.EMPTY; ImmutableList libraryToLink = ImmutableList.of(); - CcLinkingOutputs ccLinkingOutputs = helper.link(compilationOutputs); - if (!ccLinkingOutputs.isEmpty()) { - LibraryToLink rewrappedForAlwaysLink = - ccLinkingOutputs.getLibraryToLink().toBuilder().setAlwayslink(alwayslink).build(); - ccLinkingOutputs = - CcLinkingOutputs.builder() - .setExecutable(ccLinkingOutputs.getExecutable()) - .setLibraryToLink(rewrappedForAlwaysLink) - .addAllLtoArtifacts(ccLinkingOutputs.getAllLtoArtifacts()) - .build(); - libraryToLink = ImmutableList.of(rewrappedForAlwaysLink); + if (!compilationOutputs.isEmpty()) { + ccLinkingOutputs = helper.link(compilationOutputs); + if (!ccLinkingOutputs.isEmpty()) { + libraryToLink = + ImmutableList.of( + ccLinkingOutputs.getLibraryToLink().toBuilder() + .setAlwayslink(alwayslink) + .build()); + } } CcLinkingContext linkingContext = helper.buildCcLinkingContextFromLibrariesToLink( libraryToLink, CcCompilationContext.EMPTY); - return Tuple.of(linkingContext, ccLinkingOutputs); + return Tuple.of( + CcLinkingContext.merge( + ImmutableList.builder() + .add(linkingContext) + .addAll( + Sequence.cast(linkingContexts, CcLinkingContext.class, "linking_contexts")) + .build()), + ccLinkingOutputs); } catch (RuleErrorException e) { throw Starlark.errorf("%s", e.getMessage()); } @@ -1999,7 +2002,7 @@ protected Tuple compile( Object textualHeadersStarlarkObject, Object additionalExportedHeadersObject, Sequence includes, // expected - Object starlarkLooseIncludes, + Object starlarkIncludes, Sequence quoteIncludes, // expected Sequence systemIncludes, // expected Sequence frameworkIncludes, // expected @@ -2039,7 +2042,7 @@ protected Tuple compile( hdrsCheckingModeObject, implementationCcCompilationContextsObject, coptsFilterObject, - starlarkLooseIncludes)) { + starlarkIncludes)) { CcModule.checkPrivateStarlarkificationAllowlist(thread); } @@ -2047,7 +2050,7 @@ protected Tuple compile( CcToolchainProvider ccToolchainProvider = convertFromNoneable(starlarkCcToolchainProvider, null); - ImmutableList looseIncludes = asClassImmutableList(starlarkLooseIncludes); + ImmutableList looseIncludes = asClassImmutableList(starlarkIncludes); CppModuleMap moduleMap = convertFromNoneable(moduleMapNoneable, /* defaultValue= */ null); ImmutableList additionalModuleMaps = asClassImmutableList(additionalModuleMapsNoneable); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java index d746165463da79..d31cf556766578 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java @@ -363,6 +363,18 @@ public abstract static class Builder implements LibraryToLink.Builder { public final LibraryToLink build() { LibraryToLink result = autoBuild(); Preconditions.checkNotNull(result.getLibraryIdentifier(), result); + Preconditions.checkState( + (result.getObjectFiles() == null + && result.getLtoCompilationContext() == null + && result.getSharedNonLtoBackends() == null) + || result.getStaticLibrary() != null, + result); + Preconditions.checkState( + (result.getPicObjectFiles() == null + && result.getPicLtoCompilationContext() == null + && result.getPicSharedNonLtoBackends() == null) + || result.getPicStaticLibrary() != null, + result); Preconditions.checkState( result.getResolvedSymlinkDynamicLibrary() == null || result.getDynamicLibrary() != null, result); diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java old mode 100755 new mode 100644 index a4fa1d18f1bce2..d1eebd4c09a205 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java @@ -1236,18 +1236,6 @@ CcToolchainConfigInfoT ccToolchainConfigInfoFromStarlark( named = true, documented = false, defaultValue = "unbound"), - @Param( - name = "linked_dll_name_suffix", - positional = false, - named = true, - documented = false, - defaultValue = "unbound"), - @Param( - name = "win_def_file", - documented = false, - positional = false, - named = true, - defaultValue = "unbound"), }) Tuple createLinkingContextFromCompilationOutputs( StarlarkActionFactoryT starlarkActionFactoryApi, @@ -1265,8 +1253,6 @@ Tuple createLinkingContextFromCompilationOutputs( Object grepIncludes, Object variablesExtension, Object stamp, - Object linkedDllNameSuffix, - Object winDefFile, StarlarkThread thread) throws InterruptedException, EvalException; 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 old mode 100755 new mode 100644 index 90b215bbc08670..8ba02c0f08de71 --- 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 @@ -6745,6 +6745,35 @@ public void testObjectFilesInCreateLibrary() throws Exception { .containsExactly("object.pic.o"); } + @Test + public void testObjectFilesInCreateLibraryWithoutStaticLibrary() throws Exception { + setUpCcLinkingContextTest(true); + scratch.file( + "b/BUILD", + "load('//tools/build_defs/cc:rule.bzl', 'crule')", + "crule(name='import_objects_no_lib',", + " objects = ['object.o'],", + ")"); + + checkError( + "//b:import_objects_no_lib", "If you pass 'objects' you must also pass a 'static_library'"); + } + + @Test + public void testObjectFilesInCreateLibraryWithoutPicStaticLibrary() throws Exception { + setUpCcLinkingContextTest(true); + scratch.file( + "b/BUILD", + "load('//tools/build_defs/cc:rule.bzl', 'crule')", + "crule(name='import_objects_no_pic_lib',", + " pic_objects = ['object.pic.o'],", + ")"); + + checkError( + "//b:import_objects_no_pic_lib", + "If you pass 'pic_objects' you must also pass a 'pic_static_library'"); + } + private void setupDebugPackageProviderTest(String fission) throws Exception { getAnalysisMock() .ccSupport()