Configure config.h and include it from the build directory.
- Previously we overwrote the default (empty) config.h in the source
tree with a configured config.h, generated using the current compile
options.
- This was undesirable as it could lead to inadvertant commits of the
generated config.h.
- This patch moves the default config.h to <src>/config/ceres/internal,
separate from the other headers, thus if Ceres is compiled without
CMake this directory will now also have to be included. This
directory is _not_ added to the CMake include directories for Ceres
(thus the default config.h is never used when compiling with CMake).
- When using CMake, the generated config.h is now placed in
<build>/config/ceres/internal, which is in turn added to the include
directories for Ceres when it is compiled, and the resulting config.h
is copied to ceres/internal when installed.
Change-Id: Ib1ba45e66e383ade2ebb08603af9165c1df616f2
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9e17604..778682e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -654,11 +654,16 @@
ENDIF (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# Configure the Ceres config.h compile options header using the current
-# compile options and put the configured header into the Ceres source tree.
+# compile options and put the configured header into the Ceres build
+# directory. Note that the ceres/internal subdir in <build>/config where
+# the configured config.h is placed is important, because Ceres will be
+# built against this configured header, it needs to have the same relative
+# include path as it would if it were in the source tree (or installed).
LIST(REMOVE_DUPLICATES CERES_COMPILE_OPTIONS)
INCLUDE(CreateCeresConfig)
CREATE_CERES_CONFIG("${CERES_COMPILE_OPTIONS}"
- ${CMAKE_SOURCE_DIR}/include/ceres/internal)
+ ${CMAKE_CURRENT_BINARY_DIR}/config/ceres/internal)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/config)
ADD_SUBDIRECTORY(internal/ceres)
@@ -684,6 +689,12 @@
FILE(GLOB CERES_PUBLIC_INTERNAL_HDRS ${CMAKE_SOURCE_DIR}/include/ceres/internal/*.h)
INSTALL(FILES ${CERES_PUBLIC_INTERNAL_HDRS} DESTINATION include/ceres/internal)
+# Also setup installation of Ceres config.h configured with the current
+# build options into the installed headers directory.
+INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/config/ceres/internal/config.h
+ DESTINATION include/ceres/internal)
+
+
IF (MINIGLOG)
# Install miniglog header if being used as logging #includes appear in
# installed public Ceres headers.
diff --git a/cmake/CreateCeresConfig.cmake b/cmake/CreateCeresConfig.cmake
index 43f4d17..23f449b 100644
--- a/cmake/CreateCeresConfig.cmake
+++ b/cmake/CreateCeresConfig.cmake
@@ -56,11 +56,16 @@
# will be <src>/include/ceres/internal.
FUNCTION(CREATE_CERES_CONFIG CURRENT_CERES_COMPILE_OPTIONS CERES_CONFIG_OUTPUT_DIRECTORY)
- # Verify that the specified output directory is valid.
- IF (NOT (EXISTS "${CERES_CONFIG_OUTPUT_DIRECTORY}" AND
- IS_DIRECTORY "${CERES_CONFIG_OUTPUT_DIRECTORY}"))
+ # Create the specified output directory if it does not exist.
+ IF (NOT EXISTS "${CERES_CONFIG_OUTPUT_DIRECTORY}")
+ MESSAGE(STATUS "Creating configured Ceres config.h output directory: "
+ "${CERES_CONFIG_OUTPUT_DIRECTORY}")
+ FILE(MAKE_DIRECTORY "${CERES_CONFIG_OUTPUT_DIRECTORY}")
+ ENDIF()
+ IF (EXISTS "${CERES_CONFIG_OUTPUT_DIRECTORY}" AND
+ NOT IS_DIRECTORY "${CERES_CONFIG_OUTPUT_DIRECTORY}")
MESSAGE(FATAL_ERROR "Ceres Bug: Specified CERES_CONFIG_OUTPUT_DIRECTORY: "
- "${CERES_CONFIG_OUTPUT_DIRECTORY} does not exist, or is not a directory.")
+ "${CERES_CONFIG_OUTPUT_DIRECTORY} exists, but is not a directory.")
ENDIF()
# Read all possible configurable compile options from config.h.in, this avoids
diff --git a/include/ceres/internal/config.h b/config/ceres/internal/config.h
similarity index 100%
rename from include/ceres/internal/config.h
rename to config/ceres/internal/config.h
diff --git a/jni/Android.mk b/jni/Android.mk
index 7027146..23e588f 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -79,6 +79,7 @@
CERES_INCLUDE_PATHS += $(LOCAL_PATH)/../internal
CERES_INCLUDE_PATHS += $(LOCAL_PATH)/../internal/ceres
CERES_INCLUDE_PATHS += $(LOCAL_PATH)/../include
+CERES_INCLUDE_PATHS += $(LOCAL_PATH)/../config
# Use the alternate glog implementation if provided by the user.
ifdef CERES_GLOG_DIR