aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
diff options
context:
space:
mode:
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.java83
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'])");
+ }
}