diff options
author | 2017-03-27 15:59:03 +0000 | |
---|---|---|
committer | 2017-03-28 19:48:37 +0000 | |
commit | 34efd79c3c932d635eff8c3cbedd1293995521c4 (patch) | |
tree | 1ccf65b6cc24b3f6477c995b884c65e8142cfd53 /src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java | |
parent | 6b60718363c6b3abed8e68b524fe4641b4991517 (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.java | 68 |
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(); + } +} |