aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
diff options
context:
space:
mode:
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.java38
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)