diff options
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java index 08bbc5d92e..45c7bd5a74 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.OutputGroupProvider; import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.util.MockCcSupport; import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider; import com.google.devtools.build.lib.testutil.TestConstants; @@ -1009,4 +1010,86 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase { Artifact soOutput = getBinArtifact("libfoo.so", target); assertThat(getGeneratingAction(soOutput)).isInstanceOf(FailAction.class); } + + @Test + public void alwaysAddStaticAndDynamicLibraryToFilesToBuildWhenBuilding() throws Exception { + ConfiguredTarget target = + scratchConfiguredTarget("a", "b", "cc_library(name = 'b', srcs = ['source.cc'])"); + + assertThat(artifactsToStrings(getFilesToBuild(target))) + .containsExactly("bin a/libb.a", "bin a/libb.ifso", "bin a/libb.so"); + } + + @Test + public void addOnlyStaticLibraryToFilesToBuildWhenWrappingIffImplicitOutput() throws Exception { + // This shared library has the same name as the archive generated by this rule, so it should + // override said archive. However, said archive should still be put in files to build. + ConfiguredTarget target = + scratchConfiguredTarget("a", "b", "cc_library(name = 'b', srcs = ['libb.so'])"); + + if (target.getTarget().getAssociatedRule().getRuleClassObject().getImplicitOutputsFunction() + != ImplicitOutputsFunction.NONE) { + assertThat(artifactsToStrings(getFilesToBuild(target))).containsExactly("bin a/libb.a"); + } else { + assertThat(artifactsToStrings(getFilesToBuild(target))).isEmpty(); + } + } + + @Test + public void addStaticLibraryToStaticSharedLinkParamsWhenBuilding() throws Exception { + ConfiguredTarget target = + scratchConfiguredTarget("a", "foo", "cc_library(name = 'foo', srcs = ['foo.cc'])"); + + Iterable<Artifact> libraries = + LinkerInputs.toNonSolibArtifacts( + target + .getProvider(CcLinkParamsProvider.class) + .getCcLinkParams(true, true) + .getLibraries()); + assertThat(artifactsToStrings(libraries)).contains("bin a/libfoo.a"); + } + + @Test + public void dontAddStaticLibraryToStaticSharedLinkParamsWhenWrappingSameLibraryIdentifier() + throws Exception { + ConfiguredTarget target = + scratchConfiguredTarget("a", "foo", "cc_library(name = 'foo', srcs = ['libfoo.so'])"); + + Iterable<Artifact> libraries = + LinkerInputs.toNonSolibArtifacts( + target + .getProvider(CcLinkParamsProvider.class) + .getCcLinkParams(true, true) + .getLibraries()); + assertThat(artifactsToStrings(libraries)).doesNotContain("bin a/libfoo.a"); + assertThat(artifactsToStrings(libraries)).contains("src a/libfoo.so"); + } + + @Test + public void onlyAddOneWrappedLibraryWithSameLibraryIdentifierToLinkParams() throws Exception { + ConfiguredTarget target = + scratchConfiguredTarget( + "a", "foo", "cc_library(name = 'foo', srcs = ['libfoo.lo', 'libfoo.so'])"); + + Iterable<Artifact> libraries = + LinkerInputs.toNonSolibArtifacts( + target + .getProvider(CcLinkParamsProvider.class) + .getCcLinkParams(true, true) + .getLibraries()); + assertThat(artifactsToStrings(libraries)).doesNotContain("src a/libfoo.so"); + assertThat(artifactsToStrings(libraries)).contains("src a/libfoo.lo"); + } + + @Test + public void forbidBuildingAndWrappingSameLibraryIdentifier() throws Exception { + checkError( + "a", + "foo", + "in cc_library rule //a:foo: Can't put libfoo.lo into the srcs of a cc_library with the " + + "same name (foo) which also contains other code or objects to link; it shares a name " + + "with libfoo.a, libfoo.ifso, libfoo.so (output compiled and linked from the " + + "non-library sources of this rule), which could cause confusion", + "cc_library(name = 'foo', srcs = ['foo.cc', 'libfoo.lo'])"); + } } |