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 Worker 15*61c4878aSAndroid Build Coastguard Workerinclude($ENV{PW_ROOT}/pw_build/pigweed.cmake) 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard Worker# Generates a sensor library 18*61c4878aSAndroid Build Coastguard Worker# 19*61c4878aSAndroid Build Coastguard Worker# Args: 20*61c4878aSAndroid Build Coastguard Worker# OUT_HEADER: The path/to/header.h to generate 21*61c4878aSAndroid Build Coastguard Worker# SOURCES: YAML files defining sensors 22*61c4878aSAndroid Build Coastguard Worker# OUT_INCLUDES: [optional] The include path to expose in the final library, if 23*61c4878aSAndroid Build Coastguard Worker# not defined, the root of the 'out_header' will be used so including the 24*61c4878aSAndroid Build Coastguard Worker# header will be done via '#include "path/to/header.h"' 25*61c4878aSAndroid Build Coastguard Worker# INPUTS: [optional] YAML files included by the sensors, these will be 26*61c4878aSAndroid Build Coastguard Worker# used to optimize re-building. 27*61c4878aSAndroid Build Coastguard Worker# GENERATOR: [optional] Python generator script, if not set, the default 28*61c4878aSAndroid Build Coastguard Worker# Pigweed generator will be used. 29*61c4878aSAndroid Build Coastguard Worker# GENERATOR_ARGS: [optional] Command line arguments to pass to the generator. 30*61c4878aSAndroid Build Coastguard Worker# GENERATOR_INCLUDES: [optional] Include paths to pass to the generator. These 31*61c4878aSAndroid Build Coastguard Worker# are used to resolve the sensor dependencies. 32*61c4878aSAndroid Build Coastguard Worker# PUBLIC_DEPS: [optional] Public dependencies to pass to the final generated 33*61c4878aSAndroid Build Coastguard Worker# target. 34*61c4878aSAndroid Build Coastguard Worker# 35*61c4878aSAndroid Build Coastguard Worker# Example use: 36*61c4878aSAndroid Build Coastguard Worker# pw_sensor_library(my_sensors 37*61c4878aSAndroid Build Coastguard Worker# OUT_HEADER 38*61c4878aSAndroid Build Coastguard Worker# ${CMAKE_BINARY_DIR}/generated/include/my/app/sensors.h 39*61c4878aSAndroid Build Coastguard Worker# OUT_INCLUDES 40*61c4878aSAndroid Build Coastguard Worker# ${CMAKE_BINARY_DIR}/generated/include 41*61c4878aSAndroid Build Coastguard Worker# SOURCES 42*61c4878aSAndroid Build Coastguard Worker# sensors/bma4xx.yaml 43*61c4878aSAndroid Build Coastguard Worker# sensors/bmi160.yaml 44*61c4878aSAndroid Build Coastguard Worker# INPUTS 45*61c4878aSAndroid Build Coastguard Worker# sensors/attributes.yaml 46*61c4878aSAndroid Build Coastguard Worker# sensors/channels.yaml 47*61c4878aSAndroid Build Coastguard Worker# sensors/triggers.yaml 48*61c4878aSAndroid Build Coastguard Worker# sensors/units.yaml 49*61c4878aSAndroid Build Coastguard Worker# GENERATOR 50*61c4878aSAndroid Build Coastguard Worker# scripts/sensor_header_generator.py 51*61c4878aSAndroid Build Coastguard Worker# GENERATOR_ARGS 52*61c4878aSAndroid Build Coastguard Worker# -v 53*61c4878aSAndroid Build Coastguard Worker# -experimental 54*61c4878aSAndroid Build Coastguard Worker# GENERATOR_INCLUDES 55*61c4878aSAndroid Build Coastguard Worker# ${CMAKE_CURRENT_LIST_DIR} 56*61c4878aSAndroid Build Coastguard Worker# PUBLIC_DEPS 57*61c4878aSAndroid Build Coastguard Worker# pw_sensor.types 58*61c4878aSAndroid Build Coastguard Worker# pw_containers 59*61c4878aSAndroid Build Coastguard Worker# ) 60*61c4878aSAndroid Build Coastguard Workerfunction(pw_sensor_library NAME) 61*61c4878aSAndroid Build Coastguard Worker pw_parse_arguments( 62*61c4878aSAndroid Build Coastguard Worker NUM_POSITIONAL_ARGS 63*61c4878aSAndroid Build Coastguard Worker 1 64*61c4878aSAndroid Build Coastguard Worker MULTI_VALUE_ARGS 65*61c4878aSAndroid Build Coastguard Worker INPUTS 66*61c4878aSAndroid Build Coastguard Worker GENERATOR_INCLUDES 67*61c4878aSAndroid Build Coastguard Worker SOURCES 68*61c4878aSAndroid Build Coastguard Worker GENERATOR_ARGS 69*61c4878aSAndroid Build Coastguard Worker PUBLIC_DEPS 70*61c4878aSAndroid Build Coastguard Worker OUT_INCLUDES 71*61c4878aSAndroid Build Coastguard Worker ONE_VALUE_ARGS 72*61c4878aSAndroid Build Coastguard Worker OUT_HEADER 73*61c4878aSAndroid Build Coastguard Worker GENERATOR 74*61c4878aSAndroid Build Coastguard Worker REQUIRED_ARGS 75*61c4878aSAndroid Build Coastguard Worker GENERATOR_INCLUDES 76*61c4878aSAndroid Build Coastguard Worker SOURCES 77*61c4878aSAndroid Build Coastguard Worker OUT_HEADER 78*61c4878aSAndroid Build Coastguard Worker ) 79*61c4878aSAndroid Build Coastguard Worker 80*61c4878aSAndroid Build Coastguard Worker if("${arg_GENERATOR}" STREQUAL "") 81*61c4878aSAndroid Build Coastguard Worker set(arg_GENERATOR "$ENV{PW_ROOT}/pw_sensor/py/pw_sensor/constants_generator.py") 82*61c4878aSAndroid Build Coastguard Worker 83*61c4878aSAndroid Build Coastguard Worker if("${arg_GENERATOR_ARGS}" STREQUAL "") 84*61c4878aSAndroid Build Coastguard Worker set(arg_GENERATOR_ARGS --package pw.sensor) 85*61c4878aSAndroid Build Coastguard Worker endif() 86*61c4878aSAndroid Build Coastguard Worker endif() 87*61c4878aSAndroid Build Coastguard Worker 88*61c4878aSAndroid Build Coastguard Worker if(IS_ABSOLUTE "${arg_OUT_HEADER}") 89*61c4878aSAndroid Build Coastguard Worker if(NOT ${arg_OUT_INCLUDES}) 90*61c4878aSAndroid Build Coastguard Worker message(FATAL_ERROR "Invalid absolute path OUT_HEADER=${arg_OUT_HEADER}, missing OUT_INCLUDES") 91*61c4878aSAndroid Build Coastguard Worker endif() 92*61c4878aSAndroid Build Coastguard Worker 93*61c4878aSAndroid Build Coastguard Worker set(output_file "${arg_OUT_HEADER}") 94*61c4878aSAndroid Build Coastguard Worker else() 95*61c4878aSAndroid Build Coastguard Worker set(output_file "${CMAKE_CURRENT_BINARY_DIR}/${arg_OUT_HEADER}") 96*61c4878aSAndroid Build Coastguard Worker if("${arg_OUT_INCLUDES}" STREQUAL "") 97*61c4878aSAndroid Build Coastguard Worker set(arg_OUT_INCLUDES "${CMAKE_CURRENT_BINARY_DIR}") 98*61c4878aSAndroid Build Coastguard Worker endif() 99*61c4878aSAndroid Build Coastguard Worker endif() 100*61c4878aSAndroid Build Coastguard Worker 101*61c4878aSAndroid Build Coastguard Worker string(REPLACE ";" " " generator_args "${arg_GENERATOR_ARGS}") 102*61c4878aSAndroid Build Coastguard Worker 103*61c4878aSAndroid Build Coastguard Worker set(include_list) 104*61c4878aSAndroid Build Coastguard Worker 105*61c4878aSAndroid Build Coastguard Worker foreach(item IN LISTS arg_GENERATOR_INCLUDES) 106*61c4878aSAndroid Build Coastguard Worker list(APPEND include_list "-I" "${item}") 107*61c4878aSAndroid Build Coastguard Worker endforeach() 108*61c4878aSAndroid Build Coastguard Worker 109*61c4878aSAndroid Build Coastguard Worker add_custom_command( 110*61c4878aSAndroid Build Coastguard Worker OUTPUT ${output_file} 111*61c4878aSAndroid Build Coastguard Worker COMMAND python3 112*61c4878aSAndroid Build Coastguard Worker $ENV{PW_ROOT}/pw_sensor/py/pw_sensor/sensor_desc.py 113*61c4878aSAndroid Build Coastguard Worker ${include_list} 114*61c4878aSAndroid Build Coastguard Worker -g "python3 ${arg_GENERATOR} ${generator_args}" 115*61c4878aSAndroid Build Coastguard Worker -o ${output_file} 116*61c4878aSAndroid Build Coastguard Worker ${arg_SOURCES} 117*61c4878aSAndroid Build Coastguard Worker DEPENDS 118*61c4878aSAndroid Build Coastguard Worker ${arg_GENERATOR} 119*61c4878aSAndroid Build Coastguard Worker $ENV{PW_ROOT}/pw_sensor/py/pw_sensor/sensor_desc.py 120*61c4878aSAndroid Build Coastguard Worker ${arg_INPUTS} 121*61c4878aSAndroid Build Coastguard Worker ${arg_SOURCES} 122*61c4878aSAndroid Build Coastguard Worker ) 123*61c4878aSAndroid Build Coastguard Worker add_custom_target(${NAME}.__generate_constants 124*61c4878aSAndroid Build Coastguard Worker DEPENDS 125*61c4878aSAndroid Build Coastguard Worker ${output_file} 126*61c4878aSAndroid Build Coastguard Worker ) 127*61c4878aSAndroid Build Coastguard Worker add_library(${NAME} STATIC 128*61c4878aSAndroid Build Coastguard Worker ${output_file} 129*61c4878aSAndroid Build Coastguard Worker ) 130*61c4878aSAndroid Build Coastguard Worker target_link_libraries(${NAME} PUBLIC ${arg_PUBLIC_DEPS}) 131*61c4878aSAndroid Build Coastguard Worker target_include_directories(${NAME} PUBLIC 132*61c4878aSAndroid Build Coastguard Worker ${arg_OUT_INCLUDES} 133*61c4878aSAndroid Build Coastguard Worker ) 134*61c4878aSAndroid Build Coastguard Worker add_dependencies(${NAME} ${NAME}.__generate_constants) 135*61c4878aSAndroid Build Coastguard Worker set_target_properties(${NAME} PROPERTIES LINKER_LANGUAGE CXX) 136*61c4878aSAndroid Build Coastguard Workerendfunction(pw_sensor_library) 137