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(