aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2017-03-27 15:59:03 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2017-03-28 19:48:37 +0000
commit34efd79c3c932d635eff8c3cbedd1293995521c4 (patch)
tree1ccf65b6cc24b3f6477c995b884c65e8142cfd53 /src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
parent6b60718363c6b3abed8e68b524fe4641b4991517 (diff)
Rename ToolchainLookup rule to ToolchainType, to better explain the usage of
the rule. Example: tools/newlang/BUILD: toolchain_type(name = "toolchain_type") Allows users to refer to //tools/newlang:toolchain_type when discussing the newlang toolchain. The previous usage: tools/newlang/BUILD: toolchain_lookup(name = "lookup") Lead to labels like //tools/newlang:lookup, which was unclear that each language's toolchain needs one unique instance of toolchain_(lookup|type). -- PiperOrigin-RevId: 151326827 MOS_MIGRATED_REVID=151326827
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.java68
1 files changed, 68 insertions, 0 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
new file mode 100644
index 0000000000..a752db0da2
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
@@ -0,0 +1,68 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
+import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.Runfiles;
+import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.cmdline.Label;
+import java.util.TreeMap;
+
+/**
+ * Abstract base class for {@code toolchain_type}.
+ */
+public class ToolchainType implements RuleConfiguredTargetFactory {
+ private final ImmutableMap<Label, Class<? extends BuildConfiguration.Fragment>> fragmentMap;
+ 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.hardcodedVariableMap = hardcodedVariableMap;
+ }
+
+ @Override
+ public ConfiguredTarget create(RuleContext ruleContext)
+ throws InterruptedException, RuleErrorException {
+ // This cannot be an ImmutableMap.Builder because that asserts when a key is duplicated
+ TreeMap<String, String> makeVariables = new TreeMap<>();
+ Class<? extends BuildConfiguration.Fragment> fragmentClass =
+ fragmentMap.get(ruleContext.getLabel());
+ if (fragmentClass != null) {
+ BuildConfiguration.Fragment fragment = ruleContext.getFragment(fragmentClass);
+ ImmutableMap.Builder<String, String> fragmentBuilder = ImmutableMap.builder();
+ fragment.addGlobalMakeVariables(fragmentBuilder);
+ makeVariables.putAll(fragmentBuilder.build());
+ }
+
+ 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)
+ .addProvider(new ToolchainProvider(ImmutableMap.copyOf(makeVariables)))
+ .addProvider(RunfilesProvider.simple(Runfiles.EMPTY))
+ .build();
+ }
+}