Skip to content

Commit 23d0969

Browse files
erenoncopybara-github
authored andcommitted
Fix _is_shared_library_extension_valid
Consider libfoo-1.0.so.1.0 valid. Do not fail if the name does not contain a '.', return False instead. Closes bazelbuild#14021. PiperOrigin-RevId: 407357609
1 parent 99a1c41 commit 23d0969

File tree

2 files changed

+57
-13
lines changed

2 files changed

+57
-13
lines changed

src/main/starlark/builtins_bzl/common/cc/cc_import.bzl

+15-13
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,21 @@ def _is_shared_library_extension_valid(shared_library_name):
4444
shared_library_name.endswith(".dylib")):
4545
return True
4646

47-
# validate against the regex "^.+\.so(\.\d\w*)+$" for versioned .so files
48-
parts = shared_library_name.split(".")
49-
extension = parts[1]
50-
if extension != "so":
51-
return False
52-
version_parts = parts[2:]
53-
for part in version_parts:
54-
if not part[0].isdigit():
55-
return False
56-
for c in part[1:].elems():
57-
if not (c.isalnum() or c == "_"):
58-
return False
59-
return True
47+
# validate agains the regex "^.+\\.((so)|(dylib))(\\.\\d\\w*)+$",
48+
# must match VERSIONED_SHARED_LIBRARY.
49+
for ext in (".so.", ".dylib."):
50+
name, _, version = shared_library_name.rpartition(ext)
51+
if name and version:
52+
version_parts = version.split(".")
53+
for part in version_parts:
54+
if not part[0].isdigit():
55+
return False
56+
for c in part[1:].elems():
57+
if not (c.isalnum() or c == "_"):
58+
return False
59+
return True
60+
61+
return False
6062

6163
def _perform_error_checks(
6264
system_provided,

src/test/java/com/google/devtools/build/lib/rules/cpp/CcImportBaseConfiguredTargetTest.java

+42
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,35 @@ public void testCcImportWithVersionedSharedLibrary() throws Exception {
216216
.containsExactly("bin _solib_k8/_U_S_Sa_Cfoo___Ua/libfoo.so.1ab2.1_a2");
217217
}
218218

219+
@Test
220+
public void testCcImportWithVersionedSharedLibraryWithDotInTheName() throws Exception {
221+
useConfiguration("--cpu=k8");
222+
223+
ConfiguredTarget target =
224+
scratchConfiguredTarget(
225+
"a",
226+
"foo",
227+
starlarkImplementationLoadStatement,
228+
"cc_import(name = 'foo', shared_library = 'libfoo.qux.so.1ab2.1_a2')");
229+
230+
Artifact dynamicLibrary =
231+
target
232+
.get(CcInfo.PROVIDER)
233+
.getCcLinkingContext()
234+
.getLibraries()
235+
.getSingleton()
236+
.getResolvedSymlinkDynamicLibrary();
237+
Iterable<Artifact> dynamicLibrariesForRuntime =
238+
target
239+
.get(CcInfo.PROVIDER)
240+
.getCcLinkingContext()
241+
.getDynamicLibrariesForRuntime(/* linkingStatically= */ false);
242+
assertThat(artifactsToStrings(ImmutableList.of(dynamicLibrary)))
243+
.containsExactly("src a/libfoo.qux.so.1ab2.1_a2");
244+
assertThat(artifactsToStrings(dynamicLibrariesForRuntime))
245+
.containsExactly("bin _solib_k8/_U_S_Sa_Cfoo___Ua/libfoo.qux.so.1ab2.1_a2");
246+
}
247+
219248
@Test
220249
public void testCcImportWithInvalidVersionedSharedLibrary() throws Exception {
221250
checkError(
@@ -229,6 +258,19 @@ public void testCcImportWithInvalidVersionedSharedLibrary() throws Exception {
229258
")");
230259
}
231260

261+
@Test
262+
public void testCcImportWithInvalidSharedLibraryNoExtension() throws Exception {
263+
checkError(
264+
"a",
265+
"foo",
266+
"does not produce any cc_import shared_library files " + "(expected",
267+
starlarkImplementationLoadStatement,
268+
"cc_import(",
269+
" name = 'foo',",
270+
" shared_library = 'libfoo',",
271+
")");
272+
}
273+
232274
@Test
233275
public void testCcImportWithInterfaceSharedLibrary() throws Exception {
234276
useConfiguration("--cpu=k8");

0 commit comments

Comments
 (0)