aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/common/BazelFilegroupRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java5
10 files changed, 88 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
index 269e2451ab..2fbf670d8d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.analysis;
-import static com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy.DATA;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.DISTRIBUTIONS;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
@@ -154,7 +153,11 @@ public class BaseRuleClasses {
// The target itself and run_under both run on the same machine. We use the DATA config
// here because the run_under acts like a data dependency (e.g. no LIPO optimization).
- .add(attr(":run_under", LABEL).cfg(DATA).value(RUN_UNDER).skipPrereqValidatorCheck())
+ .add(
+ attr(":run_under", LABEL)
+ .cfg(env.getLipoDataTransition())
+ .value(RUN_UNDER)
+ .skipPrereqValidatorCheck())
.build();
}
@@ -328,7 +331,7 @@ public class BaseRuleClasses {
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
return builder
.add(attr("deps", LABEL_LIST).legacyAllowAnyFileType())
- .add(attr("data", LABEL_LIST).cfg(DATA)
+ .add(attr("data", LABEL_LIST).cfg(env.getLipoDataTransition())
.allowedFileTypes(FileTypeSet.ANY_FILE)
.dontCheckConstraints())
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index c73e136438..744430f4d9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -1201,6 +1201,7 @@ public class BuildView {
ImmutableList.of(),
targetConfig,
configurations.getHostConfiguration(),
+ ruleClassProvider.getLipoDataTransition(),
ruleClassProvider.getPrerequisiteValidator(),
((Rule) target).getRuleClassObject().getConfigurationFragmentPolicy())
.setVisibility(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 2b1a480921..9a57dae845 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -34,6 +34,7 @@ import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactor
import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
import com.google.devtools.build.lib.analysis.config.DynamicTransitionMapper;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
+import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
import com.google.devtools.build.lib.analysis.skylark.SkylarkModules;
import com.google.devtools.build.lib.cmdline.Label;
@@ -229,6 +230,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
new Digraph<>();
private ImmutableMap.Builder<Transition, Transition> dynamicTransitionMaps
= ImmutableMap.builder();
+ private PatchTransition lipoDataTransition;
private Class<? extends BuildConfiguration.Fragment> universalFragment;
private PrerequisiteValidator prerequisiteValidator;
private ImmutableMap.Builder<String, Object> skylarkAccessibleTopLevels =
@@ -391,6 +393,27 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
return this;
}
+ /**
+ * Sets the C++ LIPO data transition, as defined in {@link
+ * com.google.devtools.build.lib.rules.cpp.transitions.DisableLipoTransition}.
+ *
+ * <p>This is language-specific, so doesn't really belong here. But since non-C++ rules declare
+ * this transition, we need universal access to it. The need for this interface should go away
+ * on the deprecation of LIPO for
+ * <a href="https://clang.llvm.org/docs/ThinLTO.html">ThinLTO</a>.
+ */
+ public Builder setLipoDataTransition(PatchTransition transition) {
+ Preconditions.checkState(lipoDataTransition == null, "LIPO data transition already set");
+ lipoDataTransition = Preconditions.checkNotNull(transition);
+ return this;
+ }
+
+ @Override
+ public PatchTransition getLipoDataTransition() {
+ Preconditions.checkState(lipoDataTransition != null);
+ return lipoDataTransition;
+ }
+
private RuleConfiguredTargetFactory createFactory(
Class<? extends RuleConfiguredTargetFactory> factoryClass) {
try {
@@ -465,6 +488,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
ImmutableList.copyOf(configurationOptions),
ImmutableList.copyOf(configurationFragmentFactories),
new DynamicTransitionMapper(dynamicTransitionMaps.build()),
+ lipoDataTransition,
universalFragment,
prerequisiteValidator,
skylarkAccessibleTopLevels.build(),
@@ -571,6 +595,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
*/
private final DynamicTransitionMapper dynamicTransitionMapper;
+ private final PatchTransition lipoDataTransition;
+
/**
* A configuration fragment that should be available to all rules even when they don't
* explicitly require it.
@@ -600,6 +626,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
ImmutableList<Class<? extends FragmentOptions>> configurationOptions,
ImmutableList<ConfigurationFragmentFactory> configurationFragments,
DynamicTransitionMapper dynamicTransitionMapper,
+ PatchTransition lipoDataTransition,
Class<? extends BuildConfiguration.Fragment> universalFragment,
PrerequisiteValidator prerequisiteValidator,
ImmutableMap<String, Object> skylarkAccessibleJavaClasses,
@@ -617,6 +644,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
this.configurationOptions = configurationOptions;
this.configurationFragmentFactories = configurationFragments;
this.dynamicTransitionMapper = dynamicTransitionMapper;
+ this.lipoDataTransition = lipoDataTransition;
this.universalFragment = universalFragment;
this.prerequisiteValidator = prerequisiteValidator;
this.globals = createGlobals(skylarkAccessibleJavaClasses, skylarkModules);
@@ -673,6 +701,18 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
}
/**
+ * Returns the C++ LIPO data transition, as defined in {@link
+ * com.google.devtools.build.lib.rules.cpp.transitions.DisableLipoTransition}.
+ *
+ * <p>This is language-specific, so doesn't really belong here. But since non-C++ rules declare
+ * this transition, we need universal access to it. The need for this interface should go away on
+ * the deprecation of LIPO for <a href="https://clang.llvm.org/docs/ThinLTO.html">ThinLTO</a>.
+ */
+ public PatchTransition getLipoDataTransition() {
+ return lipoDataTransition;
+ }
+
+ /**
* Returns the set of configuration options that are supported in this module.
*/
public ImmutableList<Class<? extends FragmentOptions>> getConfigurationOptions() {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index bcb3748b04..044e6d039e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -322,6 +322,7 @@ public final class ConfiguredTargetFactory {
ImmutableList.of(),
configuration,
hostConfiguration,
+ ruleClassProvider.getLipoDataTransition(),
ruleClassProvider.getPrerequisiteValidator(),
rule.getRuleClassObject().getConfigurationFragmentPolicy())
.setVisibility(convertVisibility(prerequisiteMap, env.getEventHandler(), rule, null))
@@ -432,6 +433,7 @@ public final class ConfiguredTargetFactory {
aspectPath,
aspectConfiguration,
hostConfiguration,
+ ruleClassProvider.getLipoDataTransition(),
ruleClassProvider.getPrerequisiteValidator(),
aspect.getDefinition().getConfigurationFragmentPolicy());
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 c8cee3cf98..a371d00318 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
@@ -179,6 +179,7 @@ public final class RuleContext extends TargetContext
private final ImmutableSet<String> features;
private final String ruleClassNameForLogging;
private final BuildConfiguration hostConfiguration;
+ private final PatchTransition disableLipoTransition;
private final ConfigurationFragmentPolicy configurationFragmentPolicy;
private final Class<? extends BuildConfiguration.Fragment> universalFragment;
private final ErrorReporter reporter;
@@ -218,6 +219,7 @@ public final class RuleContext extends TargetContext
this.features = getEnabledFeatures();
this.ruleClassNameForLogging = ruleClassNameForLogging;
this.hostConfiguration = builder.hostConfiguration;
+ this.disableLipoTransition = builder.disableLipoTransition;
reporter = builder.reporter;
this.toolchainContext = toolchainContext;
}
@@ -1079,8 +1081,7 @@ public final class RuleContext extends TargetContext
+ " is not configured for the target configuration");
}
} else if (mode == Mode.DATA) {
- if (!(transition instanceof PatchTransition)
- && transition != ConfigurationTransitionProxy.DATA) {
+ if (transition != disableLipoTransition && transition != ConfigurationTransitionProxy.DATA) {
throw new IllegalStateException(getRule().getLocation() + ": "
+ getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not configured for the data configuration");
@@ -1367,6 +1368,7 @@ public final class RuleContext extends TargetContext
private Class<? extends BuildConfiguration.Fragment> universalFragment;
private final BuildConfiguration configuration;
private final BuildConfiguration hostConfiguration;
+ private PatchTransition disableLipoTransition;
private final PrerequisiteValidator prerequisiteValidator;
private final ErrorReporter reporter;
private OrderedSetMultimap<Attribute, ConfiguredTargetAndTarget> prerequisiteMap;
@@ -1382,6 +1384,7 @@ public final class RuleContext extends TargetContext
ImmutableList<Aspect> aspects,
BuildConfiguration configuration,
BuildConfiguration hostConfiguration,
+ PatchTransition disableLipoTransition,
PrerequisiteValidator prerequisiteValidator,
ConfigurationFragmentPolicy configurationFragmentPolicy) {
this.env = Preconditions.checkNotNull(env);
@@ -1390,6 +1393,7 @@ public final class RuleContext extends TargetContext
this.configurationFragmentPolicy = Preconditions.checkNotNull(configurationFragmentPolicy);
this.configuration = Preconditions.checkNotNull(configuration);
this.hostConfiguration = Preconditions.checkNotNull(hostConfiguration);
+ this.disableLipoTransition = disableLipoTransition;
this.prerequisiteValidator = prerequisiteValidator;
reporter = new ErrorReporter(env, rule, getRuleClassNameForLogging());
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java
index e388b86284..315abc800f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java
@@ -14,8 +14,8 @@
package com.google.devtools.build.lib.analysis;
+import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.cmdline.Label;
-
import javax.annotation.Nullable;
/**
@@ -49,4 +49,14 @@ public interface RuleDefinitionEnvironment {
*/
@Nullable
Label getLauncherLabel();
+
+ /**
+ * Returns the C++ LIPO data transition, as defined in {@link
+ * com.google.devtools.build.lib.rules.cpp.transitions.DisableLipoTransition}.
+ *
+ * <p>This is language-specific, so doesn't really belong here. But since non-C++ rules declare
+ * this transition, we need universal access to it. The need for this interface should go away on
+ * the deprecation of LIPO for <a href="https://clang.llvm.org/docs/ThinLTO.html">ThinLTO</a>.
+ */
+ PatchTransition getLipoDataTransition();
}
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 7b290df5a9..3bc6c97f32 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
@@ -116,6 +116,7 @@ import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
import com.google.devtools.build.lib.rules.cpp.CpuTransformer;
import com.google.devtools.build.lib.rules.cpp.proto.CcProtoAspect;
import com.google.devtools.build.lib.rules.cpp.proto.CcProtoLibraryRule;
+import com.google.devtools.build.lib.rules.cpp.transitions.DisableLipoTransition;
import com.google.devtools.build.lib.rules.extra.ActionListenerRule;
import com.google.devtools.build.lib.rules.extra.ExtraActionRule;
import com.google.devtools.build.lib.rules.genquery.GenQueryRule;
@@ -326,6 +327,23 @@ public class BazelRuleClassProvider {
}
};
+ /**
+ * Rules defined before this set will fail when trying to declare a data transition. So it's best
+ * to define this as early as possible.
+ */
+ public static final RuleSet LIPO_DATA_TRANSITION =
+ new RuleSet() {
+ @Override
+ public void init(Builder builder) {
+ builder.setLipoDataTransition(DisableLipoTransition.INSTANCE);
+ }
+
+ @Override
+ public ImmutableList<RuleSet> requires() {
+ return ImmutableList.of();
+ }
+ };
+
public static final RuleSet CPP_RULES =
new RuleSet() {
@Override
@@ -624,6 +642,7 @@ public class BazelRuleClassProvider {
private static final ImmutableSet<RuleSet> RULE_SETS =
ImmutableSet.of(
+ LIPO_DATA_TRANSITION,
BAZEL_SETUP,
CoreRules.INSTANCE,
CoreWorkspaceRules.INSTANCE,
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/common/BazelFilegroupRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/common/BazelFilegroupRule.java
index 68844815ba..ad3ba11605 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/common/BazelFilegroupRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/common/BazelFilegroupRule.java
@@ -13,7 +13,6 @@
// limitations under the License.
package com.google.devtools.build.lib.bazel.rules.common;
-import static com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy.DATA;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
import static com.google.devtools.build.lib.packages.BuildType.LICENSE;
@@ -69,7 +68,7 @@ public final class BazelFilegroupRule implements RuleDefinition {
<!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
.add(
attr("data", LABEL_LIST)
- .cfg(DATA)
+ .cfg(env.getLipoDataTransition())
.allowedFileTypes(FileTypeSet.ANY_FILE)
.dontCheckConstraints())
.add(attr("output_licenses", LICENSE))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java
index 9339a5b919..957fe98b0a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImportRule.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.rules.cpp;
-import static com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy.DATA;
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.BuildType.LABEL_LIST;
@@ -94,7 +93,7 @@ public final class CcImportRule implements RuleDefinition {
.add(attr("alwayslink", BOOLEAN))
.add(
attr("data", LABEL_LIST)
- .cfg(DATA)
+ .cfg(env.getLipoDataTransition())
.allowedFileTypes(FileTypeSet.ANY_FILE)
.dontCheckConstraints())
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index d7da8c0778..7c123ff3a0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -74,7 +74,6 @@ import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
import com.google.devtools.build.lib.analysis.config.HostTransition;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
@@ -1134,9 +1133,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
// apply LIPO.
BuildConfiguration firstTargetConfig = topLevelTargetConfigs.get(0);
Transition dataTransition =
- ((ConfiguredRuleClassProvider) ruleClassProvider)
- .getDynamicTransitionMapper()
- .map(ConfigurationTransitionProxy.DATA);
+ ((ConfiguredRuleClassProvider) ruleClassProvider).getLipoDataTransition();
BuildOptions dataOptions = dataTransition != NoTransition.INSTANCE
? ((PatchTransition) dataTransition).apply(firstTargetConfig.getOptions())
: firstTargetConfig.getOptions();