summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle Manna <kyle@kylemanna.com>2015-10-15 13:04:23 -0700
committerKyle Manna <kyle@kylemanna.com>2015-10-15 13:04:23 -0700
commita97617bb41d2e03c670467a0d053b4d2eaae8dad (patch)
treeb4d980088ebd411c5ae570a7d0d576123ac7d27a
parent6b63b26404064272394740f6b7354e75c5805cec (diff)
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.
-rw-r--r--extra/FindNanopb.cmake31
1 files changed, 24 insertions, 7 deletions
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
)