xref: /aosp_15_r20/build/bazel/rules/cc/cc_hidl_library.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:hidl_file_utils.bzl", "LANGUAGE_CC_HEADERS", "LANGUAGE_CC_SOURCES", "hidl_file_utils")
16*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_library_shared.bzl", "cc_library_shared")
17*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_library_static.bzl", "cc_library_static")
18*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/hidl:hidl_library.bzl", "HidlInfo")
19*7594170eSAndroid Build Coastguard Workerload(":cc_library_common.bzl", "create_ccinfo_for_includes")
20*7594170eSAndroid Build Coastguard Worker
21*7594170eSAndroid Build Coastguard WorkerCC_SOURCE_SUFFIX = "_genc++"
22*7594170eSAndroid Build Coastguard WorkerCC_HEADER_SUFFIX = "_genc++_headers"
23*7594170eSAndroid Build Coastguard WorkerCORE_PACKAGES = ["android.hidl.base@", "android.hidl.manager@"]
24*7594170eSAndroid Build Coastguard Worker
25*7594170eSAndroid Build Coastguard Workerdef _cc_hidl_code_gen_rule_impl(ctx):
26*7594170eSAndroid Build Coastguard Worker    hidl_info = ctx.attr.dep[HidlInfo]
27*7594170eSAndroid Build Coastguard Worker    outs = hidl_file_utils.generate_hidl_action(
28*7594170eSAndroid Build Coastguard Worker        hidl_info,
29*7594170eSAndroid Build Coastguard Worker        ctx.attr.language,
30*7594170eSAndroid Build Coastguard Worker        ctx,
31*7594170eSAndroid Build Coastguard Worker    )
32*7594170eSAndroid Build Coastguard Worker
33*7594170eSAndroid Build Coastguard Worker    return [
34*7594170eSAndroid Build Coastguard Worker        DefaultInfo(files = depset(direct = outs)),
35*7594170eSAndroid Build Coastguard Worker        create_ccinfo_for_includes(ctx, includes = [ctx.label.name]),
36*7594170eSAndroid Build Coastguard Worker    ]
37*7594170eSAndroid Build Coastguard Worker
38*7594170eSAndroid Build Coastguard Worker_cc_hidl_code_gen = rule(
39*7594170eSAndroid Build Coastguard Worker    implementation = _cc_hidl_code_gen_rule_impl,
40*7594170eSAndroid Build Coastguard Worker    attrs = {
41*7594170eSAndroid Build Coastguard Worker        "dep": attr.label(
42*7594170eSAndroid Build Coastguard Worker            providers = [HidlInfo],
43*7594170eSAndroid Build Coastguard Worker            doc = "hidl_library that exposes HidlInfo provider with *.hal files",
44*7594170eSAndroid Build Coastguard Worker            mandatory = True,
45*7594170eSAndroid Build Coastguard Worker        ),
46*7594170eSAndroid Build Coastguard Worker        "language": attr.string(
47*7594170eSAndroid Build Coastguard Worker            mandatory = True,
48*7594170eSAndroid Build Coastguard Worker            values = ["c++-headers", "c++-sources"],
49*7594170eSAndroid Build Coastguard Worker        ),
50*7594170eSAndroid Build Coastguard Worker        "_hidl_gen": attr.label(
51*7594170eSAndroid Build Coastguard Worker            allow_single_file = True,
52*7594170eSAndroid Build Coastguard Worker            default = Label("//prebuilts/build-tools:linux-x86/bin/hidl-gen"),
53*7594170eSAndroid Build Coastguard Worker            executable = True,
54*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
55*7594170eSAndroid Build Coastguard Worker        ),
56*7594170eSAndroid Build Coastguard Worker    },
57*7594170eSAndroid Build Coastguard Worker    toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
58*7594170eSAndroid Build Coastguard Worker)
59*7594170eSAndroid Build Coastguard Worker
60*7594170eSAndroid Build Coastguard Workerdef cc_hidl_library(
61*7594170eSAndroid Build Coastguard Worker        name,
62*7594170eSAndroid Build Coastguard Worker        interface,
63*7594170eSAndroid Build Coastguard Worker        dynamic_deps = [],
64*7594170eSAndroid Build Coastguard Worker        min_sdk_version = "",
65*7594170eSAndroid Build Coastguard Worker        tags = []):
66*7594170eSAndroid Build Coastguard Worker    srcs_name = name + CC_SOURCE_SUFFIX
67*7594170eSAndroid Build Coastguard Worker    hdrs_name = name + CC_HEADER_SUFFIX
68*7594170eSAndroid Build Coastguard Worker
69*7594170eSAndroid Build Coastguard Worker    _cc_hidl_code_gen(
70*7594170eSAndroid Build Coastguard Worker        name = srcs_name,
71*7594170eSAndroid Build Coastguard Worker        dep = interface,
72*7594170eSAndroid Build Coastguard Worker        language = LANGUAGE_CC_SOURCES,
73*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
74*7594170eSAndroid Build Coastguard Worker    )
75*7594170eSAndroid Build Coastguard Worker
76*7594170eSAndroid Build Coastguard Worker    _cc_hidl_code_gen(
77*7594170eSAndroid Build Coastguard Worker        name = hdrs_name,
78*7594170eSAndroid Build Coastguard Worker        dep = interface,
79*7594170eSAndroid Build Coastguard Worker        language = LANGUAGE_CC_HEADERS,
80*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
81*7594170eSAndroid Build Coastguard Worker    )
82*7594170eSAndroid Build Coastguard Worker
83*7594170eSAndroid Build Coastguard Worker    # Don't generate the cc library target for the core interfaces, they are parts
84*7594170eSAndroid Build Coastguard Worker    # of the libhidlbase
85*7594170eSAndroid Build Coastguard Worker    if _is_core_package(name):
86*7594170eSAndroid Build Coastguard Worker        return
87*7594170eSAndroid Build Coastguard Worker
88*7594170eSAndroid Build Coastguard Worker    combined_dynamic_deps = [
89*7594170eSAndroid Build Coastguard Worker        "//system/libhidl:libhidlbase",
90*7594170eSAndroid Build Coastguard Worker        "//system/core/libutils:libutils",
91*7594170eSAndroid Build Coastguard Worker    ]
92*7594170eSAndroid Build Coastguard Worker    implementation_dynamic_deps = [
93*7594170eSAndroid Build Coastguard Worker        "//system/core/libcutils:libcutils",
94*7594170eSAndroid Build Coastguard Worker    ] + select({
95*7594170eSAndroid Build Coastguard Worker        "//build/bazel/rules/apex:android-in_apex": ["//system/logging/liblog:liblog_stub_libs_current"],
96*7594170eSAndroid Build Coastguard Worker        "//conditions:default": ["//system/logging/liblog:liblog"],
97*7594170eSAndroid Build Coastguard Worker    })
98*7594170eSAndroid Build Coastguard Worker
99*7594170eSAndroid Build Coastguard Worker    for dep in dynamic_deps:
100*7594170eSAndroid Build Coastguard Worker        # Break up something like: //system/libhidl/transport/base/1.0:[email protected]
101*7594170eSAndroid Build Coastguard Worker        # and get the interface name such as [email protected].
102*7594170eSAndroid Build Coastguard Worker        parts = dep.split(":")
103*7594170eSAndroid Build Coastguard Worker        dep_name = parts[1] if len(parts) == 2 else dep
104*7594170eSAndroid Build Coastguard Worker
105*7594170eSAndroid Build Coastguard Worker        # core packages will be provided by libhidlbase
106*7594170eSAndroid Build Coastguard Worker        if not _is_core_package(dep_name):
107*7594170eSAndroid Build Coastguard Worker            combined_dynamic_deps.append(dep)
108*7594170eSAndroid Build Coastguard Worker
109*7594170eSAndroid Build Coastguard Worker    common_attrs = dict(
110*7594170eSAndroid Build Coastguard Worker        [
111*7594170eSAndroid Build Coastguard Worker            ("srcs", [":" + srcs_name]),
112*7594170eSAndroid Build Coastguard Worker            ("hdrs", [":" + hdrs_name]),
113*7594170eSAndroid Build Coastguard Worker            ("dynamic_deps", combined_dynamic_deps),
114*7594170eSAndroid Build Coastguard Worker            ("implementation_dynamic_deps", implementation_dynamic_deps),
115*7594170eSAndroid Build Coastguard Worker            ("export_includes", ["."]),
116*7594170eSAndroid Build Coastguard Worker            ("local_includes", ["."]),
117*7594170eSAndroid Build Coastguard Worker            ("copts", [
118*7594170eSAndroid Build Coastguard Worker                "-Wall",
119*7594170eSAndroid Build Coastguard Worker                "-Werror",
120*7594170eSAndroid Build Coastguard Worker                "-Wextra-semi",
121*7594170eSAndroid Build Coastguard Worker            ] + select({
122*7594170eSAndroid Build Coastguard Worker                "//build/bazel/product_config/config_settings:debuggable": ["-D__ANDROID_DEBUGGABLE__"],
123*7594170eSAndroid Build Coastguard Worker                "//conditions:default": [],
124*7594170eSAndroid Build Coastguard Worker            })),
125*7594170eSAndroid Build Coastguard Worker            ("min_sdk_version", min_sdk_version),
126*7594170eSAndroid Build Coastguard Worker            ("tags", tags),
127*7594170eSAndroid Build Coastguard Worker        ],
128*7594170eSAndroid Build Coastguard Worker    )
129*7594170eSAndroid Build Coastguard Worker
130*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
131*7594170eSAndroid Build Coastguard Worker        name = name,
132*7594170eSAndroid Build Coastguard Worker        **common_attrs
133*7594170eSAndroid Build Coastguard Worker    )
134*7594170eSAndroid Build Coastguard Worker
135*7594170eSAndroid Build Coastguard Worker    cc_library_static(
136*7594170eSAndroid Build Coastguard Worker        name = name + "_bp2build_cc_library_static",
137*7594170eSAndroid Build Coastguard Worker        **common_attrs
138*7594170eSAndroid Build Coastguard Worker    )
139*7594170eSAndroid Build Coastguard Worker
140*7594170eSAndroid Build Coastguard Workerdef _is_core_package(name):
141*7594170eSAndroid Build Coastguard Worker    for pkg in CORE_PACKAGES:
142*7594170eSAndroid Build Coastguard Worker        if name.startswith(pkg):
143*7594170eSAndroid Build Coastguard Worker            return True
144*7594170eSAndroid Build Coastguard Worker
145*7594170eSAndroid Build Coastguard Worker    return False
146