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 e9a3fa5c1f1dbc..32445641ace936 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 @@ -68,7 +68,9 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) .add( attr("interface_library", LABEL) .allowedFileTypes( - CppFileTypes.INTERFACE_SHARED_LIBRARY, CppFileTypes.UNIX_SHARED_LIBRARY)) + CppFileTypes.INTERFACE_SHARED_LIBRARY, + CppFileTypes.UNIX_SHARED_LIBRARY, + CppFileTypes.VERSIONED_SHARED_LIBRARY)) /* The list of header files published by this precompiled library to be directly included by sources in dependent rules. 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 index 7259df11d0ea53..4de956fc5e3112 100755 --- 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 @@ -609,7 +609,9 @@ public LibraryToLink createLibraryLinkerInput( } if (interfaceLibrary != null) { String filename = interfaceLibrary.getFilename(); - if (!FileTypeSet.of(CppFileTypes.INTERFACE_SHARED_LIBRARY, CppFileTypes.UNIX_SHARED_LIBRARY) + if (!FileTypeSet.of(CppFileTypes.INTERFACE_SHARED_LIBRARY, + CppFileTypes.UNIX_SHARED_LIBRARY, + CppFileTypes.VERSIONED_SHARED_LIBRARY) .matches(filename)) { extensionErrorsBuilder.append( String.format( diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java index 6926f5b39b98bb..b0e8b6b2a97f8d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java @@ -44,7 +44,9 @@ private Link() {} // uninstantiable FileTypeSet.of(CppFileTypes.SHARED_LIBRARY, CppFileTypes.VERSIONED_SHARED_LIBRARY); public static final FileTypeSet ONLY_INTERFACE_LIBRARY_FILETYPES = - FileTypeSet.of(CppFileTypes.INTERFACE_SHARED_LIBRARY); + FileTypeSet.of(CppFileTypes.INTERFACE_SHARED_LIBRARY, + CppFileTypes.UNIX_SHARED_LIBRARY, + CppFileTypes.VERSIONED_SHARED_LIBRARY); public static final FileTypeSet ARCHIVE_LIBRARY_FILETYPES = FileTypeSet.of( diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl index 719ceb30482cc4..02a59b986bf921 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl @@ -516,10 +516,10 @@ def _build_precompiled_files(ctx): shared_libraries, ) -def _is_versioned_shared_library_extension_valid(shared_library_name): +def _is_versioned_library_extension_valid(shared_library_name, exts): # validate agains the regex "^.+\\.((so)|(dylib))(\\.\\d\\w*)+$", # must match VERSIONED_SHARED_LIBRARY. - for ext in (".so.", ".dylib."): + for ext in exts: name, _, version = shared_library_name.rpartition(ext) if name and version: version_parts = version.split(".") @@ -532,6 +532,9 @@ def _is_versioned_shared_library_extension_valid(shared_library_name): return True return False +def _is_versioned_shared_library_extension_valid(shared_library_name): + return _is_versioned_library_extension_valid(shared_library_name, [".so.", ".dylib."]) + def _is_shared_library_extension_valid(shared_library_name): if (shared_library_name.endswith(".so") or shared_library_name.endswith(".dll") or @@ -540,6 +543,17 @@ def _is_shared_library_extension_valid(shared_library_name): return _is_versioned_shared_library_extension_valid(shared_library_name) +def _is_interface_library_extension_valid(interface_library_name): + if (interface_library_name.endswith(".ifso") or + interface_library_name.endswith(".tbd") or + interface_library_name.endswith(".dll.a") or + interface_library_name.endswith(".dylib") or + interface_library_name.endswith(".so") or + interface_library_name.endswith(".lib")): + return True + + return _is_versioned_library_extension_valid(interface_library_name, [".so.", ".dylib."]) + def _get_providers(deps, provider): providers = [] for dep in deps: @@ -932,6 +946,7 @@ cc_helper = struct( extensions = extensions, build_precompiled_files = _build_precompiled_files, is_shared_library_extension_valid = _is_shared_library_extension_valid, + is_interface_library_extension_valid = _is_interface_library_extension_valid, get_providers = _get_providers, is_compilation_outputs_empty = _is_compilation_outputs_empty, matches_extension = _matches_extension, diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl index 5a6d2ad2c065be..b47fb964dc798b 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl @@ -57,6 +57,10 @@ def _perform_error_checks( not cc_helper.is_shared_library_extension_valid(shared_library_artifact.basename)): fail("'shared_library' does not produce any cc_import shared_library files (expected .so, .dylib or .dll)") + if (interface_library_artifact != None and + not cc_helper.is_interface_library_extension_valid(interface_library_artifact.basename)): + fail("'interface_library' does not produce any cc_import interface_library files (expected .so, .dylib, .ifso)") + def _create_archive_action( ctx, feature_configuration, @@ -194,9 +198,7 @@ cc_import = rule( "static_library": attr.label(allow_single_file = [".a", ".lib"]), "pic_static_library": attr.label(allow_single_file = [".pic.a", ".pic.lib"]), "shared_library": attr.label(allow_single_file = True), - "interface_library": attr.label( - allow_single_file = [".ifso", ".tbd", ".lib", ".so", ".dylib"], - ), + "interface_library": attr.label(allow_single_file = True), "pic_objects": attr.label_list( allow_files = [".o", ".pic.o"], ), 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 d06b9a80fdddeb..d1bee128efa6ce 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 @@ -300,6 +300,31 @@ public void testCcImportWithInterfaceSharedLibrary() throws Exception { .containsExactly("bin _solib_k8/_U_S_Sb_Cfoo___Ub/libfoo.so"); } + @Test + public void testCcImportWithVersionedInterfaceSharedLibrary() throws Exception { + useConfiguration("--cpu=k8"); + ConfiguredTarget target = + scratchConfiguredTarget( + "a", + "foo", + starlarkImplementationLoadStatement, + "cc_import(name = 'foo', interface_library = 'libfoo.so.1ab2.1_a2', system_provided = 1)"); + Artifact library = + target + .get(CcInfo.PROVIDER) + .getCcLinkingContext() + .getLibraries() + .getSingleton() + .getResolvedSymlinkInterfaceLibrary(); + assertThat(artifactsToStrings(ImmutableList.of(library))).containsExactly("src a/libfoo.so.1ab2.1_a2"); + Iterable dynamicLibrariesForRuntime = + target + .get(CcInfo.PROVIDER) + .getCcLinkingContext() + .getDynamicLibrariesForRuntime(/* linkingStatically= */ false); + assertThat(artifactsToStrings(dynamicLibrariesForRuntime)).isEmpty(); + } + @Test public void testCcImportWithBothStaticAndSharedLibraries() throws Exception { useConfiguration("--cpu=k8");