diff options
author | 2017-02-24 00:00:59 +0000 | |
---|---|---|
committer | 2017-02-24 08:31:04 +0000 | |
commit | 5e945570ec0b9079596756bf89437ac37e031c36 (patch) | |
tree | f6e273b0aad77c8acda6415f0608bf32dedf3442 /src | |
parent | cd66f96c8e214d8f67eb017c85e4ee8d8f11a848 (diff) |
Rollforward of "apple_binary extension_safe attribute results in configuration transition on dependencies"
This includes a fix:
Propagate iquote appropriately from apple_binary so that generated headers of xctest apps are seen by ios_test
--
PiperOrigin-RevId: 148403601
MOS_MIGRATED_REVID=148403601
Diffstat (limited to 'src')
4 files changed, 74 insertions, 19 deletions
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 a9f45cf394..ad5e8abed6 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 @@ -706,12 +706,18 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { FRAMEWORK("framework"), /** Split transition distinguisher for {@code apple_watch1_extension} rule. */ WATCH_OS1_EXTENSION("watch_os1_extension"), - /** Distinguisher for {@code apple_binary} rule with "ios" platform_type. */ + /** Distinguisher for non-extension {@code apple_binary} rule with "ios" platform_type. */ APPLEBIN_IOS("applebin_ios"), - /** Distinguisher for {@code apple_binary} rule with "watchos" platform_type. */ + /** Distinguisher for non-extension {@code apple_binary} rule with "watchos" platform_type. */ APPLEBIN_WATCHOS("applebin_watchos"), - /** Distinguisher for {@code apple_binary} rule with "tvos" platform_type. */ + /** Distinguisher for non-extension {@code apple_binary} rule with "tvos" platform_type. */ APPLEBIN_TVOS("applebin_tvos"), + /** Distinguisher for extension {@code apple_binary} rule with "ios" platform_type. */ + APPLEBIN_IOS_EXT("applebin_ios_ext"), + /** Distinguisher for extension {@code apple_binary} rule with "watchos" platform_type. */ + APPLEBIN_WATCHOS_EXT("applebin_watchos_ext"), + /** Distinguisher for extension {@code apple_binary} rule with "tvos" platform_type. */ + APPLEBIN_TVOS_EXT("applebin_tvos_ext"), /** * Distinguisher for the apple crosstool configuration. We use "apl" for output directory * names instead of "apple_crosstool" to avoid oversized path names, which can be problematic 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 d19b6900b3..79e2b1879d 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 @@ -40,6 +40,7 @@ public class AppleBinaryRule implements RuleDefinition { public static final String BINARY_TYPE_ATTR = "binary_type"; public static final String BUNDLE_LOADER_ATTR_NAME = "bundle_loader"; + public static final String EXTENSION_SAFE_ATTR_NAME = "extension_safe"; private final ObjcProtoAspect objcProtoAspect; @@ -118,6 +119,12 @@ public class AppleBinaryRule implements RuleDefinition { attr(BINARY_TYPE_ATTR, STRING) .value(AppleBinary.BinaryType.EXECUTABLE.toString()) .allowedValues(new AllowedValueSet(AppleBinary.BinaryType.getValues()))) + /* <!-- #BLAZE_RULE(apple_binary).ATTRIBUTE(extension_safe) --> + Indicates whether this binary is for an extension. This will set certain compiler + options and restrictions on dependencies of this target. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add(attr(EXTENSION_SAFE_ATTR_NAME, BOOLEAN).value(false) + .nonconfigurable("Determines the configuration transition on deps")) .add( attr(BUNDLE_LOADER_ATTR_NAME, LABEL) .direct_compile_time_input() 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 index 80bb34164a..aa32ff75b3 100644 --- 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 @@ -14,11 +14,12 @@ package com.google.devtools.build.lib.rules.objc; +import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; import static com.google.devtools.build.lib.syntax.Type.STRING; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Objects; 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.BuildOptions; @@ -33,6 +34,7 @@ import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.MultiArchPlatformRule; import java.util.List; + /** * {@link SplitTransitionProvider} implementation for multi-architecture apple rules which can * accept different apple platform types (such as ios or watchos). @@ -42,7 +44,8 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider @VisibleForTesting static final String UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT = "Unsupported platform type \"%s\""; - + + private static final String EXTENSION_COPT = "-application-extension"; private static final ImmutableSet<PlatformType> SUPPORTED_PLATFORM_TYPES = ImmutableSet.of(PlatformType.IOS, PlatformType.WATCHOS, PlatformType.TVOS); @@ -80,17 +83,23 @@ public class MultiArchSplitTransitionProvider 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)) - .put(PlatformType.TVOS, new AppleBinaryTransition(PlatformType.TVOS)) - .build(); + private static final ImmutableSet<AppleBinaryTransition> + SPLIT_TRANSITIONS = ImmutableSet.of( + new AppleBinaryTransition(PlatformType.IOS, false), + new AppleBinaryTransition(PlatformType.WATCHOS, false), + new AppleBinaryTransition(PlatformType.TVOS, false), + new AppleBinaryTransition(PlatformType.IOS, true), + new AppleBinaryTransition(PlatformType.WATCHOS, true), + new AppleBinaryTransition(PlatformType.TVOS, true)); @Override public SplitTransition<?> apply(Rule fromRule) { - String platformTypeString = NonconfigurableAttributeMapper.of(fromRule) - .get(MultiArchPlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING); + NonconfigurableAttributeMapper attrMapper = NonconfigurableAttributeMapper.of(fromRule); + String platformTypeString = + attrMapper.get(MultiArchPlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING); + + boolean isExtension = attrMapper.has(AppleBinaryRule.EXTENSION_SAFE_ATTR_NAME, BOOLEAN) + && attrMapper.get(AppleBinaryRule.EXTENSION_SAFE_ATTR_NAME, BOOLEAN); PlatformType platformType; try { platformType = getPlatformType(platformTypeString); @@ -101,7 +110,7 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider platformType = PlatformType.IOS; } - return SPLIT_TRANSITIONS_BY_TYPE.get(platformType); + return new AppleBinaryTransition(platformType, isExtension); } /** @@ -110,7 +119,7 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider */ public static List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() { return ImmutableList.<SplitTransition<BuildOptions>>copyOf( - SPLIT_TRANSITIONS_BY_TYPE.values()); + SPLIT_TRANSITIONS.asList()); } /** @@ -121,9 +130,11 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider protected static class AppleBinaryTransition implements SplitTransition<BuildOptions> { private final PlatformType platformType; + private final boolean isExtension; - public AppleBinaryTransition(PlatformType platformType) { + public AppleBinaryTransition(PlatformType platformType, boolean isExtension) { this.platformType = platformType; + this.isExtension = isExtension; } @Override @@ -133,30 +144,45 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider switch (platformType) { case IOS: cpus = buildOptions.get(AppleCommandLineOptions.class).iosMultiCpus; - configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_IOS; + if (cpus.isEmpty()) { + cpus = ImmutableList.of(buildOptions.get(AppleCommandLineOptions.class).iosCpu); + } + configurationDistinguisher = isExtension + ? ConfigurationDistinguisher.APPLEBIN_IOS_EXT + : 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; + configurationDistinguisher = isExtension + ? ConfigurationDistinguisher.APPLEBIN_WATCHOS_EXT + : ConfigurationDistinguisher.APPLEBIN_WATCHOS; break; case TVOS: cpus = buildOptions.get(AppleCommandLineOptions.class).tvosCpus; if (cpus.isEmpty()) { cpus = ImmutableList.of(AppleCommandLineOptions.DEFAULT_TVOS_CPU); } - configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_TVOS; + configurationDistinguisher = isExtension + ? ConfigurationDistinguisher.APPLEBIN_TVOS_EXT + : ConfigurationDistinguisher.APPLEBIN_TVOS; break; default: throw new IllegalArgumentException("Unsupported platform type " + platformType); } + List<String> copts = buildOptions.get(ObjcCommandLineOptions.class).copts; + if (isExtension && !copts.contains(EXTENSION_COPT)) { + copts = ImmutableList.<String>builder() + .addAll(copts).add(EXTENSION_COPT).build(); + } ImmutableList.Builder<BuildOptions> splitBuildOptions = ImmutableList.builder(); for (String cpu : cpus) { BuildOptions splitOptions = buildOptions.clone(); + splitOptions.get(ObjcCommandLineOptions.class).copts = copts; splitOptions.get(AppleCommandLineOptions.class).applePlatformType = platformType; splitOptions.get(AppleCommandLineOptions.class).appleSplitCpu = cpu; // If the new configuration does not use the apple crosstool, then it needs ios_cpu to be @@ -184,5 +210,20 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider public boolean defaultsToSelf() { return true; } + + @Override + public int hashCode() { + return Objects.hashCode(platformType, isExtension); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof AppleBinaryTransition)) { + return false; + } + AppleBinaryTransition that = (AppleBinaryTransition) other; + return Objects.equal(platformType, that.platformType) + && Objects.equal(isExtension, that.isExtension); + } } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java index c16a1052e6..e2b07a90c7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java @@ -478,6 +478,7 @@ public final class ObjcProvider extends SkylarkClassObject implements Transitive DYNAMIC_FRAMEWORK_DIR, DYNAMIC_FRAMEWORK_FILE, FLAG, + IQUOTE, MERGE_ZIP, ROOT_MERGE_ZIP, FRAMEWORK_SEARCH_PATH_ONLY, |