aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2017-02-24 00:00:59 +0000
committerGravatar Irina Iancu <elenairina@google.com>2017-02-24 08:31:04 +0000
commit5e945570ec0b9079596756bf89437ac37e031c36 (patch)
treef6e273b0aad77c8acda6415f0608bf32dedf3442 /src
parentcd66f96c8e214d8f67eb017c85e4ee8d8f11a848 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java12
-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.java73
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java1
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,