Provide java_common.compile interface for Java compilation of proto libraries Remove `create_output_source_jar` parameter and infer its value. The value is `false` when precisely 1 source jar is on the input which is also the `output_source_jar`. Introduce `include_compilation_info` parameter. It may be disabled only in builtins. When disabled the function drops `JavaCompilationInfo` and `JavaGenJarsProvider`.This corresponds to optimisations done natively. Native Java proto compilation code provides `JavaRuleOutputJarsProvider`, truncated `JavaSourceJarsProvider`, `JavaCcInfoProvider`. Benchmarks show that truncating `JavaSourceJarsProvider` is unnecessary. PiperOrigin-RevId: 451967306 Change-Id: I033e690ffb1df36e00203f5447675861bfdfdb52
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 9902560..3fd05c4 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
@@ -265,7 +265,7 @@ Boolean enableAnnotationProcessing, Boolean enableCompileJarAction, boolean enableJSpecify, - boolean createOutputSourceJar, + boolean includeCompilationInfo, JavaSemantics javaSemantics, Object injectingRuleKind, List<String> addExports, @@ -319,6 +319,10 @@ JavaRuleOutputJarsProvider.Builder outputJarsBuilder = JavaRuleOutputJarsProvider.builder(); + boolean createOutputSourceJar = + !(sourceJars.size() == 1 + && sourceFiles.isEmpty() + && sourceJars.get(0).equals(outputSourceJar)); if (outputSourceJar == null) { outputSourceJar = getDerivedSourceJar(starlarkRuleContext.getRuleContext(), outputJar); } @@ -330,6 +334,7 @@ toolchainProvider, outputJarsBuilder, createOutputSourceJar, + includeCompilationInfo, outputSourceJar, enableCompileJarAction, javaInfoBuilder, @@ -358,15 +363,12 @@ streamProviders(deps, JavaCcInfoProvider.class), Stream.of(new JavaCcInfoProvider(CcInfo.merge(nativeLibraries)))) .collect(toImmutableList()); + return javaInfoBuilder .addProvider(JavaCompilationArgsProvider.class, javaCompilationArgsProvider) .addProvider( JavaSourceJarsProvider.class, - createOutputSourceJar - ? createJavaSourceJarsProvider(outputSourceJars, concat(runtimeDeps, exports, deps)) - : JavaSourceJarsProvider.create( - // TODO(b/207058960): Refactor. This is used for proto optimisation. - NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJars), sourceJars)) + createJavaSourceJarsProvider(outputSourceJars, concat(runtimeDeps, exports, deps))) .addProvider(JavaRuleOutputJarsProvider.class, outputJarsBuilder.build()) .javaPluginInfo(mergeExportedJavaPluginInfo(exportedPlugins, exports)) .addProvider(JavaCcInfoProvider.class, JavaCcInfoProvider.merge(transitiveNativeLibraries))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java index 208e920..10f19e4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
@@ -213,6 +213,7 @@ javaToolchainProvider, outputJarsBuilder, createOutputSourceJar, + true, outputSourceJar, true, /* javaInfoBuilder= */ null, @@ -225,6 +226,7 @@ JavaToolchainProvider javaToolchainProvider, JavaRuleOutputJarsProvider.Builder outputJarsBuilder, boolean createOutputSourceJar, + boolean includeCompilationInfo, @Nullable Artifact outputSourceJar, boolean enableCompileJarAction, @Nullable JavaInfo.Builder javaInfoBuilder, @@ -291,13 +293,13 @@ JavaCompilationArtifacts javaArtifacts = artifactsBuilder.build(); outputJarsBuilder.addJavaOutput( JavaOutput.builder() - .fromJavaCompileOutputs(outputs) + .fromJavaCompileOutputs(outputs, includeCompilationInfo) .setCompileJar(iJar) .setCompileJdeps(javaArtifacts.getCompileTimeDependencyArtifact()) .addSourceJar(outputSourceJar) .build()); - if (javaInfoBuilder != null) { + if (javaInfoBuilder != null && includeCompilationInfo) { ClasspathConfiguredFragment classpathFragment = new ClasspathConfiguredFragment( javaArtifacts,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java index a5c5e6a..e152463 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
@@ -166,8 +166,15 @@ /** Populates the builder with outputs from {@link JavaCompileOutputs}. */ public Builder fromJavaCompileOutputs(JavaCompileOutputs<Artifact> value) { + return fromJavaCompileOutputs(value, true); + } + + public Builder fromJavaCompileOutputs( + JavaCompileOutputs<Artifact> value, boolean includeJdeps) { setClassJar(value.output()); - setJdeps(value.depsProto()); + if (includeJdeps) { + setJdeps(value.depsProto()); + } setGeneratedClassJar(value.genClass()); setGeneratedSourceJar(value.genSource()); setNativeHeadersJar(value.nativeHeader());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java index bea5f73..0ce348f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
@@ -91,7 +91,7 @@ Boolean enableAnnotationProcessing, Boolean enableCompileJarAction, Boolean enableJSpecify, - boolean createOutputSourceJar, + boolean includeCompilationInfo, Object injectingRuleKind, Sequence<?> addExports, // <String> expected Sequence<?> addOpens, // <String> expected @@ -134,7 +134,7 @@ // checks for private API access if (!enableCompileJarAction || !enableJSpecify - || !createOutputSourceJar + || !includeCompilationInfo || !classpathResources.isEmpty() || injectingRuleKind != Starlark.NONE) { checkPrivateAccess(thread); @@ -170,7 +170,7 @@ enableAnnotationProcessing, enableCompileJarAction, enableJSpecify, - createOutputSourceJar, + includeCompilationInfo, javaSemantics, injectingRuleKind, Sequence.cast(addExports, String.class, "add_exports"),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java index 839de51..b9c3631 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
@@ -236,7 +236,7 @@ defaultValue = "True", documented = false), @Param( - name = "create_output_source_jar", + name = "include_compilation_info", positional = false, named = true, defaultValue = "True", @@ -294,7 +294,7 @@ Boolean enableAnnotationProcessing, Boolean enableCompileJarAction, Boolean enableJSpecify, - boolean createOutputSourceJar, + boolean includeCompilationInfo, Object injectingRuleKind, Sequence<?> addExports, // <String> expected. Sequence<?> addOpens, // <String> expected.
diff --git a/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl b/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl index eb4deaf..0e4ed69 100644 --- a/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl +++ b/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl
@@ -117,8 +117,8 @@ injecting_rule_kind = injecting_rule_kind, javac_opts = java_toolchain.compatible_javacopts("proto"), enable_jspecify = False, - create_output_source_jar = False, java_toolchain = java_toolchain, + include_compilation_info = False, ) jars = [source_jar, output_jar] else:
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java index c8c334e..7cb75be 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
@@ -3207,7 +3207,7 @@ } @Test - public void testCreateOutputSourceJarIsPrivateApi() throws Exception { + public void testCompileIncludeCompilationInfoIsPrivateApi() throws Exception { JavaToolchainTestUtil.writeBuildFileForJavaToolchain(scratch); scratch.file( "foo/custom_rule.bzl", @@ -3216,7 +3216,7 @@ " ctx,", " output = ctx.actions.declare_file('output.jar'),", " java_toolchain = ctx.attr._java_toolchain[java_common.JavaToolchainInfo],", - " create_output_source_jar = False,", + " include_compilation_info = False,", " )", " return []", "java_custom_library = rule(",