aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-03-16 18:09:10 +0000
committerGravatar Lukacs Berki <lberki@google.com>2016-03-17 10:07:19 +0000
commitde082b35aa61f57eaa2e2c856161136d38d1ebf5 (patch)
tree364a33f4ae9b5912c1aa7bfcb42910577cca1fe5 /src/main/java/com/google/devtools/build/lib/rules/cpp
parent7038d3f03a5bec97b18c00a6b3513558a897534a (diff)
Introduces apple_cc_toolchain.
-- MOS_MIGRATED_REVID=117361388
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java48
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java53
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java2
6 files changed, 88 insertions, 41 deletions
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);
}