Add --incompatible_use_toolchain_providers_in_java_common
Which requires passing JavaToolchainInfo and JavaRuntimeInfo providers to
java_common APIs instead of configured targets.
See: https://github.com/bazelbuild/bazel/issues/7186
RELNOTES: incompatible_use_toolchain_providers_in_java_common: pass JavaToolchainInfo and JavaRuntimeInfo providers to java_common APIs instead of configured targets (https://github.com/bazelbuild/bazel/issues/7186)
PiperOrigin-RevId: 231169120
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index a913169..839502d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -504,6 +504,20 @@
)
public boolean internalSkylarkFlagTestCanary;
+ @Option(
+ name = "incompatible_use_toolchain_providers_in_java_common",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
+ effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
+ metadataTags = {
+ OptionMetadataTag.INCOMPATIBLE_CHANGE,
+ OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+ },
+ help =
+ "If set to true, java_common APIs that take a java_toolchain or host_javabase parameter "
+ + " require a JavaTootoolchainInfo or JavaRuntimeInfo instead of a configured"
+ + " target.")
+ public boolean incompatibleUseToolchainProvidersInJavaCommon;
/** Constructs a {@link SkylarkSemantics} object corresponding to this set of option values. */
public SkylarkSemantics toSkylarkSemantics() {
@@ -544,6 +558,8 @@
.incompatibleRequireFeatureConfigurationForPic(requireFeatureConfigurationForPic)
.incompatibleStricArgumentOrdering(incompatibleStricArgumentOrdering)
.incompatibleStringIsNotIterable(incompatibleStringIsNotIterable)
+ .incompatibleUseToolchainProvidersInJavaCommon(
+ incompatibleUseToolchainProvidersInJavaCommon)
.internalSkylarkFlagTestCanary(internalSkylarkFlagTestCanary)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index 09a430f..9b33544 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -467,6 +467,7 @@
javaToolchain,
hostJavabase,
jdeps,
+ env.getSemantics(),
loc);
}
if (compileJar == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
index 8f02c0f..bfc0513 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
@@ -44,6 +44,7 @@
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import java.util.stream.Stream;
import javax.annotation.Nullable;
@@ -75,6 +76,7 @@
* @param actions used to create the ijar and single jar actions
* @param javaToolchain the toolchain to be used for retrieving the ijar tool
* @param jdeps optional jdeps information for outputJar
+ * @param semantics the skylark semantics
* @return new created JavaInfo instance
* @throws EvalException if some mandatory parameter are missing
*/
@@ -92,6 +94,7 @@
Object javaToolchain,
Object hostJavabase,
@Nullable Artifact jdeps,
+ SkylarkSemantics semantics,
Location location)
throws EvalException {
final Artifact sourceJar;
@@ -103,10 +106,10 @@
if (!(actions instanceof SkylarkActionFactory)) {
throw new EvalException(location, "Must pass ctx.actions when packing sources.");
}
- if (!isValidJavaToolchain(javaToolchain)) {
+ if (!isValidJavaToolchain(semantics, javaToolchain)) {
throw new EvalException(location, "Must pass java_toolchain when packing sources.");
}
- if (!isValidJavaRuntime(hostJavabase)) {
+ if (!isValidJavaRuntime(semantics, hostJavabase)) {
throw new EvalException(location, "Must pass host_javabase when packing sources.");
}
sourceJar =
@@ -117,6 +120,7 @@
sourceJars,
javaToolchain,
hostJavabase,
+ semantics,
location);
}
final Artifact iJar;
@@ -126,7 +130,7 @@
location,
"The value of use_ijar is True. Make sure the ctx.actions argument is valid.");
}
- if (!isValidJavaToolchain(javaToolchain)) {
+ if (!isValidJavaToolchain(semantics, javaToolchain)) {
throw new EvalException(
location,
"The value of use_ijar is True. Make sure the java_toolchain argument is valid.");
@@ -136,7 +140,8 @@
(SkylarkActionFactory) actions,
outputJar,
null,
- getJavaToolchainProvider(location, javaToolchain),
+ getJavaToolchainProvider(semantics, location, javaToolchain),
+ semantics,
location);
} else {
iJar = outputJar;
@@ -245,6 +250,7 @@
SkylarkList<Artifact> sourceJars,
Object javaToolchain,
Object hostJavabase,
+ SkylarkSemantics semantics,
Location location)
throws EvalException {
// No sources to pack, return None
@@ -257,8 +263,10 @@
}
ActionRegistry actionRegistry = actions.asActionRegistry(location, actions);
Artifact outputSrcJar = getSourceJar(actions.getActionConstructionContext(), outputJar);
- JavaRuntimeInfo javaRuntimeInfo = getJavaRuntimeProvider(location, hostJavabase, null);
- JavaToolchainProvider javaToolchainProvider = getJavaToolchainProvider(location, javaToolchain);
+ JavaRuntimeInfo javaRuntimeInfo =
+ getJavaRuntimeProvider(semantics, location, hostJavabase, null);
+ JavaToolchainProvider javaToolchainProvider =
+ getJavaToolchainProvider(semantics, location, javaToolchain);
JavaSemantics javaSemantics = javaToolchainProvider.getJavaSemantics();
SingleJarActionBuilder.createSourceJarAction(
actionRegistry,
@@ -318,6 +326,7 @@
NestedSet<Artifact> transitiveCompileTimeJars,
NestedSet<Artifact> transitiveRuntimeJars,
NestedSet<Artifact> sourceJars,
+ SkylarkSemantics semantics,
Location location)
throws EvalException {
@@ -329,7 +338,7 @@
location,
"The value of use_ijar is True. Make sure the ctx.actions argument is valid.");
}
- if (!isValidJavaToolchain(javaToolchain)) {
+ if (!isValidJavaToolchain(semantics, javaToolchain)) {
throw new EvalException(
location,
"The value of use_ijar is True. Make sure the java_toolchain argument is valid.");
@@ -341,7 +350,8 @@
(SkylarkActionFactory) actions,
compileJar,
null,
- getJavaToolchainProvider(location, javaToolchain),
+ getJavaToolchainProvider(semantics, location, javaToolchain),
+ semantics,
location));
}
javaCompilationArgsBuilder.addDirectCompileTimeJars(
@@ -397,12 +407,17 @@
}
JavaRuntimeInfo javaRuntimeInfo =
- getJavaRuntimeProvider(location, hostJavabase, skylarkRuleContext.getRuleContext());
+ getJavaRuntimeProvider(
+ skylarkRuleContext.getSkylarkSemantics(),
+ location,
+ hostJavabase,
+ skylarkRuleContext.getRuleContext());
if (javaRuntimeInfo == null) {
throw new EvalException(location, "'host_javabase' must point to a Java runtime");
}
- JavaToolchainProvider toolchainProvider = getJavaToolchainProvider(location, javaToolchain);
+ JavaToolchainProvider toolchainProvider =
+ getJavaToolchainProvider(environment.getSemantics(), location, javaToolchain);
JavaLibraryHelper helper =
new JavaLibraryHelper(skylarkRuleContext.getRuleContext())
@@ -500,11 +515,13 @@
Artifact inputJar,
@Nullable Label targetLabel,
Object javaToolchain,
+ SkylarkSemantics semantics,
Location location)
throws EvalException {
String ijarBasename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-ijar.jar";
Artifact interfaceJar = actions.declareFile(ijarBasename, inputJar);
- FilesToRunProvider ijarTarget = getJavaToolchainProvider(location, javaToolchain).getIjar();
+ FilesToRunProvider ijarTarget =
+ getJavaToolchainProvider(semantics, location, javaToolchain).getIjar();
CustomCommandLine.Builder commandLine =
CustomCommandLine.builder().addExecPath(inputJar).addExecPath(interfaceJar);
if (targetLabel != null) {
@@ -528,12 +545,14 @@
Artifact inputJar,
Label targetLabel,
Object javaToolchain,
+ SkylarkSemantics semantics,
Location location)
throws EvalException {
String basename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-stamped.jar";
Artifact outputJar = actions.declareFile(basename, inputJar);
// ijar doubles as a stamping tool
- FilesToRunProvider ijarTarget = getJavaToolchainProvider(location, javaToolchain).getIjar();
+ FilesToRunProvider ijarTarget =
+ getJavaToolchainProvider(semantics, location, javaToolchain).getIjar();
CustomCommandLine.Builder commandLine =
CustomCommandLine.builder()
.addExecPath(inputJar)
@@ -553,15 +572,24 @@
return outputJar;
}
- private static boolean isValidJavaToolchain(Object javaToolchain) {
- return javaToolchain instanceof ConfiguredTarget
+ private static boolean isValidJavaToolchain(
+ SkylarkSemantics skylarkSemantics, Object javaToolchain) {
+ return (!skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
+ && javaToolchain instanceof ConfiguredTarget)
|| javaToolchain instanceof JavaToolchainProvider;
}
- JavaToolchainProvider getJavaToolchainProvider(Location location, Object javaToolchain)
- throws EvalException {
+ JavaToolchainProvider getJavaToolchainProvider(
+ SkylarkSemantics semantics, Location location, Object javaToolchain) throws EvalException {
if (javaToolchain instanceof ConfiguredTarget) {
- // TODO(b/122738702): remove support for passing toolchains as configured targets
+ if (semantics.incompatibleUseToolchainProvidersInJavaCommon()) {
+ // TODO(b/122738702): remove support for passing toolchains as configured targets
+ throw new EvalException(
+ location,
+ javaToolchain
+ + " pass a java_common.JavaToolchainInfo instead of a configured target;"
+ + " see https://github.com/bazelbuild/bazel/issues/7186.");
+ }
ConfiguredTarget target = (ConfiguredTarget) javaToolchain;
JavaToolchainProvider javaToolchainProvider = JavaToolchainProvider.from(target);
if (javaToolchainProvider == null) {
@@ -576,14 +604,27 @@
throw new EvalException(null, javaToolchain + " is not a JavaToolchainProvider.");
}
- private static boolean isValidJavaRuntime(Object javaRuntime) {
- return javaRuntime instanceof ConfiguredTarget || javaRuntime instanceof JavaRuntimeInfo;
+ private static boolean isValidJavaRuntime(SkylarkSemantics skylarkSemantics, Object javaRuntime) {
+ return (!skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
+ && javaRuntime instanceof ConfiguredTarget)
+ || javaRuntime instanceof JavaRuntimeInfo;
}
private JavaRuntimeInfo getJavaRuntimeProvider(
- Location location, Object javabase, RuleContext ruleContext) throws EvalException {
+ SkylarkSemantics skylarkSemantics,
+ Location location,
+ Object javabase,
+ RuleContext ruleContext)
+ throws EvalException {
if (javabase instanceof TransitiveInfoCollection) {
- // TODO(b/122738702): remove support for passing toolchains as configured targets
+ if (skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()) {
+ // TODO(b/122738702): remove support for passing toolchains as configured targets
+ throw new EvalException(
+ location,
+ javabase
+ + " pass a java_common.JavaRuntimeInfo instead of a configured target;"
+ + " see https://github.com/bazelbuild/bazel/issues/7186.");
+ }
return JavaRuntimeInfo.from((TransitiveInfoCollection) javabase, ruleContext);
}
if (javabase instanceof JavaRuntimeInfo) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
index 9f3499e..18a244e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
@@ -70,6 +70,7 @@
asArtifactNestedSet(transitiveCompileTimeJars),
asArtifactNestedSet(transitiveRuntimeJars),
asArtifactNestedSet(sourceJars),
+ environment.getSemantics(),
location);
}
@@ -131,7 +132,8 @@
Artifact jar,
Object targetLabel,
Object javaToolchain,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException {
return JavaInfoBuildHelper.getInstance()
.buildIjar(
@@ -139,6 +141,7 @@
jar,
targetLabel != Runtime.NONE ? (Label) targetLabel : null,
javaToolchain,
+ semantics,
location);
}
@@ -148,10 +151,11 @@
Artifact jar,
Label targetLabel,
Object javaToolchain,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException {
return JavaInfoBuildHelper.getInstance()
- .stampJar(actions, jar, targetLabel, javaToolchain, location);
+ .stampJar(actions, jar, targetLabel, javaToolchain, semantics, location);
}
@Override
@@ -162,25 +166,36 @@
SkylarkList<Artifact> sourceJars,
Object javaToolchain,
Object hostJavabase,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException {
return JavaInfoBuildHelper.getInstance()
.packSourceFiles(
- actions, outputJar, sourceFiles, sourceJars, javaToolchain, hostJavabase, location);
+ actions,
+ outputJar,
+ sourceFiles,
+ sourceJars,
+ javaToolchain,
+ hostJavabase,
+ semantics,
+ location);
}
@Override
// TODO(b/78512644): migrate callers to passing explicit javacopts or using custom toolchains, and
// delete
public ImmutableList<String> getDefaultJavacOpts(
- SkylarkRuleContext skylarkRuleContext, String javaToolchainAttr, Location location)
+ SkylarkRuleContext skylarkRuleContext,
+ String javaToolchainAttr,
+ Location location,
+ SkylarkSemantics skylarkSemantics)
throws EvalException {
RuleContext ruleContext = skylarkRuleContext.getRuleContext();
ConfiguredTarget javaToolchainConfigTarget =
(ConfiguredTarget) skylarkRuleContext.getAttr().getValue(javaToolchainAttr);
JavaToolchainProvider toolchain =
JavaInfoBuildHelper.getInstance()
- .getJavaToolchainProvider(location, javaToolchainConfigTarget);
+ .getJavaToolchainProvider(skylarkSemantics, location, javaToolchainConfigTarget);
ImmutableList<String> javacOptsFromAttr;
if (ruleContext.getRule().isAttrDefined("javacopts", Type.STRING_LIST)) {
javacOptsFromAttr = ruleContext.getExpander().withDataLocations().tokenized("javacopts");
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
index 62b65ec..3dd04d2 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
@@ -31,6 +31,7 @@
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
import javax.annotation.Nullable;
/** Utilities for Java compilation support in Skylark. */
@@ -374,13 +375,15 @@
},
doc = "A JavaToolchainInfo to used to find the ijar tool."),
},
+ useSkylarkSemantics = true,
useLocation = true)
public FileApi runIjar(
SkylarkActionFactoryT actions,
FileT jar,
Object targetLabel,
Object javaToolchain,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException;
@SkylarkCallable(
@@ -425,13 +428,15 @@
},
doc = "A JavaToolchainInfo to used to find the stamp_jar tool."),
},
+ useSkylarkSemantics = true,
useLocation = true)
public FileApi stampJar(
SkylarkActionFactoryT actions,
FileT jar,
Label targetLabel,
Object javaToolchain,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException;
@SkylarkCallable(
@@ -491,6 +496,7 @@
doc = "A JavaRuntimeInfo to be used for packing sources."),
},
allowReturnNones = true,
+ useSkylarkSemantics = true,
useLocation = true)
public FileApi packSources(
SkylarkActionFactoryT actions,
@@ -499,7 +505,8 @@
SkylarkList<FileT> sourceJars,
Object javaToolchain,
Object hostJavabase,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException;
@SkylarkCallable(
@@ -515,11 +522,15 @@
doc = "The rule context."),
@Param(name = "java_toolchain_attr", positional = false, named = true, type = String.class),
},
+ useSkylarkSemantics = true,
useLocation = true)
// TODO(b/78512644): migrate callers to passing explicit javacopts or using custom toolchains, and
// delete
public ImmutableList<String> getDefaultJavacOpts(
- SkylarkRuleContextT skylarkRuleContext, String javaToolchainAttr, Location loc)
+ SkylarkRuleContextT skylarkRuleContext,
+ String javaToolchainAttr,
+ Location loc,
+ SkylarkSemantics semantics)
throws EvalException;
@SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index b9e5493..89fdba2 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -184,6 +184,8 @@
public abstract boolean internalSkylarkFlagTestCanary();
+ public abstract boolean incompatibleUseToolchainProvidersInJavaCommon();
+
/** Returns a {@link Builder} initialized with the values of this instance. */
public abstract Builder toBuilder();
@@ -207,6 +209,7 @@
.experimentalPlatformsApi(false)
.experimentalStarlarkConfigTransitions(false)
.experimentalTransitionWhitelistLocation("")
+ .incompatibleUseToolchainProvidersInJavaCommon(false)
.incompatibleBzlDisallowLoadAfterStatement(false)
.incompatibleDepsetIsNotIterable(false)
.incompatibleDepsetUnion(false)
@@ -306,6 +309,8 @@
public abstract Builder incompatibleStringIsNotIterable(boolean value);
+ public abstract Builder incompatibleUseToolchainProvidersInJavaCommon(boolean value);
+
public abstract Builder internalSkylarkFlagTestCanary(boolean value);
public abstract SkylarkSemantics build();
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
index 56ade88..fa03872 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
@@ -14,6 +14,7 @@
srcs = glob(["*.java"]),
deps = [
"//src/main/java/com/google/devtools/build/lib:events",
+ "//src/main/java/com/google/devtools/build/lib:skylark_semantics",
"//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
index a6d3c70..f9342007 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
@@ -25,6 +25,7 @@
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
import javax.annotation.Nullable;
@@ -75,7 +76,8 @@
FileApi jar,
Object targetLabel,
Object javaToolchain,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException {
return null;
}
@@ -86,7 +88,8 @@
FileApi jar,
Label targetLabel,
Object javaToolchain,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException {
return null;
}
@@ -99,14 +102,18 @@
SkylarkList<FileApi> sourceJars,
Object javaToolchain,
Object hostJavabase,
- Location location)
+ Location location,
+ SkylarkSemantics semantics)
throws EvalException {
return null;
}
@Override
public ImmutableList<String> getDefaultJavacOpts(
- SkylarkRuleContextApi skylarkRuleContext, String javaToolchainAttr, Location loc)
+ SkylarkRuleContextApi skylarkRuleContext,
+ String javaToolchainAttr,
+ Location loc,
+ SkylarkSemantics semantics)
throws EvalException {
return ImmutableList.of();
}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index b31a3d5..f2bd547 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -157,6 +157,7 @@
"--incompatible_require_feature_configuration_for_pic=" + rand.nextBoolean(),
"--incompatible_strict_argument_ordering=" + rand.nextBoolean(),
"--incompatible_string_is_not_iterable=" + rand.nextBoolean(),
+ "--incompatible_use_toolchain_providers_in_java_common=" + rand.nextBoolean(),
"--internal_skylark_flag_test_canary=" + rand.nextBoolean());
}
@@ -202,6 +203,7 @@
.incompatibleRequireFeatureConfigurationForPic(rand.nextBoolean())
.incompatibleStricArgumentOrdering(rand.nextBoolean())
.incompatibleStringIsNotIterable(rand.nextBoolean())
+ .incompatibleUseToolchainProvidersInJavaCommon(rand.nextBoolean())
.internalSkylarkFlagTestCanary(rand.nextBoolean())
.build();
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index 8dd9cc5..cfdb40e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -2182,4 +2182,84 @@
"The .java provider is deprecated and cannot be used "
+ "when --incompatible_disallow_legacy_java_provider is set.");
}
+
+ @Test
+ public void testConfiguredTargetHostJavabase() throws Exception {
+ writeBuildFileForJavaToolchain();
+ setSkylarkSemanticsOptions("--incompatible_use_toolchain_providers_in_java_common=true");
+
+ scratch.file(
+ "a/BUILD",
+ "load(':rule.bzl', 'jrule')",
+ "java_runtime(name='jvm', srcs=[], java_home='/foo/bar')",
+ "jrule(name='r', srcs=['S.java'])");
+
+ scratch.file(
+ "a/rule.bzl",
+ "def _impl(ctx):",
+ " output_jar = ctx.actions.declare_file('lib' + ctx.label.name + '.jar')",
+ " java_common.compile(",
+ " ctx,",
+ " source_files = ctx.files.srcs,",
+ " output = output_jar,",
+ " java_toolchain = ctx.attr._java_toolchain[java_common.JavaToolchainInfo],",
+ " host_javabase = ctx.attr._host_javabase",
+ " )",
+ " return struct()",
+ "jrule = rule(",
+ " implementation = _impl,",
+ " outputs = {",
+ " 'my_output': 'lib%{name}.jar'",
+ " },",
+ " attrs = {",
+ " 'srcs': attr.label_list(allow_files=['.java']),",
+ " '_java_toolchain': attr.label(default = Label('//java/com/google/test:toolchain')),",
+ " '_host_javabase': attr.label(default = Label('//a:jvm'))",
+ " },",
+ " fragments = ['java'])");
+
+ reporter.removeHandler(failFastHandler);
+ getConfiguredTarget("//a:r");
+ assertContainsEvent("java_common.JavaRuntimeInfo");
+ }
+
+ @Test
+ public void testConfiguredTargetToolchain() throws Exception {
+ writeBuildFileForJavaToolchain();
+ setSkylarkSemanticsOptions("--incompatible_use_toolchain_providers_in_java_common=true");
+
+ scratch.file(
+ "a/BUILD",
+ "load(':rule.bzl', 'jrule')",
+ "java_runtime(name='jvm', srcs=[], java_home='/foo/bar')",
+ "jrule(name='r', srcs=['S.java'])");
+
+ scratch.file(
+ "a/rule.bzl",
+ "def _impl(ctx):",
+ " output_jar = ctx.actions.declare_file('lib' + ctx.label.name + '.jar')",
+ " java_common.compile(",
+ " ctx,",
+ " source_files = ctx.files.srcs,",
+ " output = output_jar,",
+ " java_toolchain = ctx.attr._java_toolchain,",
+ " host_javabase = ctx.attr._host_javabase[java_common.JavaRuntimeInfo]",
+ " )",
+ " return struct()",
+ "jrule = rule(",
+ " implementation = _impl,",
+ " outputs = {",
+ " 'my_output': 'lib%{name}.jar'",
+ " },",
+ " attrs = {",
+ " 'srcs': attr.label_list(allow_files=['.java']),",
+ " '_java_toolchain': attr.label(default = Label('//java/com/google/test:toolchain')),",
+ " '_host_javabase': attr.label(default = Label('//a:jvm'))",
+ " },",
+ " fragments = ['java'])");
+
+ reporter.removeHandler(failFastHandler);
+ getConfiguredTarget("//a:r");
+ assertContainsEvent("java_common.JavaToolchainInfo");
+ }
}