Make the interface dynamic library builder a regular label instead of a magic artifact.

--
PiperOrigin-RevId: 147830857
MOS_MIGRATED_REVID=147830857
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index 9f9a655..3c02666 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -91,11 +91,6 @@
   Artifact getFilesetArtifact(PathFragment rootRelativePath, Root root);
 
   /**
-   * Returns the artifact for the specified tool.
-   */
-  Artifact getEmbeddedToolArtifact(String embeddedPath);
-
-  /**
    * Returns the middleman factory associated with the build.
    */
   // TODO(bazel-team): remove this method and replace it with delegate methods.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 10a9216..1f12d2c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -35,7 +35,6 @@
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
 import com.google.devtools.build.lib.actions.Root;
-import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
@@ -1083,14 +1082,14 @@
   @VisibleForTesting
   public RuleContext getRuleContextForTesting(
       ConfiguredTarget target, StoredEventHandler eventHandler,
-      BuildConfigurationCollection configurations, BinTools binTools)
+      BuildConfigurationCollection configurations)
           throws EvalException, InvalidConfigurationException, InterruptedException {
     BuildConfiguration targetConfig = target.getConfiguration();
     CachingAnalysisEnvironment env =
         new CachingAnalysisEnvironment(getArtifactFactory(),
             new ConfiguredTargetKey(target.getLabel(), targetConfig),
             /*isSystemEnv=*/false, targetConfig.extendedSanityChecks(), eventHandler,
-            /*skyframeEnv=*/null, targetConfig.isActionsEnabled(), binTools);
+            /*skyframeEnv=*/null, targetConfig.isActionsEnabled());
     return getRuleContextForTesting(eventHandler, target, env, configurations);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index 5aed23d..7a768c9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -26,7 +26,6 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.StoredEventHandler;
@@ -82,7 +81,6 @@
   private EventHandler errorEventListener;
   private SkyFunction.Environment skyframeEnv;
   private Map<Artifact, String> artifacts;
