From a97617bb41d2e03c670467a0d053b4d2eaae8dad Mon Sep 17 00:00:00 2001 From: Kyle Manna Date: Thu, 15 Oct 2015 13:04:23 -0700 Subject: cmake: Build generator files in build directory Treat the source directory as immutable. Copy the generator directory which previously generated files in-tree to the build directory and then generate files. Many emerging continuous integration build systems test builds across multiple versions of dependencies protobuf and python versions in particular. The previous source tree builds resulted in stale files from the last build breaking the current build. By placing the build files in the build directory, the build system automatically removes stale files (removes output build directory) and regenerates them as necessary. --- extra/FindNanopb.cmake | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'extra/FindNanopb.cmake') diff --git a/extra/FindNanopb.cmake b/extra/FindNanopb.cmake index 1fd25334..7734a937 100644 --- a/extra/FindNanopb.cmake +++ b/extra/FindNanopb.cmake @@ -26,8 +26,8 @@ # 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 # # ==================================================================== # @@ -127,12 +127,29 @@ function(NANOPB_GENERATE_CPP SRCS HDRS) 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) @@ -235,14 +252,14 @@ find_program(PROTOBUF_PROTOC_EXECUTABLE ) 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) @@ -250,6 +267,6 @@ 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 ) -- cgit 1.2.3-korg