aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
diff options
context:
space:
mode:
authorGravatar jcater <jcater@google.com>2018-07-19 07:18:40 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-19 07:19:43 -0700
commit04d8ea8fec3c8e7792923e29062f5e866bf45376 (patch)
tree6771f3b9841be1b1adfb8b57dd1b11c35e239286 /src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
parenta12254f9d81569b71a99444b7c1690f7f28f1409 (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.java100
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();
+ }
+ }
}