aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
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 /src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java145
1 files changed, 1 insertions, 144 deletions
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;
- }
- }
}