aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-12-10 18:00:46 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-12-10 20:15:50 +0000
commitdf36eef6464421bc3c2e824c132af902d2c5482a (patch)
tree254140471cb1fe919f8e82655a3b2e56b5154742 /src/main/java/com/google/devtools/build/lib
parentb651026bb25a331790760b9662e0e492aaeaf797 (diff)
Allows cc_{library, binary} targets to depend on objc_library.
-- MOS_MIGRATED_REVID=109909215
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java49
3 files changed, 58 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index 233d02a8c7..44b949c5fc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -31,7 +31,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.Platform;
-import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
@@ -200,8 +199,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
.addDepCcHeaderProviders(
ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
- .addDepCcLinkProviders(
- ruleContext.getPrerequisites("deps", Mode.TARGET, CcLinkParamsProvider.class))
+ .addDepCcLinkProviders(ruleContext)
.addDepObjcProviders(
ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
.addNonPropagatedDepObjcProviders(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index 4e46a59ac9..5528fecee3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -60,6 +60,7 @@ import com.google.common.collect.UnmodifiableIterator;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
@@ -68,6 +69,7 @@ import com.google.devtools.build.lib.rules.cpp.CcLinkParams;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
+import com.google.devtools.build.lib.rules.cpp.CppRunfilesProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -443,8 +445,18 @@ public final class ObjcCommon {
/**
* Sets information from {@code cc_library} dependencies to be used during linking.
*/
- public Builder addDepCcLinkProviders(Iterable<CcLinkParamsProvider> depCcLinkProviders) {
- this.depCcLinkProviders = Iterables.concat(this.depCcLinkProviders, depCcLinkProviders);
+ public Builder addDepCcLinkProviders(RuleContext ruleContext) {
+ for (TransitiveInfoCollection dep : ruleContext.getPrerequisites("deps", Mode.TARGET)) {
+ // Hack to determine if dep is a cc target. Required so objc_library archives packed in
+ // CcLinkParamsProvider do not get consumed as cc targets.
+ if (dep.getProvider(CppRunfilesProvider.class) != null) {
+ CcLinkParamsProvider ccLinkParamsProvider = dep.getProvider(CcLinkParamsProvider.class);
+ this.depCcLinkProviders =
+ Iterables.concat(
+ this.depCcLinkProviders,
+ ImmutableList.<CcLinkParamsProvider>of(ccLinkParamsProvider));
+ }
+ }
return this;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 0cea1618bd..34a6305483 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -17,14 +17,19 @@ package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.rules.objc.XcodeProductType.LIBRARY_STATIC;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+import com.google.devtools.build.lib.rules.cpp.CcLinkParams;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
+import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore;
import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
+import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
+import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
@@ -51,6 +56,33 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
}
/**
+ * A {@link CcLinkParamsStore} to be propagated to dependent cc_{library, binary} targets.
+ */
+ private static class ObjcLibraryCcLinkParamsStore extends CcLinkParamsStore {
+
+ private ObjcCommon common;
+
+ public ObjcLibraryCcLinkParamsStore(ObjcCommon common) {
+ this.common = common;
+ }
+
+ @Override
+ protected void collect(
+ CcLinkParams.Builder builder, boolean linkingStatically, boolean linkShared) {
+ ObjcProvider objcProvider = common.getObjcProvider();
+
+ ImmutableSet.Builder<LibraryToLink> libraries = new ImmutableSet.Builder<>();
+ for (Artifact library : objcProvider.get(ObjcProvider.LIBRARY)) {
+ libraries.add(LinkerInputs.opaqueLibraryToLink(library));
+ }
+
+ libraries.addAll(objcProvider.get(ObjcProvider.CC_LIBRARY));
+
+ builder.addLibraries(libraries.build());
+ }
+ }
+
+ /**
* Constructs an {@link ObjcCommon} instance based on the attributes of the given rule. The rule
* should inherit from {@link ObjcLibraryRule}..
*/
@@ -73,8 +105,7 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class))
.addDepCcHeaderProviders(
ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
- .addDepCcLinkProviders(
- ruleContext.getPrerequisites("deps", Mode.TARGET, CcLinkParamsProvider.class))
+ .addDepCcLinkProviders(ruleContext)
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
.setAlwayslink(alwayslink)
.setHasModuleMap()
@@ -85,10 +116,13 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
@Override
public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException {
- ObjcCommon common = common(
- ruleContext, ImmutableList.<SdkFramework>of(),
- ruleContext.attributes().get("alwayslink", Type.BOOLEAN), new ExtraImportLibraries(),
- ImmutableList.<ObjcProvider>of());
+ final ObjcCommon common =
+ common(
+ ruleContext,
+ ImmutableList.<SdkFramework>of(),
+ ruleContext.attributes().get("alwayslink", Type.BOOLEAN),
+ new ExtraImportLibraries(),
+ ImmutableList.<ObjcProvider>of());
XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.<Artifact>stableOrder()
@@ -122,6 +156,9 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
.addProvider(
InstrumentedFilesProvider.class,
compilationSupport.getInstrumentedFilesProvider(common))
+ .addProvider(
+ CcLinkParamsProvider.class,
+ new CcLinkParamsProvider(new ObjcLibraryCcLinkParamsStore(common)))
.build();
}
}