xref: /aosp_15_r20/external/pigweed/pw_protobuf_compiler/proto.cmake (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2020 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 Workerinclude_guard(GLOBAL)
15*61c4878aSAndroid Build Coastguard Worker
16*61c4878aSAndroid Build Coastguard Workerinclude($ENV{PW_ROOT}/pw_build/pigweed.cmake)
17*61c4878aSAndroid Build Coastguard Worker
18*61c4878aSAndroid Build Coastguard Worker# Declares a protocol buffers library. This function creates a library for each
19*61c4878aSAndroid Build Coastguard Worker# supported protocol buffer implementation:
20*61c4878aSAndroid Build Coastguard Worker#
21*61c4878aSAndroid Build Coastguard Worker#   ${NAME}.pwpb - pw_protobuf generated code
22*61c4878aSAndroid Build Coastguard Worker#   ${NAME}.nanopb - Nanopb generated code (requires Nanopb)
23*61c4878aSAndroid Build Coastguard Worker#
24*61c4878aSAndroid Build Coastguard Worker# This function also creates libraries for generating pw_rpc code:
25*61c4878aSAndroid Build Coastguard Worker#
26*61c4878aSAndroid Build Coastguard Worker#   ${NAME}.pwpb_rpc - generates pw_protobuf pw_rpc code
27*61c4878aSAndroid Build Coastguard Worker#   ${NAME}.nanopb_rpc - generates Nanopb pw_rpc code
28*61c4878aSAndroid Build Coastguard Worker#   ${NAME}.raw_rpc - generates raw pw_rpc (no protobuf library) code
29*61c4878aSAndroid Build Coastguard Worker#
30*61c4878aSAndroid Build Coastguard Worker# Args:
31*61c4878aSAndroid Build Coastguard Worker#
32*61c4878aSAndroid Build Coastguard Worker#   NAME - the base name of the libraries to create
33*61c4878aSAndroid Build Coastguard Worker#   SOURCES - .proto source files
34*61c4878aSAndroid Build Coastguard Worker#   DEPS - dependencies on other pw_proto_library targets
35*61c4878aSAndroid Build Coastguard Worker#   PREFIX - prefix add to the proto files
36*61c4878aSAndroid Build Coastguard Worker#   STRIP_PREFIX - prefix to remove from the proto files
37*61c4878aSAndroid Build Coastguard Worker#   INPUTS - files to include along with the .proto files (such as Nanopb
38*61c4878aSAndroid Build Coastguard Worker#       .options files)
39*61c4878aSAndroid Build Coastguard Worker#
40*61c4878aSAndroid Build Coastguard Workerfunction(pw_proto_library NAME)
41*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
42*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
43*61c4878aSAndroid Build Coastguard Worker      1
44*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
45*61c4878aSAndroid Build Coastguard Worker      STRIP_PREFIX
46*61c4878aSAndroid Build Coastguard Worker      PREFIX
47*61c4878aSAndroid Build Coastguard Worker    MULTI_VALUE_ARGS
48*61c4878aSAndroid Build Coastguard Worker      SOURCES
49*61c4878aSAndroid Build Coastguard Worker      INPUTS
50*61c4878aSAndroid Build Coastguard Worker      DEPS
51*61c4878aSAndroid Build Coastguard Worker    REQUIRED_ARGS
52*61c4878aSAndroid Build Coastguard Worker      SOURCES
53*61c4878aSAndroid Build Coastguard Worker  )
54*61c4878aSAndroid Build Coastguard Worker
55*61c4878aSAndroid Build Coastguard Worker  set(out_dir "${CMAKE_CURRENT_BINARY_DIR}/${NAME}")
56*61c4878aSAndroid Build Coastguard Worker
57*61c4878aSAndroid Build Coastguard Worker  # Use INTERFACE libraries to track the proto include paths that are passed to
58*61c4878aSAndroid Build Coastguard Worker  # protoc.
59*61c4878aSAndroid Build Coastguard Worker  set(include_deps "${arg_DEPS}")
60*61c4878aSAndroid Build Coastguard Worker  list(TRANSFORM include_deps APPEND ._includes)
61*61c4878aSAndroid Build Coastguard Worker
62*61c4878aSAndroid Build Coastguard Worker  pw_add_library_generic("${NAME}._includes" INTERFACE
63*61c4878aSAndroid Build Coastguard Worker    PUBLIC_INCLUDES
64*61c4878aSAndroid Build Coastguard Worker      "${out_dir}/sources"
65*61c4878aSAndroid Build Coastguard Worker    PUBLIC_DEPS
66*61c4878aSAndroid Build Coastguard Worker      ${include_deps}
67*61c4878aSAndroid Build Coastguard Worker  )
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker  # Generate a file with all include paths needed by protoc. Use the include
70*61c4878aSAndroid Build Coastguard Worker  # directory paths and replace ; with \n.
71*61c4878aSAndroid Build Coastguard Worker  set(include_file "${out_dir}/include_paths.txt")
72*61c4878aSAndroid Build Coastguard Worker  file(GENERATE OUTPUT "${include_file}"
73*61c4878aSAndroid Build Coastguard Worker     CONTENT
74*61c4878aSAndroid Build Coastguard Worker       "$<JOIN:$<TARGET_PROPERTY:${NAME}._includes,INTERFACE_INCLUDE_DIRECTORIES>,\n>")
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker  if("${arg_STRIP_PREFIX}" STREQUAL "")
77*61c4878aSAndroid Build Coastguard Worker    set(arg_STRIP_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}")
78*61c4878aSAndroid Build Coastguard Worker  else()
79*61c4878aSAndroid Build Coastguard Worker    get_filename_component(arg_STRIP_PREFIX "${arg_STRIP_PREFIX}" ABSOLUTE)
80*61c4878aSAndroid Build Coastguard Worker  endif()
81*61c4878aSAndroid Build Coastguard Worker
82*61c4878aSAndroid Build Coastguard Worker  foreach(path IN LISTS arg_SOURCES arg_INPUTS)
83*61c4878aSAndroid Build Coastguard Worker    get_filename_component(abspath "${path}" ABSOLUTE)
84*61c4878aSAndroid Build Coastguard Worker    list(APPEND files_to_mirror "${abspath}")
85*61c4878aSAndroid Build Coastguard Worker  endforeach()
86*61c4878aSAndroid Build Coastguard Worker
87*61c4878aSAndroid Build Coastguard Worker  # Mirror the sources to the output directory with the specified prefix.
88*61c4878aSAndroid Build Coastguard Worker  pw_rebase_paths(
89*61c4878aSAndroid Build Coastguard Worker      sources "${out_dir}/sources/${arg_PREFIX}" "${arg_STRIP_PREFIX}"
90*61c4878aSAndroid Build Coastguard Worker      "${arg_SOURCES}" "")
91*61c4878aSAndroid Build Coastguard Worker  pw_rebase_paths(
92*61c4878aSAndroid Build Coastguard Worker      inputs "${out_dir}/sources/${arg_PREFIX}" "${arg_STRIP_PREFIX}"
93*61c4878aSAndroid Build Coastguard Worker      "${arg_INPUTS}" "")
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker  add_custom_command(
96*61c4878aSAndroid Build Coastguard Worker    COMMAND
97*61c4878aSAndroid Build Coastguard Worker      python3
98*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_build/py/pw_build/mirror_tree.py"
99*61c4878aSAndroid Build Coastguard Worker      --source-root "${arg_STRIP_PREFIX}"
100*61c4878aSAndroid Build Coastguard Worker      --directory "${out_dir}/sources/${arg_PREFIX}"
101*61c4878aSAndroid Build Coastguard Worker      ${files_to_mirror}
102*61c4878aSAndroid Build Coastguard Worker    DEPENDS
103*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_build/py/pw_build/mirror_tree.py"
104*61c4878aSAndroid Build Coastguard Worker      ${files_to_mirror}
105*61c4878aSAndroid Build Coastguard Worker    OUTPUT
106*61c4878aSAndroid Build Coastguard Worker      ${sources} ${inputs}
107*61c4878aSAndroid Build Coastguard Worker  )
108*61c4878aSAndroid Build Coastguard Worker  add_custom_target("${NAME}._sources" DEPENDS ${sources} ${inputs})
109*61c4878aSAndroid Build Coastguard Worker
110*61c4878aSAndroid Build Coastguard Worker  set(sources_deps "${arg_DEPS}")
111*61c4878aSAndroid Build Coastguard Worker  list(TRANSFORM sources_deps APPEND ._sources)
112*61c4878aSAndroid Build Coastguard Worker
113*61c4878aSAndroid Build Coastguard Worker  if(sources_deps)
114*61c4878aSAndroid Build Coastguard Worker    add_dependencies("${NAME}._sources" ${sources_deps})
115*61c4878aSAndroid Build Coastguard Worker  endif()
116*61c4878aSAndroid Build Coastguard Worker
117*61c4878aSAndroid Build Coastguard Worker  # Create a protobuf target for each supported protobuf library.
118*61c4878aSAndroid Build Coastguard Worker  _pw_pwpb_library("${NAME}"
119*61c4878aSAndroid Build Coastguard Worker    SOURCES
120*61c4878aSAndroid Build Coastguard Worker      ${sources}
121*61c4878aSAndroid Build Coastguard Worker    INPUTS
122*61c4878aSAndroid Build Coastguard Worker      ${inputs}
123*61c4878aSAndroid Build Coastguard Worker    DEPS
124*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
125*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
126*61c4878aSAndroid Build Coastguard Worker      "${include_file}"
127*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
128*61c4878aSAndroid Build Coastguard Worker      "${out_dir}"
129*61c4878aSAndroid Build Coastguard Worker  )
130*61c4878aSAndroid Build Coastguard Worker  _pw_pwpb_rpc_library("${NAME}"
131*61c4878aSAndroid Build Coastguard Worker    SOURCES
132*61c4878aSAndroid Build Coastguard Worker      ${sources}
133*61c4878aSAndroid Build Coastguard Worker    INPUTS
134*61c4878aSAndroid Build Coastguard Worker      ${inputs}
135*61c4878aSAndroid Build Coastguard Worker    DEPS
136*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
137*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
138*61c4878aSAndroid Build Coastguard Worker      "${include_file}"
139*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
140*61c4878aSAndroid Build Coastguard Worker      "${out_dir}"
141*61c4878aSAndroid Build Coastguard Worker  )
142*61c4878aSAndroid Build Coastguard Worker  _pw_raw_rpc_library("${NAME}"
143*61c4878aSAndroid Build Coastguard Worker    SOURCES
144*61c4878aSAndroid Build Coastguard Worker      ${sources}
145*61c4878aSAndroid Build Coastguard Worker    INPUTS
146*61c4878aSAndroid Build Coastguard Worker      ${inputs}
147*61c4878aSAndroid Build Coastguard Worker    DEPS
148*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
149*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
150*61c4878aSAndroid Build Coastguard Worker      "${include_file}"
151*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
152*61c4878aSAndroid Build Coastguard Worker      "${out_dir}"
153*61c4878aSAndroid Build Coastguard Worker  )
154*61c4878aSAndroid Build Coastguard Worker  _pw_nanopb_library("${NAME}"
155*61c4878aSAndroid Build Coastguard Worker    SOURCES
156*61c4878aSAndroid Build Coastguard Worker      ${sources}
157*61c4878aSAndroid Build Coastguard Worker    INPUTS
158*61c4878aSAndroid Build Coastguard Worker      ${inputs}
159*61c4878aSAndroid Build Coastguard Worker    DEPS
160*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
161*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
162*61c4878aSAndroid Build Coastguard Worker      "${include_file}"
163*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
164*61c4878aSAndroid Build Coastguard Worker      "${out_dir}"
165*61c4878aSAndroid Build Coastguard Worker  )
166*61c4878aSAndroid Build Coastguard Worker  _pw_nanopb_rpc_library("${NAME}"
167*61c4878aSAndroid Build Coastguard Worker    SOURCES
168*61c4878aSAndroid Build Coastguard Worker      ${sources}
169*61c4878aSAndroid Build Coastguard Worker    INPUTS
170*61c4878aSAndroid Build Coastguard Worker      ${inputs}
171*61c4878aSAndroid Build Coastguard Worker    DEPS
172*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
173*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
174*61c4878aSAndroid Build Coastguard Worker      "${include_file}"
175*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
176*61c4878aSAndroid Build Coastguard Worker      "${out_dir}"
177*61c4878aSAndroid Build Coastguard Worker  )
178*61c4878aSAndroid Build Coastguard Workerendfunction(pw_proto_library)
179*61c4878aSAndroid Build Coastguard Worker
180*61c4878aSAndroid Build Coastguard Worker# Args for generate_protos.py
181*61c4878aSAndroid Build Coastguard Workerset(pw_protobuf_compiler_GENERATE_PROTOS_ARGS "" CACHE STRING "Args to generate_protos.py")
182*61c4878aSAndroid Build Coastguard Worker
183*61c4878aSAndroid Build Coastguard Worker# Internal function that invokes protoc through generate_protos.py.
184*61c4878aSAndroid Build Coastguard Workerfunction(_pw_generate_protos TARGET LANGUAGE)
185*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
186*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
187*61c4878aSAndroid Build Coastguard Worker      2
188*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
189*61c4878aSAndroid Build Coastguard Worker      PLUGIN
190*61c4878aSAndroid Build Coastguard Worker      INCLUDE_FILE
191*61c4878aSAndroid Build Coastguard Worker      OUT_DIR
192*61c4878aSAndroid Build Coastguard Worker    MULTI_VALUE_ARGS
193*61c4878aSAndroid Build Coastguard Worker      OUTPUT_EXTS
194*61c4878aSAndroid Build Coastguard Worker      SOURCES
195*61c4878aSAndroid Build Coastguard Worker      INPUTS
196*61c4878aSAndroid Build Coastguard Worker      DEPENDS
197*61c4878aSAndroid Build Coastguard Worker  )
198*61c4878aSAndroid Build Coastguard Worker
199*61c4878aSAndroid Build Coastguard Worker  # Determine the names of the compiled output files.
200*61c4878aSAndroid Build Coastguard Worker  pw_rebase_paths(outputs
201*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}/${LANGUAGE}" "${arg_OUT_DIR}/sources" "${arg_SOURCES}"
202*61c4878aSAndroid Build Coastguard Worker      "${arg_OUTPUT_EXTS}")
203*61c4878aSAndroid Build Coastguard Worker
204*61c4878aSAndroid Build Coastguard Worker  # Export the output files to the caller's scope so it can use them if needed.
205*61c4878aSAndroid Build Coastguard Worker  set(generated_outputs "${outputs}" PARENT_SCOPE)
206*61c4878aSAndroid Build Coastguard Worker
207*61c4878aSAndroid Build Coastguard Worker  if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
208*61c4878aSAndroid Build Coastguard Worker      foreach(source_file IN LISTS SOURCES)
209*61c4878aSAndroid Build Coastguard Worker        get_filename_component(dir "${source_file}" DIRECTORY)
210*61c4878aSAndroid Build Coastguard Worker        get_filename_component(name "${source_file}" NAME_WE)
211*61c4878aSAndroid Build Coastguard Worker        set(arg_PLUGIN "${dir}/${name}.bat")
212*61c4878aSAndroid Build Coastguard Worker      endforeach()
213*61c4878aSAndroid Build Coastguard Worker  endif()
214*61c4878aSAndroid Build Coastguard Worker
215*61c4878aSAndroid Build Coastguard Worker  set(script "$ENV{PW_ROOT}/pw_protobuf_compiler/py/pw_protobuf_compiler/generate_protos.py")
216*61c4878aSAndroid Build Coastguard Worker  add_custom_command(
217*61c4878aSAndroid Build Coastguard Worker    COMMAND
218*61c4878aSAndroid Build Coastguard Worker      python3
219*61c4878aSAndroid Build Coastguard Worker      "${script}"
220*61c4878aSAndroid Build Coastguard Worker      --language "${LANGUAGE}"
221*61c4878aSAndroid Build Coastguard Worker      --plugin-path "${arg_PLUGIN}"
222*61c4878aSAndroid Build Coastguard Worker      --include-file "${arg_INCLUDE_FILE}"
223*61c4878aSAndroid Build Coastguard Worker      --compile-dir "${arg_OUT_DIR}/sources"
224*61c4878aSAndroid Build Coastguard Worker      --out-dir "${arg_OUT_DIR}/${LANGUAGE}"
225*61c4878aSAndroid Build Coastguard Worker      --sources ${arg_SOURCES}
226*61c4878aSAndroid Build Coastguard Worker      "${pw_protobuf_compiler_GENERATE_PROTOS_ARGS}"
227*61c4878aSAndroid Build Coastguard Worker    DEPENDS
228*61c4878aSAndroid Build Coastguard Worker      ${script}
229*61c4878aSAndroid Build Coastguard Worker      ${arg_SOURCES}
230*61c4878aSAndroid Build Coastguard Worker      ${arg_INPUTS}
231*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPENDS}
232*61c4878aSAndroid Build Coastguard Worker    OUTPUT
233*61c4878aSAndroid Build Coastguard Worker      ${outputs}
234*61c4878aSAndroid Build Coastguard Worker  )
235*61c4878aSAndroid Build Coastguard Worker  add_custom_target("${TARGET}._generate.${LANGUAGE}" DEPENDS ${outputs})
236*61c4878aSAndroid Build Coastguard Worker  add_dependencies("${TARGET}._generate.${LANGUAGE}" "${TARGET}._sources")
237*61c4878aSAndroid Build Coastguard Workerendfunction(_pw_generate_protos)
238*61c4878aSAndroid Build Coastguard Worker
239*61c4878aSAndroid Build Coastguard Worker# Internal function that creates a pwpb proto library.
240*61c4878aSAndroid Build Coastguard Workerfunction(_pw_pwpb_library NAME)
241*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
242*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
243*61c4878aSAndroid Build Coastguard Worker      1
244*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
245*61c4878aSAndroid Build Coastguard Worker      INCLUDE_FILE
246*61c4878aSAndroid Build Coastguard Worker      OUT_DIR
247*61c4878aSAndroid Build Coastguard Worker    MULTI_VALUE_ARGS
248*61c4878aSAndroid Build Coastguard Worker      SOURCES
249*61c4878aSAndroid Build Coastguard Worker      INPUTS
250*61c4878aSAndroid Build Coastguard Worker      DEPS
251*61c4878aSAndroid Build Coastguard Worker  )
252*61c4878aSAndroid Build Coastguard Worker
253*61c4878aSAndroid Build Coastguard Worker  list(TRANSFORM arg_DEPS APPEND .pwpb)
254*61c4878aSAndroid Build Coastguard Worker
255*61c4878aSAndroid Build Coastguard Worker  _pw_generate_protos("${NAME}" pwpb
256*61c4878aSAndroid Build Coastguard Worker    PLUGIN
257*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_protobuf/py/pw_protobuf/plugin.py"
258*61c4878aSAndroid Build Coastguard Worker    OUTPUT_EXTS
259*61c4878aSAndroid Build Coastguard Worker      ".pwpb.h"
260*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
261*61c4878aSAndroid Build Coastguard Worker      "${arg_INCLUDE_FILE}"
262*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
263*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}"
264*61c4878aSAndroid Build Coastguard Worker    SOURCES
265*61c4878aSAndroid Build Coastguard Worker      ${arg_SOURCES}
266*61c4878aSAndroid Build Coastguard Worker    INPUTS
267*61c4878aSAndroid Build Coastguard Worker      ${arg_INPUTS}
268*61c4878aSAndroid Build Coastguard Worker    DEPENDS
269*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
270*61c4878aSAndroid Build Coastguard Worker  )
271*61c4878aSAndroid Build Coastguard Worker
272*61c4878aSAndroid Build Coastguard Worker  # Create the library with the generated source files.
273*61c4878aSAndroid Build Coastguard Worker  pw_add_library_generic("${NAME}.pwpb" INTERFACE
274*61c4878aSAndroid Build Coastguard Worker    PUBLIC_INCLUDES
275*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}/pwpb"
276*61c4878aSAndroid Build Coastguard Worker    PUBLIC_DEPS
277*61c4878aSAndroid Build Coastguard Worker      pw_build
278*61c4878aSAndroid Build Coastguard Worker      pw_protobuf
279*61c4878aSAndroid Build Coastguard Worker      pw_span
280*61c4878aSAndroid Build Coastguard Worker      pw_string.string
281*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
282*61c4878aSAndroid Build Coastguard Worker  )
283*61c4878aSAndroid Build Coastguard Worker  add_dependencies("${NAME}.pwpb" "${NAME}._generate.pwpb")
284*61c4878aSAndroid Build Coastguard Workerendfunction(_pw_pwpb_library)
285*61c4878aSAndroid Build Coastguard Worker
286*61c4878aSAndroid Build Coastguard Worker# Internal function that creates a pwpb_rpc library.
287*61c4878aSAndroid Build Coastguard Workerfunction(_pw_pwpb_rpc_library NAME)
288*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
289*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
290*61c4878aSAndroid Build Coastguard Worker      1
291*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
292*61c4878aSAndroid Build Coastguard Worker      INCLUDE_FILE
293*61c4878aSAndroid Build Coastguard Worker      OUT_DIR
294*61c4878aSAndroid Build Coastguard Worker    MULTI_VALUE_ARGS
295*61c4878aSAndroid Build Coastguard Worker      SOURCES
296*61c4878aSAndroid Build Coastguard Worker      INPUTS
297*61c4878aSAndroid Build Coastguard Worker      DEPS
298*61c4878aSAndroid Build Coastguard Worker  )
299*61c4878aSAndroid Build Coastguard Worker
300*61c4878aSAndroid Build Coastguard Worker  # Determine the names of the output files.
301*61c4878aSAndroid Build Coastguard Worker  list(TRANSFORM arg_DEPS APPEND .pwpb_rpc)
302*61c4878aSAndroid Build Coastguard Worker
303*61c4878aSAndroid Build Coastguard Worker  _pw_generate_protos("${NAME}" pwpb_rpc
304*61c4878aSAndroid Build Coastguard Worker    PLUGIN
305*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin_pwpb.py"
306*61c4878aSAndroid Build Coastguard Worker    OUTPUT_EXTS
307*61c4878aSAndroid Build Coastguard Worker      ".rpc.pwpb.h"
308*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
309*61c4878aSAndroid Build Coastguard Worker      "${arg_INCLUDE_FILE}"
310*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
311*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}"
312*61c4878aSAndroid Build Coastguard Worker    SOURCES
313*61c4878aSAndroid Build Coastguard Worker      ${arg_SOURCES}
314*61c4878aSAndroid Build Coastguard Worker    INPUTS
315*61c4878aSAndroid Build Coastguard Worker      ${arg_INPUTS}
316*61c4878aSAndroid Build Coastguard Worker    DEPENDS
317*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
318*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin.py"
319*61c4878aSAndroid Build Coastguard Worker  )
320*61c4878aSAndroid Build Coastguard Worker
321*61c4878aSAndroid Build Coastguard Worker  # Create the library with the generated source files.
322*61c4878aSAndroid Build Coastguard Worker  pw_add_library_generic("${NAME}.pwpb_rpc" INTERFACE
323*61c4878aSAndroid Build Coastguard Worker    PUBLIC_INCLUDES
324*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}/pwpb_rpc"
325*61c4878aSAndroid Build Coastguard Worker    PUBLIC_DEPS
326*61c4878aSAndroid Build Coastguard Worker      "${NAME}.pwpb"
327*61c4878aSAndroid Build Coastguard Worker      pw_build
328*61c4878aSAndroid Build Coastguard Worker      pw_rpc.pwpb.client_api
329*61c4878aSAndroid Build Coastguard Worker      pw_rpc.pwpb.server_api
330*61c4878aSAndroid Build Coastguard Worker      pw_rpc.server
331*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
332*61c4878aSAndroid Build Coastguard Worker  )
333*61c4878aSAndroid Build Coastguard Worker  add_dependencies("${NAME}.pwpb_rpc" "${NAME}._generate.pwpb_rpc")
334*61c4878aSAndroid Build Coastguard Workerendfunction(_pw_pwpb_rpc_library)
335*61c4878aSAndroid Build Coastguard Worker
336*61c4878aSAndroid Build Coastguard Worker# Internal function that creates a raw_rpc proto library.
337*61c4878aSAndroid Build Coastguard Workerfunction(_pw_raw_rpc_library NAME)
338*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
339*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
340*61c4878aSAndroid Build Coastguard Worker      1
341*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
342*61c4878aSAndroid Build Coastguard Worker      INCLUDE_FILE
343*61c4878aSAndroid Build Coastguard Worker      OUT_DIR
344*61c4878aSAndroid Build Coastguard Worker    MULTI_VALUE_ARGS
345*61c4878aSAndroid Build Coastguard Worker      SOURCES
346*61c4878aSAndroid Build Coastguard Worker      INPUTS
347*61c4878aSAndroid Build Coastguard Worker      DEPS
348*61c4878aSAndroid Build Coastguard Worker  )
349*61c4878aSAndroid Build Coastguard Worker
350*61c4878aSAndroid Build Coastguard Worker  list(TRANSFORM arg_DEPS APPEND .raw_rpc)
351*61c4878aSAndroid Build Coastguard Worker
352*61c4878aSAndroid Build Coastguard Worker  _pw_generate_protos("${NAME}" raw_rpc
353*61c4878aSAndroid Build Coastguard Worker    PLUGIN
354*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin_raw.py"
355*61c4878aSAndroid Build Coastguard Worker    OUTPUT_EXTS
356*61c4878aSAndroid Build Coastguard Worker      ".raw_rpc.pb.h"
357*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
358*61c4878aSAndroid Build Coastguard Worker      "${arg_INCLUDE_FILE}"
359*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
360*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}"
361*61c4878aSAndroid Build Coastguard Worker    SOURCES
362*61c4878aSAndroid Build Coastguard Worker      ${arg_SOURCES}
363*61c4878aSAndroid Build Coastguard Worker    INPUTS
364*61c4878aSAndroid Build Coastguard Worker      ${arg_INPUTS}
365*61c4878aSAndroid Build Coastguard Worker    DEPENDS
366*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
367*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin.py"
368*61c4878aSAndroid Build Coastguard Worker  )
369*61c4878aSAndroid Build Coastguard Worker
370*61c4878aSAndroid Build Coastguard Worker  # Create the library with the generated source files.
371*61c4878aSAndroid Build Coastguard Worker  pw_add_library_generic("${NAME}.raw_rpc" INTERFACE
372*61c4878aSAndroid Build Coastguard Worker    PUBLIC_INCLUDES
373*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}/raw_rpc"
374*61c4878aSAndroid Build Coastguard Worker    PUBLIC_DEPS
375*61c4878aSAndroid Build Coastguard Worker      pw_build
376*61c4878aSAndroid Build Coastguard Worker      pw_rpc.raw.server_api
377*61c4878aSAndroid Build Coastguard Worker      pw_rpc.raw.client_api
378*61c4878aSAndroid Build Coastguard Worker      pw_rpc.server
379*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
380*61c4878aSAndroid Build Coastguard Worker  )
381*61c4878aSAndroid Build Coastguard Worker  add_dependencies("${NAME}.raw_rpc" "${NAME}._generate.raw_rpc")
382*61c4878aSAndroid Build Coastguard Workerendfunction(_pw_raw_rpc_library)
383*61c4878aSAndroid Build Coastguard Worker
384*61c4878aSAndroid Build Coastguard Worker# Internal function that creates a nanopb proto library.
385*61c4878aSAndroid Build Coastguard Workerfunction(_pw_nanopb_library NAME)
386*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
387*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
388*61c4878aSAndroid Build Coastguard Worker      1
389*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
390*61c4878aSAndroid Build Coastguard Worker      INCLUDE_FILE
391*61c4878aSAndroid Build Coastguard Worker      OUT_DIR
392*61c4878aSAndroid Build Coastguard Worker    MULTI_VALUE_ARGS
393*61c4878aSAndroid Build Coastguard Worker      SOURCES
394*61c4878aSAndroid Build Coastguard Worker      INPUTS
395*61c4878aSAndroid Build Coastguard Worker      DEPS
396*61c4878aSAndroid Build Coastguard Worker  )
397*61c4878aSAndroid Build Coastguard Worker
398*61c4878aSAndroid Build Coastguard Worker  list(TRANSFORM arg_DEPS APPEND .nanopb)
399*61c4878aSAndroid Build Coastguard Worker
400*61c4878aSAndroid Build Coastguard Worker  if("${dir_pw_third_party_nanopb}" STREQUAL "")
401*61c4878aSAndroid Build Coastguard Worker    add_custom_target("${NAME}._generate.nanopb")  # Nothing to do
402*61c4878aSAndroid Build Coastguard Worker    pw_add_error_target("${NAME}.nanopb"
403*61c4878aSAndroid Build Coastguard Worker      MESSAGE
404*61c4878aSAndroid Build Coastguard Worker        "Attempting to use pw_proto_library, but dir_pw_third_party_nanopb is "
405*61c4878aSAndroid Build Coastguard Worker        "not set. Set dir_pw_third_party_nanopb to the path to the Nanopb "
406*61c4878aSAndroid Build Coastguard Worker        "repository."
407*61c4878aSAndroid Build Coastguard Worker    )
408*61c4878aSAndroid Build Coastguard Worker  else()
409*61c4878aSAndroid Build Coastguard Worker    # When compiling with the Nanopb plugin, the nanopb.proto file is already
410*61c4878aSAndroid Build Coastguard Worker    # compiled internally, so skip recompiling it with protoc.
411*61c4878aSAndroid Build Coastguard Worker    if("${arg_SOURCES}" MATCHES "nanopb\\.proto")
412*61c4878aSAndroid Build Coastguard Worker      add_custom_target("${NAME}._generate.nanopb")  # Nothing to do
413*61c4878aSAndroid Build Coastguard Worker      pw_add_library_generic("${NAME}.nanopb" INTERFACE
414*61c4878aSAndroid Build Coastguard Worker        PUBLIC_DEPS
415*61c4878aSAndroid Build Coastguard Worker          pw_build
416*61c4878aSAndroid Build Coastguard Worker          pw_third_party.nanopb
417*61c4878aSAndroid Build Coastguard Worker          ${arg_DEPS}
418*61c4878aSAndroid Build Coastguard Worker      )
419*61c4878aSAndroid Build Coastguard Worker    else()
420*61c4878aSAndroid Build Coastguard Worker      _pw_generate_protos("${NAME}" nanopb
421*61c4878aSAndroid Build Coastguard Worker        PLUGIN
422*61c4878aSAndroid Build Coastguard Worker          "${dir_pw_third_party_nanopb}/generator/protoc-gen-nanopb"
423*61c4878aSAndroid Build Coastguard Worker        OUTPUT_EXTS
424*61c4878aSAndroid Build Coastguard Worker          ".pb.h"
425*61c4878aSAndroid Build Coastguard Worker          ".pb.c"
426*61c4878aSAndroid Build Coastguard Worker        INCLUDE_FILE
427*61c4878aSAndroid Build Coastguard Worker          "${arg_INCLUDE_FILE}"
428*61c4878aSAndroid Build Coastguard Worker        OUT_DIR
429*61c4878aSAndroid Build Coastguard Worker          "${arg_OUT_DIR}"
430*61c4878aSAndroid Build Coastguard Worker        SOURCES
431*61c4878aSAndroid Build Coastguard Worker          ${arg_SOURCES}
432*61c4878aSAndroid Build Coastguard Worker        INPUTS
433*61c4878aSAndroid Build Coastguard Worker          ${arg_INPUTS}
434*61c4878aSAndroid Build Coastguard Worker        DEPENDS
435*61c4878aSAndroid Build Coastguard Worker          ${arg_DEPS}
436*61c4878aSAndroid Build Coastguard Worker      )
437*61c4878aSAndroid Build Coastguard Worker
438*61c4878aSAndroid Build Coastguard Worker      # Create the library with the generated source files.
439*61c4878aSAndroid Build Coastguard Worker      pw_add_library_generic("${NAME}.nanopb" STATIC
440*61c4878aSAndroid Build Coastguard Worker        SOURCES
441*61c4878aSAndroid Build Coastguard Worker          ${generated_outputs}
442*61c4878aSAndroid Build Coastguard Worker        PUBLIC_INCLUDES
443*61c4878aSAndroid Build Coastguard Worker          "${arg_OUT_DIR}/nanopb"
444*61c4878aSAndroid Build Coastguard Worker        PUBLIC_DEPS
445*61c4878aSAndroid Build Coastguard Worker          pw_build
446*61c4878aSAndroid Build Coastguard Worker          pw_third_party.nanopb
447*61c4878aSAndroid Build Coastguard Worker          ${arg_DEPS}
448*61c4878aSAndroid Build Coastguard Worker      )
449*61c4878aSAndroid Build Coastguard Worker    endif()
450*61c4878aSAndroid Build Coastguard Worker
451*61c4878aSAndroid Build Coastguard Worker    add_dependencies("${NAME}.nanopb" "${NAME}._generate.nanopb")
452*61c4878aSAndroid Build Coastguard Worker
453*61c4878aSAndroid Build Coastguard Worker    # Ensure that nanopb_pb2.py is generated to avoid race conditions.
454*61c4878aSAndroid Build Coastguard Worker    add_dependencies("${NAME}._generate.nanopb"
455*61c4878aSAndroid Build Coastguard Worker        pw_third_party.nanopb.generate_proto
456*61c4878aSAndroid Build Coastguard Worker    )
457*61c4878aSAndroid Build Coastguard Worker  endif()
458*61c4878aSAndroid Build Coastguard Workerendfunction(_pw_nanopb_library)
459*61c4878aSAndroid Build Coastguard Worker
460*61c4878aSAndroid Build Coastguard Worker# Internal function that creates a nanopb_rpc library.
461*61c4878aSAndroid Build Coastguard Workerfunction(_pw_nanopb_rpc_library NAME)
462*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
463*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
464*61c4878aSAndroid Build Coastguard Worker      1
465*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
466*61c4878aSAndroid Build Coastguard Worker      INCLUDE_FILE
467*61c4878aSAndroid Build Coastguard Worker      OUT_DIR
468*61c4878aSAndroid Build Coastguard Worker    MULTI_VALUE_ARGS
469*61c4878aSAndroid Build Coastguard Worker      SOURCES
470*61c4878aSAndroid Build Coastguard Worker      INPUTS
471*61c4878aSAndroid Build Coastguard Worker      DEPS
472*61c4878aSAndroid Build Coastguard Worker  )
473*61c4878aSAndroid Build Coastguard Worker
474*61c4878aSAndroid Build Coastguard Worker  # Determine the names of the output files.
475*61c4878aSAndroid Build Coastguard Worker  list(TRANSFORM arg_DEPS APPEND .nanopb_rpc)
476*61c4878aSAndroid Build Coastguard Worker
477*61c4878aSAndroid Build Coastguard Worker  _pw_generate_protos("${NAME}" nanopb_rpc
478*61c4878aSAndroid Build Coastguard Worker    PLUGIN
479*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin_nanopb.py"
480*61c4878aSAndroid Build Coastguard Worker    OUTPUT_EXTS
481*61c4878aSAndroid Build Coastguard Worker      ".rpc.pb.h"
482*61c4878aSAndroid Build Coastguard Worker    INCLUDE_FILE
483*61c4878aSAndroid Build Coastguard Worker      "${arg_INCLUDE_FILE}"
484*61c4878aSAndroid Build Coastguard Worker    OUT_DIR
485*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}"
486*61c4878aSAndroid Build Coastguard Worker    SOURCES
487*61c4878aSAndroid Build Coastguard Worker      ${arg_SOURCES}
488*61c4878aSAndroid Build Coastguard Worker    INPUTS
489*61c4878aSAndroid Build Coastguard Worker      ${arg_INPUTS}
490*61c4878aSAndroid Build Coastguard Worker    DEPENDS
491*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
492*61c4878aSAndroid Build Coastguard Worker      "$ENV{PW_ROOT}/pw_rpc/py/pw_rpc/plugin.py"
493*61c4878aSAndroid Build Coastguard Worker  )
494*61c4878aSAndroid Build Coastguard Worker
495*61c4878aSAndroid Build Coastguard Worker  # Create the library with the generated source files.
496*61c4878aSAndroid Build Coastguard Worker  pw_add_library_generic("${NAME}.nanopb_rpc" INTERFACE
497*61c4878aSAndroid Build Coastguard Worker    PUBLIC_INCLUDES
498*61c4878aSAndroid Build Coastguard Worker      "${arg_OUT_DIR}/nanopb_rpc"
499*61c4878aSAndroid Build Coastguard Worker    PUBLIC_DEPS
500*61c4878aSAndroid Build Coastguard Worker      "${NAME}.nanopb"
501*61c4878aSAndroid Build Coastguard Worker      pw_build
502*61c4878aSAndroid Build Coastguard Worker      pw_rpc.nanopb.client_api
503*61c4878aSAndroid Build Coastguard Worker      pw_rpc.nanopb.server_api
504*61c4878aSAndroid Build Coastguard Worker      pw_rpc.server
505*61c4878aSAndroid Build Coastguard Worker      ${arg_DEPS}
506*61c4878aSAndroid Build Coastguard Worker  )
507*61c4878aSAndroid Build Coastguard Worker  add_dependencies("${NAME}.nanopb_rpc" "${NAME}._generate.nanopb_rpc")
508*61c4878aSAndroid Build Coastguard Workerendfunction(_pw_nanopb_rpc_library)
509