# This is an example script for use with CMake projects for locating and configuring
# the nanopb library.
#
-# The following varialbes have to be set:
-#
-# NANOPB_SRC_ROOT_FOLDER - Path to nanopb source folder
-#
# The following variables can be set and are optional:
#
#
# NANOPB_INCLUDE_DIRS - Include directories for Google Protocol Buffers
#
# The following cache variables are also available to set or use:
-# NANOPB_GENERATOR_EXECUTABLE - The nanopb generator
# PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler
+# NANOPB_GENERATOR_SOURCE_DIR - The nanopb generator source
#
# ====================================================================
#
set(${SRCS})
set(${HDRS})
- get_filename_component(GENERATOR_PATH ${NANOPB_GENERATOR_EXECUTABLE} PATH)
+
+ set(GENERATOR_PATH ${CMAKE_BINARY_DIR}/nanopb/generator)
+
+ set(NANOPB_GENERATOR_EXECUTABLE ${GENERATOR_PATH}/nanopb_generator.py)
+
+ set(GENERATOR_CORE_DIR ${GENERATOR_PATH}/proto)
+ set(GENERATOR_CORE_SRC
+ ${GENERATOR_CORE_DIR}/nanopb.proto
+ ${GENERATOR_CORE_DIR}/plugin.proto)
+
+ # Treat the source diretory as immutable.
+ #
+ # Copy the generator directory to the build directory before
+ # compiling python and proto files. Fixes issues when using the
+ # same build directory with different python/protobuf versions
+ # as the binary build directory is discarded across builds.
+ #
+ add_custom_command(
+ OUTPUT ${NANOPB_GENERATOR_EXECUTABLE} ${GENERATOR_CORE_SRC}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory
+ ARGS ${NANOPB_GENERATOR_SOURCE_DIR} ${GENERATOR_PATH}
+ VERBATIM)
+
+ set(GENERATOR_CORE_PYTHON_SRC)
+ foreach(FIL ${GENERATOR_CORE_SRC})
+ get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
+ get_filename_component(FIL_WE ${FIL} NAME_WE)
+
+ set(output "${GENERATOR_CORE_DIR}/${FIL_WE}_pb2.py")
+ set(GENERATOR_CORE_PYTHON_SRC ${GENERATOR_CORE_PYTHON_SRC} ${output})
+ add_custom_command(
+ OUTPUT ${output}
+ COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
+ ARGS -I${GENERATOR_PATH}/proto
+ --python_out=${GENERATOR_CORE_DIR} ${ABS_FIL}
+ DEPENDS ${ABS_FIL}
+ VERBATIM)
+ endforeach()
foreach(FIL ${ARGN})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
+ get_filename_component(FIL_DIR ${FIL} PATH)
+ set(NANOPB_OPTIONS_FILE ${FIL_DIR}/${FIL_WE}.options)
+ set(NANOPB_OPTIONS)
+ if(EXISTS ${NANOPB_OPTIONS_FILE})
+ set(NANOPB_OPTIONS -f ${NANOPB_OPTIONS_FILE})
+ endif()
list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.c")
list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
- ARGS -I${GENERATOR_PATH} -I${CMAKE_CURRENT_BINARY_DIR} ${_nanobp_include_path} -o${FIL_WE}.pb ${ABS_FIL}
- DEPENDS ${ABS_FIL}
+ ARGS -I${GENERATOR_PATH} -I${GENERATOR_CORE_DIR}
+ -I${CMAKE_CURRENT_BINARY_DIR} ${_nanobp_include_path}
+ -o${FIL_WE}.pb ${ABS_FIL}
+ DEPENDS ${ABS_FIL} ${GENERATOR_CORE_PYTHON_SRC}
COMMENT "Running C++ protocol buffer compiler on ${FIL}"
VERBATIM )
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.c"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
- COMMAND python
- ARGS ${NANOPB_GENERATOR_EXECUTABLE} ${FIL_WE}.pb
+ COMMAND ${PYTHON_EXECUTABLE}
+ ARGS ${NANOPB_GENERATOR_EXECUTABLE} ${FIL_WE}.pb ${NANOPB_OPTIONS}
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb"
COMMENT "Running nanopb generator on ${FIL_WE}.pb"
VERBATIM )
set(NANOPB_GENERATE_CPP_APPEND_PATH TRUE)
endif()
+# Make a really good guess regarding location of NANOPB_SRC_ROOT_FOLDER
+if(NOT DEFINED NANOPB_SRC_ROOT_FOLDER)
+ get_filename_component(NANOPB_SRC_ROOT_FOLDER
+ ${CMAKE_CURRENT_LIST_DIR}/.. ABSOLUTE)
+endif()
+
# Find the include directory
find_path(NANOPB_INCLUDE_DIRS
pb.h
# Find nanopb source files
set(NANOPB_SRCS)
set(NANOPB_HDRS)
-list(APPEND _nanopb_srcs pb_decode.c pb_encode.c)
-list(APPEND _nanopb_hdrs pb_decode.h pb_encode.h pb.h)
+list(APPEND _nanopb_srcs pb_decode.c pb_encode.c pb_common.c)
+list(APPEND _nanopb_hdrs pb_decode.h pb_encode.h pb_common.h pb.h)
foreach(FIL ${_nanopb_srcs})
find_file(${FIL}__nano_pb_file NAMES ${FIL} PATHS ${NANOPB_SRC_ROOT_FOLDER} ${NANOPB_INCLUDE_DIRS})
)
mark_as_advanced(PROTOBUF_PROTOC_EXECUTABLE)
-# Find nanopb generator
-find_file(NANOPB_GENERATOR_EXECUTABLE
+# Find nanopb generator source dir
+find_path(NANOPB_GENERATOR_SOURCE_DIR
NAMES nanopb_generator.py
- DOC "nanopb generator"
+ DOC "nanopb generator source"
PATHS
${NANOPB_SRC_ROOT_FOLDER}/generator
)
-mark_as_advanced(NANOPB_GENERATOR_EXECUTABLE)
+mark_as_advanced(NANOPB_GENERATOR_SOURCE_DIR)
+
+find_package(PythonInterp REQUIRED)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(NANOPB DEFAULT_MSG
NANOPB_INCLUDE_DIRS
NANOPB_SRCS NANOPB_HDRS
- NANOPB_GENERATOR_EXECUTABLE
+ NANOPB_GENERATOR_SOURCE_DIR
PROTOBUF_PROTOC_EXECUTABLE
)