aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Attribute.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java31
8 files changed, 55 insertions, 25 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index 33c7531f4c..d406511d66 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -371,8 +371,7 @@ public abstract class DependencyResolver {
LateBoundDefault<?, ?> lateBoundDefault = attribute.getLateBoundDefault();
- Collection<BuildOptions> splitOptions =
- getSplitOptions(depResolver.rule, attribute, ruleConfig);
+ Collection<BuildOptions> splitOptions = getSplitOptions(attributeMap, attribute, ruleConfig);
if (!splitOptions.isEmpty() && !ruleConfig.isHostConfiguration()) {
// Late-bound attribute with a split transition:
// Since we want to get the same results as TransitionResolver.evaluateTransition (but
@@ -425,14 +424,15 @@ public abstract class DependencyResolver {
* <p>Even though the attribute may have a split, splits don't have to apply in every
* configuration (see {@link Attribute.SplitTransition#split}).
*/
- private static Collection<BuildOptions> getSplitOptions(Rule rule, Attribute attribute,
+ private static Collection<BuildOptions> getSplitOptions(ConfiguredAttributeMapper attributeMap,
+ Attribute attribute,
BuildConfiguration ruleConfig) {
if (!attribute.hasSplitConfigurationTransition()) {
return ImmutableList.<BuildOptions>of();
}
@SuppressWarnings("unchecked") // Attribute.java doesn't have the BuildOptions symbol.
Attribute.SplitTransition<BuildOptions> transition =
- (Attribute.SplitTransition<BuildOptions>) attribute.getSplitTransition(rule);
+ (Attribute.SplitTransition<BuildOptions>) attribute.getSplitTransition(attributeMap);
return transition.split(ruleConfig.getOptions());
}
@@ -716,7 +716,7 @@ public abstract class DependencyResolver {
return; // Skip this round: we still need to Skyframe-evaluate the dep's target.
}
Attribute.Transition transition = transitionResolver.evaluateTransition(
- ruleConfig, rule, attributeAndOwner.attribute, toTarget);
+ ruleConfig, rule, attributeAndOwner.attribute, toTarget, attributeMap);
outgoingEdges.put(
attributeAndOwner.attribute,
transition == Attribute.ConfigurationTransition.NULL
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 55e1f20879..f94ac86ca3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -251,7 +251,7 @@ public final class RuleContext extends TargetContext
public Root getMiddlemanDirectory() {
return getConfiguration().getMiddlemanDirectory(rule.getRepository());
}
-
+
public Rule getRule() {
return rule;
}
@@ -748,7 +748,8 @@ public final class RuleContext extends TargetContext
Attribute attributeDefinition = attributes().getAttributeDefinition(attributeName);
@SuppressWarnings("unchecked") // Attribute.java doesn't have the BuildOptions symbol.
SplitTransition<BuildOptions> transition =
- (SplitTransition<BuildOptions>) attributeDefinition.getSplitTransition(rule);
+ (SplitTransition<BuildOptions>) attributeDefinition.getSplitTransition(
+ ConfiguredAttributeMapper.of(rule, configConditions));
List<ConfiguredTarget> deps = targetMap.get(attributeName);
List<BuildOptions> splitOptions = transition.split(getConfiguration().getOptions());
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
index ebcefb6eb2..289f4453f6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
@@ -19,6 +19,7 @@ import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.build.lib.packages.Attribute.Transition;
+import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper;
import com.google.devtools.build.lib.packages.InputFile;
import com.google.devtools.build.lib.packages.PackageGroup;
import com.google.devtools.build.lib.packages.Rule;
@@ -63,7 +64,7 @@ public final class TransitionResolver {
* {@link Attribute.ConfigurationTransition}).
*/
public Transition evaluateTransition(BuildConfiguration fromConfig, final Rule fromRule,
- final Attribute attribute, final Target toTarget) {
+ final Attribute attribute, final Target toTarget, ConfiguredAttributeMapper attributeMap) {
// I. Input files and package groups have no configurations. We don't want to duplicate them.
if (usesNullConfiguration(toTarget)) {
@@ -112,7 +113,7 @@ public final class TransitionResolver {
// The "else" is a legacy restriction from static configurations.
if (attribute.hasSplitConfigurationTransition()) {
currentTransition = split(currentTransition,
- (SplitTransition<BuildOptions>) attribute.getSplitTransition(fromRule));
+ (SplitTransition<BuildOptions>) attribute.getSplitTransition(attributeMap));
} else {
// III. Attributes determine configurations. The configuration of a prerequisite is determined
// by the attribute.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 2fedb6a0b5..1f8313c071 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -188,7 +188,8 @@ public final class Attribute implements Comparable<Attribute> {
/**
* Transition to one or more configurations. To obtain the actual child configurations,
- * invoke {@link Attribute#getSplitTransition(Rule)}. See {@link SplitTransition}.
+ * invoke {@link Attribute#getSplitTransition(ConfiguredAttributeMapper)}.
+ * See {@link SplitTransition}.
**/
SPLIT
}
@@ -317,9 +318,9 @@ public final class Attribute implements Comparable<Attribute> {
*/
public interface SplitTransitionProvider {
/**
- * Returns the {@link SplitTransition} given the originating rule.
+ * Returns the {@link SplitTransition} given the attribute mapper of the originating rule.
*/
- SplitTransition<?> apply(Rule fromRule);
+ SplitTransition<?> apply(ConfiguredAttributeMapper attributeMap);
}
/**
@@ -335,7 +336,7 @@ public final class Attribute implements Comparable<Attribute> {
}
@Override
- public SplitTransition<?> apply(Rule fromRule) {
+ public SplitTransition<?> apply(ConfiguredAttributeMapper attributeMap) {
return splitTransition;
}
}
@@ -1954,13 +1955,13 @@ public final class Attribute implements Comparable<Attribute> {
/**
* Returns the split configuration transition for this attribute.
*
- * @param rule the originating {@link Rule} which owns this attribute
+ * @param attributeMapper the attribute mapper of the current {@link Rule}
* @return a SplitTransition<BuildOptions> object
* @throws IllegalStateException if {@link #hasSplitConfigurationTransition} is not true
*/
- public SplitTransition<?> getSplitTransition(Rule rule) {
+ public SplitTransition<?> getSplitTransition(ConfiguredAttributeMapper attributeMapper) {
Preconditions.checkState(hasSplitConfigurationTransition());
- return splitTransitionProvider.apply(rule);
+ return splitTransitionProvider.apply(attributeMapper);
}
/**
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 60895449a0..cc80e1b76c 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
@@ -26,8 +26,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options;
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.ConfiguredAttributeMapper;
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;
@@ -124,8 +123,7 @@ public class MultiArchSplitTransitionProvider implements SplitTransitionProvider
}
@Override
- public SplitTransition<?> apply(Rule fromRule) {
- NonconfigurableAttributeMapper attrMapper = NonconfigurableAttributeMapper.of(fromRule);
+ public SplitTransition<?> apply(ConfiguredAttributeMapper attrMapper) {
String platformTypeString = attrMapper.get(PlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING);
String minimumOsVersionString = attrMapper.get(PlatformRule.MINIMUM_OS_VERSION, STRING);
PlatformType platformType;
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 f18c11f930..9278b01be3 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,16 +909,14 @@ public class ObjcRuleClasses {
<!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
.add(
attr(PLATFORM_TYPE_ATTR_NAME, STRING)
- .mandatory()
- .nonconfigurable("Determines the configuration transition on deps"))
+ .mandatory())
/* <!-- #BLAZE_RULE($apple_platform_rule).ATTRIBUTE(minimum_os_version) -->
The minimum OS version that this target and its dependencies should be built for.
This should be a dotted version string such as "7.3".
<!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
.add(
- attr(MINIMUM_OS_VERSION, STRING)
- .nonconfigurable("Determines the configuration transition on deps"))
+ attr(MINIMUM_OS_VERSION, STRING))
.build();
}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
index 70ffa8f573..6d259f4b1a 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
@@ -301,7 +301,7 @@ public class AttributeTest {
private static class TestSplitTransitionProvider implements SplitTransitionProvider {
@Override
- public SplitTransition<?> apply(Rule fromRule) {
+ public SplitTransition<?> apply(ConfiguredAttributeMapper attrMapper) {
return new TestSplitTransition();
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index 698f33423c..33c5e26218 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -1119,6 +1119,37 @@ public class AppleBinaryTest extends ObjcRuleTestCase {
getGeneratingAction(arm64ProtoObjcSource).getInputs(), "two.proto")).isNotNull();
}
+ @Test
+ public void testPlatformTypeIsConfigurable() throws Exception {
+ scratch.file(
+ "examples/BUILD",
+ "package(default_visibility = ['//visibility:public'])",
+ "apple_binary(",
+ " name = 'bin',",
+ " deps = [':objc_lib'],",
+ " platform_type = select({",
+ " ':watch_setting': 'watchos',",
+ " '//conditions:default': 'ios',",
+ " }),",
+ ")",
+ "objc_library(",
+ " name = 'objc_lib',",
+ " srcs = ['a.m'],",
+ ")",
+ "config_setting(",
+ " name = 'watch_setting',",
+ " values = {'define': 'use_watch=1'},",
+ ")");
+
+ useConfiguration("--define=use_watch=1",
+ "--ios_multi_cpus=armv7,arm64",
+ "--watchos_cpus=armv7k");
+
+ Action lipoAction = actionProducingArtifact("//examples:bin", "_lipobin");
+
+ assertThat(getSingleArchBinary(lipoAction, "armv7k")).isNotNull();
+ }
+
private SkylarkDict<String, SkylarkDict<String, Artifact>>
generateAppleDebugOutputsSkylarkProviderMap() throws Exception {
scratch.file("examples/rule/BUILD");