| // Copyright 2014 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.bazel.rules; |
| |
| import com.google.common.collect.ImmutableList; |
| import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; |
| import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppRuleClasses; |
| import com.google.devtools.build.lib.bazel.rules.sh.BazelShRuleClasses; |
| import com.google.devtools.build.lib.buildtool.BuildRequest; |
| import com.google.devtools.build.lib.exec.ModuleActionContextRegistry; |
| import com.google.devtools.build.lib.rules.java.JavaCompileActionContext; |
| import com.google.devtools.build.lib.runtime.BlazeModule; |
| import com.google.devtools.build.lib.runtime.Command; |
| import com.google.devtools.build.lib.runtime.CommandEnvironment; |
| import com.google.devtools.build.lib.util.ResourceFileLoader; |
| import com.google.devtools.common.options.Option; |
| import com.google.devtools.common.options.OptionDocumentationCategory; |
| import com.google.devtools.common.options.OptionEffectTag; |
| import com.google.devtools.common.options.OptionMetadataTag; |
| import com.google.devtools.common.options.OptionsBase; |
| import com.google.devtools.common.options.TriState; |
| import java.io.IOException; |
| import java.util.List; |
| |
| /** Module implementing the rule set of Bazel. */ |
| public final class BazelRulesModule extends BlazeModule { |
| |
| /** |
| * This is where deprecated options used by both Bazel and Blaze but only needed for the build |
| * command go to die. |
| */ |
| @SuppressWarnings("deprecation") // These fields have no JavaDoc by design |
| public static class BuildGraveyardOptions extends OptionsBase { |
| @Option( |
| name = "experimental_use_scheduling_middlemen", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = { |
| OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION, |
| OptionEffectTag.AFFECTS_OUTPUTS, |
| OptionEffectTag.LOADING_AND_ANALYSIS |
| }, |
| help = "Deprecated. No-op.") |
| public boolean useSchedulingMiddlemen; |
| |
| @Option( |
| name = "experimental_genquery_use_graphless_query", |
| defaultValue = "auto", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = { |
| OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION, |
| OptionEffectTag.AFFECTS_OUTPUTS, |
| OptionEffectTag.LOADING_AND_ANALYSIS |
| }, |
| help = "Deprecated. No-op.") |
| public TriState useGraphlessQuery; |
| |
| @Option( |
| name = "use_top_level_targets_for_symlinks", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, |
| help = "Deprecated. No-op.") |
| public boolean useTopLevelTargetsForSymlinks; |
| |
| @Option( |
| name = "experimental_skyframe_prepare_analysis", |
| deprecationWarning = "This flag is a no-op and will be deleted in a future release.", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION}, |
| help = "Deprecated. No-op.") |
| public boolean skyframePrepareAnalysis; |
| |
| @Option( |
| name = "incompatible_disable_legacy_flags_cc_toolchain_api", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE, OptionMetadataTag.DEPRECATED}, |
| help = |
| "Flag for disabling the legacy cc_toolchain Starlark API for accessing legacy " |
| + "CROSSTOOL fields.") |
| public boolean disableLegacyFlagsCcToolchainApi; |
| |
| @Option( |
| name = "incompatible_enable_profile_by_default", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "No-op.") |
| public boolean enableProfileByDefault; |
| |
| @Option( |
| name = "incompatible_override_toolchain_transition", |
| defaultValue = "true", |
| deprecationWarning = "This is now always set, please remove this flag.", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = OptionEffectTag.UNKNOWN, |
| help = "Deprecated, this is no longer in use and should be removed.") |
| public boolean overrideToolchainTransition; |
| |
| @Option( |
| name = "experimental_parse_headers_skipped_if_corresponding_srcs_found", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.NO_OP}, |
| help = "No-op.") |
| public boolean parseHeadersSkippedIfCorrespondingSrcsFound; |
| |
| @Option( |
| name = "experimental_worker_as_resource", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.EXECUTION_STRATEGY, |
| effectTags = {OptionEffectTag.NO_OP}, |
| help = "No-op, will be removed soon.") |
| public boolean workerAsResource; |
| |
| @Option( |
| name = "high_priority_workers", |
| defaultValue = "null", |
| documentationCategory = OptionDocumentationCategory.EXECUTION_STRATEGY, |
| effectTags = {OptionEffectTag.EXECUTION}, |
| help = "No-op, will be removed soon.", |
| allowMultiple = true) |
| public List<String> highPriorityWorkers; |
| |
| @Option( |
| name = "target_platform_fallback", |
| defaultValue = "", |
| documentationCategory = OptionDocumentationCategory.TOOLCHAIN, |
| effectTags = { |
| OptionEffectTag.AFFECTS_OUTPUTS, |
| OptionEffectTag.CHANGES_INPUTS, |
| OptionEffectTag.LOADING_AND_ANALYSIS |
| }, |
| help = "This option is deprecated and has no effect.") |
| public String targetPlatformFallback; |
| |
| @Option( |
| name = "incompatible_auto_configure_host_platform", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "This option is deprecated and has no effect.") |
| public boolean autoConfigureHostPlatform; |
| |
| @Deprecated |
| @Option( |
| name = "experimental_require_availability_info", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| defaultValue = "false", |
| help = "Deprecated no-op.") |
| public boolean requireAvailabilityInfo; |
| |
| @Option( |
| name = "experimental_collect_local_action_metrics", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.EXECUTION}, |
| help = "Deprecated no-op.") |
| public boolean collectLocalExecutionStatistics; |
| |
| @Option( |
| name = "experimental_collect_local_sandbox_action_metrics", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.LOGGING, |
| effectTags = {OptionEffectTag.EXECUTION}, |
| help = "Deprecated no-op.") |
| public boolean collectLocalSandboxExecutionStatistics; |
| |
| @Option( |
| name = "experimental_enable_starlark_doc_extract", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, |
| metadataTags = {OptionMetadataTag.EXPERIMENTAL}, |
| help = "Deprecated no-op.") |
| public boolean enableBzlDocDump; |
| |
| // TODO(b/274595070): Remove this option. |
| @Option( |
| name = "experimental_parallel_aquery_output", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.QUERY, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "No-op.") |
| public boolean parallelAqueryOutput; |
| |
| @Option( |
| name = "experimental_show_artifacts", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, |
| help = "Deprecated no-op.") |
| public boolean showArtifacts; |
| |
| @Option( |
| name = "announce", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, |
| help = "Deprecated. No-op.", |
| deprecationWarning = "This option is now deprecated and is a no-op") |
| public boolean announce; |
| |
| @Option( |
| name = "action_cache_store_output_metadata", |
| oldName = "experimental_action_cache_store_output_metadata", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = { |
| OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION, |
| OptionEffectTag.HOST_MACHINE_RESOURCE_OPTIMIZATIONS |
| }, |
| help = "no-op") |
| public boolean actionCacheStoreOutputMetadata; |
| |
| @Option( |
| name = "discard_actions_after_execution", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| metadataTags = OptionMetadataTag.INCOMPATIBLE_CHANGE, |
| effectTags = {OptionEffectTag.LOSES_INCREMENTAL_STATE}, |
| help = "This option is deprecated and has no effect.") |
| public boolean discardActionsAfterExecution; |
| |
| @Option( |
| name = "defer_param_files", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = { |
| OptionEffectTag.LOADING_AND_ANALYSIS, |
| OptionEffectTag.EXECUTION, |
| OptionEffectTag.ACTION_COMMAND_LINES |
| }, |
| help = "This option is deprecated and has no effect and will be removed in the future.") |
| public boolean deferParamFiles; |
| |
| @Option( |
| name = "check_fileset_dependencies_recursively", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| deprecationWarning = |
| "This flag is a no-op and fileset dependencies are always checked " |
| + "to ensure correctness of builds.", |
| effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}) |
| public boolean checkFilesetDependenciesRecursively; |
| |
| @Option( |
| name = "experimental_skyframe_native_filesets", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION}, |
| deprecationWarning = "This flag is a no-op and skyframe-native-filesets is always true.") |
| public boolean skyframeNativeFileset; |
| |
| @Option( |
| name = "collapse_duplicate_defines", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = { |
| OptionEffectTag.LOADING_AND_ANALYSIS, |
| OptionEffectTag.LOSES_INCREMENTAL_STATE, |
| }, |
| help = "no-op") |
| public boolean collapseDuplicateDefines; |
| |
| @Option( |
| name = "incompatible_require_javaplugininfo_in_javacommon", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "When enabled java_common.compile only accepts JavaPluginInfo for plugins.") |
| public boolean requireJavaPluginInfo; |
| } |
| |
| /** This is where deprecated Bazel-specific options only used by the build command go to die. */ |
| @SuppressWarnings("deprecation") // These fields have no JavaDoc by design |
| public static final class BazelBuildGraveyardOptions extends BuildGraveyardOptions { |
| @Option( |
| name = "incompatible_load_python_rules_from_bzl", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "Deprecated no-op.") |
| public boolean loadPythonRulesFromBzl; |
| |
| @Option( |
| name = "incompatible_load_proto_rules_from_bzl", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "Deprecated no-op.") |
| public boolean loadProtoRulesFromBzl; |
| |
| @Option( |
| name = "incompatible_load_java_rules_from_bzl", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "Deprecated no-op.") |
| public boolean loadJavaRulesFromBzl; |
| |
| @Option( |
| name = "make_variables_source", |
| defaultValue = "configuration", |
| metadataTags = {OptionMetadataTag.HIDDEN, OptionMetadataTag.DEPRECATED}, |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}) |
| public String makeVariableSource; |
| |
| @Option( |
| name = "incompatible_cc_coverage", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = { |
| OptionEffectTag.UNKNOWN, |
| }, |
| oldName = "experimental_cc_coverage", |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE, OptionMetadataTag.DEPRECATED}, |
| help = "Obsolete, no effect.") |
| public boolean useGcovCoverage; |
| |
| @Deprecated |
| @Option( |
| name = "direct_run", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| metadataTags = {OptionMetadataTag.DEPRECATED}, |
| help = "Deprecated no-op.") |
| public boolean directRun; |
| |
| @Deprecated |
| @Option( |
| name = "glibc", |
| defaultValue = "null", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| metadataTags = {OptionMetadataTag.DEPRECATED}, |
| help = "Deprecated no-op.") |
| public String glibc; |
| |
| @Option( |
| name = "force_ignore_dash_static", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS, OptionEffectTag.AFFECTS_OUTPUTS}, |
| help = "noop") |
| public boolean forceIgnoreDashStatic; |
| |
| @Option( |
| name = "experimental_profile_action_counts", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "No-op.") |
| public boolean enableActionCountProfile; |
| |
| @Option( |
| name = "incompatible_remove_binary_profile", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "No-op.") |
| public boolean removeBinaryProfile; |
| |
| @Option( |
| name = "experimental_post_profile_started_event", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "No-op.") |
| public boolean postProfileStartedEvent; |
| |
| @Option( |
| name = "incompatible_dont_use_javasourceinfoprovider", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, |
| help = "No-op") |
| public boolean dontUseJavaSourceInfoProvider; |
| } |
| |
| /** |
| * This is where deprecated options which need to be available for all commands go to die. If you |
| * want to graveyard an all-command option specific to Blaze or Bazel, create a subclass. |
| */ |
| public static final class AllCommandGraveyardOptions extends OptionsBase { |
| @Option( |
| name = "experimental_enable_aspect_hints", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, |
| metadataTags = {OptionMetadataTag.EXPERIMENTAL}) |
| public boolean enableAspectHints; |
| |
| @Option( |
| name = "bes_best_effort", |
| defaultValue = "false", |
| deprecationWarning = |
| "BES best effort upload has been removed. The flag has no more " |
| + "functionality attached to it and will be removed in a future release.", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, |
| help = "No-op") |
| public boolean besBestEffort; |
| |
| @Option( |
| name = "experimental_use_event_based_build_completion_status", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| metadataTags = OptionMetadataTag.EXPERIMENTAL, |
| effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS, OptionEffectTag.EXECUTION}, |
| help = "No-op") |
| public boolean useEventBasedBuildCompletionStatus; |
| |
| @Option( |
| name = "experimental_use_fork_join_pool", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| metadataTags = OptionMetadataTag.DEPRECATED, |
| effectTags = {OptionEffectTag.NO_OP}, |
| help = "No-op.") |
| public boolean useForkJoinPool; |
| |
| @Option( |
| name = "experimental_use_priority_in_analysis", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| metadataTags = OptionMetadataTag.DEPRECATED, |
| effectTags = {OptionEffectTag.NO_OP}, |
| help = "No-op.") |
| public boolean usePrioritization; |
| |
| @Option( |
| name = "incompatible_generated_protos_in_virtual_imports", |
| defaultValue = "true", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.NO_OP}, |
| metadataTags = {OptionMetadataTag.DEPRECATED}, |
| help = "No-op.") |
| public boolean generatedProtosInVirtualImports; |
| |
| @Option( |
| name = "experimental_java_proto_add_allowed_public_imports", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| metadataTags = {OptionMetadataTag.EXPERIMENTAL}, |
| help = "This flag is a noop and scheduled for removal.") |
| public boolean experimentalJavaProtoAddAllowedPublicImports; |
| |
| @Option( |
| name = "java_optimization_mode", |
| defaultValue = "", |
| documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "Do not use.") |
| public String javaOptimizationMode; |
| } |
| |
| @Override |
| public void initializeRuleClasses(ConfiguredRuleClassProvider.Builder builder) { |
| BazelRuleClassProvider.setup(builder); |
| |
| try { |
| // Load auto-configuration files, it is made outside of the rule class provider so that it |
| // will not be loaded for our Java tests. |
| builder.addWorkspaceFileSuffix( |
| ResourceFileLoader.loadResource(BazelCppRuleClasses.class, "cc_configure.WORKSPACE")); |
| builder.addWorkspaceFileSuffix( |
| ResourceFileLoader.loadResource(BazelRulesModule.class, "xcode_configure.WORKSPACE")); |
| builder.addWorkspaceFileSuffix( |
| ResourceFileLoader.loadResource(BazelShRuleClasses.class, "sh_configure.WORKSPACE")); |
| |
| // Load rules_license, which is needed for license attestations for many rules, including |
| // things in @bazel_tools |
| builder.addWorkspaceFileSuffix( |
| ResourceFileLoader.loadResource(BazelRulesModule.class, "rules_license.WORKSPACE")); |
| } catch (IOException e) { |
| throw new IllegalStateException(e); |
| } |
| } |
| |
| @Override |
| public Iterable<Class<? extends OptionsBase>> getCommandOptions(Command command) { |
| return "build".equals(command.name()) |
| ? ImmutableList.of(BazelBuildGraveyardOptions.class, AllCommandGraveyardOptions.class) |
| : ImmutableList.of(AllCommandGraveyardOptions.class); |
| } |
| |
| @Override |
| public void registerActionContexts( |
| ModuleActionContextRegistry.Builder registryBuilder, |
| CommandEnvironment env, |
| BuildRequest buildRequest) { |
| registryBuilder.register(JavaCompileActionContext.class, new JavaCompileActionContext()); |
| } |
| } |