diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java | 41 |
1 files changed, 30 insertions, 11 deletions
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 4a2081c7a6..d7e8ff45ac 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 @@ -610,27 +610,30 @@ public final class ObjcProvider extends SkylarkClassObject { * @param avoidCcProviders cc providers which contain the dependency subtrees to subtract */ // TODO(b/19795062): Investigate subtraction generalized to NestedSet. + @SuppressWarnings("unchecked") public ObjcProvider subtractSubtrees(Iterable<ObjcProvider> avoidObjcProviders, Iterable<CcLinkParamsProvider> avoidCcProviders) { // LIBRARY and CC_LIBRARY need to be special cased for objc-cc interop. - // A library which is a dependency of a cc_library may be present in all or any of + // A library which is a dependency of a cc_library may be present in all or any of // three possible locations (and may be duplicated!): // 1. ObjcProvider.LIBRARY // 2. ObjcProvider.CC_LIBRARY // 3. CcLinkParamsProvider->LibraryToLink->getArtifact() // TODO(cpeyser): Clean up objc-cc interop. - HashSet<Artifact> avoidLibrariesSet = new HashSet<>(); + HashSet<PathFragment> avoidLibrariesSet = new HashSet<>(); for (CcLinkParamsProvider linkProvider : avoidCcProviders) { NestedSet<LibraryToLink> librariesToLink = linkProvider.getCcLinkParams(true, false).getLibraries(); for (LibraryToLink libraryToLink : librariesToLink.toList()) { - avoidLibrariesSet.add(libraryToLink.getArtifact()); + avoidLibrariesSet.add(libraryToLink.getArtifact().getRunfilesPath()); } } for (ObjcProvider avoidProvider : avoidObjcProviders) { - avoidLibrariesSet.addAll(avoidProvider.getCcLibraries()); + for (Artifact ccLibrary : avoidProvider.getCcLibraries()) { + avoidLibrariesSet.add(ccLibrary.getRunfilesPath()); + } for (Artifact libraryToAvoid : avoidProvider.getPropagable(LIBRARY)) { - avoidLibrariesSet.add(libraryToAvoid); + avoidLibrariesSet.add(libraryToAvoid.getRunfilesPath()); } } ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(); @@ -639,10 +642,12 @@ public final class ObjcProvider extends SkylarkClassObject { addTransitiveAndFilter(objcProviderBuilder, CC_LIBRARY, ccLibraryNotYetLinked(avoidLibrariesSet)); } else if (key == LIBRARY) { - addTransitiveAndFilter(objcProviderBuilder, LIBRARY, - notContainedIn(avoidLibrariesSet)); + addTransitiveAndFilter(objcProviderBuilder, LIBRARY, notContainedIn(avoidLibrariesSet)); } else if (NON_SUBTRACTABLE_KEYS.contains(key)) { addTransitiveAndAvoid(objcProviderBuilder, key, ImmutableList.<ObjcProvider>of()); + } else if (key.getType() == Artifact.class) { + addTransitiveAndAvoidArtifacts(objcProviderBuilder, ((Key<Artifact>) key), + avoidObjcProviders); } else { addTransitiveAndAvoid(objcProviderBuilder, key, avoidObjcProviders); } @@ -658,8 +663,8 @@ public final class ObjcProvider extends SkylarkClassObject { * return false */ private static Predicate<Artifact> notContainedIn( - final HashSet<Artifact> linkedLibraryArtifacts) { - return libraryToLink -> !linkedLibraryArtifacts.contains(libraryToLink); + final HashSet<PathFragment> linkedLibraryArtifacts) { + return libraryToLink -> !linkedLibraryArtifacts.contains(libraryToLink.getRunfilesPath()); } /** @@ -670,8 +675,9 @@ public final class ObjcProvider extends SkylarkClassObject { * predicate will return false */ private static Predicate<LibraryToLink> ccLibraryNotYetLinked( - final HashSet<Artifact> linkedLibraryArtifacts) { - return libraryToLink -> !linkedLibraryArtifacts.contains(libraryToLink.getArtifact()); + final HashSet<PathFragment> linkedLibraryArtifacts) { + return libraryToLink -> !linkedLibraryArtifacts.contains( + libraryToLink.getArtifact().getRunfilesPath()); } @SuppressWarnings("unchecked") @@ -695,6 +701,19 @@ public final class ObjcProvider extends SkylarkClassObject { } } + private void addTransitiveAndAvoidArtifacts(ObjcProvider.Builder objcProviderBuilder, + Key<Artifact> key, Iterable<ObjcProvider> avoidProviders) { + // Artifacts to avoid may be in a different configuration and thus a different + // root directory, hence only the path fragment after the root directory is compared. + HashSet<PathFragment> avoidPathsSet = new HashSet<>(); + for (ObjcProvider avoidProvider : avoidProviders) { + for (Artifact artifact : avoidProvider.getPropagable(key)) { + avoidPathsSet.add(artifact.getRunfilesPath()); + } + } + addTransitiveAndFilter(objcProviderBuilder, key, notContainedIn(avoidPathsSet)); + } + @SuppressWarnings("unchecked") private <T> void addTransitiveAndAvoid(ObjcProvider.Builder objcProviderBuilder, Key<T> key, Iterable<ObjcProvider> avoidProviders) { |