aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar jcater <jcater@google.com>2018-05-16 09:26:25 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-16 09:28:18 -0700
commit83ebe8c8773eb8def96b0c5aa1517ee9b1625144 (patch)
treeff2647325a9c2e1ef24fed5ed9746c369e974f55
parent8d2c8ae9ac41e7913cb67a8fa4b63453ddd17781 (diff)
Add libc_top attribute to cc_toolchain in preparation for moving config data out of CppConfiguration.
PiperOrigin-RevId: 196838680
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java38
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java74
4 files changed, 121 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java
index 5d07a2b8fe..dbe364e662 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java
@@ -27,6 +27,7 @@ import com.google.devtools.build.lib.rules.apple.AppleToolchain;
import com.google.devtools.build.lib.rules.apple.XcodeConfig;
import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider;
import com.google.devtools.build.lib.rules.cpp.CcToolchain;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainRule;
import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -115,7 +116,8 @@ public class AppleCcToolchain extends CcToolchain {
RuleContext ruleContext, NestedSet<Artifact> link) {
return NestedSetBuilder.<Artifact>stableOrder()
.addTransitive(link)
- .addTransitive(AnalysisUtils.getMiddlemanFor(ruleContext, ":libc_top", Mode.TARGET))
+ .addTransitive(
+ AnalysisUtils.getMiddlemanFor(ruleContext, CcToolchainRule.LIBC_TOP_ATTR, Mode.TARGET))
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 316c9a6d03..5209e1c230 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -321,12 +321,14 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
if (cppConfiguration.getFdoPath() != null) {
fdoZip = cppConfiguration.getFdoPath();
} else if (cppConfiguration.getFdoOptimizeLabel() != null) {
- Artifact fdoArtifact = ruleContext.getPrerequisiteArtifact(":fdo_optimize", Mode.TARGET);
+ Artifact fdoArtifact =
+ ruleContext.getPrerequisiteArtifact(CcToolchainRule.FDO_OPTIMIZE_ATTR, Mode.TARGET);
if (!fdoArtifact.isSourceArtifact()) {
ruleContext.ruleError("--fdo_optimize points to a target that is not an input file");
return null;
}
- Label fdoLabel = ruleContext.getPrerequisite(":fdo_optimize", Mode.TARGET).getLabel();
+ Label fdoLabel =
+ ruleContext.getPrerequisite(CcToolchainRule.FDO_OPTIMIZE_ATTR, Mode.TARGET).getLabel();
if (!fdoLabel
.getPackageIdentifier()
.getPathUnderExecRoot()
@@ -338,7 +340,8 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
fdoZip = fdoArtifact.getPath().asFragment();
} else if (cppConfiguration.getFdoProfileLabel() != null) {
FdoProfileProvider fdoProvider =
- ruleContext.getPrerequisite(":fdo_profile", Mode.TARGET, FdoProfileProvider.PROVIDER);
+ ruleContext.getPrerequisite(
+ CcToolchainRule.FDO_PROFILE_ATTR, Mode.TARGET, FdoProfileProvider.PROVIDER);
fdoZip =
fdoProvider.getFdoPath() != null
? fdoProvider.getFdoPath()
@@ -746,7 +749,8 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
}
private NestedSet<Artifact> inputsForLibc(RuleContext ruleContext) {
- TransitiveInfoCollection libc = ruleContext.getPrerequisite(":libc_top", Mode.TARGET);
+ TransitiveInfoCollection libc =
+ ruleContext.getPrerequisite(CcToolchainRule.LIBC_TOP_ATTR, Mode.TARGET);
return libc != null
? libc.getProvider(FileProvider.class).getFilesToBuild()
: NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER);
@@ -756,7 +760,8 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
NestedSet<Artifact> crosstoolMiddleman) {
return NestedSetBuilder.<Artifact>stableOrder()
.addTransitive(crosstoolMiddleman)
- .addTransitive(AnalysisUtils.getMiddlemanFor(ruleContext, ":libc_top", Mode.TARGET))
+ .addTransitive(
+ AnalysisUtils.getMiddlemanFor(ruleContext, CcToolchainRule.LIBC_TOP_ATTR, Mode.TARGET))
.build();
}
@@ -768,7 +773,8 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
RuleContext ruleContext, NestedSet<Artifact> link) {
return NestedSetBuilder.<Artifact>stableOrder()
.addTransitive(link)
- .addTransitive(AnalysisUtils.getMiddlemanFor(ruleContext, ":libc_top", Mode.TARGET))
+ .addTransitive(
+ AnalysisUtils.getMiddlemanFor(ruleContext, CcToolchainRule.LIBC_TOP_ATTR, Mode.TARGET))
.add(ruleContext.getPrerequisiteArtifact("$interface_library_builder", Mode.HOST))
.add(ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST))
.build();
@@ -874,7 +880,8 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
private PathFragment calculateSysroot(RuleContext ruleContext, PathFragment defaultSysroot) {
- TransitiveInfoCollection sysrootTarget = ruleContext.getPrerequisite(":libc_top", Mode.TARGET);
+ TransitiveInfoCollection sysrootTarget =
+ ruleContext.getPrerequisite(CcToolchainRule.LIBC_TOP_ATTR, Mode.TARGET);
if (sysrootTarget == null) {
return defaultSysroot;
}
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)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
index 58ea8940cc..044757c738 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.packages.util.MockCcSupport;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode;
import com.google.devtools.build.lib.testutil.TestConstants;
+import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
import com.google.devtools.common.options.OptionsParsingException;
@@ -925,4 +926,77 @@ public class CcToolchainTest extends BuildViewTestCase {
"--features=-static_link_cpp_runtimes");
assertThat(featureConfiguration.isEnabled(CppRuleClasses.STATIC_LINK_CPP_RUNTIMES)).isFalse();
}
+
+ @Test
+ public void testSysroot_fromCrosstool() throws Exception {
+ scratch.file(
+ "a/BUILD",
+ "filegroup(",
+ " name='empty')",
+ "cc_toolchain(",
+ " name = 'b',",
+ " cpu = 'banana',",
+ " all_files = ':empty',",
+ " ar_files = ':empty',",
+ " as_files = ':empty',",
+ " compiler_files = ':empty',",
+ " dwp_files = ':empty',",
+ " linker_files = ':empty',",
+ " strip_files = ':empty',",
+ " objcopy_files = ':empty',",
+ " dynamic_runtime_libs = [':empty'],",
+ " static_runtime_libs = [':empty'])");
+ scratch.file("libc1/BUILD", "filegroup(name = 'everything', srcs = ['header1.h'])");
+ scratch.file("libc1/header1.h", "#define FOO 1");
+
+ getAnalysisMock()
+ .ccSupport()
+ .setupCrosstool(
+ mockToolsConfig,
+ CrosstoolConfig.CToolchain.newBuilder().setDefaultGrteTop("//libc1").buildPartial());
+ useConfiguration();
+ ConfiguredTarget target = getConfiguredTarget("//a:b");
+ CcToolchainProvider toolchainProvider =
+ (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
+
+ assertThat(toolchainProvider.getSysroot()).isEqualTo(PathFragment.create("libc1"));
+ }
+
+ @Test
+ public void testSysroot_fromCcToolchain() throws Exception {
+ scratch.file(
+ "a/BUILD",
+ "filegroup(",
+ " name='empty')",
+ "cc_toolchain(",
+ " name = 'b',",
+ " cpu = 'banana',",
+ " all_files = ':empty',",
+ " ar_files = ':empty',",
+ " as_files = ':empty',",
+ " compiler_files = ':empty',",
+ " dwp_files = ':empty',",
+ " linker_files = ':empty',",
+ " strip_files = ':empty',",
+ " objcopy_files = ':empty',",
+ " dynamic_runtime_libs = [':empty'],",
+ " static_runtime_libs = [':empty'],",
+ " libc_top = '//libc2:everything')");
+ scratch.file("libc1/BUILD", "filegroup(name = 'everything', srcs = ['header1.h'])");
+ scratch.file("libc1/header1.h", "#define FOO 1");
+ scratch.file("libc2/BUILD", "filegroup(name = 'everything', srcs = ['header2.h'])");
+ scratch.file("libc2/header2.h", "#define FOO 2");
+
+ getAnalysisMock()
+ .ccSupport()
+ .setupCrosstool(
+ mockToolsConfig,
+ CrosstoolConfig.CToolchain.newBuilder().setDefaultGrteTop("//libc1").buildPartial());
+ useConfiguration();
+ ConfiguredTarget target = getConfiguredTarget("//a:b");
+ CcToolchainProvider toolchainProvider =
+ (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
+
+ assertThat(toolchainProvider.getSysroot()).isEqualTo(PathFragment.create("libc2"));
+ }
}