Fix custom Eigen on macos (EIGEN_INCLUDE_DIR_HINTS) In ceres' CMakeLists.txt a workaround for custom homebrew locations sets CMAKE_PREFIX_PATH to the homebrew install path. This overrides explicit requests for custom locations for third-party dependencies, in particular for Eigen with EIGEN_INCLUDE_DIR_HINTS. This commit introduces a workaround to make EIGEN_INCLUDE_DIR_HINTS work on macos by ignoring CMAKE_PREFIX_PATH in that case. Fixes https://github.com/ceres-solver/ceres-solver/issues/431 Change-Id: I3ec0ec418d45d41b9e5ebdd6aee60552438afec3
diff --git a/CMakeLists.txt b/CMakeLists.txt index 6308cfb..be045a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -87,6 +87,10 @@ # CMake in find_path & find_library. This should ensure that we can # still build Ceres even if Homebrew is installed in a non-standard # location (not /usr/local). +# Note: This is a hack that breaks HINTS passed to find_... modules +# for thirdparty dependencies, since CMAKE_PREFIX_PATH takes +# precendence over HINTS. See FindEigen.cmake for notes on the +# workaround needed for making EIGEN_INCLUDE_DIR_HINTS work. if (CMAKE_SYSTEM_NAME MATCHES "Darwin") find_program(HOMEBREW_EXECUTABLE brew) mark_as_advanced(FORCE HOMEBREW_EXECUTABLE)
diff --git a/cmake/FindEigen.cmake b/cmake/FindEigen.cmake index f6d2664..d218699 100644 --- a/cmake/FindEigen.cmake +++ b/cmake/FindEigen.cmake
@@ -192,12 +192,25 @@ Eigen/include/eigen3 # Windows (for C:/Program Files prefix) < 3.3 Eigen3/include/eigen3 ) # Windows (for C:/Program Files prefix) >= 3.3 + # On macos with Homebrew, the brew prefix is added + # CMAKE_PREFIX_PATH, which overrides EIGEN_INCLUDE_DIR_HINTS in the + # following find_path, and the brew Eigen version is found (if + # installed) instead of the one provided by the hint. So, in that + # case we ignore CMAKE_PREFIX_PATH. See also the comments in ceres' + # main CMakeLists.txt around where HOMEBREW_EXECUTABLE is set. + if(HOMEBREW_EXECUTABLE AND EIGEN_INCLUDE_DIR_HINTS) + set(FIND_PATH_FLAG NO_CMAKE_PATH) + else() + set(FIND_PATH_FLAG) + endif() + # Search supplied hint directories first if supplied. find_path(EIGEN_INCLUDE_DIR NAMES Eigen/Core HINTS ${EIGEN_INCLUDE_DIR_HINTS} PATHS ${EIGEN_CHECK_INCLUDE_DIRS} - PATH_SUFFIXES ${EIGEN_CHECK_PATH_SUFFIXES}) + PATH_SUFFIXES ${EIGEN_CHECK_PATH_SUFFIXES} + ${FIND_PATH_FLAG}) if (NOT EIGEN_INCLUDE_DIR OR NOT EXISTS ${EIGEN_INCLUDE_DIR})