diff options
author | 2016-09-02 15:43:19 +0000 | |
---|---|---|
committer | 2016-09-06 15:37:56 +0000 | |
commit | 1e5add7a351de38a65f1811d0f257b80b65518dd (patch) | |
tree | e1f9f19ab5e3514417e6a21e509496d81f2fe982 /src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java | |
parent | 658a8eae9550bb6daf16eb24e1bc56c015a819c2 (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.java | 145 |
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; - } - } } |