C++: Simplify code that used old LibraryToLink
RELNOTES:none
PiperOrigin-RevId: 234100718
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index ad6bba3..4a5b1e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -50,7 +50,6 @@
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.SolibLibraryToLink;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -326,52 +325,6 @@
ccLinkingOutputs = linkingHelper.link(ccCompilationOutputs);
}
- /*
- * Add the libraries from srcs, if any. For static/mostly static
- * linking we setup the dynamic libraries if there are no static libraries
- * to choose from. Path to the libraries will be mangled to avoid using
- * absolute path names on the -rpath, but library filenames will be
- * preserved (since some libraries might have SONAME tag) - symlink will
- * be created to the parent directory instead.
- *
- * For compatibility with existing BUILD files, any ".a" or ".lo" files listed in
- * srcs are assumed to be position-independent code, or at least suitable for
- * inclusion in shared libraries, unless they end with ".nopic.a" or ".nopic.lo".
- *
- * Note that some target platforms do not require shared library code to be PIC.
- */
- ImmutableList<LinkerInputs.LibraryToLink> precompiledStaticLibraries =
- ImmutableList.<LinkerInputs.LibraryToLink>builder()
- .addAll(
- LinkerInputs.opaqueLibrariesToLink(
- ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getStaticLibraries()))
- .addAll(
- LinkerInputs.opaqueLibrariesToLink(
- ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
- precompiledFiles.getAlwayslinkStaticLibraries()))
- .build();
-
- ImmutableList<LinkerInputs.LibraryToLink> precompiledPicStaticLibraries =
- ImmutableList.<LinkerInputs.LibraryToLink>builder()
- .addAll(
- LinkerInputs.opaqueLibrariesToLink(
- ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getPicStaticLibraries()))
- .addAll(
- LinkerInputs.opaqueLibrariesToLink(
- ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
- precompiledFiles.getPicAlwayslinkLibraries()))
- .build();
-
- List<LinkerInputs.LibraryToLink> dynamicLibraries =
- ImmutableList.copyOf(
- Iterables.transform(
- precompiledFiles.getSharedLibraries(),
- library ->
- LinkerInputs.solibLibraryToLink(
- common.getDynamicLibrarySymlink(library, true),
- library,
- CcLinkingOutputs.libraryIdentifierOf(library))));
-
ImmutableSortedMap.Builder<String, NestedSet<Artifact>> outputGroups =
ImmutableSortedMap.naturalOrder();
if (!ccLinkingOutputs.isEmpty()) {
@@ -385,10 +338,7 @@
}
List<LibraryToLink> precompiledLibraries =
convertPrecompiledLibrariesToLibraryToLink(
- ruleContext.getFragment(CppConfiguration.class).forcePic(),
- precompiledStaticLibraries,
- precompiledPicStaticLibraries,
- dynamicLibraries);
+ common, ruleContext.getFragment(CppConfiguration.class).forcePic(), precompiledFiles);
if (!ccCompilationOutputs.isEmpty()) {
checkIfLinkOutputsCollidingWithPrecompiledFiles(
@@ -708,94 +658,112 @@
return ccCompilationOutputsIsEmpty && !ccLinkingOutputsIsEmpty;
}
+ private static Map<String, Artifact> buildMapIdentifierToArtifact(Iterable<Artifact> artifacts) {
+ ImmutableMap.Builder<String, Artifact> libraries = ImmutableMap.builder();
+ for (Artifact artifact : artifacts) {
+ libraries.put(CcLinkingOutputs.libraryIdentifierOf(artifact), artifact);
+ }
+ return libraries.build();
+ }
+
+ /*
+ * Add the libraries from srcs, if any. For static/mostly static
+ * linking we setup the dynamic libraries if there are no static libraries
+ * to choose from. Path to the libraries will be mangled to avoid using
+ * absolute path names on the -rpath, but library filenames will be
+ * preserved (since some libraries might have SONAME tag) - symlink will
+ * be created to the parent directory instead.
+ *
+ * For compatibility with existing BUILD files, any ".a" or ".lo" files listed in
+ * srcs are assumed to be position-independent code, or at least suitable for
+ * inclusion in shared libraries, unless they end with ".nopic.a" or ".nopic.lo".
+ *
+ * Note that some target platforms do not require shared library code to be PIC.
+ */
private static List<LibraryToLink> convertPrecompiledLibrariesToLibraryToLink(
- boolean forcePic,
- List<LinkerInputs.LibraryToLink> staticLibraries,
- List<LinkerInputs.LibraryToLink> picStaticLibraries,
- List<LinkerInputs.LibraryToLink> dynamicLibrariesForRuntime) {
+ CcCommon common, boolean forcePic, PrecompiledFiles precompiledFiles) {
ImmutableList.Builder<LibraryToLink> librariesToLink = ImmutableList.builder();
+ Map<String, Artifact> staticLibraries =
+ buildMapIdentifierToArtifact(precompiledFiles.getStaticLibraries());
+ Map<String, Artifact> picStaticLibraries =
+ buildMapIdentifierToArtifact(precompiledFiles.getPicStaticLibraries());
+ Map<String, Artifact> alwayslinkStaticLibraries =
+ buildMapIdentifierToArtifact(precompiledFiles.getAlwayslinkStaticLibraries());
+ Map<String, Artifact> alwayslinkPicStaticLibraries =
+ buildMapIdentifierToArtifact(precompiledFiles.getPicAlwayslinkLibraries());
+ Map<String, Artifact> dynamicLibraries =
+ buildMapIdentifierToArtifact(precompiledFiles.getSharedLibraries());
+
Set<String> identifiersUsed = new HashSet<>();
- // Here we hae an O(n^2) algorithm, the size of the inputs is never big though, we only work
- // here with the local libraries, none of the libraries of the transitive closure.
- for (LinkerInputs.LibraryToLink staticLibrary : staticLibraries) {
+ for (Map.Entry<String, Artifact> staticLibraryEntry :
+ Iterables.concat(staticLibraries.entrySet(), alwayslinkStaticLibraries.entrySet())) {
LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
- String identifier = staticLibrary.getLibraryIdentifier();
+ String identifier = staticLibraryEntry.getKey();
libraryToLinkBuilder.setLibraryIdentifier(identifier);
- List<LinkerInputs.LibraryToLink> sameIdentifierPicStaticLibraries =
- picStaticLibraries.stream()
- .filter(x -> x.getLibraryIdentifier().equals(identifier))
- .collect(ImmutableList.toImmutableList());
- boolean hadPic = false;
- if (!sameIdentifierPicStaticLibraries.isEmpty()) {
- hadPic = true;
- libraryToLinkBuilder.setPicStaticLibrary(
- sameIdentifierPicStaticLibraries.get(0).getArtifact());
- }
- if (!forcePic || !hadPic) {
- libraryToLinkBuilder.setStaticLibrary(staticLibrary.getArtifact());
- }
- List<LinkerInputs.LibraryToLink> sameIdentifierDynamicLibraries =
- dynamicLibrariesForRuntime.stream()
- .filter(x -> x.getLibraryIdentifier().equals(identifier))
- .collect(ImmutableList.toImmutableList());
- if (!sameIdentifierDynamicLibraries.isEmpty()) {
- LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
- libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
- if (dynamicLibrary instanceof SolibLibraryToLink) {
- libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
- dynamicLibrary.getOriginalLibraryArtifact());
+ boolean hasPic = picStaticLibraries.containsKey(identifier);
+ boolean hasAlwaysPic = alwayslinkPicStaticLibraries.containsKey(identifier);
+ if (hasPic || hasAlwaysPic) {
+ Artifact picStaticLibrary = null;
+ if (hasPic) {
+ picStaticLibrary = picStaticLibraries.get(identifier);
+ } else {
+ picStaticLibrary = alwayslinkPicStaticLibraries.get(identifier);
}
+ libraryToLinkBuilder.setPicStaticLibrary(picStaticLibrary);
}
- libraryToLinkBuilder.setAlwayslink(
- staticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
+ if (!forcePic || !(hasPic || hasAlwaysPic)) {
+ libraryToLinkBuilder.setStaticLibrary(staticLibraryEntry.getValue());
+ }
+ if (dynamicLibraries.containsKey(identifier)) {
+ Artifact library = dynamicLibraries.get(identifier);
+ Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+ libraryToLinkBuilder.setDynamicLibrary(symlink);
+ libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
+ }
+ libraryToLinkBuilder.setAlwayslink(alwayslinkStaticLibraries.containsKey(identifier));
identifiersUsed.add(identifier);
librariesToLink.add(libraryToLinkBuilder.build());
}
- for (LinkerInputs.LibraryToLink picStaticLibrary : picStaticLibraries) {
- String identifier = picStaticLibrary.getLibraryIdentifier();
+ for (Map.Entry<String, Artifact> picStaticLibraryEntry :
+ Iterables.concat(picStaticLibraries.entrySet(), alwayslinkPicStaticLibraries.entrySet())) {
+ String identifier = picStaticLibraryEntry.getKey();
if (identifiersUsed.contains(identifier)) {
continue;
}
LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
- libraryToLinkBuilder.setPicStaticLibrary(picStaticLibrary.getArtifact());
libraryToLinkBuilder.setLibraryIdentifier(identifier);
- List<LinkerInputs.LibraryToLink> sameIdentifierDynamicLibraries =
- dynamicLibrariesForRuntime.stream()
- .filter(x -> x.getLibraryIdentifier().equals(identifier))
- .collect(ImmutableList.toImmutableList());
- if (!sameIdentifierDynamicLibraries.isEmpty()) {
- LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
- libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
- if (dynamicLibrary instanceof SolibLibraryToLink) {
- libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
- dynamicLibrary.getOriginalLibraryArtifact());
- }
+ libraryToLinkBuilder.setPicStaticLibrary(picStaticLibraryEntry.getValue());
+ if (dynamicLibraries.containsKey(identifier)) {
+ Artifact library = dynamicLibraries.get(identifier);
+ Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+ libraryToLinkBuilder.setDynamicLibrary(symlink);
+ libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
}
- libraryToLinkBuilder.setAlwayslink(
- picStaticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
+ libraryToLinkBuilder.setAlwayslink(alwayslinkPicStaticLibraries.containsKey(identifier));
identifiersUsed.add(identifier);
librariesToLink.add(libraryToLinkBuilder.build());
}
- for (LinkerInputs.LibraryToLink dynamicLibrary : dynamicLibrariesForRuntime) {
- String identifier = dynamicLibrary.getLibraryIdentifier();
+ for (Map.Entry<String, Artifact> dynamicLibraryEntry : dynamicLibraries.entrySet()) {
+ String identifier = dynamicLibraryEntry.getKey();
if (identifiersUsed.contains(identifier)) {
continue;
}
LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
- libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
libraryToLinkBuilder.setLibraryIdentifier(identifier);
- if (dynamicLibrary instanceof SolibLibraryToLink) {
- libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
- dynamicLibrary.getOriginalLibraryArtifact());
- }
+ Artifact library = dynamicLibraryEntry.getValue();
+ Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+ libraryToLinkBuilder.setDynamicLibrary(symlink);
+ libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
librariesToLink.add(libraryToLinkBuilder.build());
}
return librariesToLink.build();
}
+
+
private static void checkIfLinkOutputsCollidingWithPrecompiledFiles(
RuleContext ruleContext,
CcLinkingOutputs ccLinkingOutputs,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index 47086bd..67db9ed 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -29,6 +29,7 @@
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
@@ -668,7 +669,7 @@
if (shouldLinkTransitively) {
CcLinkingContext ccLinkingContext = CcLinkingContext.merge(ccLinkingContexts);
List<LinkerInputs.LibraryToLink> libraries =
- LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
+ convertLibraryToLinkListToLinkerInputList(
ccLinkingContext.getLibraries(),
linkingMode != LinkingMode.DYNAMIC,
dynamicLinkType.isDynamicLibrary());
@@ -820,4 +821,65 @@
return result;
}
+
+ private static List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLinkerInputList(
+ NestedSet<LibraryToLink> librariesToLink, boolean staticMode, boolean forDynamicLibrary) {
+ ImmutableList.Builder<LinkerInputs.LibraryToLink> librariesToLinkBuilder =
+ ImmutableList.builder();
+ for (LibraryToLink libraryToLink : librariesToLink) {
+ LinkerInputs.LibraryToLink staticLibraryToLink =
+ libraryToLink.getStaticLibrary() == null ? null : libraryToLink.getStaticLibraryToLink();
+ LinkerInputs.LibraryToLink picStaticLibraryToLink =
+ libraryToLink.getPicStaticLibrary() == null
+ ? null
+ : libraryToLink.getPicStaticLibraryToLink();
+ LinkerInputs.LibraryToLink libraryToLinkToUse = null;
+ if (staticMode) {
+ if (forDynamicLibrary) {
+ if (picStaticLibraryToLink != null) {
+ libraryToLinkToUse = picStaticLibraryToLink;
+ } else if (staticLibraryToLink != null) {
+ libraryToLinkToUse = staticLibraryToLink;
+ }
+ } else {
+ if (staticLibraryToLink != null) {
+ libraryToLinkToUse = staticLibraryToLink;
+ } else if (picStaticLibraryToLink != null) {
+ libraryToLinkToUse = picStaticLibraryToLink;
+ }
+ }
+ if (libraryToLinkToUse == null) {
+ if (libraryToLink.getInterfaceLibrary() != null) {
+ libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+ } else if (libraryToLink.getDynamicLibrary() != null) {
+ libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
+ }
+ }
+ } else {
+ if (libraryToLink.getInterfaceLibrary() != null) {
+ libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+ } else if (libraryToLink.getDynamicLibrary() != null) {
+ libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
+ }
+ if (libraryToLinkToUse == null) {
+ if (forDynamicLibrary) {
+ if (picStaticLibraryToLink != null) {
+ libraryToLinkToUse = picStaticLibraryToLink;
+ } else if (staticLibraryToLink != null) {
+ libraryToLinkToUse = staticLibraryToLink;
+ }
+ } else {
+ if (staticLibraryToLink != null) {
+ libraryToLinkToUse = staticLibraryToLink;
+ } else if (picStaticLibraryToLink != null) {
+ libraryToLinkToUse = picStaticLibraryToLink;
+ }
+ }
+ }
+ }
+ Preconditions.checkNotNull(libraryToLinkToUse);
+ librariesToLinkBuilder.add(libraryToLinkToUse);
+ }
+ return librariesToLinkBuilder.build();
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
index fba355e..5811cd9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
@@ -29,16 +29,13 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.SolibLibraryToLink;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.util.Fingerprint;
-import com.google.devtools.build.lib.vfs.FileSystemUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
-import java.util.ListIterator;
import javax.annotation.Nullable;
/**
@@ -52,67 +49,6 @@
@AutoValue
public abstract class LibraryToLink implements LibraryToLinkApi<Artifact> {
- public static List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLibraryToLinkList(
- NestedSet<LibraryToLink> librariesToLink, boolean staticMode, boolean forDynamicLibrary) {
- ImmutableList.Builder<LinkerInputs.LibraryToLink> librariesToLinkBuilder =
- ImmutableList.builder();
- for (LibraryToLink libraryToLink : librariesToLink) {
- LinkerInputs.LibraryToLink staticLibraryToLink =
- libraryToLink.getStaticLibrary() == null ? null : libraryToLink.getStaticLibraryToLink();
- LinkerInputs.LibraryToLink picStaticLibraryToLink =
- libraryToLink.getPicStaticLibrary() == null
- ? null
- : libraryToLink.getPicStaticLibraryToLink();
- LinkerInputs.LibraryToLink libraryToLinkToUse = null;
- if (staticMode) {
- if (forDynamicLibrary) {
- if (picStaticLibraryToLink != null) {
- libraryToLinkToUse = picStaticLibraryToLink;
- } else if (staticLibraryToLink != null) {
- libraryToLinkToUse = staticLibraryToLink;
- }
- } else {
- if (staticLibraryToLink != null) {
- libraryToLinkToUse = staticLibraryToLink;
- } else if (picStaticLibraryToLink != null) {
- libraryToLinkToUse = picStaticLibraryToLink;
- }
- }
- if (libraryToLinkToUse == null) {
- if (libraryToLink.getInterfaceLibrary() != null) {
- libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
- } else if (libraryToLink.getDynamicLibrary() != null) {
- libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
- }
- }
- } else {
- if (libraryToLink.getInterfaceLibrary() != null) {
- libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
- } else if (libraryToLink.getDynamicLibrary() != null) {
- libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
- }
- if (libraryToLinkToUse == null) {
- if (forDynamicLibrary) {
- if (picStaticLibraryToLink != null) {
- libraryToLinkToUse = picStaticLibraryToLink;
- } else if (staticLibraryToLink != null) {
- libraryToLinkToUse = staticLibraryToLink;
- }
- } else {
- if (staticLibraryToLink != null) {
- libraryToLinkToUse = staticLibraryToLink;
- } else if (picStaticLibraryToLink != null) {
- libraryToLinkToUse = picStaticLibraryToLink;
- }
- }
- }
- }
- Preconditions.checkNotNull(libraryToLinkToUse);
- librariesToLinkBuilder.add(libraryToLinkToUse);
- }
- return librariesToLinkBuilder.build();
- }
-
public Artifact getDynamicLibraryForRuntimeOrNull(boolean linkingStatically) {
if (getDynamicLibrary() == null) {
return null;
@@ -522,100 +458,6 @@
return new AutoValue_LibraryToLink.Builder().setMustKeepDebug(false).setAlwayslink(false);
}
- @Nullable
- @SuppressWarnings("ReferenceEquality")
- static String setDynamicArtifactsAndReturnIdentifier(
- LibraryToLink.Builder libraryToLinkBuilder,
- LinkerInputs.LibraryToLink dynamicModeParamsForExecutableEntry,
- LinkerInputs.LibraryToLink dynamicModeParamsForDynamicLibraryEntry,
- ListIterator<Artifact> runtimeLibraryIterator) {
- Preconditions.checkNotNull(runtimeLibraryIterator);
- Artifact artifact = dynamicModeParamsForExecutableEntry.getArtifact();
- String libraryIdentifier = null;
- Artifact runtimeArtifact = null;
- if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
- == ArtifactCategory.DYNAMIC_LIBRARY
- || dynamicModeParamsForExecutableEntry.getArtifactCategory()
- == ArtifactCategory.INTERFACE_LIBRARY) {
- Preconditions.checkState(
- dynamicModeParamsForExecutableEntry == dynamicModeParamsForDynamicLibraryEntry);
- libraryIdentifier = dynamicModeParamsForExecutableEntry.getLibraryIdentifier();
-
- // Not every library to link has a corresponding runtime artifact, for example this is the
- // case when it is provided by the system. Here we check if the next runtime artifact has the
- // same basename as the current library to link, if it is, then we match them together. If
- // isn't, then we must rewind the iterator since every call to next() advances it.
- if (runtimeLibraryIterator.hasNext()) {
- runtimeArtifact = runtimeLibraryIterator.next();
- if (!doArtifactsHaveSameBasename(artifact, runtimeArtifact)) {
- runtimeArtifact = null;
- runtimeLibraryIterator.previous();
- }
- }
- }
-
- if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
- == ArtifactCategory.DYNAMIC_LIBRARY) {
- // The SolibLibraryToLink implementation returns ArtifactCategory.DYNAMIC_LIBRARY even if
- // the library being symlinked is an interface library. This was probably an oversight that
- // didn't cause any issues. In any case, here we have to figure out whether the library is
- // an interface library or not by checking the extension if it's a symlink.
-
- if (dynamicModeParamsForExecutableEntry instanceof SolibLibraryToLink) {
- // Note: with the old way of doing C++ linking, we lose the information regarding the
- // runtime library. If {@code runtimeArtifact} is a symlink we only have the symlink but
- // not a reference to the artifact it points to. We can infer whether it's a symlink by
- // looking at whether the interface library is a symlink, however, we can't find out what
- // it points to. With the new API design, we won't lose this information anymore. This is
- // the way it has been done until now, but it wasn't a problem because symlinks get
- // automatically resolved when they are in runfiles.
- if (ArtifactCategory.INTERFACE_LIBRARY
- .getAllowedExtensions()
- .contains("." + artifact.getExtension())) {
- libraryToLinkBuilder.setInterfaceLibrary(artifact);
- libraryToLinkBuilder.setResolvedSymlinkInterfaceLibrary(
- dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
- if (runtimeArtifact != null) {
- libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
- }
- } else {
- Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
- libraryToLinkBuilder.setDynamicLibrary(artifact);
- libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
- dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
- }
- } else {
- libraryToLinkBuilder.setDynamicLibrary(artifact);
- Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
- }
- } else if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
- == ArtifactCategory.INTERFACE_LIBRARY) {
- Preconditions.checkState(
- !(dynamicModeParamsForExecutableEntry instanceof SolibLibraryToLink));
- libraryToLinkBuilder.setInterfaceLibrary(artifact);
- if (runtimeArtifact != null) {
- libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
- }
- }
- return libraryIdentifier;
- }
-
- private static boolean doArtifactsHaveSameBasename(Artifact first, Artifact second) {
- String nameFirst = removeAllExtensions(first.getRootRelativePath().getPathString());
- String nameSecond = removeAllExtensions(second.getRootRelativePath().getPathString());
- return nameFirst.equals(nameSecond);
- }
-
- private static String removeAllExtensions(String name) {
- String previousWithoutExtension = FileSystemUtils.removeExtension(name);
- String currentWithoutExtension = FileSystemUtils.removeExtension(previousWithoutExtension);
- while (!previousWithoutExtension.equals(currentWithoutExtension)) {
- previousWithoutExtension = currentWithoutExtension;
- currentWithoutExtension = FileSystemUtils.removeExtension(previousWithoutExtension);
- }
- return currentWithoutExtension;
- }
-
LinkerInputs.LibraryToLink getStaticLibraryToLink() {
Preconditions.checkNotNull(getStaticLibrary(), this);
if (staticLibraryToLink != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 0e532ed..c466bf8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -781,14 +781,9 @@
// TODO(cpeyser): Clean up objc-cc interop.
HashSet<PathFragment> avoidLibrariesSet = new HashSet<>();
for (CcLinkingContext ccLinkingContext : avoidCcProviders) {
- List<com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink> librariesToLink =
- LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
- ccLinkingContext.getLibraries(),
- /* staticMode= */ true,
- /* forDynamicLibrary= */ false);
- for (com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink libraryToLink :
- librariesToLink) {
- avoidLibrariesSet.add(libraryToLink.getArtifact().getRunfilesPath());
+ List<Artifact> libraries = ccLinkingContext.getStaticModeParamsForExecutableLibraries();
+ for (Artifact library : libraries) {
+ avoidLibrariesSet.add(library.getRunfilesPath());
}
}
for (ObjcProvider avoidProvider : avoidObjcProviders) {