xref: /aosp_15_r20/external/pigweed/pw_sensor/sensor.cmake (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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