Skip to content

Commit

Permalink
Materialize MATERIALIZED_ARTIFACTS_DIR from preprocess_java_classes
Browse files Browse the repository at this point in the history
Summary: We want to make sure this directory is always materialized, so materialize it for `android_apk` and `android_bundle`, and for `apk_genrule` make sure the underlying directory is materialized.

Reviewed By: navidqar

Differential Revision: D51551158

fbshipit-source-id: c6081b49de0e8fcbc950336bd6fc91313f5eb360
  • Loading branch information
Ian Childs authored and facebook-github-bot committed Dec 12, 2023
1 parent 9866707 commit bb4de65
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 10 deletions.
4 changes: 2 additions & 2 deletions prelude/android/android_apk.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def android_apk_impl(ctx: AnalysisContext) -> list[Provider]:
)

return [
AndroidApkInfo(apk = output_apk, manifest = resources_info.manifest),
AndroidApkInfo(apk = output_apk, manifest = resources_info.manifest, materialized_artifacts = android_binary_info.materialized_artifacts),
AndroidApkUnderTestInfo(
java_packaging_deps = set([dep.label.raw_target() for dep in java_packaging_deps]),
keystore = keystore,
Expand All @@ -58,7 +58,7 @@ def android_apk_impl(ctx: AnalysisContext) -> list[Provider]:
r_dot_java_packages = set([info.specified_r_dot_java_package for info in resources_info.unfiltered_resource_infos if info.specified_r_dot_java_package]),
shared_libraries = set(native_library_info.apk_under_test_shared_libraries),
),
DefaultInfo(default_output = output_apk, other_outputs = _get_exopackage_outputs(exopackage_info), sub_targets = sub_targets | class_to_srcs_subtargets),
DefaultInfo(default_output = output_apk, other_outputs = _get_exopackage_outputs(exopackage_info) + android_binary_info.materialized_artifacts, sub_targets = sub_targets | class_to_srcs_subtargets),
get_install_info(ctx, output_apk = output_apk, manifest = resources_info.manifest, exopackage_info = exopackage_info),
TemplatePlaceholderInfo(
keyed_variables = {
Expand Down
7 changes: 6 additions & 1 deletion prelude/android/android_binary.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@ AndroidBinaryInfo = record(
dex_files_info = DexFilesInfo,
native_library_info = "AndroidBinaryNativeLibsInfo",
resources_info = "AndroidBinaryResourcesInfo",
materialized_artifacts = list[Artifact],
)

def get_binary_info(ctx: AnalysisContext, use_proto_format: bool) -> AndroidBinaryInfo:
sub_targets = {}
materialized_artifacts = []

_verify_params(ctx)

Expand Down Expand Up @@ -123,7 +125,9 @@ def get_binary_info(ctx: AnalysisContext, use_proto_format: bool) -> AndroidBina
else:
jars_to_owners = {packaging_dep.jar: packaging_dep.jar.owner.raw_target() for packaging_dep in dex_java_packaging_deps}
if ctx.attrs.preprocess_java_classes_bash:
jars_to_owners = get_preprocessed_java_classes(ctx, jars_to_owners)
jars_to_owners, materialized_artifacts_dir = get_preprocessed_java_classes(ctx, jars_to_owners)
if materialized_artifacts_dir:
materialized_artifacts.append(materialized_artifacts_dir)
if has_proguard_config:
proguard_output = get_proguard_output(
ctx,
Expand Down Expand Up @@ -184,6 +188,7 @@ def get_binary_info(ctx: AnalysisContext, use_proto_format: bool) -> AndroidBina
dex_files_info = dex_files_info,
native_library_info = native_library_info,
resources_info = resources_info,
materialized_artifacts = materialized_artifacts,
)

def get_build_config_java_libraries(
Expand Down
4 changes: 2 additions & 2 deletions prelude/android/android_bundle.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ def android_bundle_impl(ctx: AnalysisContext) -> list[Provider]:

java_packaging_deps = android_binary_info.java_packaging_deps
return [
DefaultInfo(default_output = output_bundle, sub_targets = android_binary_info.sub_targets),
AndroidAabInfo(aab = output_bundle, manifest = android_binary_info.resources_info.manifest),
DefaultInfo(default_output = output_bundle, other_outputs = android_binary_info.materialized_artifacts, sub_targets = android_binary_info.sub_targets),
AndroidAabInfo(aab = output_bundle, manifest = android_binary_info.resources_info.manifest, materialized_artifacts = android_binary_info.materialized_artifacts),
TemplatePlaceholderInfo(
keyed_variables = {
"classpath": cmd_args([dep.jar for dep in java_packaging_deps if dep.jar], delimiter = get_path_separator_for_exec_os(ctx)),
Expand Down
2 changes: 2 additions & 0 deletions prelude/android/android_providers.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,15 @@ AndroidApkInfo = provider(
fields = {
"apk": provider_field(typing.Any, default = None),
"manifest": provider_field(typing.Any, default = None),
"materialized_artifacts": provider_field(typing.Any, default = None),
},
)

AndroidAabInfo = provider(
fields = {
"aab": provider_field(typing.Any, default = None),
"manifest": provider_field(typing.Any, default = None),
"materialized_artifacts": provider_field(typing.Any, default = None),
},
)

Expand Down
5 changes: 4 additions & 1 deletion prelude/android/apk_genrule.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def apk_genrule_impl(ctx: AnalysisContext) -> list[Provider]:
expect(input_android_apk_info != None, "'apk' attribute must be an Android APK!")
input_apk = input_android_apk_info.apk
input_manifest = input_android_apk_info.manifest
input_materialized_artifacts = input_android_apk_info.materialized_artifacts
input_android_apk_under_test_info = ctx.attrs.apk[AndroidApkUnderTestInfo]
else:
input_android_aab_info = ctx.attrs.aab[AndroidAabInfo]
Expand All @@ -28,6 +29,7 @@ def apk_genrule_impl(ctx: AnalysisContext) -> list[Provider]:
# It's not an APK, but buck1 does this so we do it too for compatibility
input_apk = input_android_aab_info.aab
input_manifest = input_android_aab_info.manifest
input_materialized_artifacts = input_android_aab_info.materialized_artifacts

env_vars = {
"APK": cmd_args(input_apk),
Expand All @@ -36,7 +38,7 @@ def apk_genrule_impl(ctx: AnalysisContext) -> list[Provider]:
# Like buck1, we ignore the 'out' attribute and construct the output path ourselves.
output_apk_name = "{}.apk".format(ctx.label.name)

genrule_providers = process_genrule(ctx, output_apk_name, None, env_vars)
genrule_providers = process_genrule(ctx, output_apk_name, None, env_vars, other_outputs = input_materialized_artifacts)

expect(
len(genrule_providers) == 1 and isinstance(genrule_providers[0], DefaultInfo),
Expand All @@ -57,6 +59,7 @@ def apk_genrule_impl(ctx: AnalysisContext) -> list[Provider]:
AndroidApkInfo(
apk = output_apk,
manifest = input_manifest,
materialized_artifacts = input_materialized_artifacts,
),
install_info,
] + filter(None, [input_android_apk_under_test_info]) + class_to_src_map
6 changes: 3 additions & 3 deletions prelude/android/preprocess_java_classes.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ load("@prelude//java:java_toolchain.bzl", "JavaToolchainInfo")
load("@prelude//java/utils:java_more_utils.bzl", "get_path_separator_for_exec_os")
load("@prelude//utils:expect.bzl", "expect")

def get_preprocessed_java_classes(ctx: AnalysisContext, input_jars = {"artifact": "target_label"}) -> dict[Artifact, TargetLabel]:
def get_preprocessed_java_classes(ctx: AnalysisContext, input_jars = {"artifact": "target_label"}) -> (dict[Artifact, TargetLabel], [Artifact, None]):
if not input_jars:
return {}
return {}, None

input_srcs = {}
output_jars_to_owners = {}
Expand Down Expand Up @@ -60,4 +60,4 @@ def get_preprocessed_java_classes(ctx: AnalysisContext, input_jars = {"artifact"

ctx.actions.run(preprocess_cmd, env = env, category = "preprocess_java_classes")

return output_jars_to_owners
return output_jars_to_owners, materialized_artifacts_dir
4 changes: 3 additions & 1 deletion prelude/genrule.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ def process_genrule(
out_attr: [str, None],
outs_attr: [dict, None],
extra_env_vars: dict = {},
identifier: [str, None] = None) -> list[Provider]:
identifier: [str, None] = None,
other_outputs: list[Artifact] = []) -> list[Provider]:
if (out_attr != None) and (outs_attr != None):
fail("Only one of `out` and `outs` should be set. Got out=`%s`, outs=`%s`" % (repr(out_attr), repr(outs_attr)))

Expand Down Expand Up @@ -357,6 +358,7 @@ def process_genrule(
providers = [DefaultInfo(
default_outputs = default_outputs,
sub_targets = sub_targets,
other_outputs = other_outputs,
)]

# The cxx_genrule also forwards here, and that doesn't have .executable, so use getattr
Expand Down

0 comments on commit bb4de65

Please sign in to comment.