aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
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.java41
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) {