xref: /aosp_15_r20/build/bazel/rules/java/java_resources.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker"""
2*7594170eSAndroid Build Coastguard WorkerCopyright (C) 2023 The Android Open Source Project
3*7594170eSAndroid Build Coastguard Worker
4*7594170eSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License");
5*7594170eSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License.
6*7594170eSAndroid Build Coastguard WorkerYou may obtain a copy of the License at
7*7594170eSAndroid Build Coastguard Worker
8*7594170eSAndroid Build Coastguard Worker    http://www.apache.org/licenses/LICENSE-2.0
9*7594170eSAndroid Build Coastguard Worker
10*7594170eSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software
11*7594170eSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS,
12*7594170eSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7594170eSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and
14*7594170eSAndroid Build Coastguard Workerlimitations under the License.
15*7594170eSAndroid Build Coastguard Worker"""
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths")
18*7594170eSAndroid Build Coastguard Worker
19*7594170eSAndroid Build Coastguard Workerdef _java_resources_impl(ctx):
20*7594170eSAndroid Build Coastguard Worker    java_runtime = ctx.attr._runtime[java_common.JavaRuntimeInfo]
21*7594170eSAndroid Build Coastguard Worker
22*7594170eSAndroid Build Coastguard Worker    output_file = ctx.actions.declare_file(ctx.attr.name + "_java_resources.jar")
23*7594170eSAndroid Build Coastguard Worker
24*7594170eSAndroid Build Coastguard Worker    ctx.actions.run_shell(
25*7594170eSAndroid Build Coastguard Worker        outputs = [output_file],
26*7594170eSAndroid Build Coastguard Worker        inputs = ctx.files.resources,
27*7594170eSAndroid Build Coastguard Worker        tools = java_runtime.files,
28*7594170eSAndroid Build Coastguard Worker        command = "{} cvf {} -C {} .".format(
29*7594170eSAndroid Build Coastguard Worker            paths.join(java_runtime.java_home, "bin", "jar"),
30*7594170eSAndroid Build Coastguard Worker            output_file.path,
31*7594170eSAndroid Build Coastguard Worker            ctx.attr.resource_strip_prefix,
32*7594170eSAndroid Build Coastguard Worker        ),
33*7594170eSAndroid Build Coastguard Worker    )
34*7594170eSAndroid Build Coastguard Worker
35*7594170eSAndroid Build Coastguard Worker    compile_jar = ctx.actions.declare_file(ctx.attr.name + "_java_resources-ijar.jar")
36*7594170eSAndroid Build Coastguard Worker    java_common.run_ijar(
37*7594170eSAndroid Build Coastguard Worker        actions = ctx.actions,
38*7594170eSAndroid Build Coastguard Worker        jar = output_file,
39*7594170eSAndroid Build Coastguard Worker        java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java,
40*7594170eSAndroid Build Coastguard Worker    )
41*7594170eSAndroid Build Coastguard Worker
42*7594170eSAndroid Build Coastguard Worker    return [
43*7594170eSAndroid Build Coastguard Worker        JavaInfo(
44*7594170eSAndroid Build Coastguard Worker            output_jar = output_file,
45*7594170eSAndroid Build Coastguard Worker            compile_jar = compile_jar,
46*7594170eSAndroid Build Coastguard Worker        ),
47*7594170eSAndroid Build Coastguard Worker        DefaultInfo(files = depset([output_file])),
48*7594170eSAndroid Build Coastguard Worker    ]
49*7594170eSAndroid Build Coastguard Worker
50*7594170eSAndroid Build Coastguard Workerjava_resources = rule(
51*7594170eSAndroid Build Coastguard Worker    doc = """
52*7594170eSAndroid Build Coastguard Worker    Package srcs into a jar, with the option of stripping a path prefix
53*7594170eSAndroid Build Coastguard Worker    """,
54*7594170eSAndroid Build Coastguard Worker    implementation = _java_resources_impl,
55*7594170eSAndroid Build Coastguard Worker    attrs = {
56*7594170eSAndroid Build Coastguard Worker        "resources": attr.label_list(allow_files = True),
57*7594170eSAndroid Build Coastguard Worker        "resource_strip_prefix": attr.string(
58*7594170eSAndroid Build Coastguard Worker            doc = """The path prefix to strip from resources.
59*7594170eSAndroid Build Coastguard Worker                   If specified, this path prefix is stripped from every fil
60*7594170eSAndroid Build Coastguard Worker                   in the resources attribute. It is an error for a resource
61*7594170eSAndroid Build Coastguard Worker                   file not to be under this directory. If not specified
62*7594170eSAndroid Build Coastguard Worker                   (the default), the path of resource file is determined
63*7594170eSAndroid Build Coastguard Worker                   according to the same logic as the Java package of source
64*7594170eSAndroid Build Coastguard Worker                   files. For example, a source file at stuff/java/foo/bar/a.txt
65*7594170eSAndroid Build Coastguard Worker                    will be located at foo/bar/a.txt.""",
66*7594170eSAndroid Build Coastguard Worker        ),
67*7594170eSAndroid Build Coastguard Worker        "_runtime": attr.label(
68*7594170eSAndroid Build Coastguard Worker            default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
69*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
70*7594170eSAndroid Build Coastguard Worker            providers = [java_common.JavaRuntimeInfo],
71*7594170eSAndroid Build Coastguard Worker        ),
72*7594170eSAndroid Build Coastguard Worker    },
73*7594170eSAndroid Build Coastguard Worker    toolchains = ["@bazel_tools//tools/jdk:toolchain_type"],
74*7594170eSAndroid Build Coastguard Worker    provides = [JavaInfo],
75*7594170eSAndroid Build Coastguard Worker)
76