From de082b35aa61f57eaa2e2c856161136d38d1ebf5 Mon Sep 17 00:00:00 2001 From: Cal Peyser Date: Wed, 16 Mar 2016 18:09:10 +0000 Subject: Introduces apple_cc_toolchain. -- MOS_MIGRATED_REVID=117361388 --- .../devtools/build/lib/rules/cpp/CcToolchain.java | 48 ++++++++++++-------- .../build/lib/rules/cpp/CcToolchainFeatures.java | 8 ++++ .../build/lib/rules/cpp/CcToolchainProvider.java | 53 ++++++++++++++-------- .../build/lib/rules/cpp/CcToolchainRule.java | 15 +++++- .../lib/rules/cpp/CppConfigurationLoader.java | 3 +- .../devtools/build/lib/rules/cpp/CppModel.java | 2 + 6 files changed, 88 insertions(+), 41 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp') diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java index 01e25a13dc..feefa5ae14 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.cpp; import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; @@ -41,6 +42,7 @@ import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.List; +import java.util.Map; /** * Implementation for the cc_toolchain rule. @@ -142,24 +144,26 @@ public class CcToolchain implements RuleConfiguredTargetFactory { boolean supportsHeaderParsing = ruleContext.attributes().get("supports_header_parsing", BOOLEAN); - CcToolchainProvider provider = new CcToolchainProvider( - Preconditions.checkNotNull(ruleContext.getFragment(CppConfiguration.class)), - crosstool, - fullInputsForCrosstool(ruleContext, crosstoolMiddleman), - compile, - strip, - objcopy, - fullInputsForLink(ruleContext, link), - dwp, - libcLink, - staticRuntimeLinkInputs, - staticRuntimeLinkMiddleman, - dynamicRuntimeLinkInputs, - dynamicRuntimeLinkMiddleman, - runtimeSolibDir, - context, - supportsParamFiles, - supportsHeaderParsing); + CcToolchainProvider provider = + new CcToolchainProvider( + Preconditions.checkNotNull(ruleContext.getFragment(CppConfiguration.class)), + crosstool, + fullInputsForCrosstool(ruleContext, crosstoolMiddleman), + compile, + strip, + objcopy, + fullInputsForLink(ruleContext, link), + dwp, + libcLink, + staticRuntimeLinkInputs, + staticRuntimeLinkMiddleman, + dynamicRuntimeLinkInputs, + dynamicRuntimeLinkMiddleman, + runtimeSolibDir, + context, + supportsParamFiles, + supportsHeaderParsing, + getBuildVariables(ruleContext)); RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext) .add(CcToolchainProvider.class, provider) @@ -246,4 +250,12 @@ public class CcToolchain implements RuleConfiguredTargetFactory { ? middlemanProvider.getMiddlemanArtifact() : dep.getProvider(FileProvider.class).getFilesToBuild(); } + + /** + * Returns a map that should be templated into the crosstool as build variables. Is meant to + * be overridden by subclasses of CcToolchain. + */ + protected Map getBuildVariables(RuleContext ruleContext) { + return ImmutableMap.of(); + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java index 15edc30dd5..00a224f05e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java @@ -628,6 +628,14 @@ public class CcToolchainFeatures implements Serializable { variables.put(name, value); return this; } + + /** + * Add all variables in a map. + */ + public Builder addAllVariables(Map variableMap) { + variables.putAll(variableMap); + return this; + } /** * Add a nested sequence that expands {@code name} recursively. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java index 6df75aac15..9673e04c1e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.rules.cpp; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.config.CompilationMode; @@ -23,6 +24,8 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; +import java.util.Map; + import javax.annotation.Nullable; /** @@ -33,24 +36,26 @@ public final class CcToolchainProvider implements TransitiveInfoProvider { /** * An empty toolchain to be returned in the error case (instead of null). */ - public static final CcToolchainProvider EMPTY_TOOLCHAIN_IS_ERROR = new CcToolchainProvider( - null, - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - null, - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - null, - PathFragment.EMPTY_FRAGMENT, - CppCompilationContext.EMPTY, - false, - false); + public static final CcToolchainProvider EMPTY_TOOLCHAIN_IS_ERROR = + new CcToolchainProvider( + null, + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + null, + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + null, + PathFragment.EMPTY_FRAGMENT, + CppCompilationContext.EMPTY, + false, + false, + ImmutableMap.of()); @Nullable private final CppConfiguration cppConfiguration; private final NestedSet crosstool; @@ -69,6 +74,7 @@ public final class CcToolchainProvider implements TransitiveInfoProvider { private final CppCompilationContext cppCompilationContext; private final boolean supportsParamFiles; private final boolean supportsHeaderParsing; + private final Map buildVariables; public CcToolchainProvider( @Nullable CppConfiguration cppConfiguration, @@ -87,7 +93,8 @@ public final class CcToolchainProvider implements TransitiveInfoProvider { PathFragment dynamicRuntimeSolibDir, CppCompilationContext cppCompilationContext, boolean supportsParamFiles, - boolean supportsHeaderParsing) { + boolean supportsHeaderParsing, + Map buildVariables) { this.cppConfiguration = cppConfiguration; this.crosstool = Preconditions.checkNotNull(crosstool); this.crosstoolMiddleman = Preconditions.checkNotNull(crosstoolMiddleman); @@ -105,6 +112,7 @@ public final class CcToolchainProvider implements TransitiveInfoProvider { this.cppCompilationContext = Preconditions.checkNotNull(cppCompilationContext); this.supportsParamFiles = supportsParamFiles; this.supportsHeaderParsing = supportsHeaderParsing; + this.buildVariables = buildVariables; } /** @@ -228,4 +236,11 @@ public final class CcToolchainProvider implements TransitiveInfoProvider { public CompilationMode getCompilationMode() { return cppConfiguration.getCompilationMode(); } + + /** + * Returns build variables to be templated into the crosstool. + */ + public Map getBuildVariables() { + return buildVariables; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java index 8b7d64a35e..7ab982ff17 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java @@ -31,16 +31,27 @@ import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.packages.Target; /** * Rule definition for compiler definition. */ public final class CcToolchainRule implements RuleDefinition { + + /** + * Determines if the given target is a cc_toolchain or one of its subclasses. New subclasses + * should be added to this method. + */ + static boolean isCcToolchain(Target target) { + String ruleClass = ((Rule) target).getRuleClass(); + return ruleClass.endsWith("cc_toolchain"); + } + private static final LateBoundLabel LIBC_LINK = new LateBoundLabel(CppConfiguration.class) { @Override - public Label getDefault(Rule rule, AttributeMap attributes, - BuildConfiguration configuration) { + public Label getDefault( + Rule rule, AttributeMap attributes, BuildConfiguration configuration) { return configuration.getFragment(CppConfiguration.class).getLibcLabel(); } }; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java index 039d7de925..13d382a6fd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java @@ -211,8 +211,7 @@ public class CppConfigurationLoader implements ConfigurationFragmentFactory { "The toolchain rule '%s' does not exist", ccToolchainLabel)); } - if (!(ccToolchain instanceof Rule) - || !((Rule) ccToolchain).getRuleClass().equals("cc_toolchain")) { + if (!(ccToolchain instanceof Rule) || !CcToolchainRule.isCcToolchain(ccToolchain)) { throw new InvalidConfigurationException(String.format( "The label '%s' is not a cc_toolchain rule", ccToolchainLabel)); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java index ff9d9a3ff9..a57bc44058 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java @@ -374,6 +374,8 @@ public final class CppModel { buildVariables.addVariable("gcov_gcno_file", gcnoFile.getExecPathString()); } + buildVariables.addAllVariables(CppHelper.getToolchain(ruleContext).getBuildVariables()); + CcToolchainFeatures.Variables variables = buildVariables.build(); builder.setVariables(variables); } -- cgit v1.2.3