From 5efc8c473596f797445ecc4be7a0b0585654d8fc Mon Sep 17 00:00:00 2001
From: Googler
Date: Fri, 6 Dec 2019 05:32:05 -0800
Subject: [PATCH] Add support for versioned shared libraries in CcImport
Permit ".so" files with "version extension" strings in CcImport rules using
existing shared version matcher.
Allows use of files like "foo.so.1a2"
PiperOrigin-RevId: 284166839
---
.../build/lib/rules/cpp/CcImportRule.java | 5 ++-
.../cpp/CcImportBaseConfiguredTargetTest.java | 36 +++++++++++++++++++
2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java
index ac29d0b8d8fd0d..62133d1900f4af 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java
@@ -51,7 +51,10 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env)
or .dylib
*/
- .add(attr("shared_library", LABEL).allowedFileTypes(CppFileTypes.SHARED_LIBRARY))
+ .add(
+ attr("shared_library", LABEL)
+ .allowedFileTypes(
+ CppFileTypes.SHARED_LIBRARY, CppFileTypes.VERSIONED_SHARED_LIBRARY))
/*
A single interface library for linking the shared library.
Permitted file types:
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcImportBaseConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcImportBaseConfiguredTargetTest.java
index 6b1198403eee3f..0d79c0f97ed3d0 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcImportBaseConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcImportBaseConfiguredTargetTest.java
@@ -179,6 +179,42 @@ public void testCcImportWithSharedLibrary() throws Exception {
.containsExactly("bin _solib_k8/_U_S_Sa_Cfoo___Ua/libfoo.so");
}
+ @Test
+ public void testCcImportWithVersionedSharedLibrary() throws Exception {
+ useConfiguration("--cpu=k8");
+ ConfiguredTarget target =
+ scratchConfiguredTarget(
+ "a",
+ "foo",
+ skylarkImplementationLoadStatement,
+ "cc_import(name = 'foo', shared_library = 'libfoo.so.1ab2.1_a2')");
+ Artifact dynamicLibrary =
+ Iterables.getOnlyElement(target.get(CcInfo.PROVIDER).getCcLinkingContext().getLibraries())
+ .getResolvedSymlinkDynamicLibrary();
+ Iterable dynamicLibrariesForRuntime =
+ target
+ .get(CcInfo.PROVIDER)
+ .getCcLinkingContext()
+ .getDynamicLibrariesForRuntime(/* linkingStatically= */ false);
+ assertThat(artifactsToStrings(ImmutableList.of(dynamicLibrary)))
+ .containsExactly("src a/libfoo.so.1ab2.1_a2");
+ assertThat(artifactsToStrings(dynamicLibrariesForRuntime))
+ .containsExactly("bin _solib_k8/_U_S_Sa_Cfoo___Ua/libfoo.so.1ab2.1_a2");
+ }
+
+ @Test
+ public void testCcImportWithInvalidVersionedSharedLibrary() throws Exception {
+ checkError(
+ "a",
+ "foo",
+ "does not produce any cc_import shared_library files " + "(expected .so, .dylib or .dll)",
+ skylarkImplementationLoadStatement,
+ "cc_import(",
+ " name = 'foo',",
+ " shared_library = 'libfoo.so.1ab2.ab',",
+ ")");
+ }
+
@Test
public void testCcImportWithInterfaceSharedLibrary() throws Exception {
useConfiguration("--cpu=k8");