xref: /aosp_15_r20/build/bazel/rules/aidl/aidl_interface.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 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 Workerload("//build/bazel/rules/aidl:aidl_library.bzl", "aidl_library")
16*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_aidl_library.bzl", "cc_aidl_library")
17*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:java_aidl_library.bzl", "java_aidl_library")
18*7594170eSAndroid Build Coastguard Worker
19*7594170eSAndroid Build Coastguard WorkerJAVA = "java"
20*7594170eSAndroid Build Coastguard WorkerCPP = "cpp"
21*7594170eSAndroid Build Coastguard WorkerNDK = "ndk"
22*7594170eSAndroid Build Coastguard Worker#TODO(b/246803961) Add support for rust backend
23*7594170eSAndroid Build Coastguard Worker
24*7594170eSAndroid Build Coastguard Workerdef _hash_file(name, version):
25*7594170eSAndroid Build Coastguard Worker    return "aidl_api/{}/{}/.hash".format(name, version)
26*7594170eSAndroid Build Coastguard Worker
27*7594170eSAndroid Build Coastguard Workerdef _check_versions_with_info(versions_with_info):
28*7594170eSAndroid Build Coastguard Worker    for version_with_info in versions_with_info:
29*7594170eSAndroid Build Coastguard Worker        for dep in version_with_info.get("deps", []):
30*7594170eSAndroid Build Coastguard Worker            parts = dep.split("-V")
31*7594170eSAndroid Build Coastguard Worker            if len(parts) < 2 or not parts[-1].isdigit():
32*7594170eSAndroid Build Coastguard Worker                fail("deps in versions_with_info must specify its version, but", dep)
33*7594170eSAndroid Build Coastguard Worker
34*7594170eSAndroid Build Coastguard Worker    versions = []
35*7594170eSAndroid Build Coastguard Worker
36*7594170eSAndroid Build Coastguard Worker    # ensure that all versions are ints
37*7594170eSAndroid Build Coastguard Worker    for info in versions_with_info:
38*7594170eSAndroid Build Coastguard Worker        version = info["version"]
39*7594170eSAndroid Build Coastguard Worker        if version.isdigit() == False:
40*7594170eSAndroid Build Coastguard Worker            fail("version %s is not an integer".format(version))
41*7594170eSAndroid Build Coastguard Worker
42*7594170eSAndroid Build Coastguard Worker        versions.append(int(version))
43*7594170eSAndroid Build Coastguard Worker
44*7594170eSAndroid Build Coastguard Worker    if versions != sorted(versions):
45*7594170eSAndroid Build Coastguard Worker        fail("versions should be sorted")
46*7594170eSAndroid Build Coastguard Worker
47*7594170eSAndroid Build Coastguard Worker    for i, v in enumerate(versions):
48*7594170eSAndroid Build Coastguard Worker        if i > 0:
49*7594170eSAndroid Build Coastguard Worker            if v == versions[i - 1]:
50*7594170eSAndroid Build Coastguard Worker                fail("duplicate version found:", v)
51*7594170eSAndroid Build Coastguard Worker        if v <= 0:
52*7594170eSAndroid Build Coastguard Worker            fail("all versions should be > 0, but found version:", v)
53*7594170eSAndroid Build Coastguard Worker
54*7594170eSAndroid Build Coastguard Workerdef _create_latest_version_aliases(name, last_version_name, backend_configs, **kwargs):
55*7594170eSAndroid Build Coastguard Worker    latest_name = name + "-latest"
56*7594170eSAndroid Build Coastguard Worker    native.alias(
57*7594170eSAndroid Build Coastguard Worker        name = latest_name,
58*7594170eSAndroid Build Coastguard Worker        actual = ":" + last_version_name,
59*7594170eSAndroid Build Coastguard Worker        **kwargs
60*7594170eSAndroid Build Coastguard Worker    )
61*7594170eSAndroid Build Coastguard Worker    for lang in backend_configs.keys():
62*7594170eSAndroid Build Coastguard Worker        language_binding_name = last_version_name + "-" + lang
63*7594170eSAndroid Build Coastguard Worker        native.alias(
64*7594170eSAndroid Build Coastguard Worker            name = latest_name + "-" + lang,
65*7594170eSAndroid Build Coastguard Worker            actual = ":" + language_binding_name,
66*7594170eSAndroid Build Coastguard Worker            **kwargs
67*7594170eSAndroid Build Coastguard Worker        )
68*7594170eSAndroid Build Coastguard Worker
69*7594170eSAndroid Build Coastguard Workerdef _versioned_name(name, version):
70*7594170eSAndroid Build Coastguard Worker    if version == "":
71*7594170eSAndroid Build Coastguard Worker        return name
72*7594170eSAndroid Build Coastguard Worker
73*7594170eSAndroid Build Coastguard Worker    return name + "-V" + version
74*7594170eSAndroid Build Coastguard Worker
75*7594170eSAndroid Build Coastguard Worker# https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_interface.go;l=782-799;drc=5390d9a42f5e4f99ccb3a84068f554d948cb62b9
76*7594170eSAndroid Build Coastguard Workerdef _next_version(versions_with_info, unstable):
77*7594170eSAndroid Build Coastguard Worker    if unstable:
78*7594170eSAndroid Build Coastguard Worker        return ""
79*7594170eSAndroid Build Coastguard Worker
80*7594170eSAndroid Build Coastguard Worker    if versions_with_info == None or len(versions_with_info) == 0:
81*7594170eSAndroid Build Coastguard Worker        return "1"
82*7594170eSAndroid Build Coastguard Worker
83*7594170eSAndroid Build Coastguard Worker    return str(int(versions_with_info[-1]["version"]) + 1)
84*7594170eSAndroid Build Coastguard Worker
85*7594170eSAndroid Build Coastguard Workerdef _is_config_enabled(config):
86*7594170eSAndroid Build Coastguard Worker    if config == None:
87*7594170eSAndroid Build Coastguard Worker        return False
88*7594170eSAndroid Build Coastguard Worker
89*7594170eSAndroid Build Coastguard Worker    for key in config:
90*7594170eSAndroid Build Coastguard Worker        if key not in ["enabled", "min_sdk_version", "tags", "additional_dynamic_deps"]:
91*7594170eSAndroid Build Coastguard Worker            fail("unknown property in aidl configuration: " + str(key))
92*7594170eSAndroid Build Coastguard Worker
93*7594170eSAndroid Build Coastguard Worker    return config.get("enabled", False) == True
94*7594170eSAndroid Build Coastguard Worker
95*7594170eSAndroid Build Coastguard Workerdef aidl_interface(
96*7594170eSAndroid Build Coastguard Worker        name,
97*7594170eSAndroid Build Coastguard Worker        deps = [],
98*7594170eSAndroid Build Coastguard Worker        hdrs = [],
99*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "",
100*7594170eSAndroid Build Coastguard Worker        srcs = None,
101*7594170eSAndroid Build Coastguard Worker        flags = None,
102*7594170eSAndroid Build Coastguard Worker        java_config = None,
103*7594170eSAndroid Build Coastguard Worker        cpp_config = None,
104*7594170eSAndroid Build Coastguard Worker        ndk_config = None,
105*7594170eSAndroid Build Coastguard Worker        stability = None,
106*7594170eSAndroid Build Coastguard Worker        versions_with_info = [],
107*7594170eSAndroid Build Coastguard Worker        unstable = False,
108*7594170eSAndroid Build Coastguard Worker        tags = [],
109*7594170eSAndroid Build Coastguard Worker        # TODO(b/261208761): Support frozen attr
110*7594170eSAndroid Build Coastguard Worker        frozen = False,
111*7594170eSAndroid Build Coastguard Worker        **kwargs):
112*7594170eSAndroid Build Coastguard Worker    """aidl_interface creates a versioned aidl_libraries and language-specific *_aidl_libraries
113*7594170eSAndroid Build Coastguard Worker
114*7594170eSAndroid Build Coastguard Worker    This macro loops over the list of required versions and searches for all
115*7594170eSAndroid Build Coastguard Worker    *.aidl source files located under the path `aidl_api/<version label/`.
116*7594170eSAndroid Build Coastguard Worker    For each version, an `aidl_library` is created with the corresponding sources.
117*7594170eSAndroid Build Coastguard Worker    For each `aidl_library`, a language-binding library *_aidl_library is created
118*7594170eSAndroid Build Coastguard Worker    based on the values passed to the `backends` argument.
119*7594170eSAndroid Build Coastguard Worker
120*7594170eSAndroid Build Coastguard Worker    Arguments:
121*7594170eSAndroid Build Coastguard Worker        name:                   string, base name of generated targets: <module-name>-V<version number>-<language-type>
122*7594170eSAndroid Build Coastguard Worker        deps:                   List[AidlGenInfo], a list of other aidl_libraries that all versions of this interface depend on
123*7594170eSAndroid Build Coastguard Worker        hdrs:                   List[AidlGenInfo], a list of other aidl_libraries that all versions of this interface depend on but will not link against for C++
124*7594170eSAndroid Build Coastguard Worker        strip_import_prefix:    str, a local directory to pass to the AIDL compiler to satisfy imports
125*7594170eSAndroid Build Coastguard Worker        srcs:                   List[file], a list of files to include in the development (unversioned) version of the aidl_interface
126*7594170eSAndroid Build Coastguard Worker        flags:                  List[string], a list of flags to pass to the AIDL compiler
127*7594170eSAndroid Build Coastguard Worker        java_config:            Dict{"enabled": bool}, config for java backend
128*7594170eSAndroid Build Coastguard Worker        cpp_config:             Dict{"enabled": bool, "min_sdk_version": string, "additional_dynamic_deps": List[Label]}, config for cpp backend
129*7594170eSAndroid Build Coastguard Worker        ndk_config:             Dict{"enabled": bool, "min_sdk_version": string, "additional_dynamic_deps": List[Label]}, config for ndk backend
130*7594170eSAndroid Build Coastguard Worker        stability:              string, stability promise of the interface. Currently, only supports "vintf"
131*7594170eSAndroid Build Coastguard Worker        backends:               List[string], a list of the languages to generate bindings for
132*7594170eSAndroid Build Coastguard Worker    """
133*7594170eSAndroid Build Coastguard Worker
134*7594170eSAndroid Build Coastguard Worker    # When versions_with_info is set, versions is no-op.
135*7594170eSAndroid Build Coastguard Worker    # TODO(b/244349745): Modify bp2build to skip convert versions if versions_with_info is set
136*7594170eSAndroid Build Coastguard Worker    if (len(versions_with_info) == 0 and srcs == None):
137*7594170eSAndroid Build Coastguard Worker        fail("must specify at least versions_with_info or srcs")
138*7594170eSAndroid Build Coastguard Worker
139*7594170eSAndroid Build Coastguard Worker    if len(versions_with_info) == 0:
140*7594170eSAndroid Build Coastguard Worker        if frozen == True:
141*7594170eSAndroid Build Coastguard Worker            fail("frozen cannot be set without versions_with_info attr being set")
142*7594170eSAndroid Build Coastguard Worker    elif unstable == True:
143*7594170eSAndroid Build Coastguard Worker        # https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_interface.go;l=872;drc=5390d9a42f5e4f99ccb3a84068f554d948cb62b9
144*7594170eSAndroid Build Coastguard Worker        fail("cannot have versions for unstable interface")
145*7594170eSAndroid Build Coastguard Worker
146*7594170eSAndroid Build Coastguard Worker    aidl_flags = ["--structured"]
147*7594170eSAndroid Build Coastguard Worker
148*7594170eSAndroid Build Coastguard Worker    enabled_backend_configs = {}
149*7594170eSAndroid Build Coastguard Worker    if _is_config_enabled(java_config):
150*7594170eSAndroid Build Coastguard Worker        enabled_backend_configs[JAVA] = java_config
151*7594170eSAndroid Build Coastguard Worker    if _is_config_enabled(cpp_config):
152*7594170eSAndroid Build Coastguard Worker        enabled_backend_configs[CPP] = cpp_config
153*7594170eSAndroid Build Coastguard Worker    if _is_config_enabled(ndk_config):
154*7594170eSAndroid Build Coastguard Worker        enabled_backend_configs[NDK] = ndk_config
155*7594170eSAndroid Build Coastguard Worker
156*7594170eSAndroid Build Coastguard Worker    if stability != None:
157*7594170eSAndroid Build Coastguard Worker        if unstable == True:
158*7594170eSAndroid Build Coastguard Worker            fail("stability must be unset when unstable is true")
159*7594170eSAndroid Build Coastguard Worker        if stability == "vintf":
160*7594170eSAndroid Build Coastguard Worker            aidl_flags.append("--stability=" + stability)
161*7594170eSAndroid Build Coastguard Worker
162*7594170eSAndroid Build Coastguard Worker            # TODO(b/245738285): Add support for vintf stability in java backend
163*7594170eSAndroid Build Coastguard Worker            if JAVA in enabled_backend_configs:
164*7594170eSAndroid Build Coastguard Worker                enabled_backend_configs.pop(JAVA)
165*7594170eSAndroid Build Coastguard Worker        else:
166*7594170eSAndroid Build Coastguard Worker            # https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_interface.go;l=329;drc=e88d9a9b14eafb064a234d555a5cd96de97ca9e2
167*7594170eSAndroid Build Coastguard Worker            # only vintf is allowed currently
168*7594170eSAndroid Build Coastguard Worker            fail("stability must be unset or \"vintf\"")
169*7594170eSAndroid Build Coastguard Worker
170*7594170eSAndroid Build Coastguard Worker    # next_version will be the last specified version + 1.
171*7594170eSAndroid Build Coastguard Worker    # https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_interface.go;l=791?q=system%2Ftools%2Faidl%2Fbuild%2Faidl_interface.go
172*7594170eSAndroid Build Coastguard Worker    next_version = None
173*7594170eSAndroid Build Coastguard Worker
174*7594170eSAndroid Build Coastguard Worker    if len(versions_with_info) > 0:
175*7594170eSAndroid Build Coastguard Worker        _check_versions_with_info(versions_with_info)
176*7594170eSAndroid Build Coastguard Worker        next_version = _next_version(versions_with_info, False)
177*7594170eSAndroid Build Coastguard Worker
178*7594170eSAndroid Build Coastguard Worker        for version_with_info in versions_with_info:
179*7594170eSAndroid Build Coastguard Worker            deps_for_version = version_with_info.get("deps", [])
180*7594170eSAndroid Build Coastguard Worker            version = version_with_info.get("version")
181*7594170eSAndroid Build Coastguard Worker            flags_for_version = aidl_flags
182*7594170eSAndroid Build Coastguard Worker
183*7594170eSAndroid Build Coastguard Worker            if version == next_version and frozen == False and flags != None:
184*7594170eSAndroid Build Coastguard Worker                flags_for_version.extend(flags)
185*7594170eSAndroid Build Coastguard Worker
186*7594170eSAndroid Build Coastguard Worker            create_aidl_binding_for_backends(
187*7594170eSAndroid Build Coastguard Worker                name = name,
188*7594170eSAndroid Build Coastguard Worker                version = version_with_info["version"],
189*7594170eSAndroid Build Coastguard Worker                deps = deps_for_version,
190*7594170eSAndroid Build Coastguard Worker                hdrs = hdrs,
191*7594170eSAndroid Build Coastguard Worker                aidl_flags = flags_for_version,
192*7594170eSAndroid Build Coastguard Worker                backend_configs = enabled_backend_configs,
193*7594170eSAndroid Build Coastguard Worker                tags = tags,
194*7594170eSAndroid Build Coastguard Worker                **kwargs
195*7594170eSAndroid Build Coastguard Worker            )
196*7594170eSAndroid Build Coastguard Worker
197*7594170eSAndroid Build Coastguard Worker        _create_latest_version_aliases(
198*7594170eSAndroid Build Coastguard Worker            name,
199*7594170eSAndroid Build Coastguard Worker            _versioned_name(name, versions_with_info[-1]["version"]),
200*7594170eSAndroid Build Coastguard Worker            enabled_backend_configs,
201*7594170eSAndroid Build Coastguard Worker            tags = tags,
202*7594170eSAndroid Build Coastguard Worker            **kwargs
203*7594170eSAndroid Build Coastguard Worker        )
204*7594170eSAndroid Build Coastguard Worker    else:
205*7594170eSAndroid Build Coastguard Worker        next_version = _next_version(versions_with_info, unstable)
206*7594170eSAndroid Build Coastguard Worker
207*7594170eSAndroid Build Coastguard Worker    # https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_interface.go;l=941;drc=5390d9a42f5e4f99ccb3a84068f554d948cb62b9
208*7594170eSAndroid Build Coastguard Worker    # Create aidl binding for next_version with srcs
209*7594170eSAndroid Build Coastguard Worker    if srcs and len(srcs) > 0:
210*7594170eSAndroid Build Coastguard Worker        create_aidl_binding_for_backends(
211*7594170eSAndroid Build Coastguard Worker            name = name,
212*7594170eSAndroid Build Coastguard Worker            version = next_version,
213*7594170eSAndroid Build Coastguard Worker            srcs = srcs,
214*7594170eSAndroid Build Coastguard Worker            strip_import_prefix = strip_import_prefix,
215*7594170eSAndroid Build Coastguard Worker            deps = deps,
216*7594170eSAndroid Build Coastguard Worker            hdrs = hdrs,
217*7594170eSAndroid Build Coastguard Worker            aidl_flags = aidl_flags,
218*7594170eSAndroid Build Coastguard Worker            backend_configs = enabled_backend_configs,
219*7594170eSAndroid Build Coastguard Worker            tags = tags,
220*7594170eSAndroid Build Coastguard Worker            **kwargs
221*7594170eSAndroid Build Coastguard Worker        )
222*7594170eSAndroid Build Coastguard Worker
223*7594170eSAndroid Build Coastguard Workerdef create_aidl_binding_for_backends(
224*7594170eSAndroid Build Coastguard Worker        name,
225*7594170eSAndroid Build Coastguard Worker        version = None,
226*7594170eSAndroid Build Coastguard Worker        srcs = None,
227*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "",
228*7594170eSAndroid Build Coastguard Worker        deps = None,
229*7594170eSAndroid Build Coastguard Worker        hdrs = None,
230*7594170eSAndroid Build Coastguard Worker        aidl_flags = [],
231*7594170eSAndroid Build Coastguard Worker        backend_configs = {},
232*7594170eSAndroid Build Coastguard Worker        tags = [],
233*7594170eSAndroid Build Coastguard Worker        **kwargs):
234*7594170eSAndroid Build Coastguard Worker    """
235*7594170eSAndroid Build Coastguard Worker    Create aidl_library target and corrending <backend>_aidl_library target for a given version
236*7594170eSAndroid Build Coastguard Worker
237*7594170eSAndroid Build Coastguard Worker    Arguments:
238*7594170eSAndroid Build Coastguard Worker        name:                   string, base name of the aidl interface
239*7594170eSAndroid Build Coastguard Worker        version:                string, version of the aidl interface
240*7594170eSAndroid Build Coastguard Worker        srcs:                   List[Label] list of unversioned AIDL srcs
241*7594170eSAndroid Build Coastguard Worker        strip_import_prefix     string, the prefix to strip the paths of the .aidl files in srcs
242*7594170eSAndroid Build Coastguard Worker        deps:                   List[AidlGenInfo], a list of other aidl_libraries that the version depends on
243*7594170eSAndroid Build Coastguard Worker        hdrs:                   List[AidlGenInfo], a list of other aidl_libraries that the version depends on but will not link against for C++
244*7594170eSAndroid Build Coastguard Worker                                the label of the targets have format <aidl-interface>-V<version_number>
245*7594170eSAndroid Build Coastguard Worker        aidl_flags:             List[string], a list of flags to pass to the AIDL compiler
246*7594170eSAndroid Build Coastguard Worker        backends:               List[string], a list of the languages to generate bindings for
247*7594170eSAndroid Build Coastguard Worker    """
248*7594170eSAndroid Build Coastguard Worker    aidl_library_name = _versioned_name(name, version)
249*7594170eSAndroid Build Coastguard Worker
250*7594170eSAndroid Build Coastguard Worker    # srcs is None when create_aidl_binding_for_backends is called with a
251*7594170eSAndroid Build Coastguard Worker    # frozen version specified via versions or versions_with_info.
252*7594170eSAndroid Build Coastguard Worker    # next_version being equal to "" means this is an unstable version and
253*7594170eSAndroid Build Coastguard Worker    # we should use srcs instead
254*7594170eSAndroid Build Coastguard Worker    if version != "":
255*7594170eSAndroid Build Coastguard Worker        aidl_flags = aidl_flags + ["--version=" + version]
256*7594170eSAndroid Build Coastguard Worker
257*7594170eSAndroid Build Coastguard Worker    hash_file = None
258*7594170eSAndroid Build Coastguard Worker
259*7594170eSAndroid Build Coastguard Worker    if srcs == None:
260*7594170eSAndroid Build Coastguard Worker        if version == "":
261*7594170eSAndroid Build Coastguard Worker            fail("need srcs for unversioned interface")
262*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = "aidl_api/{}/{}".format(name, version)
263*7594170eSAndroid Build Coastguard Worker        srcs = native.glob([strip_import_prefix + "/**/*.aidl"])
264*7594170eSAndroid Build Coastguard Worker        hash_file = _hash_file(name, version)
265*7594170eSAndroid Build Coastguard Worker
266*7594170eSAndroid Build Coastguard Worker    aidl_library(
267*7594170eSAndroid Build Coastguard Worker        name = aidl_library_name,
268*7594170eSAndroid Build Coastguard Worker        deps = deps + hdrs,
269*7594170eSAndroid Build Coastguard Worker        hash_file = hash_file,
270*7594170eSAndroid Build Coastguard Worker        version = version,
271*7594170eSAndroid Build Coastguard Worker        strip_import_prefix = strip_import_prefix,
272*7594170eSAndroid Build Coastguard Worker        srcs = srcs,
273*7594170eSAndroid Build Coastguard Worker        flags = aidl_flags,
274*7594170eSAndroid Build Coastguard Worker        # The language-specific backends will set more appropriate apex_available values.
275*7594170eSAndroid Build Coastguard Worker        tags = tags + ["apex_available=//apex_available:anyapex"],
276*7594170eSAndroid Build Coastguard Worker        **kwargs
277*7594170eSAndroid Build Coastguard Worker    )
278*7594170eSAndroid Build Coastguard Worker
279*7594170eSAndroid Build Coastguard Worker    for lang, config in backend_configs.items():
280*7594170eSAndroid Build Coastguard Worker        # https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_gen_rule.go;l=207;drc=a858ae7039b876a30002a1130f24196915a859a4
281*7594170eSAndroid Build Coastguard Worker        min_sdk_version = "current"
282*7594170eSAndroid Build Coastguard Worker        if "min_sdk_version" in config:
283*7594170eSAndroid Build Coastguard Worker            min_sdk_version = config["min_sdk_version"]
284*7594170eSAndroid Build Coastguard Worker
285*7594170eSAndroid Build Coastguard Worker        if lang == JAVA:
286*7594170eSAndroid Build Coastguard Worker            #TODO(b/285574832) re-enable Java backend
287*7594170eSAndroid Build Coastguard Worker            continue
288*7594170eSAndroid Build Coastguard Worker            java_aidl_library(
289*7594170eSAndroid Build Coastguard Worker                name = aidl_library_name + "-java",
290*7594170eSAndroid Build Coastguard Worker                deps = [":" + aidl_library_name],
291*7594170eSAndroid Build Coastguard Worker                tags = tags + config.get("tags", []),
292*7594170eSAndroid Build Coastguard Worker                # TODO(b/249276008): Pass min_sdk_version to java_aidl_library
293*7594170eSAndroid Build Coastguard Worker                **(kwargs | {"target_compatible_with": ["//build/bazel_common_rules/platforms/os:android"]})
294*7594170eSAndroid Build Coastguard Worker            )
295*7594170eSAndroid Build Coastguard Worker        elif lang == CPP or lang == NDK:
296*7594170eSAndroid Build Coastguard Worker            dynamic_deps = []
297*7594170eSAndroid Build Coastguard Worker            cppflags = []
298*7594170eSAndroid Build Coastguard Worker
299*7594170eSAndroid Build Coastguard Worker            # https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_interface_backends.go;l=564;drc=0517d97079d4b08f909e7f35edfa33b88fcc0d0e
300*7594170eSAndroid Build Coastguard Worker            if deps != None:
301*7594170eSAndroid Build Coastguard Worker                # For each aidl_library target label versioned_name, there's an
302*7594170eSAndroid Build Coastguard Worker                # associated cc_library_shared target with label versioned_name-<cpp|ndk>
303*7594170eSAndroid Build Coastguard Worker                dynamic_deps.extend(["{}-{}".format(dep, lang) for dep in deps])
304*7594170eSAndroid Build Coastguard Worker
305*7594170eSAndroid Build Coastguard Worker            # https://cs.android.com/android/platform/superproject/+/master:system/tools/aidl/build/aidl_interface_backends.go;l=111;drc=ef9f1352a1a8fec7bb134b1c713e13fc3ccee651
306*7594170eSAndroid Build Coastguard Worker            if lang == CPP:
307*7594170eSAndroid Build Coastguard Worker                dynamic_deps.extend([
308*7594170eSAndroid Build Coastguard Worker                    "//frameworks/native/libs/binder:libbinder",
309*7594170eSAndroid Build Coastguard Worker                    "//system/core/libutils:libutils",
310*7594170eSAndroid Build Coastguard Worker                ])
311*7594170eSAndroid Build Coastguard Worker            elif lang == NDK:
312*7594170eSAndroid Build Coastguard Worker                dynamic_deps = dynamic_deps + select({
313*7594170eSAndroid Build Coastguard Worker                    "//build/bazel/rules/apex:android-in_apex": ["//frameworks/native/libs/binder/ndk:libbinder_ndk_stub_libs_current"],
314*7594170eSAndroid Build Coastguard Worker                    "//conditions:default": ["//frameworks/native/libs/binder/ndk:libbinder_ndk"],
315*7594170eSAndroid Build Coastguard Worker                })
316*7594170eSAndroid Build Coastguard Worker
317*7594170eSAndroid Build Coastguard Worker                # https://source.corp.google.com/android/system/tools/aidl/build/aidl_interface_backends.go;l=120;rcl=18dd931bde35b502545b7a52987e2363042c151c
318*7594170eSAndroid Build Coastguard Worker                cppflags = ["-DBINDER_STABILITY_SUPPORT"]
319*7594170eSAndroid Build Coastguard Worker
320*7594170eSAndroid Build Coastguard Worker            if "additional_dynamic_deps" in config:
321*7594170eSAndroid Build Coastguard Worker                dynamic_deps += config["additional_dynamic_deps"]
322*7594170eSAndroid Build Coastguard Worker
323*7594170eSAndroid Build Coastguard Worker            if hasattr(kwargs, "tidy_checks_as_errors"):
324*7594170eSAndroid Build Coastguard Worker                fail("tidy_checks_as_errors cannot be overriden for aidl_interface cc_libraries")
325*7594170eSAndroid Build Coastguard Worker            tidy_checks_as_errors = [
326*7594170eSAndroid Build Coastguard Worker                "*",
327*7594170eSAndroid Build Coastguard Worker                "-clang-analyzer-deadcode.DeadStores",  # b/253079031
328*7594170eSAndroid Build Coastguard Worker                "-clang-analyzer-cplusplus.NewDeleteLeaks",  # b/253079031
329*7594170eSAndroid Build Coastguard Worker                "-clang-analyzer-optin.performance.Padding",  # b/253079031
330*7594170eSAndroid Build Coastguard Worker            ]
331*7594170eSAndroid Build Coastguard Worker
332*7594170eSAndroid Build Coastguard Worker            cc_aidl_library(
333*7594170eSAndroid Build Coastguard Worker                name = "{}-{}".format(aidl_library_name, lang),
334*7594170eSAndroid Build Coastguard Worker                make_shared = True,
335*7594170eSAndroid Build Coastguard Worker                cppflags = cppflags,
336*7594170eSAndroid Build Coastguard Worker                deps = [":" + aidl_library_name],
337*7594170eSAndroid Build Coastguard Worker                dynamic_deps = dynamic_deps,
338*7594170eSAndroid Build Coastguard Worker                lang = lang,
339*7594170eSAndroid Build Coastguard Worker                min_sdk_version = min_sdk_version,
340*7594170eSAndroid Build Coastguard Worker                tidy = "local",
341*7594170eSAndroid Build Coastguard Worker                tidy_checks_as_errors = tidy_checks_as_errors,
342*7594170eSAndroid Build Coastguard Worker                tidy_gen_header_filter = True,
343*7594170eSAndroid Build Coastguard Worker                tags = tags + config.get("tags", []),
344*7594170eSAndroid Build Coastguard Worker                **kwargs
345*7594170eSAndroid Build Coastguard Worker            )
346