diff options
author | 2016-09-02 15:43:19 +0000 | |
---|---|---|
committer | 2016-09-06 15:37:56 +0000 | |
commit | 1e5add7a351de38a65f1811d0f257b80b65518dd (patch) | |
tree | e1f9f19ab5e3514417e6a21e509496d81f2fe982 | |
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
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. */ |