aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfigurationCollection.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolSplitTransition.java61
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatchExtensionBinaryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java1
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();
}