| # Copyright 2024 The Pigweed Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| # use this file except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations under |
| # the License. |
| import("//build_overrides/pigweed.gni") |
| |
| import("$dir_pw_build/cc_library.gni") |
| import("$dir_pw_build/python_action.gni") |
| |
| # Generates a sensor library |
| # |
| # Args: |
| # out_header: The path/to/header.h to generate |
| # sources: YAML files defining sensors |
| # inputs: [optional] YAML files included by the sensors, these will be |
| # used to optimize re-building. |
| # generator: [optional] Python generator script, if not set, the default |
| # Pigweed generator will be used. |
| # generator_args: [optional] Command line arguments to pass to the generator. |
| # generator_includes: [optional] Include paths to pass to the generator. These |
| # are used to resolve the sensor dependencies. |
| # public_deps: [optional] Public dependencies to pass to the final generated |
| # target. |
| template("pw_sensor_library") { |
| current_dir = rebase_path(get_path_info(".", "abspath")) |
| |
| # Get the output header path |
| assert(defined(invoker.out_header) && invoker.out_header != "", |
| "pw_sensor_library requires an out_header name") |
| out_header = "$target_gen_dir/${invoker.out_header}" |
| |
| # Get the source yaml files |
| assert(defined(invoker.sources) && invoker.sources != [], |
| "pw_sensor_library requires .yaml source files") |
| source_files = [] |
| foreach(src, invoker.sources) { |
| source_files += [ "$current_dir/$src" ] |
| } |
| |
| # Get the optional inputs |
| in_inputs = [] |
| foreach(file, invoker.inputs) { |
| in_inputs += [ "$current_dir/$file" ] |
| } |
| |
| # Get the include paths for the generator |
| include_list = [] |
| foreach(file, invoker.generator_includes) { |
| include_list += [ |
| "-I", |
| rebase_path(file, root_build_dir), |
| ] |
| } |
| |
| # Get the generator args if provided |
| generator_args = [] |
| if (defined(invoker.generator_args)) { |
| generator_args = invoker.generator_args |
| } |
| |
| # Get the generator if provided (use the default otherwise) |
| if (defined(invoker.generator)) { |
| generator = rebase_path(invoker.generator, root_build_dir) |
| } else { |
| generator = |
| rebase_path("$dir_pw_sensor/py/pw_sensor/constants_generator.py") |
| if (!defined(invoker.generator_args)) { |
| generator_args = [ |
| "--package", |
| "pw.sensor", |
| ] |
| } |
| } |
| generator_args_string = string_join(" ", generator_args) |
| |
| pw_python_action("${target_name}_generate_header") { |
| script = "$dir_pw_sensor/py/pw_sensor/sensor_desc.py" |
| python_deps = [ "$dir_pw_sensor/py" ] |
| args = [] + include_list + [ |
| "-g", |
| "python3 $generator $generator_args_string", |
| "-o", |
| rebase_path(out_header), |
| ] + source_files |
| inputs = source_files + [ generator ] + in_inputs |
| outputs = [ out_header ] |
| } |
| |
| config("${target_name}_config") { |
| include_dirs = [ target_gen_dir ] |
| } |
| |
| in_public_deps = [] |
| if (defined(invoker.public_deps)) { |
| in_public_deps = invoker.public_deps |
| } |
| |
| pw_source_set(target_name) { |
| public = [ out_header ] |
| public_configs = [ ":${target_name}_config" ] |
| public_deps = [ ":${target_name}_generate_header" ] + in_public_deps |
| } |
| } |