xref: /aosp_15_r20/build/bazel/rules/kotlin/kt_jvm_library.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("@rules_kotlin//kotlin:compiler_opt.bzl", "kt_compiler_opt")
18*7594170eSAndroid Build Coastguard Workerload("@rules_kotlin//kotlin:rules.bzl", _kt_jvm_library = "kt_jvm_library")
19*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:java_resources.bzl", "java_resources")
20*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:sdk_transition.bzl", "sdk_transition_attrs")
21*7594170eSAndroid Build Coastguard Worker
22*7594170eSAndroid Build Coastguard Workerdef make_kt_compiler_opt(
23*7594170eSAndroid Build Coastguard Worker        name,
24*7594170eSAndroid Build Coastguard Worker        kotlincflags = None):
25*7594170eSAndroid Build Coastguard Worker    custom_kotlincopts = None
26*7594170eSAndroid Build Coastguard Worker    if kotlincflags != None:
27*7594170eSAndroid Build Coastguard Worker        ktcopts_name = name + "_kotlincopts"
28*7594170eSAndroid Build Coastguard Worker        kt_compiler_opt(
29*7594170eSAndroid Build Coastguard Worker            name = ktcopts_name,
30*7594170eSAndroid Build Coastguard Worker            opts = kotlincflags,
31*7594170eSAndroid Build Coastguard Worker        )
32*7594170eSAndroid Build Coastguard Worker        custom_kotlincopts = [":" + ktcopts_name]
33*7594170eSAndroid Build Coastguard Worker
34*7594170eSAndroid Build Coastguard Worker    return custom_kotlincopts
35*7594170eSAndroid Build Coastguard Worker
36*7594170eSAndroid Build Coastguard Worker# TODO(b/277801336): document these attributes.
37*7594170eSAndroid Build Coastguard Workerdef kt_jvm_library(
38*7594170eSAndroid Build Coastguard Worker        name,
39*7594170eSAndroid Build Coastguard Worker        deps = None,
40*7594170eSAndroid Build Coastguard Worker        resources = None,
41*7594170eSAndroid Build Coastguard Worker        resource_strip_prefix = None,
42*7594170eSAndroid Build Coastguard Worker        kotlincflags = None,
43*7594170eSAndroid Build Coastguard Worker        java_version = None,
44*7594170eSAndroid Build Coastguard Worker        sdk_version = None,
45*7594170eSAndroid Build Coastguard Worker        javacopts = [],
46*7594170eSAndroid Build Coastguard Worker        errorprone_force_enable = None,
47*7594170eSAndroid Build Coastguard Worker        tags = [],
48*7594170eSAndroid Build Coastguard Worker        target_compatible_with = [],
49*7594170eSAndroid Build Coastguard Worker        visibility = None,
50*7594170eSAndroid Build Coastguard Worker        **kwargs):
51*7594170eSAndroid Build Coastguard Worker    """Bazel macro wrapping for kt_jvm_library
52*7594170eSAndroid Build Coastguard Worker
53*7594170eSAndroid Build Coastguard Worker        Attributes:
54*7594170eSAndroid Build Coastguard Worker            errorprone_force_enable: set this to true to always run Error Prone
55*7594170eSAndroid Build Coastguard Worker            on this target (overriding the value of environment variable
56*7594170eSAndroid Build Coastguard Worker            RUN_ERROR_PRONE). Error Prone can be force disabled for an individual
57*7594170eSAndroid Build Coastguard Worker            module by adding the "-XepDisableAllChecks" flag to javacopts
58*7594170eSAndroid Build Coastguard Worker        """
59*7594170eSAndroid Build Coastguard Worker    if resource_strip_prefix != None:
60*7594170eSAndroid Build Coastguard Worker        kt_res_jar_name = name + "__kt_res_jar"
61*7594170eSAndroid Build Coastguard Worker
62*7594170eSAndroid Build Coastguard Worker        java_resources(
63*7594170eSAndroid Build Coastguard Worker            name = kt_res_jar_name,
64*7594170eSAndroid Build Coastguard Worker            resources = resources,
65*7594170eSAndroid Build Coastguard Worker            resource_strip_prefix = resource_strip_prefix,
66*7594170eSAndroid Build Coastguard Worker        )
67*7594170eSAndroid Build Coastguard Worker
68*7594170eSAndroid Build Coastguard Worker        deps = deps + [":" + kt_res_jar_name]
69*7594170eSAndroid Build Coastguard Worker
70*7594170eSAndroid Build Coastguard Worker    custom_kotlincopts = make_kt_compiler_opt(name, kotlincflags)
71*7594170eSAndroid Build Coastguard Worker
72*7594170eSAndroid Build Coastguard Worker    opts = javacopts
73*7594170eSAndroid Build Coastguard Worker    if errorprone_force_enable == None:
74*7594170eSAndroid Build Coastguard Worker        # TODO (b/227504307) temporarily disable errorprone until environment variable is handled
75*7594170eSAndroid Build Coastguard Worker        opts = opts + ["-XepDisableAllChecks"]
76*7594170eSAndroid Build Coastguard Worker
77*7594170eSAndroid Build Coastguard Worker    lib_name = name + "_private"
78*7594170eSAndroid Build Coastguard Worker    _kt_jvm_library(
79*7594170eSAndroid Build Coastguard Worker        name = lib_name,
80*7594170eSAndroid Build Coastguard Worker        deps = deps,
81*7594170eSAndroid Build Coastguard Worker        custom_kotlincopts = custom_kotlincopts,
82*7594170eSAndroid Build Coastguard Worker        javacopts = opts,
83*7594170eSAndroid Build Coastguard Worker        tags = tags + ["manual"],
84*7594170eSAndroid Build Coastguard Worker        target_compatible_with = target_compatible_with,
85*7594170eSAndroid Build Coastguard Worker        visibility = ["//visibility:private"],
86*7594170eSAndroid Build Coastguard Worker        **kwargs
87*7594170eSAndroid Build Coastguard Worker    )
88*7594170eSAndroid Build Coastguard Worker
89*7594170eSAndroid Build Coastguard Worker    kt_jvm_library_sdk_transition(
90*7594170eSAndroid Build Coastguard Worker        name = name,
91*7594170eSAndroid Build Coastguard Worker        sdk_version = sdk_version,
92*7594170eSAndroid Build Coastguard Worker        java_version = java_version,
93*7594170eSAndroid Build Coastguard Worker        exports = lib_name,
94*7594170eSAndroid Build Coastguard Worker        tags = tags,
95*7594170eSAndroid Build Coastguard Worker        target_compatible_with = target_compatible_with,
96*7594170eSAndroid Build Coastguard Worker        visibility = visibility,
97*7594170eSAndroid Build Coastguard Worker    )
98*7594170eSAndroid Build Coastguard Worker
99*7594170eSAndroid Build Coastguard Worker# The list of providers to forward was determined using cquery on one
100*7594170eSAndroid Build Coastguard Worker# of the example targets listed under EXAMPLE_WRAPPER_TARGETS at
101*7594170eSAndroid Build Coastguard Worker# //build/bazel/ci/target_lists.sh. It may not be exhaustive. A unit
102*7594170eSAndroid Build Coastguard Worker# test ensures that the wrapper's providers and the wrapped rule's do
103*7594170eSAndroid Build Coastguard Worker# match.
104*7594170eSAndroid Build Coastguard Workerdef _kt_jvm_library_sdk_transition_impl(ctx):
105*7594170eSAndroid Build Coastguard Worker    return [
106*7594170eSAndroid Build Coastguard Worker        ctx.attr.exports[0][JavaInfo],
107*7594170eSAndroid Build Coastguard Worker        ctx.attr.exports[0][InstrumentedFilesInfo],
108*7594170eSAndroid Build Coastguard Worker        ctx.attr.exports[0][ProguardSpecProvider],
109*7594170eSAndroid Build Coastguard Worker        ctx.attr.exports[0][OutputGroupInfo],
110*7594170eSAndroid Build Coastguard Worker        ctx.attr.exports[0][DefaultInfo],
111*7594170eSAndroid Build Coastguard Worker    ]
112*7594170eSAndroid Build Coastguard Worker
113*7594170eSAndroid Build Coastguard Workerkt_jvm_library_sdk_transition = rule(
114*7594170eSAndroid Build Coastguard Worker    implementation = _kt_jvm_library_sdk_transition_impl,
115*7594170eSAndroid Build Coastguard Worker    attrs = sdk_transition_attrs,
116*7594170eSAndroid Build Coastguard Worker    provides = [JavaInfo],
117*7594170eSAndroid Build Coastguard Worker)
118