blob: ada6d8d83f4da0c62dcb0d033748e3503bb7089b [file]
# 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.
include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
# Generates a sensor library
#
# Args:
# OUT_HEADER: The path/to/header.h to generate
# SOURCES: YAML files defining sensors
# OUT_INCLUDES: [optional] The include path to expose in the final library, if
# not defined, the root of the 'out_header' will be used so including the
# header will be done via '#include "path/to/header.h"'
# 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.
#
# Example use:
# pw_sensor_library(my_sensors
# OUT_HEADER
# ${CMAKE_BINARY_DIR}/generated/include/my/app/sensors.h
# OUT_INCLUDES
# ${CMAKE_BINARY_DIR}/generated/include
# SOURCES
# sensors/bma4xx.yaml
# sensors/bmi160.yaml
# INPUTS
# sensors/attributes.yaml
# sensors/channels.yaml
# sensors/triggers.yaml
# sensors/units.yaml
# GENERATOR
# scripts/sensor_header_generator.py
# GENERATOR_ARGS
# -v
# -experimental
# GENERATOR_INCLUDES
# ${CMAKE_CURRENT_LIST_DIR}
# PUBLIC_DEPS
# pw_sensor.types
# pw_containers
# )
function(pw_sensor_library NAME)
pw_parse_arguments(
NUM_POSITIONAL_ARGS
1
MULTI_VALUE_ARGS
INPUTS
GENERATOR_INCLUDES
SOURCES
GENERATOR_ARGS
PUBLIC_DEPS
OUT_INCLUDES
ONE_VALUE_ARGS
OUT_HEADER
GENERATOR
REQUIRED_ARGS
GENERATOR_INCLUDES
SOURCES
OUT_HEADER
)
if("${arg_GENERATOR}" STREQUAL "")
set(arg_GENERATOR "$ENV{PW_ROOT}/pw_sensor/py/pw_sensor/constants_generator.py")
list(APPEND arg_INPUTS "$ENV{PW_ROOT}/pw_sensor/py/pw_sensor/templates/cpp_constants.jinja")
if("${arg_GENERATOR_ARGS}" STREQUAL "")
set(arg_GENERATOR_ARGS --package pw.sensor)
endif()
endif()
if(IS_ABSOLUTE "${arg_OUT_HEADER}")
if(NOT ${arg_OUT_INCLUDES})
message(FATAL_ERROR "Invalid absolute path OUT_HEADER=${arg_OUT_HEADER}, missing OUT_INCLUDES")
endif()
set(output_file "${arg_OUT_HEADER}")
else()
set(output_file "${CMAKE_CURRENT_BINARY_DIR}/${arg_OUT_HEADER}")
if("${arg_OUT_INCLUDES}" STREQUAL "")
set(arg_OUT_INCLUDES "${CMAKE_CURRENT_BINARY_DIR}")
endif()
endif()
string(REPLACE ";" " " generator_args "${arg_GENERATOR_ARGS}")
set(include_list)
foreach(item IN LISTS arg_GENERATOR_INCLUDES)
list(APPEND include_list "-I" "${item}")
endforeach()
add_custom_command(
OUTPUT ${output_file}
COMMAND python3
$ENV{PW_ROOT}/pw_sensor/py/pw_sensor/sensor_desc.py
${include_list}
-g "python3 ${arg_GENERATOR} ${generator_args}"
-o ${output_file}
${arg_SOURCES}
DEPENDS
${arg_GENERATOR}
$ENV{PW_ROOT}/pw_sensor/py/pw_sensor/sensor_desc.py
${arg_INPUTS}
${arg_SOURCES}
)
add_custom_target(${NAME}.__generate_constants
DEPENDS
${output_file}
)
add_library(${NAME} INTERFACE
${output_file}
)
target_link_libraries(${NAME} INTERFACE ${arg_PUBLIC_DEPS})
target_include_directories(${NAME} INTERFACE
${arg_OUT_INCLUDES}
)
add_dependencies(${NAME} ${NAME}.__generate_constants)
set_target_properties(${NAME} PROPERTIES LINKER_LANGUAGE CXX)
endfunction(pw_sensor_library)