diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
6 files changed, 126 insertions, 17 deletions
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 648e3963a4..6724465d02 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 @@ public class AppleCommandLineOptions extends FragmentOptions { 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 34a6a05664..b685056f65 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 class AppleConfiguration extends BuildConfiguration.Fragment { **/ 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 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { 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 0000000000..647c97a3be --- /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 1425c597db..ba091e3ab0 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.ImmutableList; 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.AppleCommandLineOptions; 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 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider 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 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider 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 c2f45b5cd0..7dc9e6800a 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 class ObjcCommandLineOptions extends FragmentOptions { 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 1197cd3bf0..90944aa2ef 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.SpawnAction; 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 @@ public final class ReleaseBundlingSupport { 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 @@ public final class ReleaseBundlingSupport { */ 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 |