diff options
9 files changed, 124 insertions, 54 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java index 15e4e6887b..af92ecfa76 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java @@ -75,6 +75,7 @@ public abstract class ConfigurationTestCase extends FoundationTestCase { public List<String> multiCpus; } + protected MockToolsConfig mockToolsConfig; protected Path workspace; protected AnalysisMock analysisMock; protected SequencedSkyframeExecutor skyframeExecutor; @@ -123,7 +124,8 @@ public abstract class ConfigurationTestCase extends FoundationTestCase { UUID.randomUUID(), new TimestampGranularityMonitor(BlazeClock.instance())); - analysisMock.setupMockClient(new MockToolsConfig(rootDirectory)); + mockToolsConfig = new MockToolsConfig(rootDirectory); + analysisMock.setupMockClient(mockToolsConfig); analysisMock.setupMockWorkspaceFiles(directories.getEmbeddedBinariesRoot()); configurationFactory = analysisMock.createConfigurationFactory(); buildOptionClasses = ruleClassProvider.getConfigurationOptions(); diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java index d43ce9a77b..192ce19bf6 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java @@ -81,10 +81,16 @@ public final class BazelMockCcSupport extends MockCcSupport { "/bazel_tools_workspace/tools/cpp/BUILD", "cc_library(name = 'stl')", "cc_library(name = 'malloc')", - "filegroup(name = 'toolchain', ", - " srcs = [':cc-compiler-local', ':cc-compiler-darwin', ':cc-compiler-piii',", - " ':cc-compiler-armeabi-v7a', ':empty'],", - ")", + "cc_toolchain_suite(", + " name = 'toolchain',", + " toolchains = {", + " 'local|compiler': ':cc-compiler-local',", + " 'k8|compiler': ':cc-compiler-k8',", + " 'piii|compiler': ':cc-compiler-piii',", + " 'darwin|compiler': ':cc-compiler-darwin',", + " 'armeabi-v7a|compiler': ':cc-compiler-armeabi-v7a',", + " 'x64_windows|compiler': ':cc-compiler-x64_windows',", + " })", "cc_toolchain(name = 'cc-compiler-k8', all_files = ':empty', compiler_files = ':empty',", " cpu = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ", " linker_files = ':empty',", @@ -132,7 +138,7 @@ public final class BazelMockCcSupport extends MockCcSupport { } @Override - protected String readCrosstoolFile() throws IOException { + public String readCrosstoolFile() throws IOException { return readFromResources(MOCK_CROSSTOOL_PATH); } diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java index cddecfaa3d..ddd5b584c9 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java @@ -15,12 +15,11 @@ package com.google.devtools.build.lib.packages.util; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; - +import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig; +import com.google.protobuf.TextFormat; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.List; /** * A helper class to create a crosstool package containing a CROSSTOOL file, and the various @@ -108,7 +107,14 @@ final class Crosstool { } } - List<String> compilerRules = Lists.newArrayList(); + CrosstoolConfig.CrosstoolRelease.Builder configBuilder = + CrosstoolConfig.CrosstoolRelease.newBuilder(); + TextFormat.merge(crosstoolFileContents, configBuilder); + StringBuilder compilerMap = new StringBuilder(); + for (CrosstoolConfig.CToolchain toolchain : configBuilder.build().getToolchainList()) { + compilerMap.append(String.format("'%s|%s': ':cc-compiler-%s',\n", + toolchain.getTargetCpu(), toolchain.getCompiler(), toolchain.getTargetCpu())); + } for (String arch : archs) { String compilerRule; @@ -145,7 +151,6 @@ final class Crosstool { + "])"); compilationTools.append(compilerRule + "\n"); - compilerRules.add(":cc-compiler-" + arch); } String build = @@ -154,14 +159,14 @@ final class Crosstool { "package(default_visibility=['//visibility:public'])", "licenses(['restricted'])", "", + "alias(name = 'toolchain', actual = 'everything')", "filegroup(name = 'everything-multilib',", " srcs = glob(['" + version + "/**/*'],", " exclude_directories = 1),", " output_licenses = ['unencumbered'])", "", String.format( - "filegroup(name = 'everything', srcs = ['%s', ':every-file'])", - Joiner.on("', '").join(compilerRules)), + "cc_toolchain_suite(name = 'everything', toolchains = {%s})", compilerMap), "", String.format( "filegroup(name = 'every-file', srcs = ['%s'%s%s])", diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java index 8dbe6e978d..9da6514969 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java @@ -367,6 +367,11 @@ public abstract class MockCcSupport { setupCrosstool(config, toolchainBuilder.buildPartial()); } + public void setupCrosstoolWithRelease(MockToolsConfig config, String crosstool) + throws IOException { + createCrosstoolPackage(config, false, true, null, null, crosstool); + } + /** * Creates a crosstool package by merging {@code toolchain} with the default mock CROSSTOOL file. */ @@ -389,8 +394,7 @@ public abstract class MockCcSupport { boolean addModuleMap, String staticRuntimesLabel, String dynamicRuntimesLabel, - CToolchain toolchain) - throws IOException { + CToolchain toolchain) throws IOException { createCrosstoolPackage( config, addEmbeddedRuntimes, @@ -400,6 +404,23 @@ public abstract class MockCcSupport { toolchain); } + public void setupCrosstool( + MockToolsConfig config, + boolean addEmbeddedRuntimes, + boolean addModuleMap, + String staticRuntimesLabel, + String dynamicRuntimesLabel, + String crosstool) + throws IOException { + createCrosstoolPackage( + config, + addEmbeddedRuntimes, + addModuleMap, + staticRuntimesLabel, + dynamicRuntimesLabel, + crosstool); + } + protected static void createToolsCppPackage(MockToolsConfig config) throws IOException { config.create( "tools/cpp/BUILD", @@ -409,7 +430,7 @@ public abstract class MockCcSupport { protected void createCrosstoolPackage(MockToolsConfig config, boolean addEmbeddedRuntimes) throws IOException { - createCrosstoolPackage(config, addEmbeddedRuntimes, /*addModuleMap=*/ true, null, null, null); + createCrosstoolPackage(config, addEmbeddedRuntimes, /*addModuleMap=*/ true, null, null); } protected String getCrosstoolTopPathForConfig(MockToolsConfig config) { @@ -433,7 +454,18 @@ public abstract class MockCcSupport { } } - protected void createCrosstoolPackage( + private void createCrosstoolPackage( + MockToolsConfig config, + boolean addEmbeddedRuntimes, + boolean addModuleMap, + String staticRuntimesLabel, + String dynamicRuntimesLabel) + throws IOException { + createCrosstoolPackage(config, addEmbeddedRuntimes, addModuleMap, staticRuntimesLabel, + dynamicRuntimesLabel, readCrosstoolFile()); + } + + private void createCrosstoolPackage( MockToolsConfig config, boolean addEmbeddedRuntimes, boolean addModuleMap, @@ -441,14 +473,23 @@ public abstract class MockCcSupport { String dynamicRuntimesLabel, CToolchain toolchain) throws IOException { + String crosstoolFile = mergeCrosstoolConfig(readCrosstoolFile(), toolchain); + createCrosstoolPackage(config, addEmbeddedRuntimes, addModuleMap, staticRuntimesLabel, + dynamicRuntimesLabel, crosstoolFile); + } + + protected void createCrosstoolPackage( + MockToolsConfig config, + boolean addEmbeddedRuntimes, + boolean addModuleMap, + String staticRuntimesLabel, + String dynamicRuntimesLabel, + String crosstoolFile) + throws IOException { String crosstoolTop = getCrosstoolTopPathForConfig(config); if (config.isRealFileSystem()) { config.linkTools(getRealFilesystemTools(crosstoolTop)); } else { - String crosstoolFile = readCrosstoolFile(); - if (toolchain != null) { - crosstoolFile = mergeCrosstoolConfig(crosstoolFile, toolchain); - } new Crosstool(config, crosstoolTop) .setEmbeddedRuntimes(addEmbeddedRuntimes, staticRuntimesLabel, dynamicRuntimesLabel) .setCrosstoolFile(getMockCrosstoolVersion(), crosstoolFile) @@ -461,7 +502,7 @@ public abstract class MockCcSupport { protected abstract String getMockCrosstoolVersion(); - protected abstract String readCrosstoolFile() throws IOException; + public abstract String readCrosstoolFile() throws IOException; protected abstract ImmutableList<String> getCrosstoolArchs(); diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java index 9896392eeb..14549403d7 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java @@ -242,8 +242,7 @@ public class CcCommonTest extends BuildViewTestCase { @Test public void testStartEndLib() throws Exception { - CrosstoolConfigurationHelper.overwriteCrosstoolWithToolchain( - directories.getWorkspace(), + getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig, CrosstoolConfig.CToolchain.newBuilder().setSupportsStartEndLib(true).buildPartial()); useConfiguration( // Prevent Android from trying to setup ARM crosstool by forcing it on system cpu. @@ -356,13 +355,12 @@ public class CcCommonTest extends BuildViewTestCase { /** * Tests that nocopts= "-fPIC" takes '-fPIC' out of a compile invocation even if the crosstool - * requires fPIC compilation (i.e. nocoopts overrides crosstool settings on a rule-specific + * requires fPIC compilation (i.e. nocopts overrides crosstool settings on a rule-specific * basis). */ @Test public void testNoCoptfPicOverride() throws Exception { - CrosstoolConfigurationHelper.overwriteCrosstoolWithToolchain( - directories.getWorkspace(), + getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig, CrosstoolConfig.CToolchain.newBuilder().setNeedsPic(true).buildPartial()); useConfiguration( // Prevent Android from trying to setup ARM crosstool by forcing it on system cpu. diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java index 34efc439ee..65ec00df24 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java @@ -44,6 +44,8 @@ import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.vfs.PathFragment; +import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig; +import com.google.protobuf.TextFormat; import java.util.ArrayList; import java.util.List; import org.junit.Before; @@ -116,8 +118,36 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase { @Test public void testFilesToBuildWithoutDSO() throws Exception { + CrosstoolConfig.CrosstoolRelease.Builder release = CrosstoolConfig.CrosstoolRelease.newBuilder() + .mergeFrom(CrosstoolConfigurationHelper.simpleCompleteToolchainProto()); + release.getToolchainBuilder(0) + .setTargetCpu("k8") + .setCompiler("compiler") + .clearLinkingModeFlags(); + + scratch.file("crosstool/BUILD", + "cc_toolchain_suite(", + " name = 'crosstool',", + " toolchains = {'k8|compiler': ':cc-compiler-k8'})", + "filegroup(name = 'empty')", + "cc_toolchain(", + " name = 'cc-compiler-k8',", + " output_licenses = ['unencumbered'],", + " cpu = 'k8',", + " compiler_files = ':empty',", + " dwp_files = ':empty',", + " linker_files = ':empty',", + " strip_files = ':empty',", + " objcopy_files = ':empty',", + " static_runtime_libs = [':empty'],", + " dynamic_runtime_libs = [':empty'],", + " all_files = ':empty',", + " licenses = ['unencumbered'])"); + scratch.file("crosstool/CROSSTOOL", TextFormat.printToString(release)); + // This is like the preceding test, but with a toolchain that can't build '.so' files - useConfiguration("--compiler=compiler_no_dyn_linker"); + useConfiguration("--crosstool_top=//crosstool:crosstool", "--compiler=compiler", + "--cpu=k8", "--host_cpu=k8"); ConfiguredTarget hello = getConfiguredTarget("//hello:hello"); Artifact archive = getBinArtifact("libhello.a", hello); assertThat(getFilesToBuild(hello)).containsExactly(archive); diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java index 0b80265f67..cf858ac8ba 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java @@ -63,15 +63,7 @@ public class CrosstoolConfigurationHelper { return OS.getCurrent() == OS.DARWIN ? "darwin" : "k8"; } - /** - * Overwrites the default CROSSTOOL file with a reasonable toolchain. - */ - public static void overwriteCrosstoolWithSimpleCompleteToolchain(Path workspace) - throws IOException { - overwriteCrosstoolFile(workspace, TextFormat.printToString(simpleCompleteToolchainProto())); - } - - private static CrosstoolConfig.CrosstoolRelease simpleCompleteToolchainProto() { + public static CrosstoolConfig.CrosstoolRelease simpleCompleteToolchainProto() { CrosstoolConfig.CrosstoolRelease.Builder builder = CrosstoolConfig.CrosstoolRelease.newBuilder() .setMajorVersion("12") diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java index a1bfaaf313..b207a13e6d 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java @@ -43,15 +43,13 @@ import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LipoMode; import com.google.devtools.common.options.OptionsParser; import com.google.devtools.common.options.OptionsParsingException; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; /** * Tests for {@link CppConfigurationLoader}. @@ -82,8 +80,7 @@ public class CrosstoolConfigurationLoaderTest extends AnalysisTestCase { } private CppConfigurationLoader loader(String crosstoolFileContents) throws IOException { - CrosstoolConfigurationHelper.overwriteCrosstoolFile( - directories.getWorkspace(), crosstoolFileContents); + getAnalysisMock().ccSupport().setupCrosstoolWithRelease(mockToolsConfig, crosstoolFileContents); return new CppConfigurationLoader(Functions.<String>identity()); } diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD index b121ddcfd2..f693fe7cb3 100644 --- a/tools/cpp/BUILD +++ b/tools/cpp/BUILD @@ -29,17 +29,16 @@ filegroup( ) # Hardcoded toolchain, legacy behaviour. -filegroup( +cc_toolchain_suite( name = "default-toolchain", - srcs = [ - ":cc-compiler-armeabi-v7a", - ":cc-compiler-darwin", - ":cc-compiler-freebsd", - ":cc-compiler-local", - ":cc-compiler-x64_windows", - ":cc-compiler-x64_windows_msvc", - ":empty", - ], + toolchains = { + "armeabi-v7a|compiler": ":cc-compiler-armeabi-v7a", + "darwin|compiler": ":cc-compiler-darwin", + "freebsd|compiler": ":cc-compiler-freebsd", + "local|compiler": ":cc-compiler-local", + "x64_windows|compiler": ":cc-compiler-x64_windows", + "x64_windows_msvc|compiler": ":cc-compiler-x64_windows_msvc", + }, ) cc_toolchain( |