1*61c4878aSAndroid Build Coastguard Worker# Copyright 2024 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker# 3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker# the License at 6*61c4878aSAndroid Build Coastguard Worker# 7*61c4878aSAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker# 9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker# the License. 14*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni") 15*61c4878aSAndroid Build Coastguard Worker 16*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/cc_library.gni") 17*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/python_action.gni") 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard Worker# Generates a sensor library 20*61c4878aSAndroid Build Coastguard Worker# 21*61c4878aSAndroid Build Coastguard Worker# Args: 22*61c4878aSAndroid Build Coastguard Worker# out_header: The path/to/header.h to generate 23*61c4878aSAndroid Build Coastguard Worker# sources: YAML files defining sensors 24*61c4878aSAndroid Build Coastguard Worker# inputs: [optional] YAML files included by the sensors, these will be 25*61c4878aSAndroid Build Coastguard Worker# used to optimize re-building. 26*61c4878aSAndroid Build Coastguard Worker# generator: [optional] Python generator script, if not set, the default 27*61c4878aSAndroid Build Coastguard Worker# Pigweed generator will be used. 28*61c4878aSAndroid Build Coastguard Worker# generator_args: [optional] Command line arguments to pass to the generator. 29*61c4878aSAndroid Build Coastguard Worker# generator_includes: [optional] Include paths to pass to the generator. These 30*61c4878aSAndroid Build Coastguard Worker# are used to resolve the sensor dependencies. 31*61c4878aSAndroid Build Coastguard Worker# public_deps: [optional] Public dependencies to pass to the final generated 32*61c4878aSAndroid Build Coastguard Worker# target. 33*61c4878aSAndroid Build Coastguard Workertemplate("pw_sensor_library") { 34*61c4878aSAndroid Build Coastguard Worker current_dir = rebase_path(get_path_info(".", "abspath")) 35*61c4878aSAndroid Build Coastguard Worker 36*61c4878aSAndroid Build Coastguard Worker # Get the output header path 37*61c4878aSAndroid Build Coastguard Worker assert(defined(invoker.out_header) && invoker.out_header != "", 38*61c4878aSAndroid Build Coastguard Worker "pw_sensor_library requires an out_header name") 39*61c4878aSAndroid Build Coastguard Worker out_header = "$target_gen_dir/${invoker.out_header}" 40*61c4878aSAndroid Build Coastguard Worker 41*61c4878aSAndroid Build Coastguard Worker # Get the source yaml files 42*61c4878aSAndroid Build Coastguard Worker assert(defined(invoker.sources) && invoker.sources != [], 43*61c4878aSAndroid Build Coastguard Worker "pw_sensor_library requires .yaml source files") 44*61c4878aSAndroid Build Coastguard Worker source_files = [] 45*61c4878aSAndroid Build Coastguard Worker foreach(src, invoker.sources) { 46*61c4878aSAndroid Build Coastguard Worker source_files += [ "$current_dir/$src" ] 47*61c4878aSAndroid Build Coastguard Worker } 48*61c4878aSAndroid Build Coastguard Worker 49*61c4878aSAndroid Build Coastguard Worker # Get the optional inputs 50*61c4878aSAndroid Build Coastguard Worker in_inputs = [] 51*61c4878aSAndroid Build Coastguard Worker foreach(file, invoker.inputs) { 52*61c4878aSAndroid Build Coastguard Worker in_inputs += [ "$current_dir/$file" ] 53*61c4878aSAndroid Build Coastguard Worker } 54*61c4878aSAndroid Build Coastguard Worker 55*61c4878aSAndroid Build Coastguard Worker # Get the include paths for the generator 56*61c4878aSAndroid Build Coastguard Worker include_list = [] 57*61c4878aSAndroid Build Coastguard Worker foreach(file, invoker.generator_includes) { 58*61c4878aSAndroid Build Coastguard Worker include_list += [ 59*61c4878aSAndroid Build Coastguard Worker "-I", 60*61c4878aSAndroid Build Coastguard Worker rebase_path(file, root_build_dir), 61*61c4878aSAndroid Build Coastguard Worker ] 62*61c4878aSAndroid Build Coastguard Worker } 63*61c4878aSAndroid Build Coastguard Worker 64*61c4878aSAndroid Build Coastguard Worker # Get the generator args if provided 65*61c4878aSAndroid Build Coastguard Worker generator_args = [] 66*61c4878aSAndroid Build Coastguard Worker if (defined(invoker.generator_args)) { 67*61c4878aSAndroid Build Coastguard Worker generator_args = invoker.generator_args 68*61c4878aSAndroid Build Coastguard Worker } 69*61c4878aSAndroid Build Coastguard Worker 70*61c4878aSAndroid Build Coastguard Worker # Get the generator if provided (use the default otherwise) 71*61c4878aSAndroid Build Coastguard Worker if (defined(invoker.generator)) { 72*61c4878aSAndroid Build Coastguard Worker generator = rebase_path(invoker.generator, root_build_dir) 73*61c4878aSAndroid Build Coastguard Worker } else { 74*61c4878aSAndroid Build Coastguard Worker generator = 75*61c4878aSAndroid Build Coastguard Worker rebase_path("$dir_pw_sensor/py/pw_sensor/constants_generator.py") 76*61c4878aSAndroid Build Coastguard Worker if (!defined(invoker.generator_args)) { 77*61c4878aSAndroid Build Coastguard Worker generator_args = [ 78*61c4878aSAndroid Build Coastguard Worker "--package", 79*61c4878aSAndroid Build Coastguard Worker "pw.sensor", 80*61c4878aSAndroid Build Coastguard Worker ] 81*61c4878aSAndroid Build Coastguard Worker } 82*61c4878aSAndroid Build Coastguard Worker } 83*61c4878aSAndroid Build Coastguard Worker generator_args_string = string_join(" ", generator_args) 84*61c4878aSAndroid Build Coastguard Worker 85*61c4878aSAndroid Build Coastguard Worker pw_python_action("${target_name}_generate_header") { 86*61c4878aSAndroid Build Coastguard Worker script = "$dir_pw_sensor/py/pw_sensor/sensor_desc.py" 87*61c4878aSAndroid Build Coastguard Worker python_deps = [ "$dir_pw_sensor/py" ] 88*61c4878aSAndroid Build Coastguard Worker args = [] + include_list + [ 89*61c4878aSAndroid Build Coastguard Worker "-g", 90*61c4878aSAndroid Build Coastguard Worker "python3 $generator $generator_args_string", 91*61c4878aSAndroid Build Coastguard Worker "-o", 92*61c4878aSAndroid Build Coastguard Worker rebase_path(out_header), 93*61c4878aSAndroid Build Coastguard Worker ] + source_files 94*61c4878aSAndroid Build Coastguard Worker inputs = source_files + [ generator ] + in_inputs 95*61c4878aSAndroid Build Coastguard Worker outputs = [ out_header ] 96*61c4878aSAndroid Build Coastguard Worker } 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard Worker config("${target_name}_config") { 99*61c4878aSAndroid Build Coastguard Worker include_dirs = [ target_gen_dir ] 100*61c4878aSAndroid Build Coastguard Worker } 101*61c4878aSAndroid Build Coastguard Worker 102*61c4878aSAndroid Build Coastguard Worker in_public_deps = [] 103*61c4878aSAndroid Build Coastguard Worker if (defined(invoker.public_deps)) { 104*61c4878aSAndroid Build Coastguard Worker in_public_deps = invoker.public_deps 105*61c4878aSAndroid Build Coastguard Worker } 106*61c4878aSAndroid Build Coastguard Worker 107*61c4878aSAndroid Build Coastguard Worker pw_source_set(target_name) { 108*61c4878aSAndroid Build Coastguard Worker public = [ out_header ] 109*61c4878aSAndroid Build Coastguard Worker public_configs = [ ":${target_name}_config" ] 110*61c4878aSAndroid Build Coastguard Worker public_deps = [ ":${target_name}_generate_header" ] + in_public_deps 111*61c4878aSAndroid Build Coastguard Worker } 112*61c4878aSAndroid Build Coastguard Worker} 113