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