From 648fc4f6788dd9c6f6feaffe0cab1ff7751ba103 Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 30 Nov 2023 01:52:09 -0800 Subject: [PATCH] Fix objc unit test to use C++ toolchains This is preparation to make --incompatible_enable_cc_toolchain_resolution a no-op. All the unit tests need to work with the flag enabled. Remove the dummy C++ toolchain (used by Android) in BazelAnalysisMock. This is necessary to correctly resolve a later appended (mocked) Mac C++ toolchain. Because of this some other tests needed additional mocked C++ toolchains. PiperOrigin-RevId: 586597562 Change-Id: Id70368697fe71b33970f19058c7b384a90599a61 --- .../lib/analysis/mock/BazelAnalysisMock.java | 49 -------------- .../devtools/build/lib/bazel/rules/sh/BUILD | 1 + .../sh/BazelShTestConfiguredTargetTest.java | 9 +++ .../lib/packages/util/MockObjcSupport.java | 64 +++++++++++++++---- .../objc/AppleToolchainSelectionTest.java | 28 ++++---- .../rules/objc/BazelJ2ObjcLibraryTest.java | 6 +- .../rules/objc/ObjcBuildVariablesTest.java | 32 ++++------ .../build/lib/rules/objc/ObjcLibraryTest.java | 20 ++++-- .../lib/rules/objc/ObjcRuleTestCase.java | 41 ++++++------ .../build/lib/skyframe/toolchains/BUILD | 1 + .../toolchains/ToolchainsForTargetsTest.java | 9 +++ 11 files changed, 142 insertions(+), 118 deletions(-) diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java index edbed3139b068c..19f026c3cabaff 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java @@ -298,38 +298,8 @@ public void setupMockClient(MockToolsConfig config, List workspaceConten config.create( "embedded_tools/tools/android/emulator/BUILD", Iterables.toArray(createToolsAndroidEmulatorContents(), String.class)); - // Create a dummy toolchain to make toolchain resolution happy. - config.create( - "embedded_tools/tools/android/dummy_sdk/dummy-cc-toolchain-config.bzl", - "def _impl(ctx):", - " out = ctx.actions.declare_file(ctx.label.name)", - " ctx.actions.write(out, 'Fake executable')", - " return [", - " cc_common.create_cc_toolchain_config_info(", - " ctx = ctx,", - " toolchain_identifier = 'dummy-toolchain',", - " host_system_name = 'nothing',", - " target_system_name = 'nothing',", - " target_cpu = 'nothing',", - " target_libc = 'nothing',", - " cc_target_os = 'nothing',", - " compiler = 'bin-false',", - " abi_version = 'nothing',", - " abi_libc_version = 'eleventy',", - " ),", - " DefaultInfo(", - " executable = out,", - " ),", - " ]", - "dummy_cc_toolchain_config = rule(", - " implementation = _impl,", - " attrs = {},", - " provides = [CcToolchainConfigInfo],", - " executable = True,", - ")"); config.create( "embedded_tools/tools/android/dummy_sdk/BUILD", - "load(':dummy-cc-toolchain-config.bzl'," + " 'dummy_cc_toolchain_config')", "package(default_visibility=['//visibility:public'])", "toolchain(", " name = 'dummy-sdk',", @@ -363,25 +333,6 @@ public void setupMockClient(MockToolsConfig config, List workspaceConten " shrinked_android_jar = 'dummy.jar',", " zipalign = ':empty_binary',", " tags = ['__ANDROID_RULES_MIGRATION__'],", - ")", - "toolchain(", - " name = 'dummy-cc_toolchain',", - " toolchain = ':dummy_cc_toolchain_impl',", - " toolchain_type = '@bazel_tools//tools/cpp:toolchain_type',", - ")", - "cc_toolchain(", - " name = 'dummy_cc_toolchain_impl',", - " all_files = ':nothing',", - " as_files = ':nothing',", - " compiler_files = ':nothing',", - " dwp_files = ':nothing',", - " linker_files = ':nothing',", - " objcopy_files = ':nothing',", - " strip_files = ':nothing',", - " toolchain_config = ':dummy-cc-toolchain-config',", - ")", - "dummy_cc_toolchain_config(", - " name = 'dummy-cc-toolchain-config',", ")"); config.create( "android_gmaven_r8/jar/BUILD", diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD index 77e09ed8f64b63..e87e5ae907a636 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD +++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD @@ -23,6 +23,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/analysis:configured_target", "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/test/java/com/google/devtools/build/lib/analysis/util", + "//src/test/java/com/google/devtools/build/lib/packages:testutil", "//third_party:guava", "//third_party:junit4", "//third_party:truth", diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BazelShTestConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BazelShTestConfiguredTargetTest.java index 06c4acfa616837..299df4a694d405 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BazelShTestConfiguredTargetTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BazelShTestConfiguredTargetTest.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.test.TestRunnerAction; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -57,6 +58,14 @@ public void testNonWindowsWrapper() throws Exception { @Test public void testWindowsWrapper() throws Exception { + getAnalysisMock() + .ccSupport() + .setupCcToolchainConfig( + mockToolsConfig, + CcToolchainConfig.builder() + .withToolchainTargetConstraints("@platforms//os:windows") + .withToolchainExecConstraints() + .withCpu("fake")); scratch.file( "platforms/BUILD", "platform(name = 'windows', constraint_values = ['@platforms//os:windows'])"); diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockObjcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockObjcSupport.java index 23c15df70dfe76..ba929b6bf633d1 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/MockObjcSupport.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockObjcSupport.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.packages.util; +import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.devtools.build.lib.rules.python.PythonTestUtils.getPyLoad; import com.google.common.collect.ImmutableList; @@ -22,6 +23,7 @@ import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig; import com.google.devtools.build.lib.testutil.TestConstants; import java.io.IOException; +import java.util.stream.Stream; /** Creates mock BUILD files required for the objc rules. */ public final class MockObjcSupport { @@ -56,34 +58,50 @@ public final class MockObjcSupport { public static final String DEFAULT_XCODE_VERSION = "7.3.1"; public static final String DEFAULT_IOS_SDK_VERSION = "8.4"; - public static ImmutableList requiredObjcPlatformFlags() { + public static final String APPLE_SIMULATOR_PLATFORM_PACKAGE = + TestConstants.APPLE_PLATFORM_PACKAGE_ROOT + + (TestConstants.PRODUCT_NAME.equals("bazel") ? "" : "/simulator"); + + public static final String DARWIN_X86_64 = + TestConstants.APPLE_PLATFORM_PACKAGE_ROOT + ":darwin_x86_64"; + public static final String IOS_X86_64 = APPLE_SIMULATOR_PLATFORM_PACKAGE + ":ios_x86_64"; + public static final String IOS_ARM64 = TestConstants.APPLE_PLATFORM_PACKAGE_ROOT + ":ios_arm64"; + public static final String IOS_ARMV7 = + TestConstants.APPLE_PLATFORM_PACKAGE_ROOT + ":ios_armv7"; // legacy for testing + public static final String IOS_I386 = + APPLE_SIMULATOR_PLATFORM_PACKAGE + ":ios_i386"; // legacy for testing + public static final String WATCHOS_ARMV7K = + TestConstants.APPLE_PLATFORM_PACKAGE_ROOT + ":watchos_armv7k"; + + public static ImmutableList requiredObjcPlatformFlags(String... args) { ImmutableList.Builder builder = ImmutableList.builder(); return builder - .addAll(requiredObjcPlatformFlagsNoXcodeConfig()) + .addAll(requiredObjcPlatformFlagsNoXcodeConfig(args)) .add("--xcode_version_config=" + MockObjcSupport.XCODE_VERSION_CONFIG) .build(); } /** Returns the set of flags required to build objc libraries using the mock OSX crosstool. */ - public static ImmutableList requiredObjcCrosstoolFlags() { + public static ImmutableList requiredObjcCrosstoolFlags(String... args) { ImmutableList.Builder builder = ImmutableList.builder(); return builder - .addAll(requiredObjcCrosstoolFlagsNoXcodeConfig()) + .addAll(requiredObjcCrosstoolFlagsNoXcodeConfig(args)) .add("--xcode_version_config=" + MockObjcSupport.XCODE_VERSION_CONFIG) .build(); } - public static ImmutableList requiredObjcPlatformFlagsNoXcodeConfig() { + public static ImmutableList requiredObjcPlatformFlagsNoXcodeConfig(String... args) { ImmutableList.Builder argsBuilder = ImmutableList.builder(); - - argsBuilder.add("--platforms=" + TestConstants.CONSTRAINTS_PATH + "/apple:darwin_x86_64"); + argsBuilder.addAll(Stream.of(args).collect(toImmutableList())); + if (Stream.of(args).noneMatch(arg -> arg.startsWith("--platforms="))) { + argsBuilder.add("--platforms=" + MockObjcSupport.DARWIN_X86_64); + } // Set a crosstool_top that is compatible with Apple transitions. Currently, even though this // references the old cc_toolchain_suite, it's still required of cc builds even when the // incompatible_enable_cc_toolchain_resolution flag is active. argsBuilder.add("--apple_crosstool_top=" + MockObjcSupport.DEFAULT_OSX_CROSSTOOL); - argsBuilder.add("--incompatible_enable_cc_toolchain_resolution"); argsBuilder.add("--incompatible_enable_apple_toolchain_resolution"); return argsBuilder.build(); @@ -93,16 +111,19 @@ public static ImmutableList requiredObjcPlatformFlagsNoXcodeConfig() { * Returns the set of flags required to build objc libraries using the mock OSX crosstool except * for --xcode_version_config. */ - public static ImmutableList requiredObjcCrosstoolFlagsNoXcodeConfig() { + public static ImmutableList requiredObjcCrosstoolFlagsNoXcodeConfig(String... args) { ImmutableList.Builder argsBuilder = ImmutableList.builder(); + argsBuilder.addAll(Stream.of(args).collect(toImmutableList())); + if (Stream.of(args).noneMatch(arg -> arg.startsWith("--platforms="))) { + argsBuilder.add("--platforms=" + MockObjcSupport.DARWIN_X86_64); + } // TODO(b/68751876): Set --apple_crosstool_top and --crosstool_top using the // AppleCrosstoolTransition argsBuilder .add("--apple_crosstool_top=" + MockObjcSupport.DEFAULT_OSX_CROSSTOOL) - .add("--crosstool_top=" + MockObjcSupport.DEFAULT_OSX_CROSSTOOL) - .add("--noincompatible_enable_cc_toolchain_resolution"); + .add("--crosstool_top=" + MockObjcSupport.DEFAULT_OSX_CROSSTOOL); return argsBuilder.build(); } @@ -159,6 +180,20 @@ public static void setup(MockToolsConfig config) throws IOException { " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:ios',", " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:arm64',", " ],", + ")", + "platform(", // legacy platform only used to support tests + " name = 'ios_armv7',", + " constraint_values = [", + " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:ios',", + " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:armv7',", + " ],", + ")", + "platform(", + " name = 'watchos_armv7k',", + " constraint_values = [", + " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:watchos',", + " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:armv7k',", + " ],", ")"); String[] simulatorPlatforms = { @@ -170,6 +205,13 @@ public static void setup(MockToolsConfig config) throws IOException { " ],", ")", "platform(", + " name = 'ios_i386',", // legacy platform only used to support tests + " constraint_values = [", + " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:ios',", + " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:x86_32',", + " ],", + ")", + "platform(", " name = 'watchos_x86_64',", " constraint_values = [", " '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:watchos',", diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java index 89eb2f5fb64f35..e52c63b2b65fcf 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java @@ -22,7 +22,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.CommandAction; import com.google.devtools.build.lib.analysis.util.ScratchAttributeWriter; -import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; +import com.google.devtools.build.lib.packages.util.MockObjcSupport; import com.google.devtools.build.lib.rules.cpp.CppLinkAction; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,9 +48,7 @@ public void testToolchainSelectionCcDepDefault() throws Exception { " deps = ['//b:lib'],", ")"); Action lipoAction = actionProducingArtifact("//a:bin", "_lipobin"); - String x8664Bin = - configurationBin("x86_64", ConfigurationDistinguisher.APPLEBIN_IOS) + "a/bin_bin"; - Artifact binArtifact = getFirstArtifactEndingWith(lipoAction.getInputs(), x8664Bin); + Artifact binArtifact = lipoAction.getInputs().getSingleton(); CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(binArtifact); CppLinkAction ccArchiveAction = (CppLinkAction) @@ -62,9 +60,9 @@ public void testToolchainSelectionCcDepDefault() throws Exception { @Test public void testToolchainSelectionCcDepDevice() throws Exception { - useConfiguration("--apple_platform_type=ios", "--cpu=ios_armv7"); - ScratchAttributeWriter - .fromLabelString(this, "cc_library", "//b:lib") + useConfiguration( + "--apple_platform_type=ios", "--cpu=ios_armv7", "--platforms=" + MockObjcSupport.IOS_ARMV7); + ScratchAttributeWriter.fromLabelString(this, "cc_library", "//b:lib") .setList("srcs", "b.cc") .write(); addAppleBinaryStarlarkRule(scratch); @@ -77,9 +75,11 @@ public void testToolchainSelectionCcDepDevice() throws Exception { " deps = ['//b:lib'],", ")"); Action lipoAction = actionProducingArtifact("//a:bin", "_lipobin"); - String armv7Bin = - configurationBin("armv7", ConfigurationDistinguisher.APPLEBIN_IOS) + "a/bin_bin"; - Artifact binArtifact = getFirstArtifactEndingWith(lipoAction.getInputs(), armv7Bin); + Artifact binArtifact = + lipoAction.getInputs().toList().stream() + .filter(artifact -> artifact.getPath().toString().contains("armv7")) + .findAny() + .get(); CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(binArtifact); CppLinkAction ccArchiveAction = (CppLinkAction) @@ -105,9 +105,11 @@ public void testToolchainSelectionMultiArchIos() throws Exception { " deps = ['//b:lib'],", ")"); Action lipoAction = actionProducingArtifact("//a:bin", "_lipobin"); - String armv64Bin = - configurationBin("arm64", ConfigurationDistinguisher.APPLEBIN_IOS) + "a/bin_bin"; - Artifact binArtifact = getFirstArtifactEndingWith(lipoAction.getInputs(), armv64Bin); + Artifact binArtifact = + lipoAction.getInputs().toList().stream() + .filter(artifact -> artifact.getPath().toString().contains("arm64")) + .findAny() + .get(); CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(binArtifact); CppLinkAction objcLibArchiveAction = (CppLinkAction) getGeneratingAction( getFirstArtifactEndingWith(linkAction.getInputs(), "liblib.a")); diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java index bd56b39af9d7c1..2b1f1416645ce9 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java @@ -1262,7 +1262,11 @@ protected ImmutableList getActionsForInputsOfGeneratingActionT @Test public void testCompileActionTemplateFromGenJar() throws Exception { - useConfiguration("--apple_platform_type=ios", "--cpu=ios_i386", "--ios_minimum_os=1.0"); + useConfiguration( + "--apple_platform_type=ios", + "--cpu=ios_i386", + "--ios_minimum_os=1.0", + "--platforms=" + MockObjcSupport.IOS_I386); addSimpleJ2ObjcLibraryWithJavaPlugin(); Artifact archive = j2objcArchive("//java/com/google/app/test:transpile", "test"); CommandAction archiveAction = (CommandAction) getGeneratingAction(archive); diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcBuildVariablesTest.java index f752f01f5c9a81..4f472a1223b943 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcBuildVariablesTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcBuildVariablesTest.java @@ -62,7 +62,6 @@ protected void initializeMockClient() throws IOException { protected void useConfiguration(String... args) throws Exception { ImmutableList extraArgs = ImmutableList.builder() - .add("--noincompatible_enable_cc_toolchain_resolution") .add("--xcode_version_config=" + MockObjcSupport.XCODE_VERSION_CONFIG) .add("--apple_crosstool_top=" + MockObjcSupport.DEFAULT_OSX_CROSSTOOL) .add("--crosstool_top=" + MockObjcSupport.DEFAULT_OSX_CROSSTOOL) @@ -75,15 +74,14 @@ protected void useConfiguration(String... args) throws Exception { @Test public void testAppleBuildVariablesIos() throws Exception { useConfiguration( - "--crosstool_top=//tools/osx/crosstool", "--xcode_version=5.8", - "--ios_minimum_os=12.345", "--watchos_minimum_os=11.111", - "--cpu=ios_x86_64", "--apple_platform_type=ios"); - scratch.file( - "x/BUILD", - "cc_binary(", - " name = 'bin',", - " srcs = ['a.cc'],", - ")"); + "--crosstool_top=//tools/osx/crosstool", + "--xcode_version=5.8", + "--ios_minimum_os=12.345", + "--watchos_minimum_os=11.111", + "--cpu=ios_x86_64", + "--apple_platform_type=ios", + "--platforms=" + MockObjcSupport.IOS_X86_64); + scratch.file("x/BUILD", "cc_binary(", " name = 'bin',", " srcs = ['a.cc'],", ")"); scratch.file("x/a.cc"); ConfiguredTarget target = getConfiguredTarget("//x:bin"); @@ -103,7 +101,7 @@ public void testAppleBuildVariablesWatchos() throws Exception { useConfiguration( "--crosstool_top=//tools/osx/crosstool", "--xcode_version=5.8", "--ios_minimum_os=12.345", "--watchos_minimum_os=" + dummyMinimumOsValue, - "--watchos_cpus=armv7k"); + "--watchos_cpus=armv7k", "--platforms=" + MockObjcSupport.WATCHOS_ARMV7K); ObjcRuleTestCase.addAppleBinaryStarlarkRule(scratch); scratch.file( "x/BUILD", @@ -145,13 +143,11 @@ public void testAppleBuildVariablesWatchos() throws Exception { @Test public void testDefaultBuildVariablesIos() throws Exception { useConfiguration( - "--apple_platform_type=ios", "--crosstool_top=//tools/osx/crosstool", "--cpu=ios_x86_64"); - scratch.file( - "x/BUILD", - "cc_binary(", - " name = 'bin',", - " srcs = ['a.cc'],", - ")"); + "--apple_platform_type=ios", + "--crosstool_top=//tools/osx/crosstool", + "--cpu=ios_x86_64", + "--platforms=" + MockObjcSupport.IOS_X86_64); + scratch.file("x/BUILD", "cc_binary(", " name = 'bin',", " srcs = ['a.cc'],", ")"); scratch.file("x/a.cc"); ConfiguredTarget target = getConfiguredTarget("//x:bin"); diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java index 8f180ce1862e81..b710580673d08c 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java @@ -222,7 +222,11 @@ public void testCompilesSourcesWithSameBaseName() throws Exception { @Test public void testObjcPlusPlusCompile() throws Exception { - useConfiguration("--apple_platform_type=ios", "--cpu=ios_i386", "--ios_minimum_os=9.10.11"); + useConfiguration( + "--apple_platform_type=ios", + "--cpu=ios_i386", + "--ios_minimum_os=9.10.11", + "--platforms=" + MockObjcSupport.IOS_I386); createLibraryTargetWriter("//objc:lib").setList("srcs", "a.mm").write(); CommandAction compileAction = compileAction("//objc:lib", "a.o"); assertThat(compileAction.getArguments()) @@ -473,7 +477,8 @@ public void testMultiPlatformLibrary() throws Exception { @Test public void testCompilationActions_simulator() throws Exception { - useConfiguration("--apple_platform_type=ios", "--cpu=ios_i386"); + useConfiguration( + "--apple_platform_type=ios", "--cpu=ios_i386", "--platforms=" + MockObjcSupport.IOS_I386); scratch.file("objc/a.m"); scratch.file("objc/non_arc.m"); @@ -518,7 +523,8 @@ public void testCompilationActions_simulator() throws Exception { @Test public void testCompilationActions_device() throws Exception { - useConfiguration("--apple_platform_type=ios", "--cpu=ios_armv7"); + useConfiguration( + "--apple_platform_type=ios", "--cpu=ios_armv7", "--platforms=" + MockObjcSupport.IOS_ARMV7); scratch.file("objc/a.m"); scratch.file("objc/non_arc.m"); @@ -683,7 +689,8 @@ public void testCompilationActionsWithCoptFmodules() throws Exception { @Test public void testArchiveAction_simulator() throws Exception { - useConfiguration("--apple_platform_type=ios", "--cpu=ios_i386"); + useConfiguration( + "--apple_platform_type=ios", "--cpu=ios_i386", "--platforms=" + MockObjcSupport.IOS_I386); createLibraryTargetWriter("//objc:lib") .setAndCreateFiles("srcs", "a.m", "b.m", "private.h") .setAndCreateFiles("hdrs", "c.h") @@ -708,7 +715,8 @@ public void testArchiveAction_simulator() throws Exception { @Test public void testArchiveAction_device() throws Exception { - useConfiguration("--apple_platform_type=ios", "--cpu=ios_armv7"); + useConfiguration( + "--apple_platform_type=ios", "--cpu=ios_armv7", "--platforms=" + MockObjcSupport.IOS_ARMV7); createLibraryTargetWriter("//objc:lib") .setAndCreateFiles("srcs", "a.m", "b.m", "private.h") .setAndCreateFiles("hdrs", "c.h") @@ -1462,7 +1470,7 @@ public void testAppleSdkDevicePlatformEnv() throws Exception { @Test public void testApplePlatformEnvForCcLibraryDep() throws Exception { - useConfiguration("--cpu=ios_i386"); + useConfiguration("--cpu=ios_i386", "--platforms=" + MockObjcSupport.IOS_I386); addAppleBinaryStarlarkRule(scratch); scratch.file( diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java index a1466b420128df..42a9b6c30e1a85 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java @@ -63,7 +63,6 @@ import com.google.devtools.common.options.OptionsParsingException; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; @@ -252,31 +251,23 @@ protected boolean platformBasedToolchains() { @Override protected void useConfiguration(String... args) throws Exception { - ImmutableList extraArgs; + ImmutableList newArgs; if (platformBasedToolchains()) { - extraArgs = MockObjcSupport.requiredObjcPlatformFlags(); + newArgs = MockObjcSupport.requiredObjcPlatformFlags(args); } else { - extraArgs = MockObjcSupport.requiredObjcCrosstoolFlags(); + newArgs = MockObjcSupport.requiredObjcCrosstoolFlags(args); } - args = Arrays.copyOf(args, args.length + extraArgs.size()); - for (int i = 0; i < extraArgs.size(); i++) { - args[(args.length - extraArgs.size()) + i] = extraArgs.get(i); - } - super.useConfiguration(args); + super.useConfiguration(newArgs.toArray(new String[] {})); } protected void useConfigurationWithCustomXcode(String... args) throws Exception { - ImmutableList extraArgs; + ImmutableList newArgs; if (platformBasedToolchains()) { - extraArgs = MockObjcSupport.requiredObjcPlatformFlagsNoXcodeConfig(); + newArgs = MockObjcSupport.requiredObjcPlatformFlagsNoXcodeConfig(args); } else { - extraArgs = MockObjcSupport.requiredObjcCrosstoolFlagsNoXcodeConfig(); - } - args = Arrays.copyOf(args, args.length + extraArgs.size()); - for (int i = 0; i < extraArgs.size(); i++) { - args[(args.length - extraArgs.size()) + i] = extraArgs.get(i); + newArgs = MockObjcSupport.requiredObjcCrosstoolFlagsNoXcodeConfig(args); } - super.useConfiguration(args); + super.useConfiguration(newArgs.toArray(new String[] {})); } /** Asserts that an action specifies the given requirement. */ @@ -509,6 +500,14 @@ protected static void addAppleBinaryStarlarkRule(Scratch scratch) throws Excepti scratch.file( "test_starlark/apple_binary_starlark.bzl", + "_CPU_TO_PLATFORM = {", + " 'darwin_x86_64': '" + MockObjcSupport.DARWIN_X86_64 + "',", + " 'ios_x86_64': '" + MockObjcSupport.IOS_X86_64 + "',", + " 'ios_arm64': '" + MockObjcSupport.IOS_ARM64 + "',", + " 'ios_i386': '" + MockObjcSupport.IOS_I386 + "',", // legacy platform used in tests + " 'ios_armv7': '" + MockObjcSupport.IOS_ARMV7 + "',", // legacy platform used in tests + " 'watchos_armv7k': '" + MockObjcSupport.WATCHOS_ARMV7K + "',", + "}", "_apple_platform_transition_inputs = [", " '//command_line_option:apple_crosstool_top',", " '//command_line_option:cpu',", @@ -527,8 +526,11 @@ protected static void addAppleBinaryStarlarkRule(Scratch scratch) throws Excepti " '//command_line_option:crosstool_top',", " '//command_line_option:fission',", " '//command_line_option:grte_top',", + " '//command_line_option:platforms',", "]", "def _command_line_options(*, environment_arch = None, platform_type, settings):", + " cpu = ('darwin_' + environment_arch if platform_type == 'macos'", + " else platform_type + '_' + environment_arch)", " output_dictionary = {", " '//command_line_option:apple configuration distinguisher':", " 'applebin_' + platform_type,", @@ -536,13 +538,12 @@ protected static void addAppleBinaryStarlarkRule(Scratch scratch) throws Excepti " '//command_line_option:apple_platforms': [],", " '//command_line_option:apple_split_cpu': environment_arch,", " '//command_line_option:compiler': None,", - " '//command_line_option:cpu': ", - " 'darwin_' + environment_arch if platform_type == 'macos'", - " else platform_type + '_' + environment_arch,", + " '//command_line_option:cpu': cpu,", " '//command_line_option:crosstool_top': ", " settings['//command_line_option:apple_crosstool_top'],", " '//command_line_option:fission': [],", " '//command_line_option:grte_top': None,", + " '//command_line_option:platforms': [_CPU_TO_PLATFORM[cpu]],", " }", " return output_dictionary", "def _apple_platform_split_transition_impl(settings, attr):", diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/BUILD index 943c9ddea6a78c..33d03d7e4b526f 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/BUILD +++ b/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/BUILD @@ -177,6 +177,7 @@ java_test( "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/test/java/com/google/devtools/build/lib/analysis/testing", "//src/test/java/com/google/devtools/build/lib/analysis/util", + "//src/test/java/com/google/devtools/build/lib/packages:testutil", "//src/test/java/com/google/devtools/build/lib/skyframe:testutil", "//third_party:auto_value", "//third_party:error_prone_annotations", diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainsForTargetsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainsForTargetsTest.java index c03ad0501253fb..476abeecf4181e 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainsForTargetsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainsForTargetsTest.java @@ -42,6 +42,7 @@ import com.google.devtools.build.lib.analysis.util.AnalysisTestCase; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.RuleClassProvider; +import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig; import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction; import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey; import com.google.devtools.build.lib.skyframe.ConfiguredValueCreationException; @@ -552,6 +553,14 @@ private AnalysisResult updateExplicitTarget(String label) throws Exception { @Test public void targetCompatibleWith_matchesExecCompatibleWith() throws Exception { + getAnalysisMock() + .ccSupport() + .setupCcToolchainConfig( + mockToolsConfig, + CcToolchainConfig.builder() + .withToolchainTargetConstraints("@//platforms:local_value_a") + .withToolchainExecConstraints() + .withCpu("fake")); scratch.file( "platforms/BUILD", "constraint_setting(name = 'local_setting')",