Introduce --apple_crosstool_top, which sets the crosstool for sources in objc_*/apple_*/ios_* targets and their dependencies.
--
PiperOrigin-RevId: 142673622
MOS_MIGRATED_REVID=142673622
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
index a539a6c..52e4f4c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java
@@ -19,6 +19,7 @@
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Table;
import com.google.devtools.build.lib.analysis.ConfigurationCollectionFactory;
@@ -34,7 +35,10 @@
import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.build.lib.packages.Attribute.Transition;
+import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.cpp.CppRuleClasses.LipoTransition;
+import com.google.devtools.build.lib.rules.objc.AppleCrosstoolTransition;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
@@ -104,6 +108,17 @@
return super.getDynamicTransition(configurationTransition);
}
}
+
+ @Override
+ public BuildConfiguration toplevelConfigurationHook(Target toTarget) {
+ return (AppleConfiguration.APPLE_CROSSTOOL_RULE_CLASSES
+ .contains(toTarget.getAssociatedRule().getRuleClass()))
+ ? Iterables.getOnlyElement(
+ configuration
+ .getTransitions()
+ .getSplitConfigurations(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION))
+ : configuration;
+ }
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
index 648e396..6724465 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
@@ -136,6 +136,16 @@
help = "Specifies to target CPU of iOS compilation.")
public String iosCpu;
+ @Option(
+ name = "apple_crosstool_top",
+ defaultValue = "@bazel_tools//tools/cpp:toolchain",
+ category = "version",
+ converter = LabelConverter.class,
+ help = "The label of the crosstool package to be used in Apple and Objc rules and their"
+ + " dependencies."
+ )
+ public Label appleCrosstoolTop;
+
@Option(name = "apple_platform_type",
defaultValue = "IOS",
category = "undocumented",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
index 34a6a05..b685056 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
@@ -65,8 +65,20 @@
**/
public static final String APPLE_SDK_PLATFORM_ENV_NAME = "APPLE_SDK_PLATFORM";
- private static final DottedVersion MINIMUM_BITCODE_XCODE_VERSION = DottedVersion.fromString("7");
+ /**
+ * Rule classes that need a top level transition to the apple crosstool.
+ *
+ * <p>This list must not contain any rule classes that require some other split transition, as
+ * that transition would be suppressed by the top level transition to the apple crosstool. For
+ * example, if "apple_binary" were in this list, the multi-arch transition would not occur.
+ */
+ public static final ImmutableList<String> APPLE_CROSSTOOL_RULE_CLASSES = ImmutableList.of(
+ "objc_library",
+ "objc_binary",
+ "experimental_objc_library");
+ private static final DottedVersion MINIMUM_BITCODE_XCODE_VERSION = DottedVersion.fromString("7");
+
private final DottedVersion iosSdkVersion;
private final DottedVersion iosMinimumOs;
private final DottedVersion watchosSdkVersion;
@@ -628,5 +640,7 @@
APPLEBIN_WATCHOS,
/** Distinguisher for {@code apple_binary} rule with "tvos" platform_type. */
APPLEBIN_TVOS,
+ /** Distinguisher for the apple crosstool configuration. */
+ APPLE_CROSSTOOL,
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
new file mode 100644
index 0000000..647c97a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
@@ -0,0 +1,82 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.objc;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
+import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions;
+import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
+import com.google.devtools.build.lib.rules.cpp.CppOptions;
+import java.util.List;
+
+/**
+ * Transition that produces a configuration that causes c++ toolchain selection to use the
+ * CROSSTOOL given in apple_crosstool_top.
+ */
+public class AppleCrosstoolTransition implements SplitTransition<BuildOptions> {
+
+ /**
+ * A singleton instance of AppleCrosstoolTransition.
+ */
+ public static final SplitTransition<BuildOptions> APPLE_CROSSTOOL_TRANSITION =
+ new AppleCrosstoolTransition();
+
+ @Override
+ public boolean defaultsToSelf() {
+ return true;
+ }
+
+ @Override
+ public List<BuildOptions> split(BuildOptions buildOptions) {
+ BuildOptions result = buildOptions.clone();
+ result.get(AppleCommandLineOptions.class).configurationDistinguisher =
+ ConfigurationDistinguisher.APPLE_CROSSTOOL;
+
+
+ // TODO(b/29355778): Once ios_cpu is retired, introduce another top-level flag (perhaps
+ // --apple_cpu) for toolchain selection in top-level consuming rules.
+ String cpu = "ios_" + buildOptions.get(AppleCommandLineOptions.class).iosCpu;
+ setAppleCrosstoolTransitionConfiguration(buildOptions, result, cpu);
+ return ImmutableList.of(result);
+ }
+
+ /**
+ * Sets configuration fields required for a transition that uses apple_crosstool_top in place of
+ * the default CROSSTOOL.
+ *
+ * @param from options from the originating configuration
+ * @param to options for the destination configuration. This instance will be modified
+ * to so the destination configuration uses the apple crosstool
+ * @param cpu {@code --cpu} value for toolchain selection in the destination configuration
+ */
+ public static void setAppleCrosstoolTransitionConfiguration(BuildOptions from,
+ BuildOptions to, String cpu) {
+ to.get(BuildConfiguration.Options.class).cpu = cpu;
+ to.get(CppOptions.class).crosstoolTop =
+ from.get(AppleCommandLineOptions.class).appleCrosstoolTop;
+
+ // --compiler = "compiler" for all OSX toolchains. We do not support asan/tsan, cfi, etc. on
+ // darwin.
+ to.get(CppOptions.class).cppCompiler = "compiler";
+
+ // OSX toolchains always use the runtime of the platform they are targeting (i.e. we do not
+ // support custom production environments).
+ to.get(CppOptions.class).libcTop = null;
+ to.get(CppOptions.class).glibc = null;
+ }
+
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
index 1425c59..ba091e3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
@@ -21,7 +21,6 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider;
@@ -32,7 +31,6 @@
import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.MultiArchPlatformRule;
-
import java.util.List;
/**
@@ -161,17 +159,20 @@
splitOptions.get(AppleCommandLineOptions.class).applePlatformType = platformType;
splitOptions.get(AppleCommandLineOptions.class).appleSplitCpu = cpu;
- // Set for backwards compatibility with rules that depend on this flag, even when
- // ios is not the platform type.
- // TODO(b/28958783): Clean this up.
- splitOptions.get(AppleCommandLineOptions.class).iosCpu = cpu;
if (splitOptions.get(ObjcCommandLineOptions.class).enableCcDeps) {
// Only set the (CC-compilation) CPU for dependencies if explicitly required by the user.
// This helps users of the iOS rules who do not depend on CC rules as these CPU values
// require additional flags to work (e.g. a custom crosstool) which now only need to be
// set if this feature is explicitly requested.
- splitOptions.get(BuildConfiguration.Options.class).cpu =
- String.format("%s_%s", platformType, cpu);
+ String platformCpu = String.format("%s_%s", platformType, cpu);
+ AppleCrosstoolTransition.setAppleCrosstoolTransitionConfiguration(buildOptions,
+ splitOptions, platformCpu);
+ } else {
+ // If the new configuration does not use the apple crosstool, then it needs ios_cpu to be
+ // to decide architecture.
+ // TODO(b/29355778, b/28403953): Use a crosstool for any apple rule, and remove this
+ // "else" clause. Deprecate ios_cpu.
+ splitOptions.get(AppleCommandLineOptions.class).iosCpu = cpu;
}
splitOptions.get(AppleCommandLineOptions.class).configurationDistinguisher =
configurationDistinguisher;
@@ -185,4 +186,4 @@
return true;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
index c2f45b5..7dc9e68 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
@@ -251,7 +251,8 @@
public List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() {
return ImmutableList.<SplitTransition<BuildOptions>>builder().add(
IosApplication.SPLIT_ARCH_TRANSITION, IosExtension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION,
- AppleWatch1Extension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION)
+ AppleWatch1Extension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION,
+ AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION)
.addAll(MultiArchSplitTransitionProvider.getPotentialSplitTransitions())
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
index 1197cd3..90944aa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
@@ -47,7 +47,6 @@
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -1344,7 +1343,7 @@
ImmutableList.Builder<BuildOptions> splitBuildOptions = ImmutableList.builder();
for (String iosCpu : iosMultiCpus) {
BuildOptions splitOptions = buildOptions.clone();
- setArchitectureOptions(splitOptions, iosCpu);
+ setArchitectureOptions(splitOptions, buildOptions, iosCpu);
setAdditionalOptions(splitOptions, buildOptions);
splitOptions.get(AppleCommandLineOptions.class).configurationDistinguisher =
getConfigurationDistinguisher();
@@ -1372,17 +1371,19 @@
*/
protected void setAdditionalOptions(BuildOptions splitOptions, BuildOptions originalOptions) {}
- private void setArchitectureOptions(BuildOptions splitOptions, String iosCpu) {
+ private static void setArchitectureOptions(BuildOptions splitOptions,
+ BuildOptions originalOptions, String iosCpu) {
splitOptions.get(AppleCommandLineOptions.class).applePlatformType = PlatformType.IOS;
splitOptions.get(AppleCommandLineOptions.class).appleSplitCpu = iosCpu;
splitOptions.get(AppleCommandLineOptions.class).iosCpu = iosCpu;
- if (splitOptions.get(ObjcCommandLineOptions.class).enableCcDeps) {
+ if (splitOptions.get(ObjcCommandLineOptions.class).enableCcDeps) {
// Only set the (CC-compilation) CPU for dependencies if explicitly required by the user.
// This helps users of the iOS rules who do not depend on CC rules as these CPU values
// require additional flags to work (e.g. a custom crosstool) which now only need to be set
// if this feature is explicitly requested.
- splitOptions.get(BuildConfiguration.Options.class).cpu = "ios_" + iosCpu;
- }
+ AppleCrosstoolTransition.setAppleCrosstoolTransitionConfiguration(originalOptions,
+ splitOptions, "ios_" + iosCpu);
+ }
}
@Override
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
index 14e38ac..5f8b523 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
@@ -21,6 +21,10 @@
toolchain_identifier: "local_darwin"
}
default_toolchain {
+ cpu: "ios_x86_64"
+ toolchain_identifier: "local_ios"
+}
+default_toolchain {
cpu: "x64_windows"
toolchain_identifier: "local_windows_msys64"
}
@@ -354,6 +358,52 @@
supports_interface_shared_objects: true
}
+# Stub crosstool to allow construction of apple crosstool configuration in a
+# static configuration set.
+# TODO(b/33804121): Remove this once dynamic configurations are in place.
+toolchain {
+ toolchain_identifier: "local_ios"
+
+ host_system_name: "local"
+ target_system_name: "local"
+ target_cpu: "ios_x86_64"
+ target_libc: "ios"
+ compiler: "compiler"
+ linking_mode_flags { mode: DYNAMIC }
+
+ abi_version: "local"
+ abi_libc_version: "local"
+
+ tool_path { name: "ar" path: "/usr/bin/libtool" }
+ tool_path { name: "compat-ld" path: "/usr/bin/ld" }
+ tool_path { name: "cpp" path: "/usr/bin/cpp" }
+ tool_path { name: "dwp" path: "/usr/bin/dwp" }
+ tool_path { name: "gcc" path: "/usr/bin/gcc" }
+ tool_path { name: "gcov" path: "/usr/bin/gcov" }
+ tool_path { name: "ld" path: "/usr/bin/ld" }
+ tool_path { name: "nm" path: "/usr/bin/nm" }
+ tool_path { name: "objcopy" path: "/usr/bin/objcopy" }
+ tool_path { name: "objdump" path: "/usr/bin/objdump" }
+ tool_path { name: "strip" path: "/usr/bin/strip" }
+
+ needsPic: false
+
+ builtin_sysroot: ""
+ cxx_flag: "-std=c++0x"
+ ar_flag: "-static"
+ ar_flag: "-s"
+ ar_flag: "-o"
+ linker_flag: "-lstdc++"
+ cxx_builtin_include_directory: "/usr/include"
+ cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
+ cxx_builtin_include_directory: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"
+ cxx_builtin_include_directory: "/opt/local/include"
+ cxx_builtin_include_directory: "/Library/Developer/CommandLineTools"
+ objcopy_embed_flag: "-I"
+ objcopy_embed_flag: "binary"
+ supports_interface_shared_objects: true
+}
+
toolchain {
toolchain_identifier: "local_windows_mingw"
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 dd2f474..cc063b1 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
@@ -87,6 +87,7 @@
" 'k8|compiler': ':cc-compiler-k8',",
" 'piii|compiler': ':cc-compiler-piii',",
" 'darwin|compiler': ':cc-compiler-darwin',",
+ " 'ios_x86_64|compiler': ':cc-compiler-ios_x86_64',",
" 'armeabi-v7a|compiler': ':cc-compiler-armeabi-v7a',",
" 'x64_windows|windows_msys64': ':cc-compiler-x64_windows',",
" 'ppc|compiler': ':cc-compiler-ppc',",
@@ -116,6 +117,13 @@
" module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
" objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
")",
+ "cc_toolchain(name = 'cc-compiler-ios_x86_64', all_files = ':empty', ",
+ " compiler_files = ':empty',",
+ " cpu = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
+ " linker_files = ':empty',",
+ " module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
+ " objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
+ ")",
"cc_toolchain(name = 'cc-compiler-armeabi-v7a', all_files = ':empty', ",
" compiler_files = ':empty',",
" cpu = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD
index 4e93a31..c7df6cf 100644
--- a/tools/cpp/BUILD
+++ b/tools/cpp/BUILD
@@ -39,6 +39,7 @@
"x64_windows|compiler": ":cc-compiler-x64_windows",
"x64_windows_msvc|compiler": ":cc-compiler-x64_windows_msvc",
"ppc|compiler": ":cc-compiler-ppc",
+ "ios_x86_64|compiler": ":cc-compiler-ios_x86_64",
},
)
@@ -154,6 +155,20 @@
supports_param_files = 1,
)
+cc_toolchain(
+ name = "cc-compiler-ios_x86_64",
+ all_files = ":empty",
+ compiler_files = ":empty",
+ cpu = "local",
+ dwp_files = ":empty",
+ dynamic_runtime_libs = [":empty"],
+ linker_files = ":empty",
+ objcopy_files = ":empty",
+ static_runtime_libs = [":empty"],
+ strip_files = ":empty",
+ supports_param_files = 0,
+)
+
filegroup(
name = "every-file-x64_windows",
srcs = [
diff --git a/tools/cpp/CROSSTOOL b/tools/cpp/CROSSTOOL
index 0922cf3..bfe3e80 100644
--- a/tools/cpp/CROSSTOOL
+++ b/tools/cpp/CROSSTOOL
@@ -43,6 +43,12 @@
cpu: "ppc"
toolchain_identifier: "local_linux"
}
+
+default_toolchain {
+ cpu: "ios_x86_64"
+ toolchain_identifier: "ios_x86_64"
+}
+
toolchain {
abi_version: "armeabi-v7a"
abi_libc_version: "armeabi-v7a"
@@ -807,3 +813,37 @@
compiler_flag: "-Xcompilation-mode=opt"
}
}
+
+# Stub crosstool to allow construction of apple crosstool configuration in a
+# static configuration set.
+# TODO(b/33804121): Remove this once dynamic configurations are in place.
+toolchain {
+ toolchain_identifier: "ios_x86_64"
+ host_system_name: "x86_64-apple-macosx"
+ target_system_name: "x86_64-apple-ios"
+ target_cpu: "ios_x86_64"
+ target_libc: "ios"
+ compiler: "compiler"
+ abi_version: "local"
+ abi_libc_version: "local"
+ supports_gold_linker: false
+ supports_incremental_linker: false
+ supports_fission: false
+ supports_interface_shared_objects: false
+ supports_normalizing_ar: false
+ supports_start_end_lib: false
+
+ tool_path { name: "ar" path: "/bin/false" }
+ tool_path { name: "compat-ld" path: "/bin/false" }
+ tool_path { name: "cpp" path: "/bin/false" }
+ tool_path { name: "dwp" path: "/bin/false" }
+ tool_path { name: "gcc" path: "/bin/false" }
+ tool_path { name: "gcov" path: "/bin/false" }
+ tool_path { name: "ld" path: "/bin/false" }
+
+ tool_path { name: "nm" path: "/bin/false" }
+ tool_path { name: "objcopy" path: "/bin/false" }
+ tool_path { name: "objdump" path: "/bin/false" }
+ tool_path { name: "strip" path: "/bin/false" }
+ linking_mode_flags { mode: DYNAMIC }
+}