From aff189a7c514a0171a53a2dcdd37c93ecaa672ad Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 3 Jun 2019 13:33:07 -0700 Subject: [PATCH] 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 --- .../build/lib/rules/cpp/CcLinkingHelper.java | 34 ++++-------------- .../build/lib/rules/cpp/CppHelper.java | 35 +++++++++++++++++-- 2 files changed, 40 insertions(+), 29 deletions(-) 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 58aa9589f89aaa..771e2a596c642b 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 @@ private Artifact getLinkedArtifact(LinkTargetType linkTargetType) throws RuleErr 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 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 4b8e27d417a2e7..c076a5b4fd9ffc 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 @@ public static Artifact getLinkedArtifact( 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(