aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar dbabkin <dbabkin@google.com>2018-05-02 02:42:53 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-02 02:44:19 -0700
commita28234270e9c3e37006ce6cd98b26aa1e17444a1 (patch)
tree373cf1a96010c0b7777acb0a3d5ec4d1cb6eaefa /src/main/java/com/google/devtools/build/lib/rules
parentcc67bcee928cf69a772fa7a07e7f6fdca8d6ac52 (diff)
Add CommonAliasRule.
We need to have base class with logic related to alias rule. Based on this class other rule classes should be created, to avoid total code duplication. RELNOTES:none PiperOrigin-RevId: 195066568
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java110
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java16
2 files changed, 118 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java b/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java
new file mode 100644
index 0000000000..3e309c338b
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java
@@ -0,0 +1,110 @@
+// Copyright 2018 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;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.AliasProvider;
+import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
+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.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
+import com.google.devtools.build.lib.packages.RuleClass;
+import java.util.function.Function;
+
+/** Implements template for creating custom alias rules. */
+public class LateBoundAlias implements RuleConfiguredTargetFactory {
+
+ private static final String ATTRIBUTE_NAME = ":alias";
+
+ @Override
+ public ConfiguredTarget create(RuleContext ruleContext) {
+ ConfiguredTarget actual =
+ (ConfiguredTarget) ruleContext.getPrerequisite(ATTRIBUTE_NAME, 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 custom alias rules"
+ */
+ public static class CommonAliasRule implements RuleDefinition {
+
+ private static final String ATTRIBUTE_NAME = ":alias";
+
+ private final String ruleName;
+ private final Function<
+ RuleDefinitionEnvironment,
+ LateBoundDefault<? extends BuildConfiguration.Fragment, Label>>
+ labelResolver;
+ private final Class<? extends BuildConfiguration.Fragment> fragmentClass;
+
+ public CommonAliasRule(
+ String ruleName,
+ Function<
+ RuleDefinitionEnvironment,
+ LateBoundDefault<? extends BuildConfiguration.Fragment, Label>>
+ labelResolver,
+ Class<? extends BuildConfiguration.Fragment> fragmentClass) {
+ this.ruleName = Preconditions.checkNotNull(ruleName);
+ this.labelResolver = Preconditions.checkNotNull(labelResolver);
+ this.fragmentClass = Preconditions.checkNotNull(fragmentClass);
+ }
+
+ protected Attribute.Builder<Label> makeAttribute(RuleDefinitionEnvironment environment) {
+ return attr(ATTRIBUTE_NAME, LABEL).value(labelResolver.apply(environment));
+ }
+
+ @Override
+ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
+ Attribute attribute = makeAttribute(environment).build();
+ Preconditions.checkArgument(attribute.getName().equals(ATTRIBUTE_NAME));
+ Preconditions.checkArgument(attribute.getType().equals(LABEL));
+
+ return builder
+ .requiresConfigurationFragments(fragmentClass)
+ .removeAttribute("licenses")
+ .removeAttribute("distribs")
+ .addAttribute(attribute)
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return Metadata.builder()
+ .name(ruleName)
+ .ancestors(BaseRuleClasses.BaseRule.class)
+ .factoryClass(LateBoundAlias.class)
+ .build();
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
index fdf59887a7..7b60599ac8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
@@ -116,7 +116,7 @@ public interface JavaSemantics {
/** The java_toolchain.compatible_javacopts key for testonly compilations. */
public static final String TESTONLY_JAVACOPTS_KEY = "testonly";
- LabelLateBoundDefault<?> JAVA_TOOLCHAIN =
+ LabelLateBoundDefault<JavaConfiguration> JAVA_TOOLCHAIN =
LabelLateBoundDefault.fromTargetConfiguration(
JavaConfiguration.class,
Label.parseAbsoluteUnchecked(JAVA_TOOLCHAIN_LABEL),
@@ -136,7 +136,7 @@ public interface JavaSemantics {
OutputGroupInfo.HIDDEN_OUTPUT_GROUP_PREFIX + "gen_jars";
/** Implementation for the :jvm attribute. */
- static LabelLateBoundDefault<?> jvmAttribute(RuleDefinitionEnvironment env) {
+ static LabelLateBoundDefault<JavaConfiguration> jvmAttribute(RuleDefinitionEnvironment env) {
return LabelLateBoundDefault.fromTargetConfiguration(
JavaConfiguration.class,
env.getToolsLabel(JavaImplicitAttributes.JDK_LABEL),
@@ -144,7 +144,7 @@ public interface JavaSemantics {
}
/** Implementation for the :host_jdk attribute. */
- static LabelLateBoundDefault<?> hostJdkAttribute(RuleDefinitionEnvironment env) {
+ static LabelLateBoundDefault<JavaConfiguration> hostJdkAttribute(RuleDefinitionEnvironment env) {
return LabelLateBoundDefault.fromHostConfiguration(
JavaConfiguration.class,
env.getToolsLabel(JavaImplicitAttributes.HOST_JDK_LABEL),
@@ -155,7 +155,7 @@ public interface JavaSemantics {
* Implementation for the :java_launcher attribute. Note that the Java launcher is disabled by
* default, so it returns null for the configuration-independent default value.
*/
- LabelLateBoundDefault<?> JAVA_LAUNCHER =
+ LabelLateBoundDefault<JavaConfiguration> JAVA_LAUNCHER =
LabelLateBoundDefault.fromTargetConfiguration(
JavaConfiguration.class,
null,
@@ -178,25 +178,25 @@ public interface JavaSemantics {
return javaConfig.getJavaLauncherLabel();
});
- LabelListLateBoundDefault<?> JAVA_PLUGINS =
+ LabelListLateBoundDefault<JavaConfiguration> JAVA_PLUGINS =
LabelListLateBoundDefault.fromTargetConfiguration(
JavaConfiguration.class,
(rule, attributes, javaConfig) -> ImmutableList.copyOf(javaConfig.getPlugins()));
/** Implementation for the :proguard attribute. */
- LabelLateBoundDefault<?> PROGUARD =
+ LabelLateBoundDefault<JavaConfiguration> PROGUARD =
LabelLateBoundDefault.fromTargetConfiguration(
JavaConfiguration.class,
null,
(rule, attributes, javaConfig) -> javaConfig.getProguardBinary());
- LabelListLateBoundDefault<?> EXTRA_PROGUARD_SPECS =
+ LabelListLateBoundDefault<JavaConfiguration> EXTRA_PROGUARD_SPECS =
LabelListLateBoundDefault.fromTargetConfiguration(
JavaConfiguration.class,
(rule, attributes, javaConfig) ->
ImmutableList.copyOf(javaConfig.getExtraProguardSpecs()));
- LabelListLateBoundDefault<?> BYTECODE_OPTIMIZERS =
+ LabelListLateBoundDefault<JavaConfiguration> BYTECODE_OPTIMIZERS =
LabelListLateBoundDefault.fromTargetConfiguration(
JavaConfiguration.class,
(rule, attributes, javaConfig) -> {