Allows cc_{library, binary} targets to depend on objc_library.

--
MOS_MIGRATED_REVID=109909215
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 233d02a..44b949c 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.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 @@
                 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 4e46a59..5528fec 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.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.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 @@
     /**
      * 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 0cea161..34a6305 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 @@
 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 @@
   }
 
   /**
+   * 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 @@
             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 @@
 
   @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 @@
         .addProvider(
             InstrumentedFilesProvider.class,
             compilationSupport.getInstrumentedFilesProvider(common))
+        .addProvider(
+            CcLinkParamsProvider.class,
+            new CcLinkParamsProvider(new ObjcLibraryCcLinkParamsStore(common)))
         .build();
   }
 }