diff options
Diffstat (limited to 'src/main/java/com/google/devtools')
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) { |