Always declare dependency on xcode gcov.

RELNOTES[INC]: Removes --objc_gcov_binary flag.

--
MOS_MIGRATED_REVID=113190035
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 7f2d7ff..9cd8624 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -836,12 +836,6 @@
     )
     public List<Label> targetEnvironments;
 
-    @Option(name = "objc_gcov_binary",
-        converter = ToolsLabelConverter.class,
-        defaultValue = "//third_party/gcov:gcov_for_xcode_osx",
-        category = "undocumented")
-    public Label objcGcovBinary;
-
     /** Converter for labels in the @bazel_tools repository. The @Options' defaultValues can't
      * prepend TOOLS_REPOSITORY, unfortunately, because then the compiler thinks they're not
      * constant. */
@@ -913,9 +907,6 @@
       if ((runUnder != null) && (runUnder.getLabel() != null)) {
         labelMap.put("RunUnder", runUnder.getLabel());
       }
-      if (collectCodeCoverage) {
-        labelMap.put("objc_gcov", objcGcovBinary);
-      }
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
index 141258a..191d918 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.Attribute.ComputedDefault;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundLabelList;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
@@ -47,6 +47,10 @@
  */
 public class IosTestRule implements RuleDefinition {
 
+  private static final ImmutableList<Label> GCOV =
+      ImmutableList.of(
+          Label.parseAbsoluteUnchecked(Constants.TOOLS_REPOSITORY + "//tools/objc:gcov"));
+
   @Override
   public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) {
     return builder
@@ -86,7 +90,7 @@
         .add(
             attr(IosTest.XCTEST_APP, LABEL)
                 .value(
-                    new Attribute.ComputedDefault(IosTest.IS_XCTEST) {
+                    new ComputedDefault(IosTest.IS_XCTEST) {
                       @Override
                       public Object getDefault(AttributeMap rule) {
                         return rule.get(IosTest.IS_XCTEST, Type.BOOLEAN)
@@ -103,7 +107,7 @@
         .override(
             attr("infoplist", LABEL)
                 .value(
-                    new Attribute.ComputedDefault(IosTest.IS_XCTEST) {
+                    new ComputedDefault(IosTest.IS_XCTEST) {
                       @Override
                       public Object getDefault(AttributeMap rule) {
                         return rule.get(IosTest.IS_XCTEST, Type.BOOLEAN)
@@ -154,16 +158,13 @@
             attr(":gcov", LABEL_LIST)
                 .cfg(HOST)
                 .value(
-                    new LateBoundLabelList<BuildConfiguration>() {
+                    new LateBoundLabelList<BuildConfiguration>(GCOV) {
                       @Override
                       public List<Label> getDefault(Rule rule, BuildConfiguration configuration) {
                         if (!configuration.isCodeCoverageEnabled()) {
                           return ImmutableList.of();
                         }
-                        return ImmutableList.of(
-                            configuration
-                                .getFragment(ObjcConfiguration.class)
-                                .getGcovLabel());
+                        return GCOV;
                       }
                     }))
         .build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
index 7b3584c..53a36ab 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
@@ -20,7 +20,6 @@
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
-import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.rules.apple.DottedVersion;
 import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -63,13 +62,6 @@
   private final String xcodeOverrideWorkspaceRoot;
   private final boolean useAbsolutePathsForActions;
 
-  // We only load these labels if the mode which uses them is enabled. That is known as part of the
-  // BuildConfiguration. This label needs to be part of a configuration because only configurations
-  // can conditionally cause loading.
-  // They are referenced from late bound attributes, and if loading wasn't forced in a
-  // configuration, the late bound attribute will fail to be initialized because it hasn't been
-  // loaded.
-  @Nullable private final Label gcovLabel;
 
   ObjcConfiguration(ObjcCommandLineOptions objcOptions, BuildConfiguration.Options options,
       @Nullable BlazeDirectories directories) {
@@ -82,7 +74,6 @@
     this.runMemleaks = objcOptions.runMemleaks;
     this.copts = ImmutableList.copyOf(objcOptions.copts);
     this.compilationMode = Preconditions.checkNotNull(options.compilationMode, "compilationMode");
-    this.gcovLabel = options.objcGcovBinary;
     this.iosSplitCpu = Preconditions.checkNotNull(objcOptions.iosSplitCpu, "iosSplitCpu");
     this.fastbuildOptions = ImmutableList.copyOf(objcOptions.fastbuildOptions);
     this.enableBinaryStripping = objcOptions.enableBinaryStripping;
@@ -154,14 +145,6 @@
   }
 
   /**
-   * Returns the label of the gcov binary, used to get test coverage data. Null iff not in coverage
-   * mode.
-   */
-  @Nullable public Label getGcovLabel() {
-    return gcovLabel;
-  }
-
-  /**
    * Whether module map generation and interpretation is enabled.
    */
   public boolean moduleMapsEnabled() {
diff --git a/tools/objc/BUILD b/tools/objc/BUILD
index 6d86385..eca7bb4 100644
--- a/tools/objc/BUILD
+++ b/tools/objc/BUILD
@@ -100,6 +100,11 @@
     srcs = [":xcrunwrapper.sh"],
 )
 
+filegroup(
+    name = "gcov",
+    srcs = [":gcov_stub"],
+)
+
 xcode_config(
     name = "host_xcodes",
 )
diff --git a/tools/objc/gcov_stub b/tools/objc/gcov_stub
new file mode 100644
index 0000000..5764e83
--- /dev/null
+++ b/tools/objc/gcov_stub
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+(
+  printf 'Bazel does not yet support coverage.\n'
+) >&2
+
+exit 1