apple_binary scopes link artifacts using child configuration for --experimental_objc_crosstool=all

--
PiperOrigin-RevId: 150066766
MOS_MIGRATED_REVID=150066766
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index b0183e0..e2c04b7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -189,7 +189,8 @@
     // which only happens when some rule explicitly depends on the dynamic library.
     if (!createDynamicLibrary && !supportsDynamicLinker) {
       Artifact solibArtifact =
-          CppHelper.getLinuxLinkedArtifact(ruleContext, LinkTargetType.DYNAMIC_LIBRARY);
+          CppHelper.getLinuxLinkedArtifact(
+              ruleContext, ruleContext.getConfiguration(), LinkTargetType.DYNAMIC_LIBRARY);
       ruleContext.registerAction(new FailAction(ruleContext.getActionOwner(),
           ImmutableList.of(solibArtifact), "Toolchain does not support dynamic linking"));
     } else if (!createDynamicLibrary
@@ -200,7 +201,8 @@
       // generate an .so with. If that's the case, register a fake generating action to prevent
       // a "no generating action for this artifact" error.
       Artifact solibArtifact =
-          CppHelper.getLinuxLinkedArtifact(ruleContext, LinkTargetType.DYNAMIC_LIBRARY);
+          CppHelper.getLinuxLinkedArtifact(
+              ruleContext, ruleContext.getConfiguration(), LinkTargetType.DYNAMIC_LIBRARY);
       ruleContext.registerAction(new FailAction(ruleContext.getActionOwner(),
           ImmutableList.of(solibArtifact), "configurable \"srcs\" triggers an implicit .so output "
           + "even though there are no sources to compile in this configuration"));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index 4151d99..f3f2e70 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -1100,19 +1100,26 @@
       archiveFile.add(
           CppHelper.getLinuxLinkedArtifact(
               ruleContext,
+              configuration,
               Link.LinkTargetType.ALWAYS_LINK_STATIC_LIBRARY,
               linkedArtifactNameSuffix));
     } else {
       archiveFile.add(
           CppHelper.getLinuxLinkedArtifact(
-              ruleContext, Link.LinkTargetType.STATIC_LIBRARY, linkedArtifactNameSuffix));
+              ruleContext,
+              configuration,
+              Link.LinkTargetType.STATIC_LIBRARY,
+              linkedArtifactNameSuffix));
     }
 
     if (!ruleContext.attributes().get("linkstatic", Type.BOOLEAN)
         && !ccOutputs.isEmpty()) {
       dynamicLibrary.add(
           CppHelper.getLinuxLinkedArtifact(
-              ruleContext, Link.LinkTargetType.DYNAMIC_LIBRARY, linkedArtifactNameSuffix));
+              ruleContext,
+              configuration,
+              Link.LinkTargetType.DYNAMIC_LIBRARY,
+              linkedArtifactNameSuffix));
     }
 
     outputGroups.put("archive", archiveFile.build());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index 92df634..3134aad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -342,13 +342,23 @@
         src.getRoot());
   }
 
-  /** Returns the linked artifact for linux. */
-  public static Artifact getLinuxLinkedArtifact(RuleContext ruleContext, LinkTargetType linkType) {
-    return getLinuxLinkedArtifact(ruleContext, linkType, "");
+  /**
+   * Returns the linked artifact for linux.
+   *
+   * @param ruleContext the ruleContext to be used to scope the artifact
+   * @param config the configuration to be used to scope the artifact
+   * @param linkType the type of artifact, used to determine extension
+   */
+  public static Artifact getLinuxLinkedArtifact(
+      RuleContext ruleContext, BuildConfiguration config, LinkTargetType linkType) {
+    return getLinuxLinkedArtifact(ruleContext, config, linkType, "");
   }
 
   /** Returns the linked artifact with the given suffix for linux. */
-  public static Artifact getLinuxLinkedArtifact(RuleContext ruleContext, LinkTargetType linkType,
+  public static Artifact getLinuxLinkedArtifact(
+      RuleContext ruleContext,
+      BuildConfiguration config,
+      LinkTargetType linkType,
       String linkedArtifactNameSuffix) {
     PathFragment name = new PathFragment(ruleContext.getLabel().getName());
     if (linkType != LinkTargetType.EXECUTABLE) {
@@ -356,7 +366,8 @@
           "lib" + name.getBaseName() + linkedArtifactNameSuffix  + linkType.getExtension());
     }
 
-    return ruleContext.getBinArtifact(name);
+    return ruleContext.getPackageRelativeArtifact(
+        name, config.getBinDirectory(ruleContext.getRule().getRepository()));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
index 3d27459..bca504c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
@@ -957,8 +957,9 @@
    */
   private Artifact getLinkedArtifact(LinkTargetType linkTargetType) throws RuleErrorException {
     Artifact result = null;
-    Artifact linuxDefault = CppHelper.getLinuxLinkedArtifact(
-        ruleContext, linkTargetType, linkedArtifactNameSuffix);
+    Artifact linuxDefault =
+        CppHelper.getLinuxLinkedArtifact(
+            ruleContext, configuration, linkTargetType, linkedArtifactNameSuffix);
 
     try {
       String maybePicName = ruleContext.getLabel().getName() + linkedArtifactNameSuffix;
@@ -1117,7 +1118,10 @@
     if (cppConfiguration.useInterfaceSharedObjects() && allowInterfaceSharedObjects) {
       soInterface =
           CppHelper.getLinuxLinkedArtifact(
-              ruleContext, LinkTargetType.INTERFACE_DYNAMIC_LIBRARY, linkedArtifactNameSuffix);
+              ruleContext,
+              configuration,
+              LinkTargetType.INTERFACE_DYNAMIC_LIBRARY,
+              linkedArtifactNameSuffix);
       sonameLinkopts = ImmutableList.of("-Wl,-soname=" +
           SolibSymlinkAction.getDynamicLibrarySoname(soImpl.getRootRelativePath(), false));
     }