diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java | 38 |
1 files changed, 30 insertions, 8 deletions
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 29831acc1c..a7bf17bf51 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 @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.analysis.TemplateVariableInfo; import com.google.devtools.build.lib.analysis.config.HostTransition; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault; +import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.Target; @@ -40,6 +41,11 @@ import com.google.devtools.build.lib.syntax.Type; * Rule definition for compiler definition. */ public final class CcToolchainRule implements RuleDefinition { + + public static final String LIBC_TOP_ATTR = ":libc_top"; + public static final String FDO_OPTIMIZE_ATTR = ":fdo_optimize"; + public static final String FDO_PROFILE_ATTR = ":fdo_profile"; + /** * Determines if the given target is a cc_toolchain or one of its subclasses. New subclasses * should be added to this method. @@ -49,19 +55,31 @@ public final class CcToolchainRule implements RuleDefinition { return ruleClass.endsWith("cc_toolchain"); } - private static final LabelLateBoundDefault<?> LIBC_TOP = + private static Label getLabel(AttributeMap attributes, String attrName, Label defaultValue) { + if (attributes.has(attrName, LABEL)) { + Label value = attributes.get(attrName, LABEL); + if (value != null) { + return value; + } + } + return defaultValue; + } + + private static final LabelLateBoundDefault<?> LIBC_TOP_VALUE = LabelLateBoundDefault.fromTargetConfiguration( CppConfiguration.class, null, - (rule, attributes, cppConfig) -> cppConfig.getSysrootLabel()); + (rule, attributes, cppConfig) -> + // This avoids analyzing the label from the CROSSTOOL if the attribute is set. + getLabel(attributes, "libc_top", cppConfig.getSysrootLabel())); - private static final LabelLateBoundDefault<?> FDO_OPTIMIZE_LABEL = + private static final LabelLateBoundDefault<?> FDO_OPTIMIZE_VALUE = LabelLateBoundDefault.fromTargetConfiguration( CppConfiguration.class, null, (rule, attributes, cppConfig) -> cppConfig.getFdoOptimizeLabel()); - private static final LabelLateBoundDefault<?> FDO_PROFILE_LABEL = + private static final LabelLateBoundDefault<?> FDO_PROFILE_VALUE = LabelLateBoundDefault.fromTargetConfiguration( CppConfiguration.class, null, @@ -149,13 +167,17 @@ public final class CcToolchainRule implements RuleDefinition { null, (rule, attributes, cppConfig) -> shouldIncludeZipperInToolchain(cppConfig) ? zipper : null))) - .add(attr(":libc_top", LABEL).value(LIBC_TOP)) - .add(attr(":fdo_optimize", LABEL).singleArtifact().value(FDO_OPTIMIZE_LABEL)) + + // TODO(b/78578234): Make this the default and remove the late-bound versions. + .add(attr("libc_top", LABEL).allowedFileTypes()) + .add(attr(LIBC_TOP_ATTR, LABEL).value(LIBC_TOP_VALUE)) + + .add(attr(FDO_OPTIMIZE_ATTR, LABEL).singleArtifact().value(FDO_OPTIMIZE_VALUE)) .add( - attr(":fdo_profile", LABEL) + attr(FDO_PROFILE_ATTR, LABEL) .allowedRuleClasses("fdo_profile") .mandatoryProviders(ImmutableList.of(FdoProfileProvider.PROVIDER.id())) - .value(FDO_PROFILE_LABEL)) + .value(FDO_PROFILE_VALUE)) .add( attr(TransitiveLipoInfoProvider.LIPO_CONTEXT_COLLECTOR, LABEL) .cfg(LipoContextCollectorTransition.INSTANCE) |