Adds an implicit "fully_linked" archive output to objc_library. 

Adds a fully linked static library as an implicit target of objc_library. This implicit target is a library that contains the full transitive closure of libraries inside of it. For example, if liba depends on libb, then liba_fully_linked contains all of the symbols in liba and libb.

Tested:
Added unit tests that check the right libraries are linked in.

--
MOS_MIGRATED_REVID=103334108
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index f8d41c3..ea4188c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.rules.objc;
 
+import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
 import static com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DEFINE;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FORCE_LOAD_LIBRARY;
@@ -65,6 +66,7 @@
 import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
@@ -126,6 +128,12 @@
       };
 
   /**
+   * Defines a library that contains the transitive closure of dependencies.
+   */
+  public static final SafeImplicitOutputsFunction FULLY_LINKED_LIB =
+      fromTemplates("%{name}_fully_linked.a");
+
+  /**
    * Iterable wrapper providing strong type safety for arguments to binary linking.
    */
   static final class ExtraLinkArgs extends IterableWrapper<String> {
@@ -173,7 +181,8 @@
    * @param common common information about this rule and its dependencies
    * @return this compilation support
    */
-  CompilationSupport registerCompileAndArchiveActions(ObjcCommon common) {
+  CompilationSupport registerCompileAndArchiveActions(ObjcCommon common)
+      throws InterruptedException {
     if (common.getCompilationArtifacts().isPresent()) {
       registerGenerateModuleMapAction(common.getCompilationArtifacts());
       IntermediateArtifacts intermediateArtifacts =
@@ -189,7 +198,8 @@
           intermediateArtifacts,
           common.getObjcProvider(),
           moduleMap,
-          ruleContext.getConfiguration().isCodeCoverageEnabled());
+          ruleContext.getConfiguration().isCodeCoverageEnabled(),
+          true);
     }
     return this;
   }
@@ -203,7 +213,8 @@
       IntermediateArtifacts intermediateArtifacts,
       ObjcProvider objcProvider,
       Optional<CppModuleMap> moduleMap,
-      boolean isCodeCoverageEnabled) {
+      boolean isCodeCoverageEnabled,
+      boolean isFullyLinkEnabled) throws InterruptedException {
     ImmutableList.Builder<Artifact> objFiles = new ImmutableList.Builder<>();
     for (Artifact sourceFile : compilationArtifacts.getSrcs()) {
       Artifact objFile = intermediateArtifacts.objFile(sourceFile);
@@ -243,6 +254,10 @@
     for (Artifact archive : compilationArtifacts.getArchive().asSet()) {
       registerArchiveActions(intermediateArtifacts, objFiles, archive);
     }
+
+    if (isFullyLinkEnabled) {
+      registerFullyLinkAction(objcProvider);
+    }
   }
 
   private void registerCompileAction(
@@ -503,6 +518,30 @@
     return actions.build();
   }
 
+  private void registerFullyLinkAction(ObjcProvider objcProvider) throws InterruptedException {
+    ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
+    Artifact archive = ruleContext.getImplicitOutputArtifact(FULLY_LINKED_LIB);
+
+    ImmutableList<Artifact> ccLibraries = ccLibraries(objcProvider);
+    ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder(ruleContext)
+        .setMnemonic("ObjcLink")
+        .setExecutable(ObjcRuleClasses.LIBTOOL)
+        .setCommandLine(new CustomCommandLine.Builder()
+            .add("-static")
+            .add("-arch_only").add(objcConfiguration.getIosCpu())
+            .add("-syslibroot").add(IosSdkCommands.sdkDir(objcConfiguration))
+            .add("-o").add(archive.getExecPathString())
+            .addExecPaths(objcProvider.get(LIBRARY))
+            .addExecPaths(objcProvider.get(IMPORTED_LIBRARY))
+            .addExecPaths(ccLibraries)
+            .build())
+        .addInputs(ccLibraries)
+        .addTransitiveInputs(objcProvider.get(LIBRARY))
+        .addTransitiveInputs(objcProvider.get(IMPORTED_LIBRARY))
+        .addOutput(archive)
+        .build(ruleContext));
+  }
+
   /**
    * Registers any actions necessary to link this rule and its dependencies.
    *
@@ -785,7 +824,8 @@
    *
    * @return this compilation support
    */
-  CompilationSupport registerJ2ObjcCompileAndArchiveActions(ObjcProvider objcProvider) {
+  CompilationSupport registerJ2ObjcCompileAndArchiveActions(ObjcProvider objcProvider)
+      throws InterruptedException {
     J2ObjcSrcsProvider provider = J2ObjcSrcsProvider.buildFrom(ruleContext);
     Iterable<J2ObjcSource> j2ObjcSources = provider.getSrcs();
     J2ObjcConfiguration j2objcConfiguration = ruleContext.getFragment(J2ObjcConfiguration.class);
@@ -828,7 +868,8 @@
             intermediateArtifacts,
             objcProvider,
             moduleMap,
-            ruleContext.getConfiguration().isCodeCoverageEnabled());
+            ruleContext.getConfiguration().isCodeCoverageEnabled(),
+            false);
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java
index 62a72c4..c72d8d7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder;
 
@@ -33,9 +34,12 @@
         <ul>
          <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which
              can be used to develop or build on a Mac.</li>
+         <li><code>lib<var>name</var>_fully_linked.a</code>: A fully linked static library that
+             contains the full transitive closure of library dependencies.</li>
         </ul>
         <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/
-        .setImplicitOutputsFunction(XcodeSupport.PBXPROJ)
+        .setImplicitOutputsFunction(ImplicitOutputsFunction.fromFunctions(
+            CompilationSupport.FULLY_LINKED_LIB, XcodeSupport.PBXPROJ))
         .build();
   }