aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2016-09-02 15:43:19 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-09-06 15:37:56 +0000
commit1e5add7a351de38a65f1811d0f257b80b65518dd (patch)
treee1f9f19ab5e3514417e6a21e509496d81f2fe982
parent658a8eae9550bb6daf16eb24e1bc56c015a819c2 (diff)
Refactor apple multi-arch platform-specific split transition and rule classes to be reusable for apple_static_library and apple_dynamic_library
-- MOS_MIGRATED_REVID=132066681
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java145
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java35
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java178
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java52
6 files changed, 238 insertions, 176 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 20a01ada1b..f2678a6a8b 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -439,6 +439,7 @@ public class BazelRuleClassProvider {
builder.addRuleDefinition(new ObjcRuleClasses.SimulatorRule());
builder.addRuleDefinition(new ObjcRuleClasses.CompilingRule());
builder.addRuleDefinition(new ObjcRuleClasses.LinkingRule(objcProtoAspect));
+ builder.addRuleDefinition(new ObjcRuleClasses.MultiArchPlatformRule());
builder.addRuleDefinition(new ObjcRuleClasses.ResourcesRule());
builder.addRuleDefinition(new ObjcRuleClasses.XcodegenRule());
builder.addRuleDefinition(new ObjcRuleClasses.AlwaysLinkRule());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
index b5855192c3..0764430efa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
@@ -15,14 +15,11 @@
package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.MULTI_ARCH_LINKED_BINARIES;
-import static com.google.devtools.build.lib.syntax.Type.STRING;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
@@ -30,16 +27,9 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
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.NestedSetBuilder;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
-import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider;
-import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
-import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
-import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
-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.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
@@ -52,28 +42,14 @@ import java.util.Set;
*/
public class AppleBinary implements RuleConfiguredTargetFactory {
- /**
- * {@link SplitTransitionProvider} instance for the apple binary rule. (This is exposed for
- * convenience as a single static instance as it possesses no internal state.)
- */
- public static final AppleBinaryTransitionProvider SPLIT_TRANSITION_PROVIDER =
- new AppleBinaryTransitionProvider();
-
@VisibleForTesting
static final String REQUIRES_AT_LEAST_ONE_SOURCE_FILE =
"At least one source file is required (srcs, non_arc_srcs, or precompiled_srcs).";
- @VisibleForTesting
- static final String UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT =
- "Unsupported platform type \"%s\"";
-
- private static final ImmutableSet<PlatformType> SUPPORTED_APPLE_BINARY_PLATFORM_TYPES =
- ImmutableSet.of(PlatformType.IOS, PlatformType.WATCHOS);
-
@Override
public final ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
- PlatformType platformType = getPlatformType(ruleContext);
+ PlatformType platformType = MultiArchSplitTransitionProvider.getPlatformType(ruleContext);
ImmutableListMultimap<BuildConfiguration, ObjcProvider> configurationToNonPropagatedObjcMap =
ruleContext.getPrerequisitesByConfiguration("non_propagated_deps", Mode.SPLIT,
ObjcProvider.class);
@@ -211,123 +187,4 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
return configToProvider.keySet();
}
-
- private static PlatformType getPlatformType(RuleContext ruleContext) throws RuleErrorException {
- try {
- return getPlatformType(
- ruleContext.attributes().get(AppleBinaryRule.PLATFORM_TYPE_ATTR_NAME, STRING));
- } catch (IllegalArgumentException exception) {
- throw ruleContext.throwWithAttributeError(AppleBinaryRule.PLATFORM_TYPE_ATTR_NAME,
- String.format(UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT,
- ruleContext.attributes().get(AppleBinaryRule.PLATFORM_TYPE_ATTR_NAME, STRING)));
- }
- }
-
- private static PlatformType getPlatformType(String platformTypeString) {
- PlatformType platformType = PlatformType.fromString(platformTypeString);
-
- if (!SUPPORTED_APPLE_BINARY_PLATFORM_TYPES.contains(platformType)) {
- throw new IllegalArgumentException(
- String.format(UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT, platformTypeString));
- } else {
- return platformType;
- }
- }
-
- /**
- * {@link SplitTransitionProvider} implementation for the apple binary rule.
- */
- public static class AppleBinaryTransitionProvider implements SplitTransitionProvider {
-
- private static final ImmutableMap<PlatformType, AppleBinaryTransition>
- SPLIT_TRANSITIONS_BY_TYPE = ImmutableMap.<PlatformType, AppleBinaryTransition>builder()
- .put(PlatformType.IOS, new AppleBinaryTransition(PlatformType.IOS))
- .put(PlatformType.WATCHOS, new AppleBinaryTransition(PlatformType.WATCHOS))
- .build();
-
- @Override
- public SplitTransition<?> apply(Rule fromRule) {
- String platformTypeString = NonconfigurableAttributeMapper.of(fromRule)
- .get(AppleBinaryRule.PLATFORM_TYPE_ATTR_NAME, STRING);
- PlatformType platformType;
- try {
- platformType = getPlatformType(platformTypeString);
- } catch (IllegalArgumentException exception) {
- // There's no opportunity to propagate exception information up cleanly at the transition
- // provider level. This will later be registered as a rule error during the initialization
- // of the apple_binary target.
- platformType = PlatformType.IOS;
- }
-
- return SPLIT_TRANSITIONS_BY_TYPE.get(platformType);
- }
-
- public List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() {
- return ImmutableList.<SplitTransition<BuildOptions>>copyOf(
- SPLIT_TRANSITIONS_BY_TYPE.values());
- }
- }
-
- /**
- * Transition that results in one configured target per architecture specified in {@code
- * --ios_multi_cpus}.
- */
- protected static class AppleBinaryTransition implements SplitTransition<BuildOptions> {
-
- private final PlatformType platformType;
-
- public AppleBinaryTransition(PlatformType platformType) {
- this.platformType = platformType;
- }
-
- @Override
- public final List<BuildOptions> split(BuildOptions buildOptions) {
- List<String> cpus;
- ConfigurationDistinguisher configurationDistinguisher;
- switch (platformType) {
- case IOS:
- cpus = buildOptions.get(AppleCommandLineOptions.class).iosMultiCpus;
- configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_IOS;
- break;
- case WATCHOS:
- cpus = buildOptions.get(AppleCommandLineOptions.class).watchosCpus;
- if (cpus.isEmpty()) {
- cpus = ImmutableList.of(AppleCommandLineOptions.DEFAULT_WATCHOS_CPU);
- }
- configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_WATCHOS;
- break;
- default:
- throw new IllegalArgumentException("Unsupported platform type " + platformType);
- }
-
- ImmutableList.Builder<BuildOptions> splitBuildOptions = ImmutableList.builder();
- for (String cpu : cpus) {
- BuildOptions splitOptions = buildOptions.clone();
-
- 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);
- }
- splitOptions.get(AppleCommandLineOptions.class).configurationDistinguisher =
- configurationDistinguisher;
- splitBuildOptions.add(splitOptions);
- }
- return splitBuildOptions.build();
- }
-
- @Override
- public boolean defaultsToSelf() {
- return true;
- }
- }
}
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 f6b5c141e2..d09c494322 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
@@ -15,10 +15,8 @@
package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.packages.Attribute.attr;
-import static com.google.devtools.build.lib.packages.BuildType.LABEL;
import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
import static com.google.devtools.build.lib.syntax.Type.BOOLEAN;
-import static com.google.devtools.build.lib.syntax.Type.STRING;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.RuleDefinition;
@@ -28,7 +26,6 @@ import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplic
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
-import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
/**
* Rule definition for apple_binary.
@@ -49,37 +46,15 @@ public class AppleBinaryRule implements RuleDefinition {
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
+ MultiArchSplitTransitionProvider splitTransitionProvider =
+ new MultiArchSplitTransitionProvider();
return builder
.requiresConfigurationFragments(
ObjcConfiguration.class, J2ObjcConfiguration.class, AppleConfiguration.class)
.add(attr("$is_executable", BOOLEAN).value(true)
.nonconfigurable("Called from RunCommand.isExecutable, which takes a Target"))
- .override(builder.copy("deps").cfg(AppleBinary.SPLIT_TRANSITION_PROVIDER))
- .override(builder.copy("non_propagated_deps").cfg(AppleBinary.SPLIT_TRANSITION_PROVIDER))
- // This is currently a hack to obtain all child configurations regardless of the attribute
- // values of this rule -- this rule does not currently use the actual info provided by
- // this attribute.
- .add(attr(":cc_toolchain", LABEL)
- .cfg(AppleBinary.SPLIT_TRANSITION_PROVIDER)
- .value(ObjcRuleClasses.APPLE_TOOLCHAIN))
- /* <!-- #BLAZE_RULE(apple_binary).ATTRIBUTE(platform_type) -->
- The type of platform for which to create multi-architecture "fat" binaries in this rule.
- For example, if <code>ios</code> is selected, then fat binaries will be created
- combining all architectures specified in <code>--ios_multi_cpus</code>.
-
- Options are:
- <ul>
- <li>
- <code>ios</code> (default): architectures gathered from <code>--ios_multi_cpus</code>.
- </li>
- <li>
- <code>watchos</code>: architectures gathered from <code>--watchos_multi_cpus</code>
- </li>
- </ul>
- <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
- .add(attr(PLATFORM_TYPE_ATTR_NAME, STRING)
- .value(PlatformType.IOS.toString())
- .nonconfigurable("Determines the configuration transition on deps"))
+ .override(builder.copy("deps").cfg(splitTransitionProvider))
+ .override(builder.copy("non_propagated_deps").cfg(splitTransitionProvider))
/*<!-- #BLAZE_RULE(apple_binary).IMPLICIT_OUTPUTS -->
<ul>
<li><code><var>name</var>_lipobin</code>: the 'lipo'ed potentially multi-architecture
@@ -97,7 +72,7 @@ public class AppleBinaryRule implements RuleDefinition {
.name("apple_binary")
.factoryClass(AppleBinary.class)
.ancestors(BaseRuleClasses.BaseRule.class, ObjcRuleClasses.LinkingRule.class,
- ObjcRuleClasses.SimulatorRule.class)
+ ObjcRuleClasses.MultiArchPlatformRule.class, ObjcRuleClasses.SimulatorRule.class)
.build();
}
}
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
new file mode 100644
index 0000000000..35026f38a5
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
@@ -0,0 +1,178 @@
+// 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 static com.google.devtools.build.lib.syntax.Type.STRING;
+
+import com.google.common.annotations.VisibleForTesting;
+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;
+import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
+import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+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 java.util.List;
+
+/**
+ * {@link SplitTransitionProvider} implementation for multi-architecture apple rules which can
+ * accept different apple platform types (such as ios or watchos).
+ */
+public class MultiArchSplitTransitionProvider implements SplitTransitionProvider {
+
+ @VisibleForTesting
+ static final String UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT =
+ "Unsupported platform type \"%s\"";
+
+ private static final ImmutableSet<PlatformType> SUPPORTED_PLATFORM_TYPES =
+ ImmutableSet.of(PlatformType.IOS, PlatformType.WATCHOS);
+
+ /**
+ * Returns the apple platform type in the current rule context.
+ *
+ * @throws RuleErrorException if the platform type attribute in the current rulecontext is
+ * an invalid value
+ */
+ public static PlatformType getPlatformType(RuleContext ruleContext) throws RuleErrorException {
+ String attributeValue =
+ ruleContext.attributes().get(AppleBinaryRule.PLATFORM_TYPE_ATTR_NAME, STRING);
+ try {
+ return getPlatformType(attributeValue);
+ } catch (IllegalArgumentException exception) {
+ throw ruleContext.throwWithAttributeError(AppleBinaryRule.PLATFORM_TYPE_ATTR_NAME,
+ String.format(UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT, attributeValue));
+ }
+ }
+
+ /**
+ * Returns the apple platform type for the given platform type string (corresponding directly
+ * with platform type attribute value).
+ *
+ * @throws IllegalArgumentException if the given platform type string is not a valid type
+ */
+ public static PlatformType getPlatformType(String platformTypeString) {
+ PlatformType platformType = PlatformType.fromString(platformTypeString);
+
+ if (!SUPPORTED_PLATFORM_TYPES.contains(platformType)) {
+ throw new IllegalArgumentException(
+ String.format(UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT, platformTypeString));
+ } else {
+ return platformType;
+ }
+ }
+
+ private static final ImmutableMap<PlatformType, AppleBinaryTransition>
+ SPLIT_TRANSITIONS_BY_TYPE = ImmutableMap.<PlatformType, AppleBinaryTransition>builder()
+ .put(PlatformType.IOS, new AppleBinaryTransition(PlatformType.IOS))
+ .put(PlatformType.WATCHOS, new AppleBinaryTransition(PlatformType.WATCHOS))
+ .build();
+
+ @Override
+ public SplitTransition<?> apply(Rule fromRule) {
+ String platformTypeString = NonconfigurableAttributeMapper.of(fromRule)
+ .get(AppleBinaryRule.PLATFORM_TYPE_ATTR_NAME, STRING);
+ PlatformType platformType;
+ try {
+ platformType = getPlatformType(platformTypeString);
+ } catch (IllegalArgumentException exception) {
+ // There's no opportunity to propagate exception information up cleanly at the transition
+ // provider level. This should later be registered as a rule error during the initialization
+ // of the rule.
+ platformType = PlatformType.IOS;
+ }
+
+ return SPLIT_TRANSITIONS_BY_TYPE.get(platformType);
+ }
+
+ /**
+ * Returns the full list of potential split transitions this split transition provider may
+ * produce.
+ */
+ public static List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() {
+ return ImmutableList.<SplitTransition<BuildOptions>>copyOf(
+ SPLIT_TRANSITIONS_BY_TYPE.values());
+ }
+
+ /**
+ * Transition that results in one configured target per architecture specified in the
+ * platform-specific cpu flag for a particular platform type (for example, --watchos_cpus
+ * for watchos platform type).
+ */
+ protected static class AppleBinaryTransition implements SplitTransition<BuildOptions> {
+
+ private final PlatformType platformType;
+
+ public AppleBinaryTransition(PlatformType platformType) {
+ this.platformType = platformType;
+ }
+
+ @Override
+ public final List<BuildOptions> split(BuildOptions buildOptions) {
+ List<String> cpus;
+ ConfigurationDistinguisher configurationDistinguisher;
+ switch (platformType) {
+ case IOS:
+ cpus = buildOptions.get(AppleCommandLineOptions.class).iosMultiCpus;
+ configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_IOS;
+ break;
+ case WATCHOS:
+ cpus = buildOptions.get(AppleCommandLineOptions.class).watchosCpus;
+ if (cpus.isEmpty()) {
+ cpus = ImmutableList.of(AppleCommandLineOptions.DEFAULT_WATCHOS_CPU);
+ }
+ configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_WATCHOS;
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported platform type " + platformType);
+ }
+
+ ImmutableList.Builder<BuildOptions> splitBuildOptions = ImmutableList.builder();
+ for (String cpu : cpus) {
+ BuildOptions splitOptions = buildOptions.clone();
+
+ 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);
+ }
+ splitOptions.get(AppleCommandLineOptions.class).configurationDistinguisher =
+ configurationDistinguisher;
+ splitBuildOptions.add(splitOptions);
+ }
+ return splitBuildOptions.build();
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ 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 bd6e6723aa..2d305ca0d9 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
@@ -25,7 +25,6 @@ import com.google.devtools.build.lib.rules.apple.DottedVersion;
import com.google.devtools.build.lib.rules.apple.DottedVersionConverter;
import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
import com.google.devtools.common.options.Option;
-
import java.util.List;
/**
@@ -215,7 +214,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)
- .addAll(AppleBinary.SPLIT_TRANSITION_PROVIDER.getPotentialSplitTransitions())
+ .addAll(MultiArchSplitTransitionProvider.getPotentialSplitTransitions())
.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index ae038854b2..023b81ff80 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -909,6 +909,58 @@ public class ObjcRuleClasses {
}
/**
+ * Attribute name for apple platform type (e.g. ios or watchos).
+ */
+ static final String PLATFORM_TYPE_ATTR_NAME = "platform_type";
+
+ /**
+ * Common attributes for apple rules that build multi-architecture outputs for a given platform
+ * type (such as ios or watchos).
+ */
+ public static class MultiArchPlatformRule implements RuleDefinition {
+
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
+ MultiArchSplitTransitionProvider splitTransitionProvider =
+ new MultiArchSplitTransitionProvider();
+ return builder
+ // This is currently a hack to obtain all child configurations regardless of the attribute
+ // values of this rule -- this rule does not currently use the actual info provided by
+ // this attribute.
+ .add(attr(":cc_toolchain", LABEL)
+ .cfg(splitTransitionProvider)
+ .value(ObjcRuleClasses.APPLE_TOOLCHAIN))
+ /* <!-- #BLAZE_RULE($apple_multiarch_rule).ATTRIBUTE(platform_type) -->
+ The type of platform for which to create artifacts in this rule.
+ For example, if <code>ios</code> is selected, then the output binaries/libraries will
+ be created combining all architectures specified in <code>--ios_multi_cpus</code>.
+
+ Options are:
+ <ul>
+ <li>
+ <code>ios</code> (default): architectures gathered from <code>--ios_multi_cpus</code>.
+ </li>
+ <li>
+ <code>watchos</code>: architectures gathered from <code>--watchos_multi_cpus</code>
+ </li>
+ </ul>
+ <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
+ .add(attr(PLATFORM_TYPE_ATTR_NAME, STRING)
+ .value(PlatformType.IOS.toString())
+ .nonconfigurable("Determines the configuration transition on deps"))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("$apple_multiarch_rule")
+ .type(RuleClassType.ABSTRACT)
+ .build();
+ }
+ }
+
+ /**
* Common attributes for {@code objc_*} rules that create a bundle. Specifically, for rules
* which use the {@link Bundling} helper class.
*/