1*c8d645caSAndroid Build Coastguard Worker# This is an example script for use with CMake projects for locating and configuring 2*c8d645caSAndroid Build Coastguard Worker# the nanopb library. 3*c8d645caSAndroid Build Coastguard Worker# 4*c8d645caSAndroid Build Coastguard Worker# The following variables can be set and are optional: 5*c8d645caSAndroid Build Coastguard Worker# 6*c8d645caSAndroid Build Coastguard Worker# 7*c8d645caSAndroid Build Coastguard Worker# PROTOBUF_SRC_ROOT_FOLDER - When compiling with MSVC, if this cache variable is set 8*c8d645caSAndroid Build Coastguard Worker# the protobuf-default VS project build locations 9*c8d645caSAndroid Build Coastguard Worker# (vsprojects/Debug & vsprojects/Release) will be searched 10*c8d645caSAndroid Build Coastguard Worker# for libraries and binaries. 11*c8d645caSAndroid Build Coastguard Worker# 12*c8d645caSAndroid Build Coastguard Worker# NANOPB_IMPORT_DIRS - List of additional directories to be searched for 13*c8d645caSAndroid Build Coastguard Worker# imported .proto files. 14*c8d645caSAndroid Build Coastguard Worker# 15*c8d645caSAndroid Build Coastguard Worker# NANOPB_OPTIONS - List of options passed to nanopb. 16*c8d645caSAndroid Build Coastguard Worker# 17*c8d645caSAndroid Build Coastguard Worker# NANOPB_DEPENDS - List of files to be used as dependencies 18*c8d645caSAndroid Build Coastguard Worker# for the generated source and header files. These 19*c8d645caSAndroid Build Coastguard Worker# files are not directly passed as options to 20*c8d645caSAndroid Build Coastguard Worker# nanopb but rather their directories. 21*c8d645caSAndroid Build Coastguard Worker# 22*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP_APPEND_PATH - By default -I will be passed to protoc 23*c8d645caSAndroid Build Coastguard Worker# for each directory where a proto file is referenced. 24*c8d645caSAndroid Build Coastguard Worker# Set to FALSE if you want to disable this behaviour. 25*c8d645caSAndroid Build Coastguard Worker# 26*c8d645caSAndroid Build Coastguard Worker# Defines the following variables: 27*c8d645caSAndroid Build Coastguard Worker# 28*c8d645caSAndroid Build Coastguard Worker# NANOPB_FOUND - Found the nanopb library (source&header files, generator tool, protoc compiler tool) 29*c8d645caSAndroid Build Coastguard Worker# NANOPB_INCLUDE_DIRS - Include directories for Google Protocol Buffers 30*c8d645caSAndroid Build Coastguard Worker# 31*c8d645caSAndroid Build Coastguard Worker# The following cache variables are also available to set or use: 32*c8d645caSAndroid Build Coastguard Worker# PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler 33*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATOR_SOURCE_DIR - The nanopb generator source 34*c8d645caSAndroid Build Coastguard Worker# 35*c8d645caSAndroid Build Coastguard Worker# ==================================================================== 36*c8d645caSAndroid Build Coastguard Worker# 37*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP (public function) 38*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP(SRCS HDRS [RELPATH <root-path-of-proto-files>] 39*c8d645caSAndroid Build Coastguard Worker# <proto-files>...) 40*c8d645caSAndroid Build Coastguard Worker# SRCS = Variable to define with autogenerated source files 41*c8d645caSAndroid Build Coastguard Worker# HDRS = Variable to define with autogenerated header files 42*c8d645caSAndroid Build Coastguard Worker# If you want to use relative paths in your import statements use the RELPATH 43*c8d645caSAndroid Build Coastguard Worker# option. The argument to RELPATH should be the directory that all the 44*c8d645caSAndroid Build Coastguard Worker# imports will be relative to. 45*c8d645caSAndroid Build Coastguard Worker# When RELPATH is not specified then all proto files can be imported without 46*c8d645caSAndroid Build Coastguard Worker# a path. 47*c8d645caSAndroid Build Coastguard Worker# 48*c8d645caSAndroid Build Coastguard Worker# 49*c8d645caSAndroid Build Coastguard Worker# ==================================================================== 50*c8d645caSAndroid Build Coastguard Worker# Example: 51*c8d645caSAndroid Build Coastguard Worker# 52*c8d645caSAndroid Build Coastguard Worker# set(NANOPB_SRC_ROOT_FOLDER "/path/to/nanopb") 53*c8d645caSAndroid Build Coastguard Worker# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${NANOPB_SRC_ROOT_FOLDER}/extra) 54*c8d645caSAndroid Build Coastguard Worker# find_package( Nanopb REQUIRED ) 55*c8d645caSAndroid Build Coastguard Worker# include_directories(${NANOPB_INCLUDE_DIRS}) 56*c8d645caSAndroid Build Coastguard Worker# 57*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto) 58*c8d645caSAndroid Build Coastguard Worker# 59*c8d645caSAndroid Build Coastguard Worker# include_directories(${CMAKE_CURRENT_BINARY_DIR}) 60*c8d645caSAndroid Build Coastguard Worker# add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS}) 61*c8d645caSAndroid Build Coastguard Worker# 62*c8d645caSAndroid Build Coastguard Worker# Example with RELPATH: 63*c8d645caSAndroid Build Coastguard Worker# Assume we have a layout like: 64*c8d645caSAndroid Build Coastguard Worker# .../CMakeLists.txt 65*c8d645caSAndroid Build Coastguard Worker# .../bar.cc 66*c8d645caSAndroid Build Coastguard Worker# .../proto/ 67*c8d645caSAndroid Build Coastguard Worker# .../proto/foo.proto (Which contains: import "sub/bar.proto"; ) 68*c8d645caSAndroid Build Coastguard Worker# .../proto/sub/bar.proto 69*c8d645caSAndroid Build Coastguard Worker# Everything would be the same as the previous example, but the call to 70*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP would change to: 71*c8d645caSAndroid Build Coastguard Worker# 72*c8d645caSAndroid Build Coastguard Worker# NANOPB_GENERATE_CPP(PROTO_SRCS PROTO_HDRS RELPATH proto 73*c8d645caSAndroid Build Coastguard Worker# proto/foo.proto proto/sub/bar.proto) 74*c8d645caSAndroid Build Coastguard Worker# 75*c8d645caSAndroid Build Coastguard Worker# ==================================================================== 76*c8d645caSAndroid Build Coastguard Worker 77*c8d645caSAndroid Build Coastguard Worker#============================================================================= 78*c8d645caSAndroid Build Coastguard Worker# Copyright 2009 Kitware, Inc. 79*c8d645caSAndroid Build Coastguard Worker# Copyright 2009-2011 Philip Lowman <[email protected]> 80*c8d645caSAndroid Build Coastguard Worker# Copyright 2008 Esben Mose Hansen, Ange Optimization ApS 81*c8d645caSAndroid Build Coastguard Worker# 82*c8d645caSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 83*c8d645caSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions 84*c8d645caSAndroid Build Coastguard Worker# are met: 85*c8d645caSAndroid Build Coastguard Worker# 86*c8d645caSAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright 87*c8d645caSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 88*c8d645caSAndroid Build Coastguard Worker# 89*c8d645caSAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above copyright 90*c8d645caSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer in the 91*c8d645caSAndroid Build Coastguard Worker# documentation and/or other materials provided with the distribution. 92*c8d645caSAndroid Build Coastguard Worker# 93*c8d645caSAndroid Build Coastguard Worker# * Neither the names of Kitware, Inc., the Insight Software Consortium, 94*c8d645caSAndroid Build Coastguard Worker# nor the names of their contributors may be used to endorse or promote 95*c8d645caSAndroid Build Coastguard Worker# products derived from this software without specific prior written 96*c8d645caSAndroid Build Coastguard Worker# permission. 97*c8d645caSAndroid Build Coastguard Worker# 98*c8d645caSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 99*c8d645caSAndroid Build Coastguard Worker# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 100*c8d645caSAndroid Build Coastguard Worker# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 101*c8d645caSAndroid Build Coastguard Worker# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 102*c8d645caSAndroid Build Coastguard Worker# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 103*c8d645caSAndroid Build Coastguard Worker# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 104*c8d645caSAndroid Build Coastguard Worker# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 105*c8d645caSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 106*c8d645caSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 107*c8d645caSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 108*c8d645caSAndroid Build Coastguard Worker# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 109*c8d645caSAndroid Build Coastguard Worker# 110*c8d645caSAndroid Build Coastguard Worker#============================================================================= 111*c8d645caSAndroid Build Coastguard Worker# 112*c8d645caSAndroid Build Coastguard Worker# Changes 113*c8d645caSAndroid Build Coastguard Worker# 2013.01.31 - Pavlo Ilin - used Modules/FindProtobuf.cmake from cmake 2.8.10 to 114*c8d645caSAndroid Build Coastguard Worker# write FindNanopb.cmake 115*c8d645caSAndroid Build Coastguard Worker# 116*c8d645caSAndroid Build Coastguard Worker#============================================================================= 117*c8d645caSAndroid Build Coastguard Worker 118*c8d645caSAndroid Build Coastguard Worker 119*c8d645caSAndroid Build Coastguard Workerfunction(NANOPB_GENERATE_CPP SRCS HDRS) 120*c8d645caSAndroid Build Coastguard Worker cmake_parse_arguments(NANOPB_GENERATE_CPP "" "RELPATH" "" ${ARGN}) 121*c8d645caSAndroid Build Coastguard Worker if(NOT NANOPB_GENERATE_CPP_UNPARSED_ARGUMENTS) 122*c8d645caSAndroid Build Coastguard Worker return() 123*c8d645caSAndroid Build Coastguard Worker endif() 124*c8d645caSAndroid Build Coastguard Worker 125*c8d645caSAndroid Build Coastguard Worker if(NANOPB_GENERATE_CPP_APPEND_PATH) 126*c8d645caSAndroid Build Coastguard Worker # Create an include path for each file specified 127*c8d645caSAndroid Build Coastguard Worker foreach(FIL ${NANOPB_GENERATE_CPP_UNPARSED_ARGUMENTS}) 128*c8d645caSAndroid Build Coastguard Worker get_filename_component(ABS_FIL ${FIL} ABSOLUTE) 129*c8d645caSAndroid Build Coastguard Worker get_filename_component(ABS_PATH ${ABS_FIL} PATH) 130*c8d645caSAndroid Build Coastguard Worker list(APPEND _nanopb_include_path "-I${ABS_PATH}") 131*c8d645caSAndroid Build Coastguard Worker endforeach() 132*c8d645caSAndroid Build Coastguard Worker else() 133*c8d645caSAndroid Build Coastguard Worker set(_nanopb_include_path "-I${CMAKE_CURRENT_SOURCE_DIR}") 134*c8d645caSAndroid Build Coastguard Worker endif() 135*c8d645caSAndroid Build Coastguard Worker 136*c8d645caSAndroid Build Coastguard Worker if(NANOPB_GENERATE_CPP_RELPATH) 137*c8d645caSAndroid Build Coastguard Worker list(APPEND _nanopb_include_path "-I${NANOPB_GENERATE_CPP_RELPATH}") 138*c8d645caSAndroid Build Coastguard Worker endif() 139*c8d645caSAndroid Build Coastguard Worker 140*c8d645caSAndroid Build Coastguard Worker if(DEFINED NANOPB_IMPORT_DIRS) 141*c8d645caSAndroid Build Coastguard Worker foreach(DIR ${NANOPB_IMPORT_DIRS}) 142*c8d645caSAndroid Build Coastguard Worker get_filename_component(ABS_PATH ${DIR} ABSOLUTE) 143*c8d645caSAndroid Build Coastguard Worker list(APPEND _nanopb_include_path "-I${ABS_PATH}") 144*c8d645caSAndroid Build Coastguard Worker endforeach() 145*c8d645caSAndroid Build Coastguard Worker endif() 146*c8d645caSAndroid Build Coastguard Worker 147*c8d645caSAndroid Build Coastguard Worker list(REMOVE_DUPLICATES _nanopb_include_path) 148*c8d645caSAndroid Build Coastguard Worker 149*c8d645caSAndroid Build Coastguard Worker set(GENERATOR_PATH ${CMAKE_BINARY_DIR}/nanopb/generator) 150*c8d645caSAndroid Build Coastguard Worker 151*c8d645caSAndroid Build Coastguard Worker set(NANOPB_GENERATOR_EXECUTABLE ${GENERATOR_PATH}/nanopb_generator.py) 152*c8d645caSAndroid Build Coastguard Worker if (WIN32) 153*c8d645caSAndroid Build Coastguard Worker set(NANOPB_GENERATOR_PLUGIN ${GENERATOR_PATH}/protoc-gen-nanopb.bat) 154*c8d645caSAndroid Build Coastguard Worker else() 155*c8d645caSAndroid Build Coastguard Worker set(NANOPB_GENERATOR_PLUGIN ${GENERATOR_PATH}/protoc-gen-nanopb) 156*c8d645caSAndroid Build Coastguard Worker endif() 157*c8d645caSAndroid Build Coastguard Worker 158*c8d645caSAndroid Build Coastguard Worker set(GENERATOR_CORE_DIR ${GENERATOR_PATH}/proto) 159*c8d645caSAndroid Build Coastguard Worker set(GENERATOR_CORE_SRC 160*c8d645caSAndroid Build Coastguard Worker ${GENERATOR_CORE_DIR}/nanopb.proto 161*c8d645caSAndroid Build Coastguard Worker ${GENERATOR_CORE_DIR}/plugin.proto) 162*c8d645caSAndroid Build Coastguard Worker 163*c8d645caSAndroid Build Coastguard Worker # Treat the source diretory as immutable. 164*c8d645caSAndroid Build Coastguard Worker # 165*c8d645caSAndroid Build Coastguard Worker # Copy the generator directory to the build directory before 166*c8d645caSAndroid Build Coastguard Worker # compiling python and proto files. Fixes issues when using the 167*c8d645caSAndroid Build Coastguard Worker # same build directory with different python/protobuf versions 168*c8d645caSAndroid Build Coastguard Worker # as the binary build directory is discarded across builds. 169*c8d645caSAndroid Build Coastguard Worker # 170*c8d645caSAndroid Build Coastguard Worker add_custom_command( 171*c8d645caSAndroid Build Coastguard Worker OUTPUT ${NANOPB_GENERATOR_EXECUTABLE} ${GENERATOR_CORE_SRC} 172*c8d645caSAndroid Build Coastguard Worker COMMAND ${CMAKE_COMMAND} -E copy_directory 173*c8d645caSAndroid Build Coastguard Worker ARGS ${NANOPB_GENERATOR_SOURCE_DIR} ${GENERATOR_PATH} 174*c8d645caSAndroid Build Coastguard Worker VERBATIM) 175*c8d645caSAndroid Build Coastguard Worker 176*c8d645caSAndroid Build Coastguard Worker set(GENERATOR_CORE_PYTHON_SRC) 177*c8d645caSAndroid Build Coastguard Worker foreach(FIL ${GENERATOR_CORE_SRC}) 178*c8d645caSAndroid Build Coastguard Worker get_filename_component(ABS_FIL ${FIL} ABSOLUTE) 179*c8d645caSAndroid Build Coastguard Worker get_filename_component(FIL_WE ${FIL} NAME_WE) 180*c8d645caSAndroid Build Coastguard Worker 181*c8d645caSAndroid Build Coastguard Worker set(output "${GENERATOR_CORE_DIR}/${FIL_WE}_pb2.py") 182*c8d645caSAndroid Build Coastguard Worker set(GENERATOR_CORE_PYTHON_SRC ${GENERATOR_CORE_PYTHON_SRC} ${output}) 183*c8d645caSAndroid Build Coastguard Worker add_custom_command( 184*c8d645caSAndroid Build Coastguard Worker OUTPUT ${output} 185*c8d645caSAndroid Build Coastguard Worker COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} 186*c8d645caSAndroid Build Coastguard Worker ARGS -I${GENERATOR_PATH}/proto 187*c8d645caSAndroid Build Coastguard Worker --python_out=${GENERATOR_CORE_DIR} ${ABS_FIL} 188*c8d645caSAndroid Build Coastguard Worker DEPENDS ${ABS_FIL} 189*c8d645caSAndroid Build Coastguard Worker VERBATIM) 190*c8d645caSAndroid Build Coastguard Worker endforeach() 191*c8d645caSAndroid Build Coastguard Worker 192*c8d645caSAndroid Build Coastguard Worker if(NANOPB_GENERATE_CPP_RELPATH) 193*c8d645caSAndroid Build Coastguard Worker get_filename_component(ABS_ROOT ${NANOPB_GENERATE_CPP_RELPATH} ABSOLUTE) 194*c8d645caSAndroid Build Coastguard Worker endif() 195*c8d645caSAndroid Build Coastguard Worker foreach(FIL ${NANOPB_GENERATE_CPP_UNPARSED_ARGUMENTS}) 196*c8d645caSAndroid Build Coastguard Worker get_filename_component(ABS_FIL ${FIL} ABSOLUTE) 197*c8d645caSAndroid Build Coastguard Worker get_filename_component(FIL_WE ${FIL} NAME_WE) 198*c8d645caSAndroid Build Coastguard Worker get_filename_component(FIL_DIR ${FIL} PATH) 199*c8d645caSAndroid Build Coastguard Worker set(FIL_PATH_REL) 200*c8d645caSAndroid Build Coastguard Worker if(ABS_ROOT) 201*c8d645caSAndroid Build Coastguard Worker # Check that the file is under the given "RELPATH" 202*c8d645caSAndroid Build Coastguard Worker string(FIND ${ABS_FIL} ${ABS_ROOT} LOC) 203*c8d645caSAndroid Build Coastguard Worker if (${LOC} EQUAL 0) 204*c8d645caSAndroid Build Coastguard Worker string(REPLACE "${ABS_ROOT}/" "" FIL_REL ${ABS_FIL}) 205*c8d645caSAndroid Build Coastguard Worker get_filename_component(FIL_PATH_REL ${FIL_REL} PATH) 206*c8d645caSAndroid Build Coastguard Worker file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}) 207*c8d645caSAndroid Build Coastguard Worker endif() 208*c8d645caSAndroid Build Coastguard Worker endif() 209*c8d645caSAndroid Build Coastguard Worker if(NOT FIL_PATH_REL) 210*c8d645caSAndroid Build Coastguard Worker set(FIL_PATH_REL ".") 211*c8d645caSAndroid Build Coastguard Worker endif() 212*c8d645caSAndroid Build Coastguard Worker 213*c8d645caSAndroid Build Coastguard Worker list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.c") 214*c8d645caSAndroid Build Coastguard Worker list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.h") 215*c8d645caSAndroid Build Coastguard Worker 216*c8d645caSAndroid Build Coastguard Worker set(NANOPB_PLUGIN_OPTIONS) 217*c8d645caSAndroid Build Coastguard Worker set(NANOPB_OPTIONS_DIRS) 218*c8d645caSAndroid Build Coastguard Worker 219*c8d645caSAndroid Build Coastguard Worker # If there an options file in the same working directory, set it as a dependency 220*c8d645caSAndroid Build Coastguard Worker set(NANOPB_OPTIONS_FILE ${FIL_DIR}/${FIL_WE}.options) 221*c8d645caSAndroid Build Coastguard Worker if(EXISTS ${NANOPB_OPTIONS_FILE}) 222*c8d645caSAndroid Build Coastguard Worker # Get directory as lookups for dependency options fail if an options 223*c8d645caSAndroid Build Coastguard Worker # file is used. The options is still set as a dependency of the 224*c8d645caSAndroid Build Coastguard Worker # generated source and header. 225*c8d645caSAndroid Build Coastguard Worker get_filename_component(options_dir ${NANOPB_OPTIONS_FILE} DIRECTORY) 226*c8d645caSAndroid Build Coastguard Worker list(APPEND NANOPB_OPTIONS_DIRS ${options_dir}) 227*c8d645caSAndroid Build Coastguard Worker else() 228*c8d645caSAndroid Build Coastguard Worker set(NANOPB_OPTIONS_FILE) 229*c8d645caSAndroid Build Coastguard Worker endif() 230*c8d645caSAndroid Build Coastguard Worker 231*c8d645caSAndroid Build Coastguard Worker # If the dependencies are options files, we need to pass the directories 232*c8d645caSAndroid Build Coastguard Worker # as arguments to nanopb 233*c8d645caSAndroid Build Coastguard Worker foreach(depends_file ${NANOPB_DEPENDS}) 234*c8d645caSAndroid Build Coastguard Worker get_filename_component(ext ${depends_file} EXT) 235*c8d645caSAndroid Build Coastguard Worker if(ext STREQUAL ".options") 236*c8d645caSAndroid Build Coastguard Worker get_filename_component(depends_dir ${depends_file} DIRECTORY) 237*c8d645caSAndroid Build Coastguard Worker list(APPEND NANOPB_OPTIONS_DIRS ${depends_dir}) 238*c8d645caSAndroid Build Coastguard Worker endif() 239*c8d645caSAndroid Build Coastguard Worker endforeach() 240*c8d645caSAndroid Build Coastguard Worker 241*c8d645caSAndroid Build Coastguard Worker if(NANOPB_OPTIONS_DIRS) 242*c8d645caSAndroid Build Coastguard Worker list(REMOVE_DUPLICATES NANOPB_OPTIONS_DIRS) 243*c8d645caSAndroid Build Coastguard Worker endif() 244*c8d645caSAndroid Build Coastguard Worker 245*c8d645caSAndroid Build Coastguard Worker foreach(options_path ${NANOPB_OPTIONS_DIRS}) 246*c8d645caSAndroid Build Coastguard Worker set(NANOPB_PLUGIN_OPTIONS "${NANOPB_PLUGIN_OPTIONS} -I${options_path}") 247*c8d645caSAndroid Build Coastguard Worker endforeach() 248*c8d645caSAndroid Build Coastguard Worker 249*c8d645caSAndroid Build Coastguard Worker if(NANOPB_OPTIONS) 250*c8d645caSAndroid Build Coastguard Worker set(NANOPB_PLUGIN_OPTIONS "${NANOPB_PLUGIN_OPTIONS} ${NANOPB_OPTIONS}") 251*c8d645caSAndroid Build Coastguard Worker endif() 252*c8d645caSAndroid Build Coastguard Worker 253*c8d645caSAndroid Build Coastguard Worker add_custom_command( 254*c8d645caSAndroid Build Coastguard Worker OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.c" 255*c8d645caSAndroid Build Coastguard Worker "${CMAKE_CURRENT_BINARY_DIR}/${FIL_PATH_REL}/${FIL_WE}.pb.h" 256*c8d645caSAndroid Build Coastguard Worker COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} 257*c8d645caSAndroid Build Coastguard Worker ARGS -I${GENERATOR_PATH} -I${GENERATOR_CORE_DIR} 258*c8d645caSAndroid Build Coastguard Worker -I${CMAKE_CURRENT_BINARY_DIR} ${_nanopb_include_path} 259*c8d645caSAndroid Build Coastguard Worker --plugin=protoc-gen-nanopb=${NANOPB_GENERATOR_PLUGIN} 260*c8d645caSAndroid Build Coastguard Worker "--nanopb_out=${NANOPB_PLUGIN_OPTIONS}:${CMAKE_CURRENT_BINARY_DIR}" ${ABS_FIL} 261*c8d645caSAndroid Build Coastguard Worker DEPENDS ${ABS_FIL} ${GENERATOR_CORE_PYTHON_SRC} 262*c8d645caSAndroid Build Coastguard Worker ${NANOPB_OPTIONS_FILE} ${NANOPB_DEPENDS} 263*c8d645caSAndroid Build Coastguard Worker COMMENT "Running C++ protocol buffer compiler using nanopb plugin on ${FIL}" 264*c8d645caSAndroid Build Coastguard Worker VERBATIM ) 265*c8d645caSAndroid Build Coastguard Worker 266*c8d645caSAndroid Build Coastguard Worker endforeach() 267*c8d645caSAndroid Build Coastguard Worker 268*c8d645caSAndroid Build Coastguard Worker set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) 269*c8d645caSAndroid Build Coastguard Worker set(${SRCS} ${${SRCS}} ${NANOPB_SRCS} PARENT_SCOPE) 270*c8d645caSAndroid Build Coastguard Worker set(${HDRS} ${${HDRS}} ${NANOPB_HDRS} PARENT_SCOPE) 271*c8d645caSAndroid Build Coastguard Worker 272*c8d645caSAndroid Build Coastguard Workerendfunction() 273*c8d645caSAndroid Build Coastguard Worker 274*c8d645caSAndroid Build Coastguard Worker 275*c8d645caSAndroid Build Coastguard Worker 276*c8d645caSAndroid Build Coastguard Worker# 277*c8d645caSAndroid Build Coastguard Worker# Main. 278*c8d645caSAndroid Build Coastguard Worker# 279*c8d645caSAndroid Build Coastguard Worker 280*c8d645caSAndroid Build Coastguard Worker# By default have NANOPB_GENERATE_CPP macro pass -I to protoc 281*c8d645caSAndroid Build Coastguard Worker# for each directory where a proto file is referenced. 282*c8d645caSAndroid Build Coastguard Workerif(NOT DEFINED NANOPB_GENERATE_CPP_APPEND_PATH) 283*c8d645caSAndroid Build Coastguard Worker set(NANOPB_GENERATE_CPP_APPEND_PATH TRUE) 284*c8d645caSAndroid Build Coastguard Workerendif() 285*c8d645caSAndroid Build Coastguard Worker 286*c8d645caSAndroid Build Coastguard Worker# Make a really good guess regarding location of NANOPB_SRC_ROOT_FOLDER 287*c8d645caSAndroid Build Coastguard Workerif(NOT DEFINED NANOPB_SRC_ROOT_FOLDER) 288*c8d645caSAndroid Build Coastguard Worker get_filename_component(NANOPB_SRC_ROOT_FOLDER 289*c8d645caSAndroid Build Coastguard Worker ${CMAKE_CURRENT_LIST_DIR}/.. ABSOLUTE) 290*c8d645caSAndroid Build Coastguard Workerendif() 291*c8d645caSAndroid Build Coastguard Worker 292*c8d645caSAndroid Build Coastguard Worker# Find the include directory 293*c8d645caSAndroid Build Coastguard Workerfind_path(NANOPB_INCLUDE_DIRS 294*c8d645caSAndroid Build Coastguard Worker pb.h 295*c8d645caSAndroid Build Coastguard Worker PATHS ${NANOPB_SRC_ROOT_FOLDER} 296*c8d645caSAndroid Build Coastguard Worker) 297*c8d645caSAndroid Build Coastguard Workermark_as_advanced(NANOPB_INCLUDE_DIRS) 298*c8d645caSAndroid Build Coastguard Worker 299*c8d645caSAndroid Build Coastguard Worker# Find nanopb source files 300*c8d645caSAndroid Build Coastguard Workerset(NANOPB_SRCS) 301*c8d645caSAndroid Build Coastguard Workerset(NANOPB_HDRS) 302*c8d645caSAndroid Build Coastguard Workerlist(APPEND _nanopb_srcs pb_decode.c pb_encode.c pb_common.c) 303*c8d645caSAndroid Build Coastguard Workerlist(APPEND _nanopb_hdrs pb_decode.h pb_encode.h pb_common.h pb.h) 304*c8d645caSAndroid Build Coastguard Worker 305*c8d645caSAndroid Build Coastguard Workerforeach(FIL ${_nanopb_srcs}) 306*c8d645caSAndroid Build Coastguard Worker find_file(${FIL}__nano_pb_file NAMES ${FIL} PATHS ${NANOPB_SRC_ROOT_FOLDER} ${NANOPB_INCLUDE_DIRS}) 307*c8d645caSAndroid Build Coastguard Worker list(APPEND NANOPB_SRCS "${${FIL}__nano_pb_file}") 308*c8d645caSAndroid Build Coastguard Worker mark_as_advanced(${FIL}__nano_pb_file) 309*c8d645caSAndroid Build Coastguard Workerendforeach() 310*c8d645caSAndroid Build Coastguard Worker 311*c8d645caSAndroid Build Coastguard Workerforeach(FIL ${_nanopb_hdrs}) 312*c8d645caSAndroid Build Coastguard Worker find_file(${FIL}__nano_pb_file NAMES ${FIL} PATHS ${NANOPB_INCLUDE_DIRS}) 313*c8d645caSAndroid Build Coastguard Worker mark_as_advanced(${FIL}__nano_pb_file) 314*c8d645caSAndroid Build Coastguard Worker list(APPEND NANOPB_HDRS "${${FIL}__nano_pb_file}") 315*c8d645caSAndroid Build Coastguard Workerendforeach() 316*c8d645caSAndroid Build Coastguard Worker 317*c8d645caSAndroid Build Coastguard Worker# Find the protoc Executable 318*c8d645caSAndroid Build Coastguard Workerfind_program(PROTOBUF_PROTOC_EXECUTABLE 319*c8d645caSAndroid Build Coastguard Worker NAMES protoc 320*c8d645caSAndroid Build Coastguard Worker DOC "The Google Protocol Buffers Compiler" 321*c8d645caSAndroid Build Coastguard Worker PATHS 322*c8d645caSAndroid Build Coastguard Worker ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Release 323*c8d645caSAndroid Build Coastguard Worker ${PROTOBUF_SRC_ROOT_FOLDER}/vsprojects/Debug 324*c8d645caSAndroid Build Coastguard Worker) 325*c8d645caSAndroid Build Coastguard Workermark_as_advanced(PROTOBUF_PROTOC_EXECUTABLE) 326*c8d645caSAndroid Build Coastguard Worker 327*c8d645caSAndroid Build Coastguard Worker# Find nanopb generator source dir 328*c8d645caSAndroid Build Coastguard Workerfind_path(NANOPB_GENERATOR_SOURCE_DIR 329*c8d645caSAndroid Build Coastguard Worker NAMES nanopb_generator.py 330*c8d645caSAndroid Build Coastguard Worker DOC "nanopb generator source" 331*c8d645caSAndroid Build Coastguard Worker PATHS 332*c8d645caSAndroid Build Coastguard Worker ${NANOPB_SRC_ROOT_FOLDER}/generator 333*c8d645caSAndroid Build Coastguard Worker) 334*c8d645caSAndroid Build Coastguard Workermark_as_advanced(NANOPB_GENERATOR_SOURCE_DIR) 335*c8d645caSAndroid Build Coastguard Worker 336*c8d645caSAndroid Build Coastguard Workerfind_package(PythonInterp REQUIRED) 337*c8d645caSAndroid Build Coastguard Worker 338*c8d645caSAndroid Build Coastguard Workerinclude(FindPackageHandleStandardArgs) 339*c8d645caSAndroid Build Coastguard WorkerFIND_PACKAGE_HANDLE_STANDARD_ARGS(NANOPB DEFAULT_MSG 340*c8d645caSAndroid Build Coastguard Worker NANOPB_INCLUDE_DIRS 341*c8d645caSAndroid Build Coastguard Worker NANOPB_SRCS NANOPB_HDRS 342*c8d645caSAndroid Build Coastguard Worker NANOPB_GENERATOR_SOURCE_DIR 343*c8d645caSAndroid Build Coastguard Worker PROTOBUF_PROTOC_EXECUTABLE 344*c8d645caSAndroid Build Coastguard Worker ) 345