aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc
diff options
context:
space:
mode:
authorGravatar cparsons <cparsons@google.com>2017-04-28 17:58:18 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-04-28 18:33:39 +0200
commit151d1933823922ba9b8856c3c26c30dbd234fd27 (patch)
tree3fa58b80af65145dfde1b0bdeb72045c6629bf6d /src/main/java/com/google/devtools/build/lib/rules/objc
parent0df7a3b60ccee7485f11f50cb7d696ddd767b5a1 (diff)
Rollforward attempt 2 of "apple_binary extension_safe attribute results in configuration transition on dependencies"
RELNOTES: None. PiperOrigin-RevId: 154544751
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java55
2 files changed, 47 insertions, 15 deletions
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 6c56907e69..e2f1d50888 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,6 +14,7 @@
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;
@@ -50,7 +51,8 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
static final String INVALID_VERSION_STRING_ERROR_FORMAT =
"Invalid version string \"%s\". Version must be of the form 'x.y' without alphabetic "
+ "characters, such as '4.3'.";
-
+
+ private static final String EXTENSION_COPT = "-application-extension";
private static final ImmutableSet<PlatformType> SUPPORTED_PLATFORM_TYPES =
ImmutableSet.of(
PlatformType.IOS, PlatformType.WATCHOS, PlatformType.TVOS, PlatformType.MACOS);
@@ -115,10 +117,13 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
@Override
public SplitTransition<?> apply(Rule fromRule) {
- String platformTypeString = NonconfigurableAttributeMapper.of(fromRule)
- .get(MultiArchPlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING);
- String minimumOsVersionString = NonconfigurableAttributeMapper.of(fromRule)
- .get(MultiArchPlatformRule.MINIMUM_OS_VERSION, STRING);
+ NonconfigurableAttributeMapper attrMapper = NonconfigurableAttributeMapper.of(fromRule);
+ String platformTypeString =
+ attrMapper.get(MultiArchPlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING);
+ String minimumOsVersionString =
+ attrMapper.get(MultiArchPlatformRule.MINIMUM_OS_VERSION, STRING);
+ boolean isExtension = attrMapper.has(AppleBinaryRule.EXTENSION_SAFE_ATTR_NAME, BOOLEAN)
+ && attrMapper.get(AppleBinaryRule.EXTENSION_SAFE_ATTR_NAME, BOOLEAN);
PlatformType platformType;
Optional<DottedVersion> minimumOsVersion;
try {
@@ -137,7 +142,7 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
minimumOsVersion = Optional.absent();
}
- return new AppleBinaryTransition(platformType, minimumOsVersion);
+ return new AppleBinaryTransition(platformType, minimumOsVersion, isExtension);
}
/**
@@ -150,11 +155,14 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
private final PlatformType platformType;
// TODO(b/37096178): This should be a mandatory attribute.
private final Optional<DottedVersion> minimumOsVersion;
+ private final boolean isExtension;
public AppleBinaryTransition(PlatformType platformType,
- Optional<DottedVersion> minimumOsVersion) {
+ Optional<DottedVersion> minimumOsVersion,
+ boolean isExtension) {
this.platformType = platformType;
this.minimumOsVersion = minimumOsVersion;
+ this.isExtension = isExtension;
}
@Override
@@ -165,12 +173,16 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
switch (platformType) {
case IOS:
cpus = buildOptions.get(AppleCommandLineOptions.class).iosMultiCpus;
- // TODO(b/37463474): Temporary workaround to prevent a split transition with default
- // flag values: Don't transition unless minimum_os or ios_multi_versions are specified!
- if (cpus.isEmpty() && minimumOsVersion.isPresent()) {
- cpus = ImmutableList.of(buildOptions.get(AppleCommandLineOptions.class).iosCpu);
+ if (cpus.isEmpty()) {
+ // TODO(b/37463474): Temporary workaround to prevent a split transition with default
+ // flag values: Don't transition unless minimum_os or is_extension is specified!
+ if (minimumOsVersion.isPresent() || isExtension) {
+ cpus = ImmutableList.of(buildOptions.get(AppleCommandLineOptions.class).iosCpu);
+ }
}
- configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_IOS;
+ configurationDistinguisher = isExtension
+ ? ConfigurationDistinguisher.APPLEBIN_IOS_EXT
+ : ConfigurationDistinguisher.APPLEBIN_IOS;
actualMinimumOsVersion = minimumOsVersion.isPresent() ? minimumOsVersion.get()
: buildOptions.get(AppleCommandLineOptions.class).iosMinimumOs;
break;
@@ -179,7 +191,9 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
if (cpus.isEmpty()) {
cpus = ImmutableList.of(AppleCommandLineOptions.DEFAULT_WATCHOS_CPU);
}
- configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_WATCHOS;
+ configurationDistinguisher = isExtension
+ ? ConfigurationDistinguisher.APPLEBIN_WATCHOS_EXT
+ : ConfigurationDistinguisher.APPLEBIN_WATCHOS;
actualMinimumOsVersion = minimumOsVersion.isPresent() ? minimumOsVersion.get()
: buildOptions.get(AppleCommandLineOptions.class).watchosMinimumOs;
break;
@@ -188,7 +202,9 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
if (cpus.isEmpty()) {
cpus = ImmutableList.of(AppleCommandLineOptions.DEFAULT_TVOS_CPU);
}
- configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_TVOS;
+ configurationDistinguisher = isExtension
+ ? ConfigurationDistinguisher.APPLEBIN_TVOS_EXT
+ : ConfigurationDistinguisher.APPLEBIN_TVOS;
actualMinimumOsVersion = minimumOsVersion.isPresent() ? minimumOsVersion.get()
: buildOptions.get(AppleCommandLineOptions.class).tvosMinimumOs;
break;
@@ -197,7 +213,9 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
if (cpus.isEmpty()) {
cpus = ImmutableList.of(AppleCommandLineOptions.DEFAULT_MACOS_CPU);
}
- configurationDistinguisher = ConfigurationDistinguisher.APPLEBIN_MACOS;
+ configurationDistinguisher = isExtension
+ ? ConfigurationDistinguisher.APPLEBIN_MACOS_EXT
+ : ConfigurationDistinguisher.APPLEBIN_MACOS;
actualMinimumOsVersion = minimumOsVersion.isPresent() ? minimumOsVersion.get()
: buildOptions.get(AppleCommandLineOptions.class).macosMinimumOs;
break;
@@ -205,9 +223,16 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
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;
+
AppleCommandLineOptions appleCommandLineOptions =
splitOptions.get(AppleCommandLineOptions.class);