diff options
author | 2017-01-13 00:11:22 +0000 | |
---|---|---|
committer | 2017-01-13 10:58:28 +0000 | |
commit | 619ba31fb38b249f86024474324856a75c9ef5e2 (patch) | |
tree | 7df14d2252c74f6dc21c20a1d8ea433b96f5a42a /src | |
parent | 293b061f80e0e941e97b77c967ef2c12d2937360 (diff) |
AppleCrosstoolTransition is also applied to any incoming edge to a rule class
that may contain objc source. This only works with dynamic configurations
turned on.
This ensures that objc dependencies of non-objc targets use the apple crosstool.
--
PiperOrigin-RevId: 144384483
MOS_MIGRATED_REVID=144384483
Diffstat (limited to 'src')
14 files changed, 109 insertions, 19 deletions
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 52e4f4cbbf..d474eedcc0 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 @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.bazel.rules; import com.google.common.cache.Cache; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.HashBasedTable; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -38,7 +39,7 @@ 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 com.google.devtools.build.lib.rules.objc.AppleCrosstoolSplitTransition; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; @@ -111,12 +112,16 @@ public class BazelConfigurationCollection implements ConfigurationCollectionFact @Override public BuildConfiguration toplevelConfigurationHook(Target toTarget) { - return (AppleConfiguration.APPLE_CROSSTOOL_RULE_CLASSES - .contains(toTarget.getAssociatedRule().getRuleClass())) + ImmutableList<String> appleCrosstoolRuleClasses = configuration.useDynamicConfigurations() + ? AppleConfiguration.APPLE_CROSSTOOL_RULE_CLASSES_FOR_DYNAMIC_CONFIGS + : AppleConfiguration.APPLE_CROSSTOOL_RULE_CLASSES_FOR_STATIC_CONFIGS; + + return (appleCrosstoolRuleClasses.contains(toTarget.getAssociatedRule().getRuleClass())) ? Iterables.getOnlyElement( configuration .getTransitions() - .getSplitConfigurations(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION)) + .getSplitConfigurations( + AppleCrosstoolSplitTransition.APPLE_CROSSTOOL_SPLIT_TRANSITION)) : configuration; } } 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 366a8f521a..1a99f0d388 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,16 +65,34 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { public static final String APPLE_SDK_PLATFORM_ENV_NAME = "APPLE_SDK_PLATFORM"; /** - * Rule classes that need a top level transition to the apple crosstool. - * + * Rule classes that need a top level transition to the apple crosstool if static configurations + * are being used. + * * <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"); + public static final ImmutableList<String> APPLE_CROSSTOOL_RULE_CLASSES_FOR_STATIC_CONFIGS = + ImmutableList.of( + "objc_library", + "objc_binary", + "experimental_objc_library"); + + /** + * Rule classes that need a top level transition to the apple crosstool if dynamic configurations + * are being used. + */ + public static final ImmutableList<String> APPLE_CROSSTOOL_RULE_CLASSES_FOR_DYNAMIC_CONFIGS = + ImmutableList.of( + "apple_binary", + "apple_dynamic_library", + "apple_static_library", + "apple_watch_extension_binary", + "experimental_objc_library", + "ios_extension_binary", + "ios_test", + "objc_binary", + "objc_library"); private static final DottedVersion MINIMUM_BITCODE_XCODE_VERSION = DottedVersion.fromString("7"); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java index 0e3b6acba4..17c1ff6d82 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java @@ -127,6 +127,7 @@ public class AppleBinaryRule implements RuleDefinition { </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ .setImplicitOutputsFunction(ImplicitOutputsFunction.fromFunctions(LIPOBIN)) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolSplitTransition.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolSplitTransition.java new file mode 100644 index 0000000000..8e919c088a --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolSplitTransition.java @@ -0,0 +1,61 @@ +// Copyright 2017 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.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 java.util.List; + +/** + * Transition that produces a configuration that causes c++ toolchain selection to use the + * CROSSTOOL given in apple_crosstool_top. + * + * <p>Duplicates {@link AppleCrosstoolTransition} as a {@link SplitTransition}. This is necessary + * for the top level configuration hook, until the top level configuration hook is supported for + * dynamic configurations. + * + * <p>TODO(b/34241319): Use AppleCrosstoolTransition at the top level, and retire this class. + */ +public class AppleCrosstoolSplitTransition implements SplitTransition<BuildOptions> { + + /** + * A singleton instance of {@link AppleCrosstoolSplitTransition}, since the class must be + * stateless. Use in BuildConfigurationCollection.Transitions#topLevelConfigurationHook. + */ + public static final AppleCrosstoolSplitTransition APPLE_CROSSTOOL_SPLIT_TRANSITION = + new AppleCrosstoolSplitTransition(); + + @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; + AppleCrosstoolTransition.setAppleCrosstoolTransitionConfiguration(buildOptions, result, cpu); + + return ImmutableList.of(result); + } +} 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 index de0072ecdc..a1e468dcb3 100644 --- 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 @@ -17,23 +17,21 @@ 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.analysis.config.PatchTransition; 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> { +public class AppleCrosstoolTransition implements PatchTransition { /** * A singleton instance of AppleCrosstoolTransition. */ - public static final SplitTransition<BuildOptions> APPLE_CROSSTOOL_TRANSITION = - new AppleCrosstoolTransition(); + public static final PatchTransition APPLE_CROSSTOOL_TRANSITION = new AppleCrosstoolTransition(); @Override public boolean defaultsToSelf() { @@ -41,7 +39,7 @@ public class AppleCrosstoolTransition implements SplitTransition<BuildOptions> { } @Override - public List<BuildOptions> split(BuildOptions buildOptions) { + public BuildOptions apply(BuildOptions buildOptions) { BuildOptions result = buildOptions.clone(); result.get(AppleCommandLineOptions.class).configurationDistinguisher = ConfigurationDistinguisher.APPLE_CROSSTOOL; @@ -51,7 +49,7 @@ public class AppleCrosstoolTransition implements SplitTransition<BuildOptions> { // --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); + return result; } /** @@ -81,5 +79,4 @@ public class AppleCrosstoolTransition implements SplitTransition<BuildOptions> { // OSX toolchains do not support fission. to.get(CppOptions.class).fissionModes = ImmutableList.of(); } - } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java index 8e95d8c519..dfd276dcce 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java @@ -52,6 +52,7 @@ public class AppleDynamicLibraryRule implements RuleDefinition { </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ .setImplicitOutputsFunction(LIPO_DYLIB) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java index dd9f2b7782..a0d0dc9b30 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java @@ -89,6 +89,7 @@ public class AppleStaticLibraryRule implements RuleDefinition { </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ .setImplicitOutputsFunction(ImplicitOutputsFunction.fromFunctions(LIPO_ARCHIVE)) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinaryRule.java index a65502e7a1..05b3479c3b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinaryRule.java @@ -37,6 +37,7 @@ public class AppleWatchExtensionBinaryRule implements RuleDefinition { </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ .setImplicitOutputsFunction(XcodeSupport.PBXPROJ) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java index 85014c37e8..82612bc702 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java @@ -35,6 +35,7 @@ public class ExperimentalObjcLibraryRule implements RuleDefinition { .setImplicitOutputsFunction( ImplicitOutputsFunction.fromFunctions( CompilationSupport.FULLY_LINKED_LIB, XcodeSupport.PBXPROJ)) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java index 846e2a9e50..4e38654348 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java @@ -37,6 +37,7 @@ public class IosExtensionBinaryRule implements RuleDefinition { </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ .setImplicitOutputsFunction(XcodeSupport.PBXPROJ) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java index 1946a662e8..f39288af22 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java @@ -159,6 +159,7 @@ public class IosTestRule implements RuleDefinition { return mcov; } })) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java index 313defc35a..af198018f2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java @@ -61,6 +61,7 @@ public class ObjcBinaryRule implements RuleDefinition { attr("$is_executable", BOOLEAN) .value(true) .nonconfigurable("Called from RunCommand.isExecutable, which takes a Target")) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } 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 045b9e9891..d837e0be66 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 @@ -252,7 +252,7 @@ public class ObjcCommandLineOptions extends FragmentOptions { return ImmutableList.<SplitTransition<BuildOptions>>builder().add( IosApplication.SPLIT_ARCH_TRANSITION, IosExtension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION, AppleWatch1Extension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION, - AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) + AppleCrosstoolSplitTransition.APPLE_CROSSTOOL_SPLIT_TRANSITION) .addAll(MultiArchSplitTransitionProvider.getPotentialSplitTransitions()) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java index 9c612d45da..650bb1c2a4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java @@ -43,6 +43,7 @@ public class ObjcLibraryRule implements RuleDefinition { <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ .setImplicitOutputsFunction(ImplicitOutputsFunction.fromFunctions( CompilationSupport.FULLY_LINKED_LIB, XcodeSupport.PBXPROJ)) + .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } |