diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java | 272 |
1 files changed, 272 insertions, 0 deletions
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 new file mode 100644 index 0000000000..1280bdb9a7 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -0,0 +1,272 @@ +// Copyright 2014 Google Inc. 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.bazel.rules; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Functions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.BaseRuleClasses; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.PrerequisiteValidator; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.analysis.config.BuildOptions; +import com.google.devtools.build.lib.analysis.config.ConfigRuleClasses; +import com.google.devtools.build.lib.analysis.config.ConfigurationEnvironment; +import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; +import com.google.devtools.build.lib.analysis.constraints.EnvironmentRule; +import com.google.devtools.build.lib.bazel.rules.common.BazelActionListenerRule; +import com.google.devtools.build.lib.bazel.rules.common.BazelExtraActionRule; +import com.google.devtools.build.lib.bazel.rules.common.BazelFilegroupRule; +import com.google.devtools.build.lib.bazel.rules.common.BazelTestSuiteRule; +import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppRuleClasses; +import com.google.devtools.build.lib.bazel.rules.genrule.BazelGenRuleRule; +import com.google.devtools.build.lib.bazel.rules.java.BazelJavaBinaryRule; +import com.google.devtools.build.lib.bazel.rules.java.BazelJavaBuildInfoFactory; +import com.google.devtools.build.lib.bazel.rules.java.BazelJavaImportRule; +import com.google.devtools.build.lib.bazel.rules.java.BazelJavaLibraryRule; +import com.google.devtools.build.lib.bazel.rules.java.BazelJavaPluginRule; +import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses; +import com.google.devtools.build.lib.bazel.rules.java.BazelJavaTestRule; +import com.google.devtools.build.lib.bazel.rules.objc.BazelIosTestRule; +import com.google.devtools.build.lib.bazel.rules.sh.BazelShBinaryRule; +import com.google.devtools.build.lib.bazel.rules.sh.BazelShLibraryRule; +import com.google.devtools.build.lib.bazel.rules.sh.BazelShRuleClasses; +import com.google.devtools.build.lib.bazel.rules.sh.BazelShTestRule; +import com.google.devtools.build.lib.bazel.rules.workspace.HttpArchiveRule; +import com.google.devtools.build.lib.bazel.rules.workspace.HttpJarRule; +import com.google.devtools.build.lib.bazel.rules.workspace.LocalRepositoryRule; +import com.google.devtools.build.lib.bazel.rules.workspace.MavenJarRule; +import com.google.devtools.build.lib.bazel.rules.workspace.NewLocalRepositoryRule; +import com.google.devtools.build.lib.packages.Attribute; +import com.google.devtools.build.lib.packages.PackageGroup; +import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.Target; +import com.google.devtools.build.lib.rules.cpp.CcToolchainRule; +import com.google.devtools.build.lib.rules.cpp.CppConfiguration; +import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader; +import com.google.devtools.build.lib.rules.cpp.CppOptions; +import com.google.devtools.build.lib.rules.java.JavaConfiguration; +import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader; +import com.google.devtools.build.lib.rules.java.JavaCpuSupplier; +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.JavaToolchainRule; +import com.google.devtools.build.lib.rules.java.Jvm; +import com.google.devtools.build.lib.rules.java.JvmConfigurationLoader; +import com.google.devtools.build.lib.rules.objc.IosApplicationRule; +import com.google.devtools.build.lib.rules.objc.IosDeviceRule; +import com.google.devtools.build.lib.rules.objc.ObjcBinaryRule; +import com.google.devtools.build.lib.rules.objc.ObjcBundleLibraryRule; +import com.google.devtools.build.lib.rules.objc.ObjcBundleRule; +import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions; +import com.google.devtools.build.lib.rules.objc.ObjcConfigurationLoader; +import com.google.devtools.build.lib.rules.objc.ObjcFrameworkRule; +import com.google.devtools.build.lib.rules.objc.ObjcImportRule; +import com.google.devtools.build.lib.rules.objc.ObjcLibraryRule; +import com.google.devtools.build.lib.rules.objc.ObjcOptionsRule; +import com.google.devtools.build.lib.rules.objc.ObjcProtoLibraryRule; +import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses; +import com.google.devtools.build.lib.rules.objc.ObjcXcodeprojRule; +import com.google.devtools.build.lib.rules.workspace.BindRule; +import com.google.devtools.build.lib.syntax.Label; +import com.google.devtools.build.lib.syntax.SkylarkType; + +/** + * A rule class provider implementing the rules Bazel knows. + */ +public class BazelRuleClassProvider { + + /** + * Used by the build encyclopedia generator. + */ + public static ConfiguredRuleClassProvider create() { + ConfiguredRuleClassProvider.Builder builder = + new ConfiguredRuleClassProvider.Builder(); + setup(builder); + return builder.build(); + } + + public static final JavaCpuSupplier JAVA_CPU_SUPPLIER = new JavaCpuSupplier() { + @Override + public String getJavaCpu(BuildOptions buildOptions, ConfigurationEnvironment env) + throws InvalidConfigurationException { + JavaOptions javaOptions = buildOptions.get(JavaOptions.class); + return javaOptions.javaCpu == null ? "default" : javaOptions.javaCpu; + } + }; + + private static class BazelPrerequisiteValidator implements PrerequisiteValidator { + @Override + public void validate(RuleContext.Builder context, + ConfiguredTarget prerequisite, Attribute attribute) { + validateDirectPrerequisiteVisibility(context, prerequisite, attribute.getName()); + } + + private void validateDirectPrerequisiteVisibility( + RuleContext.Builder context, ConfiguredTarget prerequisite, String attrName) { + Rule rule = context.getRule(); + Target prerequisiteTarget = prerequisite.getTarget(); + Label prerequisiteLabel = prerequisiteTarget.getLabel(); + // We don't check the visibility of late-bound attributes, because it would break some + // features. + if (!context.getRule().getLabel().getPackageName().equals( + prerequisite.getTarget().getLabel().getPackageName()) + && !context.isVisible(prerequisite)) { + if (!context.getConfiguration().checkVisibility()) { + context.ruleWarning(String.format("Target '%s' violates visibility of target " + + "'%s'. Continuing because --nocheck_visibility is active", + rule.getLabel(), prerequisiteLabel)); + } else { + // Oddly enough, we use reportError rather than ruleError here. + context.reportError(rule.getLocation(), + String.format("Target '%s' is not visible from target '%s'. Check " + + "the visibility declaration of the former target if you think " + + "the dependency is legitimate", + prerequisiteLabel, rule.getLabel())); + } + } + + if (prerequisiteTarget instanceof PackageGroup) { + if (!attrName.equals("visibility")) { + context.reportError(rule.getAttributeLocation(attrName), + "in " + attrName + " attribute of " + rule.getRuleClass() + + " rule " + rule.getLabel() + ": package group '" + + prerequisiteLabel + "' is misplaced here " + + "(they are only allowed in the visibility attribute)"); + } + } + } + } + + /** + * List of all build option classes in Blaze. + */ + // TODO(bazel-team): make this private, remove from tests, then BuildOptions.of can be merged + // into RuleClassProvider. + @VisibleForTesting + @SuppressWarnings("unchecked") + public static final ImmutableList<Class<? extends FragmentOptions>> BUILD_OPTIONS = + ImmutableList.of( + BuildConfiguration.Options.class, + CppOptions.class, + JavaOptions.class, + ObjcCommandLineOptions.class + ); + + /** + * Java objects accessible from Skylark rule implementations using this module. + */ + private static final ImmutableMap<String, SkylarkType> skylarkBuiltinJavaObects = + ImmutableMap.of( + "jvm", SkylarkType.of(Jvm.class), + "java_configuration", SkylarkType.of(JavaConfiguration.class), + "cpp", SkylarkType.of(CppConfiguration.class)); + + public static void setup(ConfiguredRuleClassProvider.Builder builder) { + builder + .addBuildInfoFactory(new BazelJavaBuildInfoFactory()) + .setConfigurationCollectionFactory(new BazelConfigurationCollection()) + .setPrerequisiteValidator(new BazelPrerequisiteValidator()) + .setSkylarkAccessibleJavaClasses(skylarkBuiltinJavaObects); + + for (Class<? extends FragmentOptions> fragmentOptions : BUILD_OPTIONS) { + builder.addConfigurationOptions(fragmentOptions); + } + + builder.addRuleDefinition(BaseRuleClasses.BaseRule.class); + builder.addRuleDefinition(BaseRuleClasses.RuleBase.class); + builder.addRuleDefinition(BazelBaseRuleClasses.BinaryBaseRule.class); + builder.addRuleDefinition(BaseRuleClasses.TestBaseRule.class); + builder.addRuleDefinition(BazelBaseRuleClasses.ErrorRule.class); + + builder.addRuleDefinition(EnvironmentRule.class); + + builder.addRuleDefinition(ConfigRuleClasses.ConfigBaseRule.class); + builder.addRuleDefinition(ConfigRuleClasses.ConfigSettingRule.class); + + builder.addRuleDefinition(BazelFilegroupRule.class); + builder.addRuleDefinition(BazelTestSuiteRule.class); + builder.addRuleDefinition(BazelGenRuleRule.class); + + builder.addRuleDefinition(BazelShRuleClasses.ShRule.class); + builder.addRuleDefinition(BazelShLibraryRule.class); + builder.addRuleDefinition(BazelShBinaryRule.class); + builder.addRuleDefinition(BazelShTestRule.class); + + builder.addRuleDefinition(CcToolchainRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcLinkingRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcDeclRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcBaseRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcBinaryBaseRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcBinaryRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcTestRule.class); + + builder.addRuleDefinition(BazelCppRuleClasses.CcLibraryBaseRule.class); + builder.addRuleDefinition(BazelCppRuleClasses.CcLibraryRule.class); + + + builder.addRuleDefinition(BazelJavaRuleClasses.BaseJavaBinaryRule.class); + builder.addRuleDefinition(BazelJavaRuleClasses.IjarBaseRule.class); + builder.addRuleDefinition(BazelJavaRuleClasses.JavaBaseRule.class); + builder.addRuleDefinition(JavaImportBaseRule.class); + builder.addRuleDefinition(BazelJavaRuleClasses.JavaRule.class); + builder.addRuleDefinition(BazelJavaBinaryRule.class); + builder.addRuleDefinition(BazelJavaLibraryRule.class); + builder.addRuleDefinition(BazelJavaImportRule.class); + builder.addRuleDefinition(BazelJavaTestRule.class); + builder.addRuleDefinition(BazelJavaPluginRule.class); + builder.addRuleDefinition(JavaToolchainRule.class); + + builder.addRuleDefinition(BazelIosTestRule.class); + builder.addRuleDefinition(IosDeviceRule.class); + builder.addRuleDefinition(ObjcBinaryRule.class); + builder.addRuleDefinition(ObjcBundleRule.class); + builder.addRuleDefinition(ObjcBundleLibraryRule.class); + builder.addRuleDefinition(ObjcFrameworkRule.class); + builder.addRuleDefinition(ObjcImportRule.class); + builder.addRuleDefinition(ObjcLibraryRule.class); + builder.addRuleDefinition(ObjcOptionsRule.class); + builder.addRuleDefinition(ObjcProtoLibraryRule.class); + builder.addRuleDefinition(ObjcXcodeprojRule.class); + builder.addRuleDefinition(ObjcRuleClasses.IosTestBaseRule.class); + builder.addRuleDefinition(ObjcRuleClasses.ObjcHasInfoplistRule.class); + builder.addRuleDefinition(ObjcRuleClasses.ObjcHasEntitlementsRule.class); + builder.addRuleDefinition(ObjcRuleClasses.ObjcCompilationRule.class); + builder.addRuleDefinition(ObjcRuleClasses.ObjcBaseResourcesRule.class); + builder.addRuleDefinition(IosApplicationRule.class); + + builder.addRuleDefinition(BazelExtraActionRule.class); + builder.addRuleDefinition(BazelActionListenerRule.class); + + builder.addRuleDefinition(BindRule.class); + builder.addRuleDefinition(HttpArchiveRule.class); + builder.addRuleDefinition(HttpJarRule.class); + builder.addRuleDefinition(LocalRepositoryRule.class); + builder.addRuleDefinition(MavenJarRule.class); + builder.addRuleDefinition(NewLocalRepositoryRule.class); + + builder.addConfigurationFragment(new BazelConfiguration.Loader()); + builder.addConfigurationFragment(new CppConfigurationLoader( + Functions.<String>identity())); + builder.addConfigurationFragment(new JvmConfigurationLoader(JAVA_CPU_SUPPLIER)); + builder.addConfigurationFragment(new JavaConfigurationLoader(JAVA_CPU_SUPPLIER)); + builder.addConfigurationFragment(new ObjcConfigurationLoader()); + } +} |