xref: /aosp_15_r20/build/bazel/rules/java/java_sysprop_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"""
16*7594170eSAndroid Build Coastguard WorkerRules for generating java code from sysprop_library modules
17*7594170eSAndroid Build Coastguard Worker"""
18*7594170eSAndroid Build Coastguard Worker
19*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/sysprop:sysprop_library.bzl", "SyspropGenInfo")
20*7594170eSAndroid Build Coastguard Workerload(":sdk_transition.bzl", "sdk_transition")
21*7594170eSAndroid Build Coastguard Worker
22*7594170eSAndroid Build Coastguard Worker# TODO: b/301122615 - Implement stubs rule and macro for both
23*7594170eSAndroid Build Coastguard Worker
24*7594170eSAndroid Build Coastguard Worker_java_sysprop_library_attrs = {
25*7594170eSAndroid Build Coastguard Worker    "dep": attr.label(mandatory = True),
26*7594170eSAndroid Build Coastguard Worker    "_sdk_version": attr.string(default = "core_current"),
27*7594170eSAndroid Build Coastguard Worker    # TODO: TBD - Add other possible stub libs
28*7594170eSAndroid Build Coastguard Worker    "_platform_stubs": attr.label(
29*7594170eSAndroid Build Coastguard Worker        default = "//system/tools/sysprop:sysprop-library-stub-platform",
30*7594170eSAndroid Build Coastguard Worker    ),
31*7594170eSAndroid Build Coastguard Worker    "_sysprop_java": attr.label(
32*7594170eSAndroid Build Coastguard Worker        default = "//system/tools/sysprop:sysprop_java",
33*7594170eSAndroid Build Coastguard Worker        executable = True,
34*7594170eSAndroid Build Coastguard Worker        cfg = "exec",
35*7594170eSAndroid Build Coastguard Worker    ),
36*7594170eSAndroid Build Coastguard Worker    "_soong_zip": attr.label(
37*7594170eSAndroid Build Coastguard Worker        default = "//build/soong/zip/cmd:soong_zip",
38*7594170eSAndroid Build Coastguard Worker        executable = True,
39*7594170eSAndroid Build Coastguard Worker        cfg = "exec",
40*7594170eSAndroid Build Coastguard Worker    ),
41*7594170eSAndroid Build Coastguard Worker    "_allowlist_function_transition": attr.label(
42*7594170eSAndroid Build Coastguard Worker        default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
43*7594170eSAndroid Build Coastguard Worker    ),
44*7594170eSAndroid Build Coastguard Worker}
45*7594170eSAndroid Build Coastguard Worker
46*7594170eSAndroid Build Coastguard Workerdef _gen_java(
47*7594170eSAndroid Build Coastguard Worker        ctx,
48*7594170eSAndroid Build Coastguard Worker        srcs,
49*7594170eSAndroid Build Coastguard Worker        scope):
50*7594170eSAndroid Build Coastguard Worker    outputs = []
51*7594170eSAndroid Build Coastguard Worker    all_srcs = []
52*7594170eSAndroid Build Coastguard Worker    for src in srcs:
53*7594170eSAndroid Build Coastguard Worker        all_srcs.extend(src.files.to_list())
54*7594170eSAndroid Build Coastguard Worker
55*7594170eSAndroid Build Coastguard Worker    for src_file in all_srcs:
56*7594170eSAndroid Build Coastguard Worker        output_subpath = src_file.short_path.replace(
57*7594170eSAndroid Build Coastguard Worker            ctx.label.package + "/",
58*7594170eSAndroid Build Coastguard Worker            "",
59*7594170eSAndroid Build Coastguard Worker            1,
60*7594170eSAndroid Build Coastguard Worker        )
61*7594170eSAndroid Build Coastguard Worker        output_srcjar_file = ctx.actions.declare_file(
62*7594170eSAndroid Build Coastguard Worker            "%s.srcjar" % output_subpath,
63*7594170eSAndroid Build Coastguard Worker        )
64*7594170eSAndroid Build Coastguard Worker        output_tmp_dir_path = "%s.tmp" % output_srcjar_file.path
65*7594170eSAndroid Build Coastguard Worker        ctx.actions.run_shell(
66*7594170eSAndroid Build Coastguard Worker            tools = [
67*7594170eSAndroid Build Coastguard Worker                ctx.executable._sysprop_java,
68*7594170eSAndroid Build Coastguard Worker                ctx.executable._soong_zip,
69*7594170eSAndroid Build Coastguard Worker            ],
70*7594170eSAndroid Build Coastguard Worker            inputs = [src_file],
71*7594170eSAndroid Build Coastguard Worker            outputs = [output_srcjar_file],
72*7594170eSAndroid Build Coastguard Worker            command = """
73*7594170eSAndroid Build Coastguard Worker            rm -rf {dir} && mkdir -p {dir} &&
74*7594170eSAndroid Build Coastguard Worker            {sysprop_java} --scope {scope} --java-output-dir {dir} {input} &&
75*7594170eSAndroid Build Coastguard Worker            {soong_zip} -jar -o {output_srcjar} -C {dir} -D {dir}
76*7594170eSAndroid Build Coastguard Worker            """.format(
77*7594170eSAndroid Build Coastguard Worker                dir = output_tmp_dir_path,
78*7594170eSAndroid Build Coastguard Worker                sysprop_java = ctx.executable._sysprop_java.path,
79*7594170eSAndroid Build Coastguard Worker                scope = scope,
80*7594170eSAndroid Build Coastguard Worker                input = src_file.path,
81*7594170eSAndroid Build Coastguard Worker                soong_zip = ctx.executable._soong_zip.path,
82*7594170eSAndroid Build Coastguard Worker                output_srcjar = output_srcjar_file.path,
83*7594170eSAndroid Build Coastguard Worker            ),
84*7594170eSAndroid Build Coastguard Worker            mnemonic = "SyspropJava",
85*7594170eSAndroid Build Coastguard Worker            progress_message = "Generating srcjar from {}".format(
86*7594170eSAndroid Build Coastguard Worker                src_file.basename,
87*7594170eSAndroid Build Coastguard Worker            ),
88*7594170eSAndroid Build Coastguard Worker        )
89*7594170eSAndroid Build Coastguard Worker        outputs.append(output_srcjar_file)
90*7594170eSAndroid Build Coastguard Worker    return outputs
91*7594170eSAndroid Build Coastguard Worker
92*7594170eSAndroid Build Coastguard Workerdef _compile_java(
93*7594170eSAndroid Build Coastguard Worker        name,
94*7594170eSAndroid Build Coastguard Worker        ctx,
95*7594170eSAndroid Build Coastguard Worker        srcs,
96*7594170eSAndroid Build Coastguard Worker        deps):
97*7594170eSAndroid Build Coastguard Worker    out_jar = ctx.actions.declare_file("%s.jar" % name)
98*7594170eSAndroid Build Coastguard Worker    java_info = java_common.compile(
99*7594170eSAndroid Build Coastguard Worker        ctx,
100*7594170eSAndroid Build Coastguard Worker        source_jars = srcs,
101*7594170eSAndroid Build Coastguard Worker        deps = deps,
102*7594170eSAndroid Build Coastguard Worker        output = out_jar,
103*7594170eSAndroid Build Coastguard Worker        java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java,
104*7594170eSAndroid Build Coastguard Worker    )
105*7594170eSAndroid Build Coastguard Worker    return java_info, out_jar
106*7594170eSAndroid Build Coastguard Worker
107*7594170eSAndroid Build Coastguard Workerdef _java_sysprop_library_impl(ctx):
108*7594170eSAndroid Build Coastguard Worker    gen_srcjars = _gen_java(
109*7594170eSAndroid Build Coastguard Worker        ctx,
110*7594170eSAndroid Build Coastguard Worker        ctx.attr.dep[SyspropGenInfo].srcs,
111*7594170eSAndroid Build Coastguard Worker        "internal",  # TODO: b/302677541 - Determine based on props
112*7594170eSAndroid Build Coastguard Worker    )
113*7594170eSAndroid Build Coastguard Worker
114*7594170eSAndroid Build Coastguard Worker    java_info, out_jar = _compile_java(
115*7594170eSAndroid Build Coastguard Worker        ctx.attr.name,
116*7594170eSAndroid Build Coastguard Worker        ctx,
117*7594170eSAndroid Build Coastguard Worker        gen_srcjars,
118*7594170eSAndroid Build Coastguard Worker        # TODO: b/302677539 - Determine based on props
119*7594170eSAndroid Build Coastguard Worker        [ctx.attr._platform_stubs[JavaInfo]],
120*7594170eSAndroid Build Coastguard Worker    )
121*7594170eSAndroid Build Coastguard Worker
122*7594170eSAndroid Build Coastguard Worker    return [
123*7594170eSAndroid Build Coastguard Worker        java_info,
124*7594170eSAndroid Build Coastguard Worker        DefaultInfo(
125*7594170eSAndroid Build Coastguard Worker            files = depset([out_jar]),
126*7594170eSAndroid Build Coastguard Worker            runfiles = ctx.runfiles(
127*7594170eSAndroid Build Coastguard Worker                transitive_files = depset(
128*7594170eSAndroid Build Coastguard Worker                    transitive = [java_info.transitive_runtime_jars],
129*7594170eSAndroid Build Coastguard Worker                ),
130*7594170eSAndroid Build Coastguard Worker            ),
131*7594170eSAndroid Build Coastguard Worker        ),
132*7594170eSAndroid Build Coastguard Worker        OutputGroupInfo(default = depset()),
133*7594170eSAndroid Build Coastguard Worker    ]
134*7594170eSAndroid Build Coastguard Worker
135*7594170eSAndroid Build Coastguard Workerjava_sysprop_library = rule(
136*7594170eSAndroid Build Coastguard Worker    implementation = _java_sysprop_library_impl,
137*7594170eSAndroid Build Coastguard Worker    cfg = sdk_transition,
138*7594170eSAndroid Build Coastguard Worker    doc = """
139*7594170eSAndroid Build Coastguard Worker    Generates java sources from the sources in the supplied sysprop_library
140*7594170eSAndroid Build Coastguard Worker    target and compiles them into a jar.
141*7594170eSAndroid Build Coastguard Worker    """,
142*7594170eSAndroid Build Coastguard Worker    attrs = _java_sysprop_library_attrs,
143*7594170eSAndroid Build Coastguard Worker    toolchains = ["@bazel_tools//tools/jdk:toolchain_type"],
144*7594170eSAndroid Build Coastguard Worker    fragments = ["java"],
145*7594170eSAndroid Build Coastguard Worker    provides = [JavaInfo],
146*7594170eSAndroid Build Coastguard Worker)
147