aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar lberki <lberki@google.com>2017-07-11 15:15:20 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-07-11 18:25:26 +0200
commit440919933dc11d8aa4394dbd53790271a2073bc5 (patch)
tree7d75ab55310db2e3011a89dfa7064aef1f45b25e /src/main/java/com/google/devtools/build/lib
parentc16f7988c8a3077dd94b6a678a7af11ad761c580 (diff)
Add a cc_toolchain_alias and java_runtime_alias rules so that e.g. genrules can depend on the C++ toolchain/Java runtime being used.
The naive way to do this would be via @bazel_tools//, except that that does not take configuration transitions into account and e.g. will be the same in the host and the target configurations even if different toolchains are used. Eventually, this will be supplanted by the toolchain selection mechanism. However, that is not live yet and the migration cost this will incur is not a lot; just replacing the one single instance of these undocumented rules with the reference to the toolchain type. RELNOTES: None. PiperOrigin-RevId: 161519229
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-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/rules/cpp/CcToolchainAlias.java78
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java94
4 files changed, 177 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 19158cfcd0..798fe05bcf 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -913,6 +913,7 @@ java_library(
"rules/java/JavaPrimaryClassProvider.java",
"rules/java/JavaProvider.java",
"rules/java/JavaRuntime.java",
+ "rules/java/JavaRuntimeAlias.java",
"rules/java/JavaRuntimeClasspathProvider.java",
"rules/java/JavaRuntimeJarProvider.java",
"rules/java/JavaRuntimeRule.java",
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 f021bec6c8..1c01cfae09 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
@@ -102,6 +102,7 @@ import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagFeatureVisibi
import com.google.devtools.build.lib.rules.config.ConfigRuleClasses;
import com.google.devtools.build.lib.rules.config.ConfigSkylarkCommon;
import com.google.devtools.build.lib.rules.cpp.CcIncLibraryRule;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainAlias;
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;
@@ -117,6 +118,7 @@ import com.google.devtools.build.lib.rules.genrule.GenRuleBaseRule;
import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader;
import com.google.devtools.build.lib.rules.java.JavaImportBaseRule;
import com.google.devtools.build.lib.rules.java.JavaOptions;
+import com.google.devtools.build.lib.rules.java.JavaRuntimeAlias;
import com.google.devtools.build.lib.rules.java.JavaRuntimeRule;
import com.google.devtools.build.lib.rules.java.JavaRuntimeSuiteRule;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
@@ -392,6 +394,7 @@ public class BazelRuleClassProvider {
builder.addRuleDefinition(new CcToolchainRule());
builder.addRuleDefinition(new CcToolchainSuiteRule());
+ builder.addRuleDefinition(new CcToolchainAlias.CcToolchainAliasRule());
builder.addRuleDefinition(new CcIncLibraryRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcLinkingRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcDeclRule());
@@ -450,6 +453,7 @@ public class BazelRuleClassProvider {
builder.addRuleDefinition(new JavaToolchainRule());
builder.addRuleDefinition(new JavaRuntimeRule());
builder.addRuleDefinition(new JavaRuntimeSuiteRule());
+ builder.addRuleDefinition(new JavaRuntimeAlias.JavaRuntimeAliasRule());
builder.addRuleDefinition(new ExtraActionRule());
builder.addRuleDefinition(new ActionListenerRule());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAlias.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAlias.java
new file mode 100644
index 0000000000..07430a5e07
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAlias.java
@@ -0,0 +1,78 @@
+// 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.rules.cpp;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
+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.VisibilityProvider;
+import com.google.devtools.build.lib.analysis.VisibilityProviderImpl;
+import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
+import com.google.devtools.build.lib.rules.AliasProvider;
+import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+
+/**
+ * Implementation of the {@code cc_toolchain_alias} rule.
+ */
+public class CcToolchainAlias implements RuleConfiguredTargetFactory {
+
+ @Override
+ public ConfiguredTarget create(RuleContext ruleContext)
+ throws InterruptedException, RuleErrorException {
+ ConfiguredTarget actual =
+ (ConfiguredTarget) ruleContext.getPrerequisite(":cc_toolchain", Mode.TARGET);
+ return new AliasConfiguredTarget(
+ ruleContext,
+ actual,
+ ImmutableMap.of(
+ AliasProvider.class,
+ AliasProvider.fromAliasRule(ruleContext.getLabel(), actual),
+ VisibilityProvider.class,
+ new VisibilityProviderImpl(ruleContext.getVisibility())));
+ }
+
+ /**
+ * Rule definition for the {@code cc_runtime_alias} rule.
+ */
+ public static class CcToolchainAliasRule implements RuleDefinition {
+
+ @Override
+ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .requiresConfigurationFragments(CppConfiguration.class)
+ .removeAttribute("licenses")
+ .removeAttribute("distribs")
+ .add(attr(":cc_toolchain", LABEL).value(CppRuleClasses.ccToolchainAttribute(environment)))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return Metadata.builder()
+ .name("cc_toolchain_alias")
+ .ancestors(BaseRuleClasses.BaseRule.class)
+ .factoryClass(CcToolchainAlias.class)
+ .build();
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java
new file mode 100644
index 0000000000..7ef88ce193
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java
@@ -0,0 +1,94 @@
+// 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.rules.java;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL;
+
+import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.FileProvider;
+import com.google.devtools.build.lib.analysis.MiddlemanProvider;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
+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.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.collect.nestedset.Order;
+import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.rules.MakeVariableProvider;
+import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+
+/**
+ * Implementation of the {@code java_runtime_alias} rule.
+ */
+public class JavaRuntimeAlias implements RuleConfiguredTargetFactory {
+
+ @Override
+ public ConfiguredTarget create(RuleContext ruleContext)
+ throws InterruptedException, RuleErrorException {
+ TransitiveInfoCollection runtime = ruleContext.getPrerequisite(":jvm", Mode.TARGET);
+ // Sadly, we can't use an AliasConfiguredTarget here because we need to be prepared for the case
+ // when --javabase is not a label. For the time being.
+ RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
+
+ if (runtime != null) {
+ MakeVariableProvider makeVariableProvider = runtime.getProvider(MakeVariableProvider.class);
+ JavaRuntimeProvider javaRuntimeProvider = runtime.getProvider(JavaRuntimeProvider.class);
+ builder
+ .addProvider(javaRuntimeProvider)
+ .addNativeDeclaredProvider(javaRuntimeProvider)
+ .addProvider(makeVariableProvider)
+ .addNativeDeclaredProvider(makeVariableProvider)
+ .addProvider(RunfilesProvider.class, runtime.getProvider(RunfilesProvider.class))
+ .addProvider(MiddlemanProvider.class, runtime.getProvider(MiddlemanProvider.class))
+ .setFilesToBuild(runtime.getProvider(FileProvider.class).getFilesToBuild());
+ } else {
+ builder
+ .setFilesToBuild(NestedSetBuilder.emptySet(Order.STABLE_ORDER))
+ .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY);
+ }
+
+ return builder.build();
+ }
+
+ /**
+ * Rule definition for the {@code java_runtime_alias} rule.
+ */
+ public static class JavaRuntimeAliasRule implements RuleDefinition {
+
+ @Override
+ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .requiresConfigurationFragments(JavaConfiguration.class)
+ .removeAttribute("licenses")
+ .removeAttribute("distribs")
+ .add(attr(":jvm", LABEL).value(JavaSemantics.jvmAttribute(environment)))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return Metadata.builder()
+ .name("java_runtime_alias")
+ .ancestors(BaseRuleClasses.BaseRule.class)
+ .factoryClass(JavaRuntimeAlias.class)
+ .build();
+ }
+ }
+}