Initial support for header compilation direct deps
This adds a new output to header compilation actions which is used as the classpath for downstream header compilations, instead of using the same output for downstream header and regular compilations. Using a separate output allows trimming information that isn't needed by header compilation, but is required for regular compilation, including methods. This results in a smaller cache key for header compilation actions.
PiperOrigin-RevId: 764512852
Change-Id: I4895e47f3418e9cbf602edd11fde38de5f3e32ca
diff --git a/java/private/java_common_internal.bzl b/java/private/java_common_internal.bzl
index 4a76df0..54f0c7b 100644
--- a/java/private/java_common_internal.bzl
+++ b/java/private/java_common_internal.bzl
@@ -196,6 +196,14 @@
direct_jars = depset()
if is_strict_mode:
direct_jars = depset(order = "preorder", transitive = [dep.compile_jars for dep in deps])
+
+ header_compilation_direct_deps = depset()
+ if is_strict_mode:
+ header_compilation_direct_deps = depset(
+ order = "preorder",
+ transitive = [dep.header_compilation_direct_deps for dep in deps],
+ )
+
compilation_classpath = depset(
order = "preorder",
transitive = [direct_jars] + [dep.transitive_compile_time_jars for dep in deps],
@@ -207,12 +215,25 @@
# create compile time jar action
if not has_sources:
compile_jar = None
+ header_compilation_jar = None
compile_deps_proto = None
elif not enable_compile_jar_action:
compile_jar = output
+ header_compilation_jar = compile_jar
compile_deps_proto = None
elif _should_use_header_compilation(ctx, java_toolchain):
compile_jar = helper.derive_output_file(ctx, output, name_suffix = "-hjar", extension = "jar")
+
+ # TODO: b/417791104 - remove hasattr check once Bazel 8.3.0 is released
+ if hasattr(ctx.fragments.java, "use_header_compilation_direct_deps") and ctx.fragments.java.use_header_compilation_direct_deps():
+ header_compilation_jar = helper.derive_output_file(ctx, output, name_suffix = "-tjar", extension = "jar")
+ header_compilation_extra_args = {
+ "header_compilation_jar": header_compilation_jar,
+ "header_compilation_direct_deps": header_compilation_direct_deps,
+ }
+ else:
+ header_compilation_jar = None
+ header_compilation_extra_args = {}
compile_deps_proto = helper.derive_output_file(ctx, output, name_suffix = "-hjar", extension = "jdeps")
get_internal_java_common().create_header_compilation_action(
ctx,
@@ -232,6 +253,7 @@
injecting_rule_kind,
enable_direct_classpath,
annotation_processor_additional_inputs,
+ **header_compilation_extra_args
)
elif ctx.fragments.java.use_ijars():
compile_jar = run_ijar(
@@ -241,9 +263,11 @@
target_label = ctx.label,
injecting_rule_kind = injecting_rule_kind,
)
+ header_compilation_jar = compile_jar
compile_deps_proto = None
else:
compile_jar = output
+ header_compilation_jar = compile_jar
compile_deps_proto = None
native_headers_jar = helper.derive_output_file(ctx, output, name_suffix = "-native-header")
@@ -323,6 +347,7 @@
return java_info_for_compilation(
output_jar = output,
compile_jar = compile_jar,
+ header_compilation_jar = header_compilation_jar,
source_jar = output_source_jar,
generated_class_jar = generated_class_jar,
generated_source_jar = generated_source_jar,
diff --git a/java/private/java_info.bzl b/java/private/java_info.bzl
index 083eef0..de1111b 100644
--- a/java/private/java_info.bzl
+++ b/java/private/java_info.bzl
@@ -28,6 +28,7 @@
fields = {
"class_jar": "(File) A classes jar file.",
"compile_jar": "(File) An interface jar file.",
+ "header_compilation_jar": "(File) An header compilation jar file.",
"ijar": "Deprecated: Please use compile_jar.",
"compile_jdeps": "(File) Compile time dependencies information (deps.proto file).",
"generated_class_jar": "(File) A jar containing classes generated via annotation processing.",
@@ -114,6 +115,7 @@
transitive_runtime_jars = [] # [depset[File]]
transitive_compile_time_jars = [] # [depset[File]]
compile_jars = [] # [depset[File]]
+ header_compilation_direct_deps = [] # [depset[File]]
full_compile_jars = [] # [depset[File]]
_transitive_full_compile_time_jars = [] # [depset[File]]
_compile_time_java_dependencies = [] # [depset[File]]
@@ -131,6 +133,7 @@
transitive_runtime_jars.append(p.transitive_runtime_jars)
transitive_compile_time_jars.append(p.transitive_compile_time_jars)
compile_jars.append(p.compile_jars)
+ header_compilation_direct_deps.append(p.header_compilation_direct_deps)
full_compile_jars.append(p.full_compile_jars)
_transitive_full_compile_time_jars.append(p._transitive_full_compile_time_jars)
_compile_time_java_dependencies.append(p._compile_time_java_dependencies)
@@ -148,6 +151,7 @@
"transitive_runtime_jars": transitive_runtime_jars,
"transitive_compile_time_jars": transitive_compile_time_jars,
"compile_jars": depset(order = "preorder", transitive = compile_jars),
+ "header_compilation_direct_deps": depset(order = "preorder", transitive = header_compilation_direct_deps),
"full_compile_jars": depset(order = "preorder", transitive = full_compile_jars),
"_transitive_full_compile_time_jars": depset(order = "preorder", transitive = _transitive_full_compile_time_jars),
"_compile_time_java_dependencies": depset(order = "preorder", transitive = _compile_time_java_dependencies),
@@ -198,6 +202,7 @@
"transitive_runtime_jars": depset(),
"transitive_compile_time_jars": depset(),
"compile_jars": depset(),
+ "header_compilation_direct_deps": depset(),
"full_compile_jars": depset(),
"_transitive_full_compile_time_jars": depset(),
"_compile_time_java_dependencies": depset(),
@@ -220,6 +225,7 @@
java_outputs = [
_JavaOutputInfo(
compile_jar = None,
+ header_compilation_jar = None,
ijar = None, # deprecated
compile_jdeps = None,
class_jar = output.class_jar,
@@ -253,6 +259,7 @@
"transitive_runtime_jars": depset() if neverlink else java_info.transitive_runtime_jars,
"transitive_compile_time_jars": java_info.transitive_compile_time_jars,
"compile_jars": java_info.compile_jars,
+ "header_compilation_direct_deps": java_info.header_compilation_direct_deps,
"full_compile_jars": java_info.full_compile_jars,
"_transitive_full_compile_time_jars": java_info._transitive_full_compile_time_jars,
"_compile_time_java_dependencies": java_info._compile_time_java_dependencies,
@@ -312,6 +319,7 @@
result.update(
compile_jars = java_info.transitive_compile_time_jars,
full_compile_jars = java_info._transitive_full_compile_time_jars,
+ header_compilation_direct_deps = java_info._transitive_full_compile_time_jars,
)
# Omit jdeps, which aren't available transitively and aren't useful for reduced classpath
@@ -411,12 +419,15 @@
add_exports,
add_opens,
direct_runtime_jars,
- compilation_info):
+ compilation_info,
+ header_compilation_jar):
"""Creates a JavaInfo instance represiting the result of java compilation.
Args:
output_jar: (File) The jar that was created as a result of a compilation.
compile_jar: (File) A jar that is the compile-time dependency in lieu of `output_jar`.
+ header_compilation_jar: (File) A jar that is used for header compilation in lieu of
+ compile_jar or output_jar.
source_jar: (File) The source jar that was used to create the output jar.
generated_class_jar: (File) A jar file containing class files compiled from sources
generated during annotation processing.
@@ -466,6 +477,7 @@
generated_source_jar,
native_libraries,
neverlink,
+ header_compilation_jar,
)
# this differs ever so slightly from the usual JavaInfo in that direct_runtime_jars
@@ -557,12 +569,18 @@
generated_class_jar,
generated_source_jar,
native_libraries,
- neverlink):
+ neverlink,
+ header_compilation_jar = None):
_validate_provider_list(deps, "deps", JavaInfo)
_validate_provider_list(runtime_deps, "runtime_deps", JavaInfo)
_validate_provider_list(exports, "exports", JavaInfo)
_validate_provider_list(native_libraries, "native_libraries", CcInfo)
+ # For clients that don't create a header_compilation_jar (e.g. java_import), fall back to using
+ # the compile jar.
+ if compile_jar and not header_compilation_jar:
+ header_compilation_jar = compile_jar
+
concatenated_deps = _compute_concatenated_deps(deps, runtime_deps, exports)
source_jars = [source_jar] if source_jar else []
@@ -575,6 +593,7 @@
java_outputs = [_JavaOutputInfo(
class_jar = output_jar,
compile_jar = compile_jar,
+ header_compilation_jar = header_compilation_jar,
ijar = compile_jar, # deprecated
compile_jdeps = compile_jdeps,
generated_class_jar = generated_class_jar,
@@ -592,6 +611,11 @@
direct = [compile_jar] if compile_jar else [],
transitive = [dep.compile_jars for dep in exports],
),
+ "header_compilation_direct_deps": depset(
+ order = "preorder",
+ direct = [header_compilation_jar] if header_compilation_jar else [],
+ transitive = [dep.header_compilation_direct_deps for dep in exports],
+ ),
"full_compile_jars": depset(
order = "preorder",
direct = [output_jar],
@@ -670,6 +694,7 @@
def _javainfo_init(
output_jar,
compile_jar,
+ header_compilation_jar = None,
source_jar = None,
compile_jdeps = None,
generated_class_jar = None,
@@ -690,6 +715,8 @@
Args:
output_jar: (File) The jar that was created as a result of a compilation.
compile_jar: (File) A jar that is the compile-time dependency in lieu of `output_jar`.
+ header_compilation_jar: (File) A jar that is used for header compilation in lieu of
+ compile_jar or output_jar.
source_jar: (File) The source jar that was used to create the output jar. Optional.
compile_jdeps: (File) jdeps information about compile time dependencies to be consumed by
JavaCompileAction. This should be a binary proto encoded using the deps.proto protobuf
@@ -739,6 +766,7 @@
generated_source_jar,
native_libraries,
neverlink,
+ header_compilation_jar = header_compilation_jar,
)
if neverlink:
@@ -801,6 +829,8 @@
"compile_jars": """(depset[File]) The jars required directly at compile time. They can be interface jars
(ijar or hjar), regular jars or both, depending on whether rule
implementations chose to create interface jars or not.""",
+ "header_compilation_direct_deps": """(depset[File]) The header compilation jars required
+ directly at compile time.""",
"full_compile_jars": """(depset[File]) The regular, full compile time Jars required by this target directly.
They can be:
- the corresponding regular Jars of the interface Jars returned by JavaInfo.compile_jars