-  private final BinTools binTools;
 
   /**
    * The list of actions registered by the configured target this analysis environment is
@@ -92,8 +90,8 @@
 
   public CachingAnalysisEnvironment(ArtifactFactory artifactFactory,
       ArtifactOwner owner, boolean isSystemEnv, boolean extendedSanityChecks,
-      EventHandler errorEventListener, SkyFunction.Environment env, boolean allowRegisteringActions,
-      BinTools binTools) {
+      EventHandler errorEventListener, SkyFunction.Environment env,
+      boolean allowRegisteringActions) {
     this.artifactFactory = artifactFactory;
     this.owner = Preconditions.checkNotNull(owner);
     this.isSystemEnv = isSystemEnv;
@@ -101,7 +99,6 @@
     this.errorEventListener = errorEventListener;
     this.skyframeEnv = env;
     this.allowRegisteringActions = allowRegisteringActions;
-    this.binTools = Preconditions.checkNotNull(binTools);
     middlemanFactory = new MiddlemanFactory(artifactFactory, this);
     artifacts = new HashMap<>();
   }
@@ -250,12 +247,6 @@
   }
 
   @Override
-  public Artifact getEmbeddedToolArtifact(String embeddedPath) {
-    Preconditions.checkState(enabled);
-    return binTools.getEmbeddedArtifact(embeddedPath, artifactFactory);
-  }
-
-  @Override
   public void registerAction(ActionAnalysisMetadata... actions) {
     Preconditions.checkState(enabled);
     if (allowRegisteringActions) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 16408d1..5ff1698 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -199,8 +199,6 @@
           "FDO_DIR", cppConfiguration.getFdoInstrument().getPathString()));
     }
 
-    Artifact linkDynamicLibraryTool = getLinkDynamicLibraryTool(ruleContext);
-
     CcToolchainProvider provider =
         new CcToolchainProvider(
             cppConfiguration,
@@ -210,6 +208,7 @@
             strip,
             objcopy,
             fullInputsForLink(ruleContext, link),
+            ruleContext.getPrerequisiteArtifact("$interface_library_builder", Mode.HOST),
             dwp,
             libcLink,
             staticRuntimeLinkInputs,
@@ -223,7 +222,7 @@
             getBuildVariables(ruleContext),
             getBuiltinIncludes(ruleContext),
             coverageEnvironment.build(),
-            linkDynamicLibraryTool,
+            ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST),
             getEnvironment(ruleContext));
     RuleConfiguredTargetBuilder builder =
         new RuleConfiguredTargetBuilder(ruleContext)
@@ -269,10 +268,6 @@
     return builder.build();
   }
 
-  private Artifact getLinkDynamicLibraryTool(RuleContext ruleContext) {
-    return ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.TARGET);
-  }
-
   private ImmutableList<Artifact> getBuiltinIncludes(RuleContext ruleContext) {
     ImmutableList.Builder<Artifact> result = ImmutableList.builder();
     for (Artifact artifact : inputsForLibc(ruleContext)) {
@@ -308,11 +303,8 @@
     return NestedSetBuilder.<Artifact>stableOrder()
         .addTransitive(link)
         .addTransitive(AnalysisUtils.getMiddlemanFor(ruleContext, ":libc_top"))
-        .add(getLinkDynamicLibraryTool(ruleContext))
-        .add(
-            ruleContext
-                .getAnalysisEnvironment()
-                .getEmbeddedToolArtifact(CppRuleClasses.BUILD_INTERFACE_SO))
+        .add(ruleContext.getPrerequisiteArtifact("$interface_library_builder", Mode.HOST))
+        .add(ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index 4145ebd..8f2f767 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -43,6 +43,7 @@
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+          null,
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
@@ -66,6 +67,7 @@
   private final NestedSet<Artifact> strip;
   private final NestedSet<Artifact> objCopy;
   private final NestedSet<Artifact> link;
+  private final Artifact interfaceSoBuilder;
   private final NestedSet<Artifact> dwp;
   private final NestedSet<Artifact> libcLink;
   private final NestedSet<Artifact> staticRuntimeLinkInputs;
@@ -90,6 +92,7 @@
       NestedSet<Artifact> strip,
       NestedSet<Artifact> objCopy,
       NestedSet<Artifact> link,
+      Artifact interfaceSoBuilder,
       NestedSet<Artifact> dwp,
       NestedSet<Artifact> libcLink,
       NestedSet<Artifact> staticRuntimeLinkInputs,
@@ -112,6 +115,7 @@
     this.strip = Preconditions.checkNotNull(strip);
     this.objCopy = Preconditions.checkNotNull(objCopy);
     this.link = Preconditions.checkNotNull(link);
+    this.interfaceSoBuilder = interfaceSoBuilder;
     this.dwp = Preconditions.checkNotNull(dwp);
     this.libcLink = Preconditions.checkNotNull(libcLink);
     this.staticRuntimeLinkInputs = Preconditions.checkNotNull(staticRuntimeLinkInputs);
@@ -291,4 +295,11 @@
   public Artifact getLinkDynamicLibraryTool() {
     return linkDynamicLibraryTool;
   }
+
+  /**
+   * Returns the tool that builds interface libraries from dynamic libraries.
+   */
+  public Artifact getInterfaceSoBuilder() {
+    return interfaceSoBuilder;
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
index 786add8..877865d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
@@ -76,7 +76,14 @@
         .add(attr("supports_param_files", BOOLEAN).value(true))
         .add(attr("supports_header_parsing", BOOLEAN).value(false))
         .add(
+            attr("$interface_library_builder", LABEL)
+                .cfg(HOST)
+                .singleArtifact()
+                .value(env.getToolsLabel("//tools/cpp:interface_library_builder")))
+        .add(
             attr("$link_dynamic_library_tool", LABEL)
+                .cfg(HOST)
+                .singleArtifact()
                 .value(env.getToolsLabel("//tools/cpp:link_dynamic_library")))
         // TODO(bazel-team): Should be using the TARGET configuration.
         .add(attr(":libc_top", LABEL).cfg(HOST).value(LIBC_TOP))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 9441fbe..1db3f3a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -1281,8 +1281,9 @@
   }
 
   /**
-   * Returns whether build_interface_so can build interface shared objects for this toolchain.
-   * Should be true if this toolchain generates ELF objects.
+   * Returns whether this toolchain supports interface shared objects.
+   *
+   * <p>Should be true if this toolchain generates ELF objects.
    */
   public boolean supportsInterfaceSharedObjects() {
     return supportsInterfaceSharedObjects;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index d1fed5d..3e0b716 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -188,7 +188,7 @@
    * @param ruleContext the rule that owns the action
    * @param output the output artifact
    * @param toolchain the C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   public CppLinkActionBuilder(RuleContext ruleContext, Artifact output,
       CcToolchainProvider toolchain, FdoSupport fdoSupport) {
@@ -208,7 +208,7 @@
    * @param output the output artifact
    * @param configuration build configuration
    * @param toolchain C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   public CppLinkActionBuilder(
       RuleContext ruleContext,
@@ -228,7 +228,7 @@
    * @param configuration the configuration used to determine the tool chain and the default link
    *     options
    * @param toolchain the C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   private CppLinkActionBuilder(
       @Nullable RuleContext ruleContext,
@@ -258,7 +258,7 @@
    * @param linkContext an immutable CppLinkAction.Context from the original builder
    * @param configuration build configuration
    * @param toolchain the C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   public CppLinkActionBuilder(
       RuleContext ruleContext,
@@ -362,10 +362,6 @@
     return this.linkstampOptions;
   }
 
-  protected Artifact getInterfaceSoBuilder() {
-    return analysisEnvironment.getEmbeddedToolArtifact(CppRuleClasses.BUILD_INTERFACE_SO);
-  }
-  
   /**
    * Returns command line options for this link action.
    */
@@ -627,7 +623,7 @@
                 paramFile,
                 thinltoParamFile,
                 PathFragment.EMPTY_FRAGMENT,
-                getInterfaceSoBuilder(),
+                toolchain.getInterfaceSoBuilder(),
                 interfaceOutput);
     variablesExtension.addVariables(buildVariablesBuilder);
     for (VariablesExtension extraVariablesExtension : variablesExtensions) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
index bb22ec2..9ad6ba3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
@@ -125,11 +125,6 @@
 
 
   /**
-   * Path of the build_interface_so script in the Blaze binary.
-   */
-  public static final String BUILD_INTERFACE_SO = "build_interface_so";
-
-  /**
    * A string constant for the parse_headers feature.
    */
   public static final String PARSE_HEADERS = "parse_headers";
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index c84cf27..0e2c828 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
@@ -91,7 +90,6 @@
   private final ConfiguredTargetFactory factory;
   private final ArtifactFactory artifactFactory;
   private final SkyframeExecutor skyframeExecutor;
-  private final BinTools binTools;
   private boolean enableAnalysis = false;
 
   // This hack allows us to see when a configured target has been invalidated, and thus when the set
@@ -126,13 +124,11 @@
   private boolean skyframeAnalysisWasDiscarded;
 
   public SkyframeBuildView(BlazeDirectories directories,
-      SkyframeExecutor skyframeExecutor, BinTools binTools,
-      ConfiguredRuleClassProvider ruleClassProvider) {
+      SkyframeExecutor skyframeExecutor, ConfiguredRuleClassProvider ruleClassProvider) {
     this.factory = new ConfiguredTargetFactory(ruleClassProvider);
     this.artifactFactory = new ArtifactFactory(
         directories.getExecRoot().getParentDirectory(), directories.getRelativeOutputPath());
     this.skyframeExecutor = skyframeExecutor;
-    this.binTools = binTools;
     this.ruleClassProvider = ruleClassProvider;
   }
 
@@ -468,7 +464,7 @@
     boolean allowRegisteringActions = config == null || config.isActionsEnabled();
     return new CachingAnalysisEnvironment(
         artifactFactory, owner, isSystemEnv, extendedSanityChecks, eventHandler, env,
-        allowRegisteringActions, binTools);
+        allowRegisteringActions);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index e587f8f..1a04d15 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -331,7 +331,6 @@
     this.skyframeBuildView = new SkyframeBuildView(
         directories,
         this,
-        binTools,
         (ConfiguredRuleClassProvider) ruleClassProvider);
     this.artifactFactory.set(skyframeBuildView.getArtifactFactory());
     this.externalFilesHelper = new ExternalFilesHelper(