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