aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/CcToolchainType.java71
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java2
5 files changed, 101 insertions, 4 deletions
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 ac85e0741c..2c0bd9e0f6 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
@@ -233,12 +233,14 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
return this;
}
- public void addWorkspaceFilePrefix(String contents) {
+ public Builder addWorkspaceFilePrefix(String contents) {
defaultWorkspaceFilePrefix.append(contents);
+ return this;
}
- public void addWorkspaceFileSuffix(String contents) {
+ public Builder addWorkspaceFileSuffix(String contents) {
defaultWorkspaceFileSuffix.append(contents);
+ return this;
}
public Builder setPrelude(String preludeLabelString) {
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 a0049989d2..4dcd5b6d95 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
@@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.PlatformOptions;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.constraints.EnvironmentRule;
import com.google.devtools.build.lib.bazel.rules.BazelToolchainType.BazelToolchainTypeRule;
+import com.google.devtools.build.lib.bazel.rules.CcToolchainType.CcToolchainTypeRule;
import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryRule;
import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryRule;
import com.google.devtools.build.lib.bazel.rules.android.BazelAarImportRule;
@@ -191,6 +192,7 @@ public class BazelRuleClassProvider {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new BazelToolchainTypeRule());
+ builder.addRuleDefinition(new CcToolchainTypeRule());
builder.addRuleDefinition(new GenRuleBaseRule());
builder.addRuleDefinition(new BazelGenRuleRule());
}
@@ -217,6 +219,8 @@ public class BazelRuleClassProvider {
builder.addConfigurationOptions(BuildConfiguration.Options.class);
builder.addWorkspaceFileSuffix(
"register_toolchains('@bazel_tools//tools/cpp:dummy_cc_toolchain')\n");
+ builder.addWorkspaceFileSuffix(
+ "register_toolchains('@bazel_tools//tools/cpp:dummy_cc_toolchain_type')\n");
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcToolchainType.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcToolchainType.java
new file mode 100644
index 0000000000..b865d72c29
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcToolchainType.java
@@ -0,0 +1,71 @@
+// Copyright 2017 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.bazel.rules;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.syntax.Type.STRING;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.PlatformConfiguration;
+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.config.BuildConfiguration;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.rules.ToolchainType;
+import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
+import com.google.devtools.build.lib.rules.cpp.CppHelper;
+
+/** A toolchain type for the c++ toolchain. */
+public class CcToolchainType extends ToolchainType {
+
+ /** Definition for {@code cc_toolchain_type}. */
+ public static class CcToolchainTypeRule implements RuleDefinition {
+ @Override
+ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .requiresConfigurationFragments(CppConfiguration.class, PlatformConfiguration.class)
+ .addRequiredToolchains(CppHelper.getCcToolchainType(environment.getToolsRepository()))
+ .add(attr("$tools_repo", STRING).value(environment.getToolsRepository()))
+ .removeAttribute("licenses")
+ .removeAttribute("distribs")
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return Metadata.builder()
+ .name("cc_toolchain_type")
+ .factoryClass(CcToolchainType.class)
+ .ancestors(BaseRuleClasses.BaseRule.class)
+ .build();
+ }
+ }
+
+ private static ImmutableMap<Label, Class<? extends BuildConfiguration.Fragment>>
+ createFragmentMap(RuleContext ruleContext) {
+ return ImmutableMap.of(
+ Label.parseAbsoluteUnchecked(
+ ruleContext.attributes().get("$tools_repo", STRING) + "//tools/cpp:toolchain_type"),
+ CppConfiguration.class);
+ }
+
+ public CcToolchainType() {
+ // Call constructor with a function that can infer fragment map from a RuleContext.
+ super(CcToolchainType::createFragmentMap, ImmutableMap.of());
+ }
+}
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 d9dd120867..46d2828f9b 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,6 +14,7 @@
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.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
@@ -23,6 +24,7 @@ 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.cmdline.Label;
import java.util.TreeMap;
@@ -30,19 +32,37 @@ 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 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 {
+ 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<>();
Class<? extends BuildConfiguration.Fragment> fragmentClass =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index b7942b3b59..5746f7e8e3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -92,7 +92,7 @@ public class CppHelper {
ImmutableList.of("deps", "srcs");
/** Base label of the c++ toolchain category. */
- public static final String TOOLCHAIN_TYPE_LABEL = "//tools/cpp:toolchain_category";
+ public static final String TOOLCHAIN_TYPE_LABEL = "//tools/cpp:toolchain_type";
/** Returns label used to select resolved cc_toolchain instances based on platform. */
public static Label getCcToolchainType(String toolsRepository) {