xref: /aosp_15_r20/build/bazel/rules/java/java_aconfig_library.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Worker"""Macro wrapping the java_aconfig_library for bp2build. """
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths")
18*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/aconfig:aconfig_declarations.bzl", "AconfigDeclarationsInfo")
19*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:sdk_transition.bzl", "sdk_transition")
20*7594170eSAndroid Build Coastguard Worker
21*7594170eSAndroid Build Coastguard Workerdef _java_aconfig_library_impl(ctx):
22*7594170eSAndroid Build Coastguard Worker    gen_dir_str = paths.join(ctx.label.name, "gen")
23*7594170eSAndroid Build Coastguard Worker
24*7594170eSAndroid Build Coastguard Worker    aconfig_declarations = ctx.attr.aconfig_declarations[AconfigDeclarationsInfo]
25*7594170eSAndroid Build Coastguard Worker    gen_srcjar = ctx.actions.declare_file(paths.join(gen_dir_str, ctx.label.name + ".srcjar"))
26*7594170eSAndroid Build Coastguard Worker
27*7594170eSAndroid Build Coastguard Worker    # TODO(b/301457407): find a solution for declare_directory.
28*7594170eSAndroid Build Coastguard Worker    gen_srcjar_tmp = ctx.actions.declare_directory("tmp", sibling = gen_srcjar)
29*7594170eSAndroid Build Coastguard Worker
30*7594170eSAndroid Build Coastguard Worker    intermediate_path = aconfig_declarations.intermediate_path
31*7594170eSAndroid Build Coastguard Worker
32*7594170eSAndroid Build Coastguard Worker    mode = "production"
33*7594170eSAndroid Build Coastguard Worker    if ctx.attr.test:
34*7594170eSAndroid Build Coastguard Worker        mode = "test"
35*7594170eSAndroid Build Coastguard Worker
36*7594170eSAndroid Build Coastguard Worker    args = ctx.actions.args()
37*7594170eSAndroid Build Coastguard Worker    args.add("create-java-lib")
38*7594170eSAndroid Build Coastguard Worker    args.add_all(["--mode", mode])
39*7594170eSAndroid Build Coastguard Worker    args.add_all(["--cache", intermediate_path])
40*7594170eSAndroid Build Coastguard Worker    args.add_all(["--out", gen_srcjar_tmp.path])
41*7594170eSAndroid Build Coastguard Worker
42*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
43*7594170eSAndroid Build Coastguard Worker        inputs = [intermediate_path],
44*7594170eSAndroid Build Coastguard Worker        executable = ctx.executable._aconfig,
45*7594170eSAndroid Build Coastguard Worker        outputs = [gen_srcjar_tmp],
46*7594170eSAndroid Build Coastguard Worker        arguments = [args],
47*7594170eSAndroid Build Coastguard Worker        tools = [
48*7594170eSAndroid Build Coastguard Worker            ctx.executable._aconfig,
49*7594170eSAndroid Build Coastguard Worker        ],
50*7594170eSAndroid Build Coastguard Worker        mnemonic = "AconfigCreateJavaLib",
51*7594170eSAndroid Build Coastguard Worker    )
52*7594170eSAndroid Build Coastguard Worker
53*7594170eSAndroid Build Coastguard Worker    args = ctx.actions.args()
54*7594170eSAndroid Build Coastguard Worker    args.add("-write_if_changed")
55*7594170eSAndroid Build Coastguard Worker    args.add("-jar")
56*7594170eSAndroid Build Coastguard Worker    args.add("-o", gen_srcjar)
57*7594170eSAndroid Build Coastguard Worker    args.add("-C", gen_srcjar_tmp.path)
58*7594170eSAndroid Build Coastguard Worker    args.add("-D", gen_srcjar_tmp.path)
59*7594170eSAndroid Build Coastguard Worker    args.add("-symlinks=false")
60*7594170eSAndroid Build Coastguard Worker
61*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
62*7594170eSAndroid Build Coastguard Worker        executable = ctx.executable._soong_zip,
63*7594170eSAndroid Build Coastguard Worker        inputs = [gen_srcjar_tmp],
64*7594170eSAndroid Build Coastguard Worker        outputs = [gen_srcjar],
65*7594170eSAndroid Build Coastguard Worker        arguments = [args],
66*7594170eSAndroid Build Coastguard Worker        tools = [
67*7594170eSAndroid Build Coastguard Worker            ctx.executable._soong_zip,
68*7594170eSAndroid Build Coastguard Worker        ],
69*7594170eSAndroid Build Coastguard Worker        mnemonic = "AconfigZipJavaLib",
70*7594170eSAndroid Build Coastguard Worker    )
71*7594170eSAndroid Build Coastguard Worker
72*7594170eSAndroid Build Coastguard Worker    out_file = ctx.actions.declare_file(ctx.label.name + ".jar")
73*7594170eSAndroid Build Coastguard Worker    java_info = java_common.compile(
74*7594170eSAndroid Build Coastguard Worker        ctx,
75*7594170eSAndroid Build Coastguard Worker        source_jars = [gen_srcjar],
76*7594170eSAndroid Build Coastguard Worker        deps = [d[JavaInfo] for d in ctx.attr.libs],
77*7594170eSAndroid Build Coastguard Worker        output = out_file,
78*7594170eSAndroid Build Coastguard Worker        java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java,
79*7594170eSAndroid Build Coastguard Worker    )
80*7594170eSAndroid Build Coastguard Worker
81*7594170eSAndroid Build Coastguard Worker    return [
82*7594170eSAndroid Build Coastguard Worker        java_info,
83*7594170eSAndroid Build Coastguard Worker        DefaultInfo(
84*7594170eSAndroid Build Coastguard Worker            files = depset([out_file]),
85*7594170eSAndroid Build Coastguard Worker            runfiles = ctx.runfiles(
86*7594170eSAndroid Build Coastguard Worker                transitive_files = depset(
87*7594170eSAndroid Build Coastguard Worker                    transitive = [java_info.transitive_runtime_jars],
88*7594170eSAndroid Build Coastguard Worker                ),
89*7594170eSAndroid Build Coastguard Worker            ),
90*7594170eSAndroid Build Coastguard Worker        ),
91*7594170eSAndroid Build Coastguard Worker        OutputGroupInfo(
92*7594170eSAndroid Build Coastguard Worker            srcjar = depset([gen_srcjar]),
93*7594170eSAndroid Build Coastguard Worker        ),
94*7594170eSAndroid Build Coastguard Worker    ]
95*7594170eSAndroid Build Coastguard Worker
96*7594170eSAndroid Build Coastguard Worker_java_aconfig_library = rule(
97*7594170eSAndroid Build Coastguard Worker    implementation = _java_aconfig_library_impl,
98*7594170eSAndroid Build Coastguard Worker    cfg = sdk_transition,
99*7594170eSAndroid Build Coastguard Worker    attrs = {
100*7594170eSAndroid Build Coastguard Worker        "aconfig_declarations": attr.label(
101*7594170eSAndroid Build Coastguard Worker            providers = [AconfigDeclarationsInfo],
102*7594170eSAndroid Build Coastguard Worker            mandatory = True,
103*7594170eSAndroid Build Coastguard Worker        ),
104*7594170eSAndroid Build Coastguard Worker        "libs": attr.label_list(
105*7594170eSAndroid Build Coastguard Worker            providers = [JavaInfo],
106*7594170eSAndroid Build Coastguard Worker        ),
107*7594170eSAndroid Build Coastguard Worker        "test": attr.bool(default = False),
108*7594170eSAndroid Build Coastguard Worker        "java_version": attr.string(),
109*7594170eSAndroid Build Coastguard Worker        "sdk_version": attr.string(),
110*7594170eSAndroid Build Coastguard Worker        "_aconfig": attr.label(
111*7594170eSAndroid Build Coastguard Worker            allow_single_file = True,
112*7594170eSAndroid Build Coastguard Worker            executable = True,
113*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
114*7594170eSAndroid Build Coastguard Worker            default = Label("//build/make/tools/aconfig:aconfig"),
115*7594170eSAndroid Build Coastguard Worker        ),
116*7594170eSAndroid Build Coastguard Worker        "_soong_zip": attr.label(
117*7594170eSAndroid Build Coastguard Worker            executable = True,
118*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
119*7594170eSAndroid Build Coastguard Worker            allow_single_file = True,
120*7594170eSAndroid Build Coastguard Worker            default = Label("//build/soong/zip/cmd:soong_zip"),
121*7594170eSAndroid Build Coastguard Worker        ),
122*7594170eSAndroid Build Coastguard Worker        "_allowlist_function_transition": attr.label(
123*7594170eSAndroid Build Coastguard Worker            default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
124*7594170eSAndroid Build Coastguard Worker        ),
125*7594170eSAndroid Build Coastguard Worker    },
126*7594170eSAndroid Build Coastguard Worker    toolchains = ["@bazel_tools//tools/jdk:toolchain_type"],
127*7594170eSAndroid Build Coastguard Worker    fragments = ["java"],
128*7594170eSAndroid Build Coastguard Worker    provides = [JavaInfo],
129*7594170eSAndroid Build Coastguard Worker)
130*7594170eSAndroid Build Coastguard Worker
131*7594170eSAndroid Build Coastguard Workerdef java_aconfig_library(
132*7594170eSAndroid Build Coastguard Worker        name,
133*7594170eSAndroid Build Coastguard Worker        aconfig_declarations,
134*7594170eSAndroid Build Coastguard Worker        test = False,
135*7594170eSAndroid Build Coastguard Worker        sdk_version = "system_current",
136*7594170eSAndroid Build Coastguard Worker        java_version = None,
137*7594170eSAndroid Build Coastguard Worker        visibility = None,
138*7594170eSAndroid Build Coastguard Worker        libs = [],
139*7594170eSAndroid Build Coastguard Worker        tags = [],
140*7594170eSAndroid Build Coastguard Worker        target_compatible_with = []):
141*7594170eSAndroid Build Coastguard Worker    combined_libs = [
142*7594170eSAndroid Build Coastguard Worker        "//frameworks/libs/modules-utils/java:aconfig-annotations-lib",
143*7594170eSAndroid Build Coastguard Worker        "//tools/platform-compat/java/android/compat/annotation:unsupportedappusage",
144*7594170eSAndroid Build Coastguard Worker    ] + libs
145*7594170eSAndroid Build Coastguard Worker    _java_aconfig_library(
146*7594170eSAndroid Build Coastguard Worker        name = name,
147*7594170eSAndroid Build Coastguard Worker        aconfig_declarations = aconfig_declarations,
148*7594170eSAndroid Build Coastguard Worker        libs = combined_libs,
149*7594170eSAndroid Build Coastguard Worker        test = test,
150*7594170eSAndroid Build Coastguard Worker        sdk_version = sdk_version,
151*7594170eSAndroid Build Coastguard Worker        java_version = java_version,
152*7594170eSAndroid Build Coastguard Worker        visibility = visibility,
153*7594170eSAndroid Build Coastguard Worker        tags = tags,
154*7594170eSAndroid Build Coastguard Worker        target_compatible_with = target_compatible_with,
155*7594170eSAndroid Build Coastguard Worker    )
156*7594170eSAndroid Build Coastguard Worker
157*7594170eSAndroid Build Coastguard Worker    native.filegroup(
158*7594170eSAndroid Build Coastguard Worker        name = name + ".generated_srcjars",
159*7594170eSAndroid Build Coastguard Worker        srcs = [name],
160*7594170eSAndroid Build Coastguard Worker        output_group = "srcjar",
161*7594170eSAndroid Build Coastguard Worker        visibility = visibility,
162*7594170eSAndroid Build Coastguard Worker        tags = tags,
163*7594170eSAndroid Build Coastguard Worker    )
164