Make sure default Linux artifacts have an associated action, even when artifact names are altered.

This is a FailAction with a message giving the corresponding file actually produced by the toolchain, and ensures that any implicit Linux-oriented outputs have a corresponding action.

RELNOTES: None.
PiperOrigin-RevId: 251297537
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index 58aa958..771e2a5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -21,7 +21,6 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.ActionRegistry;
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.actions.FailAction;
 import com.google.devtools.build.lib.analysis.FileProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
@@ -871,32 +870,13 @@
       PathFragment artifactFragment =
           PathFragment.create(label.getName()).getParentDirectory().getRelative(linkedName);
 
-    Artifact result =
-        actionConstructionContext.getPackageRelativeArtifact(
-            artifactFragment,
-            configuration.getBinDirectory(label.getPackageIdentifier().getRepository()));
-
-    // If the linked artifact is not the linux default, then a FailAction is generated for the
-    // linux default to satisfy the requirement of the implicit output.
-    // TODO(b/30132703): Remove the implicit outputs of cc_library.
-    Artifact linuxDefault =
-        CppHelper.getLinuxLinkedArtifact(
-            label,
-            actionConstructionContext,
-            configuration,
-            linkTargetType,
-            linkedArtifactNameSuffix);
-    if (!result.equals(linuxDefault)) {
-      actionConstructionContext.registerAction(
-          new FailAction(
-              actionConstructionContext.getActionOwner(),
-              ImmutableList.of(linuxDefault),
-              String.format(
-                  "the given toolchain supports creation of %s instead of %s",
-                  linuxDefault.getExecPathString(), result.getExecPathString())));
-    }
-
-    return result;
+    return CppHelper.getLinkedArtifact(
+        label,
+        actionConstructionContext,
+        configuration,
+        linkTargetType,
+        linkedArtifactNameSuffix,
+        artifactFragment);
   }
 
   private static List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLinkerInputList(
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 4b8e27d..c076a5b 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
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact;
+import com.google.devtools.build.lib.actions.FailAction;
 import com.google.devtools.build.lib.actions.MiddlemanFactory;
 import com.google.devtools.build.lib.actions.ParamFileInfo;
 import com.google.devtools.build.lib.actions.ParameterFile;
@@ -441,8 +442,38 @@
       ruleContext.throwWithRuleError("Cannot get linked artifact name: " + e.getMessage());
     }
 
-    return ruleContext.getPackageRelativeArtifact(
-        name, config.getBinDirectory(ruleContext.getRule().getRepository()));
+    return getLinkedArtifact(
+        ruleContext.getLabel(), ruleContext, config, linkType, linkedArtifactNameSuffix, name);
+  }
+
+  public static Artifact getLinkedArtifact(
+      Label label,
+      ActionConstructionContext actionConstructionContext,
+      BuildConfiguration config,
+      LinkTargetType linkType,
+      String linkedArtifactNameSuffix,
+      PathFragment name) {
+    Artifact result =
+        actionConstructionContext.getPackageRelativeArtifact(
+            name, config.getBinDirectory(label.getPackageIdentifier().getRepository()));
+
+    // If the linked artifact is not the linux default, then a FailAction is generated for said
+    // linux default to satisfy the requirements of any implicit outputs.
+    // TODO(b/30132703): Remove the implicit outputs of cc_library.
+    Artifact linuxDefault =
+        getLinuxLinkedArtifact(
+            label, actionConstructionContext, config, linkType, linkedArtifactNameSuffix);
+    if (!result.equals(linuxDefault)) {
+      actionConstructionContext.registerAction(
+          new FailAction(
+              actionConstructionContext.getActionOwner(),
+              ImmutableList.of(linuxDefault),
+              String.format(
+                  "the given toolchain supports creation of %s instead of %s",
+                  result.getExecPathString(), linuxDefault.getExecPathString())));
+    }
+
+    return result;
   }
 
   public static Artifact getLinuxLinkedArtifact(