xref: /aosp_15_r20/build/bazel/rules/hidl_file_utils.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("@bazel_skylib//lib:paths.bzl", "paths")
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard WorkerLANGUAGE_CC_HEADERS = "c++-headers"
18*7594170eSAndroid Build Coastguard WorkerLANGUAGE_CC_SOURCES = "c++-sources"
19*7594170eSAndroid Build Coastguard WorkerINTERFACE_HEADER_PREFIXES = ["I", "Bs", "BnHw", "BpHw", "IHw"]
20*7594170eSAndroid Build Coastguard WorkerTYPE_HEADER_PREFIXES = ["", "hw"]
21*7594170eSAndroid Build Coastguard Worker
22*7594170eSAndroid Build Coastguard Workerdef _generate_hidl_action(
23*7594170eSAndroid Build Coastguard Worker        hidl_info,
24*7594170eSAndroid Build Coastguard Worker        language,
25*7594170eSAndroid Build Coastguard Worker        ctx):
26*7594170eSAndroid Build Coastguard Worker    """ Utility function for generating code for the given language from HIDL interface."""
27*7594170eSAndroid Build Coastguard Worker
28*7594170eSAndroid Build Coastguard Worker    output_dir = paths.join(ctx.bin_dir.path, ctx.label.package)
29*7594170eSAndroid Build Coastguard Worker
30*7594170eSAndroid Build Coastguard Worker    args = ctx.actions.args()
31*7594170eSAndroid Build Coastguard Worker
32*7594170eSAndroid Build Coastguard Worker    args.add("-R")
33*7594170eSAndroid Build Coastguard Worker    args.add_all(["-p", "."])
34*7594170eSAndroid Build Coastguard Worker    args.add_all(["-o", output_dir])
35*7594170eSAndroid Build Coastguard Worker    args.add_all(["-L", language])
36*7594170eSAndroid Build Coastguard Worker    for root in hidl_info.transitive_roots.to_list():
37*7594170eSAndroid Build Coastguard Worker        args.add_all(["-r", root])
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Worker    args.add(hidl_info.fq_name)
40*7594170eSAndroid Build Coastguard Worker
41*7594170eSAndroid Build Coastguard Worker    hidl_srcs = hidl_info.srcs.to_list()
42*7594170eSAndroid Build Coastguard Worker    inputs = depset(
43*7594170eSAndroid Build Coastguard Worker        direct = hidl_srcs,
44*7594170eSAndroid Build Coastguard Worker        # These are needed for hidl-gen to correctly generate the code.
45*7594170eSAndroid Build Coastguard Worker        transitive = [hidl_info.transitive_srcs, hidl_info.transitive_root_interface_files],
46*7594170eSAndroid Build Coastguard Worker    )
47*7594170eSAndroid Build Coastguard Worker
48*7594170eSAndroid Build Coastguard Worker    outputs = _generate_and_declare_output_files(
49*7594170eSAndroid Build Coastguard Worker        ctx,
50*7594170eSAndroid Build Coastguard Worker        hidl_info.fq_name,
51*7594170eSAndroid Build Coastguard Worker        language,
52*7594170eSAndroid Build Coastguard Worker        hidl_srcs,
53*7594170eSAndroid Build Coastguard Worker    )
54*7594170eSAndroid Build Coastguard Worker
55*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
56*7594170eSAndroid Build Coastguard Worker        inputs = inputs,
57*7594170eSAndroid Build Coastguard Worker        executable = ctx.executable._hidl_gen,
58*7594170eSAndroid Build Coastguard Worker        outputs = outputs,
59*7594170eSAndroid Build Coastguard Worker        arguments = [args],
60*7594170eSAndroid Build Coastguard Worker        mnemonic = "HidlGen" + _get_language_string(language),
61*7594170eSAndroid Build Coastguard Worker    )
62*7594170eSAndroid Build Coastguard Worker
63*7594170eSAndroid Build Coastguard Worker    return outputs
64*7594170eSAndroid Build Coastguard Worker
65*7594170eSAndroid Build Coastguard Workerdef _get_language_string(language):
66*7594170eSAndroid Build Coastguard Worker    if language == LANGUAGE_CC_HEADERS:
67*7594170eSAndroid Build Coastguard Worker        return "CcHeader"
68*7594170eSAndroid Build Coastguard Worker    elif language == LANGUAGE_CC_SOURCES:
69*7594170eSAndroid Build Coastguard Worker        return "Cc"
70*7594170eSAndroid Build Coastguard Worker
71*7594170eSAndroid Build Coastguard Workerdef _generate_and_declare_output_files(
72*7594170eSAndroid Build Coastguard Worker        ctx,
73*7594170eSAndroid Build Coastguard Worker        fq_name,
74*7594170eSAndroid Build Coastguard Worker        language,
75*7594170eSAndroid Build Coastguard Worker        hidl_srcs):
76*7594170eSAndroid Build Coastguard Worker    files = []
77*7594170eSAndroid Build Coastguard Worker
78*7594170eSAndroid Build Coastguard Worker    # Break FQ name such as [email protected] into
79*7594170eSAndroid Build Coastguard Worker    # android/hardware/neuralnetworks/1.3 which is the directory structure
80*7594170eSAndroid Build Coastguard Worker    # that hidl-gen uses to generate files.
81*7594170eSAndroid Build Coastguard Worker    parts = fq_name.split("@")
82*7594170eSAndroid Build Coastguard Worker    dirname = paths.join(parts[0].replace(".", "/"), parts[1])
83*7594170eSAndroid Build Coastguard Worker
84*7594170eSAndroid Build Coastguard Worker    for src in hidl_srcs:
85*7594170eSAndroid Build Coastguard Worker        filename = src.basename
86*7594170eSAndroid Build Coastguard Worker
87*7594170eSAndroid Build Coastguard Worker        # "I" prefix indicates that this file is a interface file, the rest are
88*7594170eSAndroid Build Coastguard Worker        # files that define types. Interface files and type files are treated
89*7594170eSAndroid Build Coastguard Worker        # differently when generating code using hidl-gen.
90*7594170eSAndroid Build Coastguard Worker        basename = filename.removeprefix("I").removesuffix(".hal")
91*7594170eSAndroid Build Coastguard Worker        interface = _is_interface(filename)
92*7594170eSAndroid Build Coastguard Worker        if language == LANGUAGE_CC_HEADERS:
93*7594170eSAndroid Build Coastguard Worker            if interface:
94*7594170eSAndroid Build Coastguard Worker                prefixes = INTERFACE_HEADER_PREFIXES
95*7594170eSAndroid Build Coastguard Worker            else:
96*7594170eSAndroid Build Coastguard Worker                prefixes = TYPE_HEADER_PREFIXES
97*7594170eSAndroid Build Coastguard Worker            for prefix in prefixes:
98*7594170eSAndroid Build Coastguard Worker                out_name = paths.join(dirname, prefix + basename + ".h")
99*7594170eSAndroid Build Coastguard Worker                declared = ctx.actions.declare_file(out_name)
100*7594170eSAndroid Build Coastguard Worker                files.append(declared)
101*7594170eSAndroid Build Coastguard Worker        elif language == LANGUAGE_CC_SOURCES:
102*7594170eSAndroid Build Coastguard Worker            if interface:
103*7594170eSAndroid Build Coastguard Worker                out_name = paths.join(dirname, basename + "All.cpp")
104*7594170eSAndroid Build Coastguard Worker            else:
105*7594170eSAndroid Build Coastguard Worker                out_name = paths.join(dirname, basename + ".cpp")
106*7594170eSAndroid Build Coastguard Worker            declared = ctx.actions.declare_file(out_name)
107*7594170eSAndroid Build Coastguard Worker            files.append(declared)
108*7594170eSAndroid Build Coastguard Worker
109*7594170eSAndroid Build Coastguard Worker    return files
110*7594170eSAndroid Build Coastguard Worker
111*7594170eSAndroid Build Coastguard Workerdef _is_interface(filename):
112*7594170eSAndroid Build Coastguard Worker    if not filename.endswith(".hal"):
113*7594170eSAndroid Build Coastguard Worker        fail("HIDL source file must be a .hal file: %s" % filename)
114*7594170eSAndroid Build Coastguard Worker
115*7594170eSAndroid Build Coastguard Worker    return filename.startswith("I")
116*7594170eSAndroid Build Coastguard Worker
117*7594170eSAndroid Build Coastguard Workerhidl_file_utils = struct(
118*7594170eSAndroid Build Coastguard Worker    generate_hidl_action = _generate_hidl_action,
119*7594170eSAndroid Build Coastguard Worker)
120