Read the CROSSTOOL from the package of the current cc_toolchain, not from --crosstool_top
This will make the behavior work properly when using platforms, and it will fix
recurring issues when cc_toolchain_suite and cc_toolchain are built as a top
level targets, without setting --crosstool_top (that resulted in trying to
associate cc_toolchain with an unrelated CROSSTOOL file and fail the build).
This could also happen when using `bazel cquery` or `bazel aquery`.
RELNOTES: CROSSTOOL file is now read from the package of cc_toolchain, not from
the package of cc_toolchain_suite. This is not expected to break anybody since
cc_toolchain_suite and cc_toolchain are commonly in the same package.
PiperOrigin-RevId: 218516709
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java
index 6334d1e..85ef28c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportFunction.java
@@ -67,10 +67,10 @@
}
CrosstoolRelease crosstoolRelease = null;
- if (key.getCcToolchainSuiteLabel() != null) {
+ if (key.getPackageWithCrosstoolInIt() != null) {
try {
// 1. Lookup the package to handle multiple package roots (PackageLookupValue)
- PackageIdentifier packageIdentifier = key.getCcToolchainSuiteLabel().getPackageIdentifier();
+ PackageIdentifier packageIdentifier = key.getPackageWithCrosstoolInIt();
PackageLookupValue crosstoolPackageValue =
(PackageLookupValue) env.getValue(PackageLookupValue.key(packageIdentifier));
if (env.valuesMissing()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java
index d097230..d5ece4b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkyframeSupportValue.java
@@ -14,7 +14,7 @@
package com.google.devtools.build.lib.rules.cpp;
import com.google.common.collect.Interner;
-import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
@@ -49,22 +49,22 @@
private static final Interner<Key> interner = BlazeInterners.newWeakInterner();
@Nullable private final PathFragment fdoZipPath;
- @Nullable private final Label ccToolchainSuiteLabel;
+ @Nullable private final PackageIdentifier packageWithCrosstoolInIt;
- private Key(PathFragment fdoZipPath, Label ccToolchainSuiteLabel) {
+ private Key(PathFragment fdoZipPath, PackageIdentifier packageWithCrosstoolInIt) {
this.fdoZipPath = fdoZipPath;
- this.ccToolchainSuiteLabel = ccToolchainSuiteLabel;
+ this.packageWithCrosstoolInIt = packageWithCrosstoolInIt;
}
@AutoCodec.Instantiator
@AutoCodec.VisibleForSerialization
- static Key of(PathFragment fdoZipPath, Label ccToolchainSuiteLabel) {
- return interner.intern(new Key(fdoZipPath, ccToolchainSuiteLabel));
+ static Key of(PathFragment fdoZipPath, PackageIdentifier packageWithCrosstoolInIt) {
+ return interner.intern(new Key(fdoZipPath, packageWithCrosstoolInIt));
}
@Nullable
- public Label getCcToolchainSuiteLabel() {
- return ccToolchainSuiteLabel;
+ public PackageIdentifier getPackageWithCrosstoolInIt() {
+ return packageWithCrosstoolInIt;
}
@Nullable
@@ -82,13 +82,13 @@
}
Key key = (Key) o;
return Objects.equals(fdoZipPath, key.fdoZipPath)
- && Objects.equals(ccToolchainSuiteLabel, key.ccToolchainSuiteLabel);
+ && Objects.equals(packageWithCrosstoolInIt, key.packageWithCrosstoolInIt);
}
@Override
public int hashCode() {
- return Objects.hash(fdoZipPath, ccToolchainSuiteLabel);
+ return Objects.hash(fdoZipPath, packageWithCrosstoolInIt);
}
@Override
@@ -118,7 +118,7 @@
return crosstoolRelease;
}
- public static SkyKey key(PathFragment fdoZipPath, Label ccToolchainSuiteLabel) {
- return Key.of(fdoZipPath, ccToolchainSuiteLabel);
+ public static SkyKey key(PathFragment fdoZipPath, PackageIdentifier packageWithCrosstoolInIt) {
+ return Key.of(fdoZipPath, packageWithCrosstoolInIt);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
index 748166d..d8059ad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
@@ -404,12 +404,12 @@
// Is there a toolchain proto available on the target directly?
CToolchain toolchain = parseToolchainFromAttributes(ruleContext, attributes);
- Label ccToolchainSuiteLabelIfNeeded = null;
+ PackageIdentifier packageWithCrosstoolInIt = null;
if (toolchain == null && cppConfiguration.getCrosstoolFromCcToolchainProtoAttribute() == null) {
- ccToolchainSuiteLabelIfNeeded = cppConfiguration.getCrosstoolTop();
+ packageWithCrosstoolInIt = ruleContext.getLabel().getPackageIdentifier();
}
- SkyKey ccSupportKey = CcSkyframeSupportValue.key(fdoZip, ccToolchainSuiteLabelIfNeeded);
+ SkyKey ccSupportKey = CcSkyframeSupportValue.key(fdoZip, packageWithCrosstoolInIt);
SkyFunction.Environment skyframeEnv = ruleContext.getAnalysisEnvironment().getSkyframeEnv();
CcSkyframeSupportValue ccSkyframeSupportValue;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
index c555efb..f397f04 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
@@ -468,6 +468,7 @@
" all_files = ':every-file',",
" dynamic_runtime_libs = ['dynamic-runtime-libs-cherry'],",
" static_runtime_libs = ['static-runtime-libs-cherry'])");
+ scratch.file("c/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
ConfiguredTarget target = getConfiguredTarget("//c:c");
Map<Label, License> expected = licenses("//c:c", "notice");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
index 7b2e675..de24239 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcHostToolchainAliasTest.java
@@ -42,9 +42,8 @@
@Test
public void testThatHostCrosstoolTopCommandLineArgumentWorks() throws Exception {
-
scratch.file(
- "t/BUILD",
+ "b/BUILD",
"cc_toolchain_suite(",
" name = 'my_custom_toolchain_suite',",
" toolchains = {",
@@ -52,13 +51,7 @@
" 'k8|compiler': '//b:toolchain_b',",
" 'x64_windows|windows_msys64': '//b:toolchain_b',",
" 'darwin|compiler': '//b:toolchain_b',",
-
- "})");
-
- scratch.file("t/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
-
- scratch.file(
- "b/BUILD",
+ "})",
"cc_toolchain(",
" name = 'toolchain_b',",
" cpu = 'ED-E',",
@@ -72,9 +65,11 @@
" objcopy_files = ':empty',",
" dynamic_runtime_libs = [':empty'],",
" static_runtime_libs = [':empty'])");
+ scratch.file("b/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
+
scratch.file("a/BUILD", "cc_host_toolchain_alias(name='current_cc_host_toolchain')");
- useConfiguration("--host_crosstool_top=//t:my_custom_toolchain_suite");
+ useConfiguration("--host_crosstool_top=//b:my_custom_toolchain_suite");
ConfiguredTarget target = getConfiguredTarget("//a:current_cc_host_toolchain");
assertThat(target.getLabel()).isEqualTo(Label.parseAbsoluteUnchecked("//b:toolchain_b"));
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 74bb8f5..662a04d 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
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.packages.util.MockCcSupport;
import com.google.devtools.build.lib.packages.util.ResourceLoader;
@@ -341,6 +342,7 @@
" objcopy_files = ':empty',",
" dynamic_runtime_libs = [':empty'],",
" static_runtime_libs = [':empty'])");
+ scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
// Check defaults.
useConfiguration();
@@ -682,6 +684,7 @@
"fdo/BUILD",
"exports_files(['my_profile.afdo'])",
"fdo_profile(name = 'fdo', profile = ':my_profile.profdata')");
+ scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
useConfiguration();
assertThat(getPrerequisites(getConfiguredTarget("//a:b"), ":zipper")).isEmpty();
@@ -768,6 +771,7 @@
" dynamic_runtime_libs = [':empty'],",
" static_runtime_libs = [':empty'],",
" toolchain_config = ':toolchain_config')");
+ scratch.file("a/CROSSTOOL", AnalysisMock.get().ccSupport().readCrosstoolFile());
scratch.file(
"a/crosstool_rule.bzl",