Introduce --experimental_objc_crosstool, which replaces
--experimental_objc_library and --experimental_objc_use_crosstool_for_binary.
This flag will allow testing of the complete (compilation and linking) rollout
of the objc crosstool.

--
PiperOrigin-RevId: 144864301
MOS_MIGRATED_REVID=144864301
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
index 4213a58..589738e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
@@ -112,7 +112,7 @@
       
       librariesToLipo.add(intermediateArtifacts.strippedSingleArchitectureLibrary());
 
-      new LegacyCompilationSupport(ruleContext, childConfig)
+      CompilationSupport.createForConfig(ruleContext, childConfig)
           .registerCompileAndArchiveActions(common)
           .registerFullyLinkAction(
               objcProvider,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinary.java
index 6ffbaec..675c82a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinary.java
@@ -23,7 +23,7 @@
 public class AppleWatchExtensionBinary extends BinaryLinkingTargetFactory {
 
   public AppleWatchExtensionBinary() {
-    super(HasReleaseBundlingSupport.NO, XcodeProductType.LIBRARY_STATIC, UsesCrosstool.NO);
+    super(HasReleaseBundlingSupport.NO, XcodeProductType.LIBRARY_STATIC);
   }
 
   @Override
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 ea26384..ed41efc 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
@@ -47,23 +47,14 @@
     YES, NO;
   }
 
-  /** Indicates whether this binary uses the c++ rules backend, including the crosstool. */
-  enum UsesCrosstool {
-    EXPERIMENTAL, // use the crosstool if --experimental_use_crosstool_for_binary is given
-    NO;
-  }
-  
   private final HasReleaseBundlingSupport hasReleaseBundlingSupport;
   private final XcodeProductType productType;
-  private final UsesCrosstool usesCrosstool;
 
   protected BinaryLinkingTargetFactory(
       HasReleaseBundlingSupport hasReleaseBundlingSupport,
-      XcodeProductType productType,
-      UsesCrosstool usesCrosstool) {
+      XcodeProductType productType) {
     this.hasReleaseBundlingSupport = hasReleaseBundlingSupport;
     this.productType = productType;
-    this.usesCrosstool = usesCrosstool;
   }
 
   /**
@@ -115,12 +106,7 @@
             ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
         .build();
 
-    CompilationSupport compilationSupport = (usesCrosstool != UsesCrosstool.EXPERIMENTAL
-        || !ruleContext.getFragment(ObjcConfiguration.class).useCrosstoolForBinary())
-        ? new LegacyCompilationSupport(ruleContext)
-        : new CrosstoolCompilationSupport(ruleContext);
-
-    compilationSupport
+    CompilationSupport compilationSupport = CompilationSupport.create(ruleContext)
         .validateAttributes()
         .addXcodeSettings(xcodeProviderBuilder, common)
         .registerCompileAndArchiveActions(common)
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 d3206f4..dec209f 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
@@ -67,6 +67,7 @@
 import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction;
+import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions.ObjcCrosstoolMode;
 import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder;
 import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector.InstrumentationSpec;
@@ -332,8 +333,72 @@
     this.attributes = compilationAttributes;
     this.intermediateArtifacts = intermediateArtifacts;
   }
-  
+
   /**
+   * Returns a CompilationSupport instance, the type of which is determined from the
+   * --experimental_objc_crosstool flag.
+   *
+   * @param ruleContext the RuleContext for the calling target
+   */
+  public static CompilationSupport create(RuleContext ruleContext) {
+    return createForConfig(ruleContext, ruleContext.getConfiguration());
+  }
+
+   /**
+   * Returns a CompilationSupport instance, the type of which is determined from the
+   * --experimental_objc_crosstool flag.  The result can be either {@link LegacyCompilationSupport}
+   * or {@link CrosstoolCompilationSupport}.
+   *
+   * @param ruleContext the RuleContext for the calling target
+   * @param buildConfiguration the configuration for the calling target
+   */
+   public static CompilationSupport createForConfig(RuleContext ruleContext,
+       BuildConfiguration buildConfiguration) {
+     return createWithSelectedImplementation(ruleContext,
+         buildConfiguration,
+         ObjcRuleClasses.intermediateArtifacts(ruleContext, buildConfiguration),
+         CompilationAttributes.Builder.fromRuleContext(ruleContext).build());
+   }
+
+  /**
+   * Returns a CompilationSupport instance, the type of which is determined from the
+   * --experimental_objc_crosstool flag.
+   *
+   * @param ruleContext the RuleContext for the calling target
+   * @param compilationAttributes attributes of the calling target
+   */
+  public static CompilationSupport createForAttributes(RuleContext ruleContext,
+      CompilationAttributes compilationAttributes) {
+    BuildConfiguration config = ruleContext.getConfiguration();
+    return createWithSelectedImplementation(ruleContext,
+        config,
+        ObjcRuleClasses.intermediateArtifacts(ruleContext, config),
+        compilationAttributes);
+  }
+
+  /**
+   * Returns a CompilationSupport instance, the type of which is determined from the
+   * --experimental_objc_crosstool flag.
+   *
+   * @param ruleContext the RuleContext for the calling target
+   * @param buildConfiguration the configuration for the calling target
+   * @param intermediateArtifacts IntermediateArtifacts for deriving artifact paths
+   * @param compilationAttributes attributes of the calling target
+   */
+  private static CompilationSupport createWithSelectedImplementation(
+      RuleContext ruleContext,
+      BuildConfiguration buildConfiguration,
+      IntermediateArtifacts intermediateArtifacts,
+      CompilationAttributes compilationAttributes) {
+    return buildConfiguration.getFragment(ObjcConfiguration.class).getObjcCrosstoolMode()
+        == ObjcCrosstoolMode.ALL
+        ? new CrosstoolCompilationSupport(ruleContext, buildConfiguration, intermediateArtifacts,
+            compilationAttributes)
+        : new LegacyCompilationSupport(ruleContext, buildConfiguration, intermediateArtifacts,
+            compilationAttributes);
+  }
+
+ /**
    * Registers all actions necessary to compile this rule's sources and archive them.
    *
    * @param compilationArtifacts collection of artifacts required for the compilation
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
index 1688ba2..1bdf71a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
@@ -30,6 +30,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.config.BuildConfiguration;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcLibraryHelper;
@@ -82,11 +83,26 @@
    * @param ruleContext the RuleContext for the calling target
    */
   public CrosstoolCompilationSupport(RuleContext ruleContext) {
-    super(
+    this(
         ruleContext,
         ruleContext.getConfiguration(),
         ObjcRuleClasses.intermediateArtifacts(ruleContext),
         CompilationAttributes.Builder.fromRuleContext(ruleContext).build());
+  }
+
+  /**
+   * Creates a new CompilationSupport instance that uses the c++ rule backend
+   *
+   * @param ruleContext the RuleContext for the calling target
+   * @param buildConfiguration the configuration for the calling target
+   * @param intermediateArtifacts IntermediateArtifacts for deriving artifact paths
+   * @param compilationAttributes attributes of the calling target
+   */
+  public CrosstoolCompilationSupport(RuleContext ruleContext,
+      BuildConfiguration buildConfiguration,
+      IntermediateArtifacts intermediateArtifacts,
+      CompilationAttributes compilationAttributes) {
+    super(ruleContext, buildConfiguration, intermediateArtifacts, compilationAttributes);
     this.compilationArtifacts = compilationArtifacts(ruleContext);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinary.java
index b5dde4f..02b96ae 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinary.java
@@ -22,7 +22,7 @@
  */
 public class IosExtensionBinary extends BinaryLinkingTargetFactory {
   public IosExtensionBinary() {
-    super(HasReleaseBundlingSupport.NO, XcodeProductType.LIBRARY_STATIC, UsesCrosstool.NO);
+    super(HasReleaseBundlingSupport.NO, XcodeProductType.LIBRARY_STATIC);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinary.java
index fb9cfd6..e9d21f2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinary.java
@@ -23,7 +23,7 @@
  */
 public class IosFrameworkBinary extends BinaryLinkingTargetFactory {
   public IosFrameworkBinary() {
-    super(HasReleaseBundlingSupport.NO, XcodeProductType.LIBRARY_STATIC, UsesCrosstool.NO);
+    super(HasReleaseBundlingSupport.NO, XcodeProductType.LIBRARY_STATIC);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index 2902cdc..f104dc7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -32,7 +32,6 @@
 import com.google.devtools.build.lib.analysis.actions.ExecutionRequirements;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 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.PlatformType;
@@ -151,7 +150,7 @@
             ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
         .build();
 
-    new LegacyCompilationSupport(ruleContext)
+    CompilationSupport.create(ruleContext)
         .registerLinkActions(
             common.getObjcProvider(),
             j2ObjcMappingFileProvider,
@@ -202,7 +201,7 @@
         NestedSetBuilder.<Artifact>stableOrder().addTransitive(filesToBuildSet);
 
     InstrumentedFilesProvider instrumentedFilesProvider =
-        new LegacyCompilationSupport(ruleContext).getInstrumentedFilesProvider(common);
+        CompilationSupport.create(ruleContext).getInstrumentedFilesProvider(common);
 
     TestSupport testSupport =
         new TestSupport(ruleContext)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index bb52195..73fdbe6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -251,7 +251,7 @@
               depAttributes);
 
       try {
-        new LegacyCompilationSupport(ruleContext)
+        CompilationSupport.create(ruleContext)
             .registerCompileAndArchiveActions(common, EXTRA_COMPILE_ARGS)
             .registerFullyLinkAction(common.getObjcProvider(),
                 ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java
index 709df50..f9b541e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java
@@ -116,42 +116,6 @@
         .build();
   }
 
-  /** Creates a new legacy compilation support for the given rule. */
-  public LegacyCompilationSupport(RuleContext ruleContext) {
-    this(ruleContext, ruleContext.getConfiguration());
-  }
-
-  /**
-   * Creates a new legacy compilation support for the given rule.
-   *
-   * <p>All actions will be created under the given build configuration, which may be different than
-   * the current rule context configuration.
-   */
-  public LegacyCompilationSupport(RuleContext ruleContext, BuildConfiguration buildConfiguration) {
-    this(
-        ruleContext,
-        buildConfiguration,
-        ObjcRuleClasses.intermediateArtifacts(ruleContext, buildConfiguration),
-        CompilationAttributes.Builder.fromRuleContext(ruleContext).build());
-  }
-
-  /**
-   * Creates a new legacy compilation support for the given rule.
-   *
-   * <p>The compilation and linking flags will be retrieved from the given compilation attributes.
-   * The names of the generated artifacts will be retrieved from the given intermediate artifacts.
-   *
-   * <p>By instantiating multiple compilation supports for the same rule but with intermediate
-   * artifacts with different output prefixes, multiple archives can be compiled for the same rule
-   * context.
-   */
-  public LegacyCompilationSupport(
-      RuleContext ruleContext,
-      IntermediateArtifacts intermediateArtifacts,
-      CompilationAttributes compilationAttributes) {
-    this(ruleContext, ruleContext.getConfiguration(), intermediateArtifacts, compilationAttributes);
-  }
-
   /**
    * Creates a new legacy compilation support for the given rule and build configuration.
    *
@@ -165,7 +129,7 @@
    * artifacts with different output prefixes, multiple archives can be compiled for the same rule
    * context.
    */
-  public LegacyCompilationSupport(
+  LegacyCompilationSupport(
       RuleContext ruleContext,
       BuildConfiguration buildConfiguration,
       IntermediateArtifacts intermediateArtifacts,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
index 11f8696..4e9caee 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
@@ -102,7 +102,7 @@
       CompilationArtifacts compilationArtifacts =
           CompilationSupport.compilationArtifacts(
               ruleContext, ObjcRuleClasses.intermediateArtifacts(ruleContext, childConfig));
-      new LegacyCompilationSupport(ruleContext, childConfig)
+      CompilationSupport.createForConfig(ruleContext, childConfig)
           .registerCompileAndArchiveActions(compilationArtifacts, objcProvider)
           .registerLinkActions(
               objcProvider,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinary.java
index 49a99db..02771ef 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinary.java
@@ -24,9 +24,6 @@
 
         // TODO(bazel-team): Use LIBRARY_STATIC as parameter instead of APPLICATION once objc_binary
         // no longer creates an application bundle
-        XcodeProductType.APPLICATION,
-
-        // If --experimental_objc_binary is set
-        UsesCrosstool.EXPERIMENTAL);
+        XcodeProductType.APPLICATION);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
index d837e0b..6df5a44 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.rules.apple.DottedVersion;
 import com.google.devtools.build.lib.rules.apple.DottedVersionConverter;
 import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
+import com.google.devtools.common.options.EnumConverter;
 import com.google.devtools.common.options.Option;
 import java.util.List;
 
@@ -213,19 +214,47 @@
   )
   public boolean deviceDebugEntitlements;
 
-  @Option(
-    name = "experimental_objc_library",
-    defaultValue = "false",
-    category = "undocumented"
-  )
-  public boolean experimentalObjcLibrary;
+  /**
+   * Specifies the circumstances under which a CROSSTOOL is used for objc in this configuration.
+   */
+  enum ObjcCrosstoolMode {
+    /** The CROSSTOOL is used for all objc compile, archive, and link actions. */
+    ALL,
+
+    /**
+     * The CROSSTOOL is used for all objc compile and archive actions originating from an
+     * objc_library target.
+     */
+    LIBRARY,
+
+    /** The CROSSTOOL is not used for any objc action. */
+    OFF
+  }
+
+  /**
+   * Converter for {@link ObjcCrosstoolMode}.
+   */
+  public static class ObjcCrosstoolUsageConverter extends EnumConverter<ObjcCrosstoolMode> {
+    public ObjcCrosstoolUsageConverter() {
+      super(ObjcCrosstoolMode.class, "objc crosstool mode");
+    }
+  }
 
   @Option(
-    name = "experimental_objc_use_crosstool_for_binary",
-    defaultValue = "false",
-    category = "undocumented"
+      name = "experimental_objc_crosstool",
+      defaultValue = "off",
+      category = "undocumented",
+      converter = ObjcCrosstoolUsageConverter.class
   )
-  public boolean experimentalUseCrosstoolForBinary;
+  public ObjcCrosstoolMode objcCrosstoolMode;
+
+  // TODO(b/34260565): Remove in favor of --experimental_objc_crosstool
+  @Option(
+      name = "experimental_objc_library",
+      defaultValue = "false",
+      category = "undocumented"
+  )
+  public boolean experimentalObjcLibrary;
 
   @Option(
     name = "objc_use_dotd_pruning",
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 4a797bc..8d2bc20 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
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.rules.apple.DottedVersion;
 import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
 import com.google.devtools.build.lib.rules.cpp.HeaderDiscovery;
+import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions.ObjcCrosstoolMode;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -75,8 +76,8 @@
   private final boolean debugWithGlibcxx;
   @Nullable private final Label extraEntitlements;
   private final boolean deviceDebugEntitlements;
+  private final ObjcCrosstoolMode objcCrosstoolMode;
   private final boolean experimentalObjcLibrary;
-  private final boolean experimentalUseCrosstoolForBinary;
   private final boolean enableAppleBinaryNativeProtos;
   private final HeaderDiscovery.DotdPruningMode dotdPruningPlan;
 
@@ -110,8 +111,8 @@
     this.debugWithGlibcxx = objcOptions.debugWithGlibcxx;
     this.extraEntitlements = objcOptions.extraEntitlements;
     this.deviceDebugEntitlements = objcOptions.deviceDebugEntitlements;
+    this.objcCrosstoolMode = objcOptions.objcCrosstoolMode;
     this.experimentalObjcLibrary = objcOptions.experimentalObjcLibrary;
-    this.experimentalUseCrosstoolForBinary = objcOptions.experimentalUseCrosstoolForBinary;
     this.enableAppleBinaryNativeProtos = objcOptions.enableAppleBinaryNativeProtos;
     this.dotdPruningPlan =
         objcOptions.useDotdPruning
@@ -322,16 +323,11 @@
   }
 
   /**
-   * Returns true if all objc_library targets should be configured as if they were
-   * experimental_objc_library targets.
+   * Returns an {@link ObjcCrosstoolMode} that specifies the circumstances under which a
+   * CROSSTOOL is used for objc in this configuration.
    */
-  public boolean useExperimentalObjcLibrary() {
-    return experimentalObjcLibrary;
-  }
-
-  /** Returns true if objc_binary targets should use the crosstool for compiling and archiving. */
-  public boolean useCrosstoolForBinary() {
-    return experimentalUseCrosstoolForBinary;
+  public ObjcCrosstoolMode getObjcCrosstoolMode() {
+    return experimentalObjcLibrary ? ObjcCrosstoolMode.LIBRARY : objcCrosstoolMode;
   }
 
   /** Returns true if apple_binary targets should generate and link Objc protos. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
index cbadc2c..a4166e1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
@@ -58,7 +58,7 @@
     Iterable<Artifact> publicHeaders = compilationAttributes.hdrs();
     CppModuleMap moduleMap = intermediateArtifacts.moduleMap();
 
-    new LegacyCompilationSupport(ruleContext)
+    CompilationSupport.create(ruleContext)
         .registerGenerateModuleMapAction(moduleMap, publicHeaders)
         .addXcodeSettings(xcodeProviderBuilder, common)
         .validateAttributes();
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 c774887..efcbe30 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
@@ -23,6 +23,7 @@
 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.CcLinkParamsProvider;
+import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions.ObjcCrosstoolMode;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
 import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
 import com.google.devtools.build.lib.syntax.Type;
@@ -58,7 +59,10 @@
   public ConfiguredTarget create(RuleContext ruleContext)
       throws InterruptedException, RuleErrorException {
     // Support treating objc_library as experimental_objc_library
-    if (ruleContext.getFragment(ObjcConfiguration.class).useExperimentalObjcLibrary()) {
+    // TODO(b/34260565): Deprecate ExperimentalObjcLibrary in favor of ObjcLibrary with
+    // CrosstoolCompilationSupport.
+    if (ruleContext.getFragment(ObjcConfiguration.class).getObjcCrosstoolMode()
+        != ObjcCrosstoolMode.OFF) {
       return ExperimentalObjcLibrary.configureExperimentalObjcLibrary(ruleContext);
     }
     
@@ -69,7 +73,7 @@
         .addAll(common.getCompiledArchive().asSet());
 
     CompilationSupport compilationSupport =
-        new LegacyCompilationSupport(ruleContext)
+        CompilationSupport.create(ruleContext)
             .registerCompileAndArchiveActions(common)
             .registerFullyLinkAction(common.getObjcProvider(),
                 ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
index f8b8a7d..3c62f07 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
@@ -168,10 +168,7 @@
             .addAdditionalHdrs(
                 getGeneratedProtoOutputs(inputsToOutputsMap.values(), HEADER_SUFFIX));
 
-    new LegacyCompilationSupport(
-            ruleContext,
-            intermediateArtifacts,
-            new CompilationAttributes.Builder().build())
+    CompilationSupport.createForAttributes(ruleContext, new CompilationAttributes.Builder().build())
         .registerGenerateModuleMapAction(moduleMapCompilationArtifacts.build());
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java
index d781d49..61abb70 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java
@@ -97,7 +97,7 @@
    */
   public ProtocolBuffers2Support registerCompilationActions()
       throws RuleErrorException, InterruptedException {
-    new LegacyCompilationSupport(ruleContext)
+    CompilationSupport.create(ruleContext)
         .registerCompileAndArchiveActions(getCommon())
         .registerGenerateModuleMapAction(getCompilationArtifacts());
     return this;