diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java index fd819a5a33e565..d81097a57e73ca 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java @@ -673,6 +673,7 @@ public abstract static class LibraryToLinkValue extends VariableValueAdapter { public static final String OBJECT_FILES_FIELD_NAME = "object_files"; public static final String NAME_FIELD_NAME = "name"; + public static final String PATH_FIELD_NAME = "path"; public static final String TYPE_FIELD_NAME = "type"; public static final String IS_WHOLE_ARCHIVE_FIELD_NAME = "is_whole_archive"; @@ -682,8 +683,8 @@ public static LibraryToLinkValue forDynamicLibrary(String name) { return interner.intern(new ForDynamicLibrary(name)); } - public static LibraryToLinkValue forVersionedDynamicLibrary(String name) { - return interner.intern(new ForVersionedDynamicLibrary(name)); + public static LibraryToLinkValue forVersionedDynamicLibrary(String name, String path) { + return interner.intern(new ForVersionedDynamicLibrary(name, path)); } public static LibraryToLinkValue forInterfaceLibrary(String name) { @@ -809,8 +810,40 @@ protected String getTypeName() { } private static final class ForVersionedDynamicLibrary extends LibraryToLinkValueWithName { - private ForVersionedDynamicLibrary(String name) { + private final String path; + + private ForVersionedDynamicLibrary(String name, String path) { super(name); + this.path = path; + } + + @Override + public VariableValue getFieldValue( + String variableName, + String field, + @Nullable ArtifactExpander expander, + boolean throwOnMissingVariable) { + if (PATH_FIELD_NAME.equals(field)) { + return new StringValue(path); + } + return super.getFieldValue(variableName, field, expander, throwOnMissingVariable); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ForVersionedDynamicLibrary)) { + return false; + } + if (this == obj) { + return true; + } + ForVersionedDynamicLibrary other = (ForVersionedDynamicLibrary) obj; + return this.path.equals(other.path) && super.equals(other); + } + + @Override + public int hashCode() { + return 31 * super.hashCode() + path.hashCode(); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibrariesToLinkCollector.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibrariesToLinkCollector.java index 713741a5d03d1c..6c9aa3aec907f7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibrariesToLinkCollector.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibrariesToLinkCollector.java @@ -614,7 +614,8 @@ private void addDynamicInputLinkOptions( librariesToLink.addValue(LibraryToLinkValue.forDynamicLibrary(libName)); } else if (CppFileTypes.SHARED_LIBRARY.matches(name) || CppFileTypes.VERSIONED_SHARED_LIBRARY.matches(name)) { - librariesToLink.addValue(LibraryToLinkValue.forVersionedDynamicLibrary(name)); + librariesToLink.addValue( + LibraryToLinkValue.forVersionedDynamicLibrary(name, inputArtifact.getExecPathString())); } else { // Interface shared objects have a non-standard extension // that the linker won't be able to find. So use the diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkValueTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkValueTest.java index 6cc1e2ab786f1b..afdecdc99afd64 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkValueTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkValueTest.java @@ -46,9 +46,10 @@ public void equalsAndHashCode() { // #forVersionedDynamicLibrary equalsTester.addEqualityGroup( - LibraryToLinkValue.forVersionedDynamicLibrary("foo"), - LibraryToLinkValue.forVersionedDynamicLibrary("foo")); - equalsTester.addEqualityGroup(LibraryToLinkValue.forVersionedDynamicLibrary("bar")); + LibraryToLinkValue.forVersionedDynamicLibrary("foo", /* path= */ ""), + LibraryToLinkValue.forVersionedDynamicLibrary("foo", /* path= */ "")); + equalsTester.addEqualityGroup( + LibraryToLinkValue.forVersionedDynamicLibrary("bar", /* path= */ "")); // #forInterfaceLibrary equalsTester.addEqualityGroup( @@ -140,7 +141,8 @@ public void getFieldValue_forDynamicLibrary() throws Exception { @Test public void getFieldValue_forVersionedDynamicLibrary() throws Exception { - LibraryToLinkValue libraryToLinkValue = LibraryToLinkValue.forVersionedDynamicLibrary("foo"); + LibraryToLinkValue libraryToLinkValue = + LibraryToLinkValue.forVersionedDynamicLibrary("foo", "foo/bar.so"); assertThat( libraryToLinkValue .getFieldValue( @@ -150,6 +152,15 @@ public void getFieldValue_forVersionedDynamicLibrary() throws Exception { /* throwOnMissingVariable= */ false) .getStringValue("variable name doesn't matter", PathMapper.NOOP)) .isEqualTo("versioned_dynamic_library"); + assertThat( + libraryToLinkValue + .getFieldValue( + /* variableName= */ "variable name doesn't matter", + /* field= */ "path", + /* expander= */ null, + /* throwOnMissingVariable= */ false) + .getStringValue("variable name doesn't matter")) + .isEqualTo("foo/bar.so"); assertThat( libraryToLinkValue .getFieldValue(