diff options
Diffstat (limited to 'src/main/java/com')
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(); |