// 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; import static com.google.devtools.build.lib.packages.Attribute.ANY_RULE; 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.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.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; import com.google.devtools.build.lib.util.FileTypeSet; /** * Implementation of the alias rule. */ public class Alias implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException, RuleErrorException { ConfiguredTarget actual = (ConfiguredTarget) ruleContext.getPrerequisite("actual", Mode.TARGET); return new AliasConfiguredTarget( ruleContext, actual, ImmutableMap.of( AliasProvider.class, AliasProvider.fromAliasRule(ruleContext.getLabel(), actual), VisibilityProvider.class, new VisibilityProviderImpl(ruleContext.getVisibility()))); } /** * Rule definition. */ public static class AliasRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { return builder /* The target this alias refers to. It does not need to be a rule, it can also be an input file. */ .removeAttribute("licenses") .removeAttribute("distribs") .add( attr("actual", LABEL) .allowedFileTypes(FileTypeSet.ANY_FILE) .allowedRuleClasses(ANY_RULE) .mandatory()) .canHaveAnyProvider() // Aliases themselves do not need toolchains or an execution platform, so this is fine. // The actual target // will resolve platforms and toolchains with no issues regardless of this setting. .supportsPlatforms(false) .build(); } @Override public Metadata getMetadata() { return Metadata.builder() .name("alias") .factoryClass(Alias.class) .ancestors(BaseRuleClasses.BaseRule.class) .build(); } } } /*

The alias rule creates another name a rule can be referred to as.

Aliasing only works for "regular" targets. In particular, package_group, config_setting and test_suite rules cannot be aliased.

The alias rule has its own visibility declaration. In all other respects, it behaves like the rule it references with some minor exceptions:

Examples

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)
*/