diff options
author | 2016-03-16 18:09:10 +0000 | |
---|---|---|
committer | 2016-03-17 10:07:19 +0000 | |
commit | de082b35aa61f57eaa2e2c856161136d38d1ebf5 (patch) | |
tree | 364a33f4ae9b5912c1aa7bfcb42910577cca1fe5 /src/main/java/com | |
parent | 7038d3f03a5bec97b18c00a6b3513558a897534a (diff) |
Introduces apple_cc_toolchain.
--
MOS_MIGRATED_REVID=117361388
Diffstat (limited to 'src/main/java/com')
11 files changed, 199 insertions, 41 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 10a466bd3e..2389b53efc 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -516,6 +516,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/query2:query-output", "//src/main/java/com/google/devtools/build/lib/rules/apple", + "//src/main/java/com/google/devtools/build/lib/rules/apple/cpp", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/lib/rules/genquery", "//src/main/java/com/google/devtools/build/lib/rules/objc", 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 954e2a3272..90d11a8995 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 @@ -83,6 +83,7 @@ import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.XcodeConfigRule; import com.google.devtools.build.lib.rules.apple.XcodeVersionRule; +import com.google.devtools.build.lib.rules.apple.cpp.AppleCcToolchainRule; import com.google.devtools.build.lib.rules.cpp.CcToolchainRule; import com.google.devtools.build.lib.rules.cpp.CcToolchainSuiteRule; import com.google.devtools.build.lib.rules.cpp.CppBuildInfo; @@ -275,6 +276,7 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new BazelProtoLibraryRule()); builder.addRuleDefinition(new CcToolchainRule()); + builder.addRuleDefinition(new AppleCcToolchainRule()); builder.addRuleDefinition(new CcToolchainSuiteRule()); builder.addRuleDefinition(new BazelCppRuleClasses.CcLinkingRule()); builder.addRuleDefinition(new BazelCppRuleClasses.CcDeclRule()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java new file mode 100644 index 0000000000..87c4610d17 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java @@ -0,0 +1,41 @@ +// 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.apple.cpp; + +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.rules.apple.DottedVersion; +import com.google.devtools.build.lib.rules.cpp.CcToolchain; + +import java.util.Map; + +/** + * Implementation for apple_cc_toolchain rule. + */ +public class AppleCcToolchain extends CcToolchain { + + // TODO(bazel-team): Compute default based on local Xcode instead of hardcoded 7.2. + private static final DottedVersion DEFAULT_XCODE_VERSION = DottedVersion.fromString("7.2"); + + public static final String XCODE_VERSION_KEY = "xcode_version"; + + @Override + protected Map<String, String> getBuildVariables(RuleContext ruleContext) { + AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); + return ImmutableMap.of( + XCODE_VERSION_KEY, + appleConfiguration.getXcodeVersion().or(DEFAULT_XCODE_VERSION).toString()); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchainRule.java new file mode 100644 index 0000000000..2c4d278479 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchainRule.java @@ -0,0 +1,42 @@ +// 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.apple.cpp; + +import com.google.devtools.build.lib.analysis.BaseRuleClasses; +import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.packages.RuleClass; +import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.rules.cpp.CcToolchainRule; + +/** + * Rule definition for apple_cc_toolchain. + */ +public class AppleCcToolchainRule implements RuleDefinition { + + @Override + public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { + return builder.requiresConfigurationFragments(AppleConfiguration.class).build(); + } + + @Override + public Metadata getMetadata() { + return RuleDefinition.Metadata.builder() + .name("apple_cc_toolchain") + .ancestors(BaseRuleClasses.BaseRule.class, CcToolchainRule.class) + .factoryClass(AppleCcToolchain.class) + .build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/BUILD new file mode 100644 index 0000000000..972a8e7545 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/BUILD @@ -0,0 +1,25 @@ +# Description: +# Support for building cpp for Apple platform + +package( + default_visibility = ["//src:__subpackages__"], +) + +java_library( + name = "cpp", + srcs = glob(["*.java"]), + deps = [ + "//src/main/java/com/google/devtools/build/lib:build-base", + "//src/main/java/com/google/devtools/build/lib:common", + "//src/main/java/com/google/devtools/build/lib:packages-internal", + "//src/main/java/com/google/devtools/build/lib/rules/apple", + "//src/main/java/com/google/devtools/build/lib/rules/cpp", + "//src/main/protobuf:xcodegen_java_proto", + "//third_party:jsr305", + ], +) + +filegroup( + name = "srcs", + srcs = glob(["**"]), +) 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<String, String> getBuildVariables(RuleContext ruleContext) { + return ImmutableMap.<String, String>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<String, String> 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.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - null, - NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), - null, - PathFragment.EMPTY_FRAGMENT, - CppCompilationContext.EMPTY, - false, - false); + public static final CcToolchainProvider EMPTY_TOOLCHAIN_IS_ERROR = + new CcToolchainProvider( + null, + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + null, + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), + null, + PathFragment.EMPTY_FRAGMENT, + CppCompilationContext.EMPTY, + false, + false, + ImmutableMap.<String, String>of()); @Nullable private final CppConfiguration cppConfiguration; private final NestedSet<Artifact> 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<String, String> 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<String, String> 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<String, String> 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<BuildConfiguration> LIBC_LINK = new LateBoundLabel<BuildConfiguration>(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); } |