blob: 94c8249054baeda5b1cb9ade061cb0f445ccae04 [file] [log] [blame]
// 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.rules.java;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.LabelConverter;
import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.LabelListConverter;
import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.LabelMapConverter;
import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.StrictDepsConverter;
import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.StrictDepsMode;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.ImportDepsCheckingLevel;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaClasspathMode;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
import com.google.devtools.common.options.EnumConverter;
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.TriState;
import java.util.List;
import java.util.Map;
/** Command-line options for building Java targets */
public class JavaOptions extends FragmentOptions {
/** Converter for the --java_classpath option. */
public static class JavaClasspathModeConverter extends EnumConverter<JavaClasspathMode> {
public JavaClasspathModeConverter() {
super(JavaClasspathMode.class, "Java classpath reduction strategy");
}
}
/** Converter for the --experimental_one_version_enforcement option */
public static class OneVersionEnforcementLevelConverter
extends EnumConverter<OneVersionEnforcementLevel> {
public OneVersionEnforcementLevelConverter() {
super(OneVersionEnforcementLevel.class, "Enforcement level for Java One Version violations");
}
}
/** Converter for the --experimental_import_deps_checking option */
public static class ImportDepsCheckingLevelConverter
extends EnumConverter<ImportDepsCheckingLevel> {
public ImportDepsCheckingLevelConverter() {
super(
ImportDepsCheckingLevel.class,
"Enforcement level for the dependency checking for import targets.");
}
}
@Option(
name = "experimental_disallow_legacy_java_toolchain_flags",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"If enabled, disallow legacy Java toolchain flags (--javabase, --host_javabase,"
+ " --java_toolchain, --host_java_toolchain) and require the use of --platforms"
+ " instead; see #7849")
public boolean disallowLegacyJavaToolchainFlags;
private static final String DEFAULT_JAVABASE = "@bazel_tools//tools/jdk:jdk";
@Option(
name = "javabase",
defaultValue = DEFAULT_JAVABASE,
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"JAVABASE used for the JDK invoked by Blaze. This is the "
+ "java_runtime which will be used to execute "
+ "external Java commands.")
public Label javaBase;
private static final String DEFAULT_JAVA_TOOLCHAIN = "@bazel_tools//tools/jdk:remote_toolchain";
@Option(
name = "java_toolchain",
defaultValue = DEFAULT_JAVA_TOOLCHAIN,
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "The name of the toolchain rule for Java.")
public Label javaToolchain;
@Option(
name = "host_java_toolchain",
defaultValue = DEFAULT_JAVA_TOOLCHAIN,
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "The Java toolchain used to build tools that are executed during a build.")
public Label hostJavaToolchain;
@Option(
name = "host_javabase",
defaultValue = "null",
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"JAVABASE used for the host JDK. This is the java_runtime which is used to execute "
+ "tools during a build.")
public Label hostJavaBase;
@Option(
name = "javacopt",
allowMultiple = true,
defaultValue = "",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Additional options to pass to javac.")
public List<String> javacOpts;
@Option(
name = "host_javacopt",
allowMultiple = true,
defaultValue = "",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Additional options to pass to javac when building tools that are executed during a"
+ " build.")
public List<String> hostJavacOpts;
@Option(
name = "jvmopt",
allowMultiple = true,
defaultValue = "",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Additional options to pass to the Java VM. These options will get added to the "
+ "VM startup options of each java_binary target.")
public List<String> jvmOpts;
@Option(
name = "use_ijars",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"If enabled, this option causes Java compilation to use interface jars. "
+ "This will result in faster incremental compilation, "
+ "but error messages can be different.")
public boolean useIjars;
@Deprecated
@Option(
name = "use_src_ijars",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public boolean useSourceIjars;
@Option(
name = "java_header_compilation",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Compile ijars directly from source.",
oldName = "experimental_java_header_compilation")
public boolean headerCompilation;
// TODO(cushon): delete flag after removing from global .blazerc
@Deprecated
@Option(
name = "experimental_optimize_header_compilation_annotation_processing",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "This flag is a noop and scheduled for removal.")
public boolean optimizeHeaderCompilationAnnotationProcessing;
@Option(
name = "java_deps",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Generate dependency information (for now, compile-time classpath) per Java target.")
public boolean javaDeps;
@Option(
name = "experimental_java_classpath",
allowMultiple = false,
defaultValue = "javabuilder",
converter = JavaClasspathModeConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Enables reduced classpaths for Java compilations.",
oldName = "java_classpath")
public JavaClasspathMode javaClasspath;
@Option(
name = "experimental_inmemory_jdeps_files",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.BUILD_TIME_OPTIMIZATION,
effectTags = {
OptionEffectTag.LOADING_AND_ANALYSIS,
OptionEffectTag.EXECUTION,
OptionEffectTag.AFFECTS_OUTPUTS
},
metadataTags = {OptionMetadataTag.EXPERIMENTAL},
help =
"If enabled, the dependency (.jdeps) files generated from Java compilations will be "
+ "passed through in memory directly from the remote build nodes instead of being "
+ "written to disk.")
public boolean inmemoryJdepsFiles;
@Option(
name = "java_debug",
defaultValue = "null",
expansion = {
"--test_arg=--wrapper_script_flag=--debug",
"--test_output=streamed",
"--test_strategy=exclusive",
"--test_timeout=9999",
"--nocache_test_results"
},
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Causes the Java virtual machine of a java test to wait for a connection from a "
+ "JDWP-compliant debugger (such as jdb) before starting the test. Implies "
+ "-test_output=streamed.")
public Void javaTestDebug;
@Option(
name = "experimental_strict_java_deps",
allowMultiple = false,
defaultValue = "default",
converter = StrictDepsConverter.class,
documentationCategory = OptionDocumentationCategory.INPUT_STRICTNESS,
effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS, OptionEffectTag.EAGERNESS_TO_EXIT},
help =
"If true, checks that a Java target explicitly declares all directly used "
+ "targets as dependencies.",
oldName = "strict_java_deps")
public StrictDepsMode strictJavaDeps;
@Option(
name = "experimental_fix_deps_tool",
defaultValue = "add_dep",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
help = "Specifies which tool should be used to resolve missing dependencies.")
public String fixDepsTool;
// TODO(bazel-team): This flag should ideally default to true (and eventually removed). We have
// been accidentally supplying JUnit and Hamcrest deps to java_test targets indirectly via the
// BazelTestRunner, and setting this flag to true fixes that behaviour.
@Option(
name = "explicit_java_test_deps",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Explicitly specify a dependency to JUnit or Hamcrest in a java_test instead of "
+ " accidentally obtaining from the TestRunner's deps. Only works for bazel right "
+ "now.")
public boolean explicitJavaTestDeps;
@Option(
name = "javabuilder_top",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public String javaBuilderTop;
@Option(
name = "singlejar_top",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public String singleJarTop;
@Option(
name = "genclass_top",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public String genClassTop;
@Option(
name = "ijar_top",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public String iJarTop;
@Option(
name = "java_langtools",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public String javaLangtoolsJar;
@Option(
name = "javac_bootclasspath",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public String javacBootclasspath;
@Option(
name = "javac_extdir",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "No-op. Kept here for backwards compatibility.")
public String javacExtdir;
@Option(
name = "host_java_launcher",
defaultValue = "null",
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "The Java launcher used by tools that are executed during a build.")
public Label hostJavaLauncher;
@Option(
name = "java_launcher",
defaultValue = "null",
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"The Java launcher to use when building Java binaries. "
+ "The \"launcher\" attribute overrides this flag. ")
public Label javaLauncher;
@Option(
name = "proguard_top",
defaultValue = "null",
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Specifies which version of ProGuard to use for code removal when building a Java "
+ "binary.")
public Label proguard;
@Option(
name = "extra_proguard_specs",
allowMultiple = true,
defaultValue = "", // Ignored
converter = LabelConverter.class,
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Additional Proguard specs that will be used for all Proguard invocations. Note that "
+ "using this option only has an effect when Proguard is used anyway.")
public List<Label> extraProguardSpecs;
/**
* Comma-separated list of Mnemonic=label pairs of optimizers to run in the given order, treating
* {@code Proguard} specially by substituting in the relevant Proguard binary automatically. All
* optimizers must understand the same flags as Proguard.
*/
@Option(
name = "experimental_bytecode_optimizers",
defaultValue = "Proguard",
converter = LabelMapConverter.class,
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Do not use.")
public Map<String, Label> bytecodeOptimizers;
@Option(
name = "enforce_proguard_file_extension",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.EAGERNESS_TO_EXIT},
help =
"If enabled, requires that ProGuard configuration files outside of third_party/ use the"
+ " *.pgcfg file extension.")
public boolean enforceProguardFileExtension;
@Option(
name = "translations",
defaultValue = "auto",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Translate Java messages; bundle all translations into the jar "
+ "for each affected rule.")
public TriState bundleTranslations;
@Option(
name = "message_translations",
defaultValue = "",
allowMultiple = true,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "The message translations used for translating messages in Java targets.")
public List<String> translationTargets;
@Option(
name = "check_constraint",
allowMultiple = true,
defaultValue = "",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Check the listed constraint.")
public List<String> checkedConstraints;
@Option(
name = "java_optimization_mode",
defaultValue = "",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Do not use.")
public String javaOptimizationMode;
@Option(
name = "legacy_bazel_java_test",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Use the legacy mode of Bazel for java_test.")
public boolean legacyBazelJavaTest;
@Option(
name = "strict_deps_java_protos",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS, OptionEffectTag.EAGERNESS_TO_EXIT},
help =
"When 'strict-deps' is on, .java files that depend on classes not declared in their "
+ "rule's 'deps' fail to build. In other words, it's forbidden to depend on classes "
+ "obtained transitively. When true, Java protos are strict regardless of their "
+ "'strict_deps' attribute.")
public boolean strictDepsJavaProtos;
@Option(
name = "disallow_strict_deps_for_jpl",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS, OptionEffectTag.EAGERNESS_TO_EXIT},
help =
"If set, any java_proto_library or java_mutable_proto_library which sets the "
+ "strict_deps attribute explicitly will fail to build.")
public boolean isDisallowStrictDepsForJpl;
@Option(
name = "experimental_one_version_enforcement",
defaultValue = "OFF",
converter = OneVersionEnforcementLevelConverter.class,
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"When enabled, enforce that a java_binary rule can't contain more than one version "
+ "of the same class file on the classpath. This enforcement can break the build, or "
+ "can just result in warnings.")
public OneVersionEnforcementLevel enforceOneVersion;
@Option(
name = "experimental_import_deps_checking",
defaultValue = "OFF",
converter = ImportDepsCheckingLevelConverter.class,
documentationCategory = OptionDocumentationCategory.INPUT_STRICTNESS,
effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
help =
"When enabled, check whether the dependencies of an aar_import are complete. "
+ "This enforcement can break the build, or can just result in warnings.")
public ImportDepsCheckingLevel importDepsCheckingLevel;
@Option(
name = "one_version_enforcement_on_java_tests",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"When enabled, and with experimental_one_version_enforcement set to a non-NONE value,"
+ " enforce one version on java_test targets. This flag can be disabled to improve"
+ " incremental test performance at the expense of missing potential one version"
+ " violations.")
public boolean enforceOneVersionOnJavaTests;
@Option(
name = "experimental_allow_runtime_deps_on_neverlink",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
metadataTags = {OptionMetadataTag.EXPERIMENTAL},
help =
"Flag to help transition from allowing to disallowing runtime_deps on neverlink"
+ " Java archives. The depot needs to be cleaned up to roll this out by default.")
public boolean allowRuntimeDepsOnNeverLink;
@Option(
name = "experimental_add_test_support_to_compile_time_deps",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help =
"Flag to help transition away from adding test support libraries to the compile-time"
+ " deps of Java test rules.")
public boolean addTestSupportToCompileTimeDeps;
@Option(
name = "jplPropagateCcLinkParamsStore",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.AFFECTS_OUTPUTS, OptionEffectTag.LOADING_AND_ANALYSIS},
metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE},
help = "Roll-out flag for making java_proto_library propagate CcLinkParamsStore. DO NOT USE.")
public boolean jplPropagateCcLinkParamsStore;
@Option(
name = "experimental_jlpl_enforce_strict_deps",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.ACTION_COMMAND_LINES},
help =
"Turns on strict deps for all java_lite_proto_libraries even if they set strict_deps=0"
+ " unless the java_library package disables the feature jpl_strict_deps."
+ " Used for java_lite_proto_library.strict_deps migration.")
public boolean isJlplStrictDepsEnforced;
// Plugins are built using the host config. To avoid cycles we just don't propagate
// this option to the host config. If one day we decide to use plugins when building
// host tools, we can improve this by (for example) creating a compiler configuration that is
// used only for building plugins.
@Option(
name = "plugin",
converter = LabelListConverter.class,
allowMultiple = true,
defaultValue = "",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Plugins to use in the build. Currently works with java_plugin.")
public List<Label> pluginList;
@Option(
name = "incompatible_require_java_toolchain_header_compiler_direct",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
metadataTags = {
OptionMetadataTag.INCOMPATIBLE_CHANGE,
OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
},
help =
"If enabled, java_toolchains.header_compilation_direct must be set when "
+ "--java_header_compilation is enabled.")
public boolean requireJavaToolchainHeaderCompilerDirect;
@Option(
name = "incompatible_disallow_resource_jars",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
metadataTags = {
OptionMetadataTag.INCOMPATIBLE_CHANGE,
OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
},
help =
"Disables the resource_jars attribute; use java_import and deps or runtime_deps instead.")
public boolean disallowResourceJars;
@Option(
name = "incompatible_load_java_rules_from_bzl",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
metadataTags = {
OptionMetadataTag.INCOMPATIBLE_CHANGE,
OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
},
help =
"If enabled, direct usage of the native Java rules is disabled. Please use "
+ "the Starlark rules instead https://github.com/bazelbuild/rules_java")
public boolean loadJavaRulesFromBzl;
@Option(
name = "experimental_java_header_input_pruning",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "If enabled, header compilation actions support --java_classpath=bazel")
public boolean experimentalJavaHeaderInputPruning;
@Option(
name = "experimental_turbine_annotation_processing",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "If enabled, turbine is used for all annotation processing")
public boolean experimentalTurbineAnnotationProcessing;
Label defaultJavaBase() {
return Label.parseAbsoluteUnchecked(DEFAULT_JAVABASE);
}
Label getHostJavaBase() {
if (hostJavaBase == null) {
return defaultHostJavaBase();
}
return hostJavaBase;
}
Label defaultHostJavaBase() {
return Label.parseAbsoluteUnchecked("@bazel_tools//tools/jdk:remote_jdk11");
}
Label defaultJavaToolchain() {
return Label.parseAbsoluteUnchecked(DEFAULT_JAVA_TOOLCHAIN);
}
@Override
public FragmentOptions getHost() {
JavaOptions host = (JavaOptions) getDefault();
host.javaBase = getHostJavaBase();
host.jvmOpts = ImmutableList.of("-XX:ErrorFile=/dev/stderr");
host.javacOpts = hostJavacOpts;
host.javaToolchain = hostJavaToolchain;
host.javaLauncher = hostJavaLauncher;
// Java builds often contain complicated code generators for which
// incremental build performance is important.
host.useIjars = useIjars;
host.headerCompilation = headerCompilation;
host.javaDeps = javaDeps;
host.javaClasspath = javaClasspath;
host.inmemoryJdepsFiles = inmemoryJdepsFiles;
host.strictJavaDeps = strictJavaDeps;
host.fixDepsTool = fixDepsTool;
host.enforceOneVersion = enforceOneVersion;
host.importDepsCheckingLevel = importDepsCheckingLevel;
// java_test targets can be used as a host tool, Ex: as a validating tool on a genrule.
host.enforceOneVersionOnJavaTests = enforceOneVersionOnJavaTests;
host.allowRuntimeDepsOnNeverLink = allowRuntimeDepsOnNeverLink;
host.addTestSupportToCompileTimeDeps = addTestSupportToCompileTimeDeps;
host.jplPropagateCcLinkParamsStore = jplPropagateCcLinkParamsStore;
host.isJlplStrictDepsEnforced = isJlplStrictDepsEnforced;
host.requireJavaToolchainHeaderCompilerDirect = requireJavaToolchainHeaderCompilerDirect;
host.disallowResourceJars = disallowResourceJars;
host.loadJavaRulesFromBzl = loadJavaRulesFromBzl;
// Save host options for further use.
host.hostJavaBase = hostJavaBase;
host.hostJavacOpts = hostJavacOpts;
host.hostJavaLauncher = hostJavaLauncher;
host.hostJavaToolchain = hostJavaToolchain;
host.experimentalTurbineAnnotationProcessing = experimentalTurbineAnnotationProcessing;
return host;
}
}