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
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 ac29d0b..62133d1 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 @@ or <code>.dylib</code> </p> <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/ - .add(attr("shared_library", LABEL).allowedFileTypes(CppFileTypes.SHARED_LIBRARY)) + .add( + attr("shared_library", LABEL) + .allowedFileTypes( + CppFileTypes.SHARED_LIBRARY, CppFileTypes.VERSIONED_SHARED_LIBRARY)) /*<!-- #BLAZE_RULE($cc_import).ATTRIBUTE(interface_library) --> A single interface library for linking the shared library. <p> 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 6b11984..0d79c0f 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
@@ -180,6 +180,42 @@ } @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<Artifact> 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"); ConfiguredTarget target =