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