diff options
author | 2018-07-19 07:18:40 -0700 | |
---|---|---|
committer | 2018-07-19 07:19:43 -0700 | |
commit | 04d8ea8fec3c8e7792923e29062f5e866bf45376 (patch) | |
tree | 6771f3b9841be1b1adfb8b57dd1b11c35e239286 /src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java | |
parent | a12254f9d81569b71a99444b7c1690f7f28f1409 (diff) |
Remove make variable providers from ToolchainType.
PiperOrigin-RevId: 205236169
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java | 100 |
1 files changed, 26 insertions, 74 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java index 1d0c229d88..0e924acffa 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java +++ b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java @@ -14,98 +14,50 @@ package com.google.devtools.build.lib.rules; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; +import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredTarget; -import com.google.devtools.build.lib.analysis.PlatformConfiguration; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; -import com.google.devtools.build.lib.analysis.TemplateVariableInfo; -import com.google.devtools.build.lib.analysis.config.BuildConfiguration; -import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; -import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options; -import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options.MakeVariableSource; -import com.google.devtools.build.lib.analysis.platform.ToolchainInfo; -import com.google.devtools.build.lib.cmdline.Label; -import java.util.TreeMap; +import com.google.devtools.build.lib.packages.RuleClass; /** - * Abstract base class for {@code toolchain_type}. + * Implementation of {@code toolchain_type}. */ public class ToolchainType implements RuleConfiguredTargetFactory { - private ImmutableMap<Label, Class<? extends BuildConfiguration.Fragment>> fragmentMap; - private final Function<RuleContext, ImmutableMap<Label, Class<? extends Fragment>>> - fragmentMapFromRuleContext; - private final ImmutableMap<Label, ImmutableMap<String, String>> hardcodedVariableMap; - - protected ToolchainType( - ImmutableMap<Label, Class<? extends BuildConfiguration.Fragment>> fragmentMap, - ImmutableMap<Label, ImmutableMap<String, String>> hardcodedVariableMap) { - this.fragmentMap = fragmentMap; - this.fragmentMapFromRuleContext = null; - this.hardcodedVariableMap = hardcodedVariableMap; - } - - // This constructor is required to allow for toolchains that depend on the tools repository, - // which depends on RuleContext. - protected ToolchainType( - Function<RuleContext, ImmutableMap<Label, Class<? extends Fragment>>> - fragmentMapFromRuleContext, - ImmutableMap<Label, ImmutableMap<String, String>> hardcodedVariableMap) { - this.fragmentMap = null; - this.fragmentMapFromRuleContext = fragmentMapFromRuleContext; - this.hardcodedVariableMap = hardcodedVariableMap; - } @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException, ActionConflictException { - if (fragmentMap == null && fragmentMapFromRuleContext != null) { - this.fragmentMap = fragmentMapFromRuleContext.apply(ruleContext); - } - - // This cannot be an ImmutableMap.Builder because that asserts when a key is duplicated - TreeMap<String, String> makeVariables = new TreeMap<>(); - ImmutableMap.Builder<String, String> fragmentBuilder = ImmutableMap.builder(); + throws ActionConflictException { - // If this toolchain type is enabled, we can derive make variables from it. Otherwise, we - // derive make variables from the corresponding configuration fragment. - if (ruleContext.getConfiguration().getOptions().get(Options.class).makeVariableSource - == MakeVariableSource.TOOLCHAIN - && ruleContext - .getFragment(PlatformConfiguration.class) - .isToolchainTypeEnabled(ruleContext.getLabel())) { - ToolchainInfo toolchainInfo = - ruleContext.getToolchainContext().forToolchainType(ruleContext.getLabel()); - if (toolchainInfo != null) { - toolchainInfo.addGlobalMakeVariables(fragmentBuilder); - } - } else { - Class<? extends BuildConfiguration.Fragment> fragmentClass = - fragmentMap.get(ruleContext.getLabel()); - if (fragmentClass != null) { - BuildConfiguration.Fragment fragment = ruleContext.getFragment(fragmentClass); - fragment.addGlobalMakeVariables(fragmentBuilder); - } - } - makeVariables.putAll(fragmentBuilder.build()); + // TODO(katre): Add provider type checking to ensure the wrong provider isn't registered for + // a toolchain type. - ImmutableMap<String, String> hardcodedVariables = - hardcodedVariableMap.get(ruleContext.getLabel()); - if (hardcodedVariables != null) { - makeVariables.putAll(hardcodedVariables); - } - // This will eventually go to Skyframe using getAnalysisEnvironment.getSkyframeEnv() to figure - // out the lookup rule -> toolchain rule mapping. For now, it only provides Make variables that - // come from BuildConfiguration so no need to ask Skyframe. return new RuleConfiguredTargetBuilder(ruleContext) - .addNativeDeclaredProvider(new TemplateVariableInfo( - ImmutableMap.copyOf(makeVariables), ruleContext.getRule().getLocation())) .addProvider(RunfilesProvider.simple(Runfiles.EMPTY)) .build(); } + + /** Definition for {@code toolchain_type}. */ + public static class ToolchainTypeRule implements RuleDefinition { + + @Override + public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) { + return builder.removeAttribute("licenses").removeAttribute("distribs").build(); + } + + @Override + public Metadata getMetadata() { + return Metadata.builder() + .name("toolchain_type") + .factoryClass(ToolchainType.class) + .ancestors(BaseRuleClasses.BaseRule.class) + .build(); + } + } } |