From ee7e2cb3c89603f8e22d73df48fe1cc8637734e6 Mon Sep 17 00:00:00 2001 From: Alex Stewart Date: Sun, 3 Mar 2019 14:13:36 +0000 Subject: [PATCH] Set Homebrew paths via HINTS not CMAKE_PREFIX_PATH - Adding the Homebrew install prefix to CMAKE_PREFIX_PATH, irrespective of whether it is a standard location (e.g. /usr/local) overrides any user-specified HINTS locations according to the search order of CMake's find_xxx() functions. - Now we append the relevant include/lib directory to its respective HINTS directory variable (to the back to avoid overriding any user specified values). This achieves the same effect, but only after searching any user specified values. - Also adds Homebrew install prefix to find_package() calls for dependencies optionally exported with CMake after the possible user specified _DIR prefix. - Raised as issue #431 Change-Id: I47030f0f4fd9b96665fac57279be2285d9700b9a --- CMakeLists.txt | 18 ------------------ cmake/FindCXSparse.cmake | 21 +++++++++++++++++++++ cmake/FindEigen.cmake | 21 +++++++++++++++++++++ cmake/FindGflags.cmake | 22 ++++++++++++++++++++++ cmake/FindGlog.cmake | 22 ++++++++++++++++++++++ cmake/FindSuiteSparse.cmake | 21 +++++++++++++++++++++ 6 files changed, 107 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6308cfbb9..4ce361dd4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,24 +83,6 @@ include(UpdateCacheVariable) include(AddGerritCommitHook) add_gerrit_commit_hook(${Ceres_SOURCE_DIR} ${Ceres_BINARY_DIR}) -# On OS X, add the Homebrew prefix to the set of prefixes searched by -# 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). -if (CMAKE_SYSTEM_NAME MATCHES "Darwin") - find_program(HOMEBREW_EXECUTABLE brew) - mark_as_advanced(FORCE HOMEBREW_EXECUTABLE) - if (HOMEBREW_EXECUTABLE) - # Detected a Homebrew install, query for its install prefix. - execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix - OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX - OUTPUT_STRIP_TRAILING_WHITESPACE) - message(STATUS "Detected Homebrew with install prefix: " - "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.") - list(APPEND CMAKE_PREFIX_PATH "${HOMEBREW_INSTALL_PREFIX}") - endif() -endif() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Ceres_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${Ceres_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${Ceres_BINARY_DIR}/lib) diff --git a/cmake/FindCXSparse.cmake b/cmake/FindCXSparse.cmake index 3f4b0155d..8b380c90e 100644 --- a/cmake/FindCXSparse.cmake +++ b/cmake/FindCXSparse.cmake @@ -120,6 +120,27 @@ if (MSVC) set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}") endif (MSVC) +# On macOS, add the Homebrew prefix (with appropriate suffixes) to the +# respective HINTS directories (after any user-specified locations). This +# handles Homebrew installations into non-standard locations (not /usr/local). +# We do not use CMAKE_PREFIX_PATH for this as given the search ordering of +# find_xxx(), doing so would override any user-specified HINTS locations with +# the Homebrew version if it exists. +if (CMAKE_SYSTEM_NAME MATCHES "Darwin") + find_program(HOMEBREW_EXECUTABLE brew) + mark_as_advanced(FORCE HOMEBREW_EXECUTABLE) + if (HOMEBREW_EXECUTABLE) + # Detected a Homebrew install, query for its install prefix. + execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix + OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Detected Homebrew with install prefix: " + "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.") + list(APPEND CXSPARSE_INCLUDE_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/include") + list(APPEND CXSPARSE_LIBRARY_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/lib") + endif() +endif() + # Search user-installed locations first, so that we prefer user installs # to system installs where both exist. # diff --git a/cmake/FindEigen.cmake b/cmake/FindEigen.cmake index f6d266410..d1fa6d74d 100644 --- a/cmake/FindEigen.cmake +++ b/cmake/FindEigen.cmake @@ -115,6 +115,26 @@ if (NOT DEFINED EIGEN_PREFER_EXPORTED_EIGEN_CMAKE_CONFIGURATION set(EIGEN_PREFER_EXPORTED_EIGEN_CMAKE_CONFIGURATION TRUE) endif() +# On macOS, add the Homebrew prefix (with appropriate suffixes) to the +# respective HINTS directories (after any user-specified locations). This +# handles Homebrew installations into non-standard locations (not /usr/local). +# We do not use CMAKE_PREFIX_PATH for this as given the search ordering of +# find_xxx(), doing so would override any user-specified HINTS locations with +# the Homebrew version if it exists. +if (CMAKE_SYSTEM_NAME MATCHES "Darwin") + find_program(HOMEBREW_EXECUTABLE brew) + mark_as_advanced(FORCE HOMEBREW_EXECUTABLE) + if (HOMEBREW_EXECUTABLE) + # Detected a Homebrew install, query for its install prefix. + execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix + OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Detected Homebrew with install prefix: " + "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.") + list(APPEND EIGEN_INCLUDE_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/include") + endif() +endif() + if (EIGEN_PREFER_EXPORTED_EIGEN_CMAKE_CONFIGURATION) # Try to find an exported CMake configuration for Eigen. # @@ -147,6 +167,7 @@ if (EIGEN_PREFER_EXPORTED_EIGEN_CMAKE_CONFIGURATION) # # [1] http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_package find_package(Eigen3 QUIET + HINTS ${Eigen3_DIR} ${HOMEBREW_INSTALL_PREFIX} NO_MODULE NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_BUILDS_PATH) diff --git a/cmake/FindGflags.cmake b/cmake/FindGflags.cmake index 32c04ea0c..c8151a5be 100644 --- a/cmake/FindGflags.cmake +++ b/cmake/FindGflags.cmake @@ -292,6 +292,27 @@ if (NOT DEFINED GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION set(GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION TRUE) endif() +# On macOS, add the Homebrew prefix (with appropriate suffixes) to the +# respective HINTS directories (after any user-specified locations). This +# handles Homebrew installations into non-standard locations (not /usr/local). +# We do not use CMAKE_PREFIX_PATH for this as given the search ordering of +# find_xxx(), doing so would override any user-specified HINTS locations with +# the Homebrew version if it exists. +if (CMAKE_SYSTEM_NAME MATCHES "Darwin") + find_program(HOMEBREW_EXECUTABLE brew) + mark_as_advanced(FORCE HOMEBREW_EXECUTABLE) + if (HOMEBREW_EXECUTABLE) + # Detected a Homebrew install, query for its install prefix. + execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix + OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Detected Homebrew with install prefix: " + "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.") + list(APPEND GFLAGS_INCLUDE_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/include") + list(APPEND GFLAGS_LIBRARY_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/lib") + endif() +endif() + if (GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION) # Try to find an exported CMake configuration for gflags, as generated by # gflags versions >= 2.1. @@ -325,6 +346,7 @@ if (GFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION) # # [1] http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_package find_package(gflags QUIET + HINTS ${gflags_DIR} ${HOMEBREW_INSTALL_PREFIX} NO_MODULE NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_BUILDS_PATH) diff --git a/cmake/FindGlog.cmake b/cmake/FindGlog.cmake index 979dceda4..4fc84da33 100644 --- a/cmake/FindGlog.cmake +++ b/cmake/FindGlog.cmake @@ -130,6 +130,27 @@ if (NOT DEFINED GLOG_PREFER_EXPORTED_GLOG_CMAKE_CONFIGURATION set(GLOG_PREFER_EXPORTED_GLOG_CMAKE_CONFIGURATION TRUE) endif() +# On macOS, add the Homebrew prefix (with appropriate suffixes) to the +# respective HINTS directories (after any user-specified locations). This +# handles Homebrew installations into non-standard locations (not /usr/local). +# We do not use CMAKE_PREFIX_PATH for this as given the search ordering of +# find_xxx(), doing so would override any user-specified HINTS locations with +# the Homebrew version if it exists. +if (CMAKE_SYSTEM_NAME MATCHES "Darwin") + find_program(HOMEBREW_EXECUTABLE brew) + mark_as_advanced(FORCE HOMEBREW_EXECUTABLE) + if (HOMEBREW_EXECUTABLE) + # Detected a Homebrew install, query for its install prefix. + execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix + OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Detected Homebrew with install prefix: " + "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.") + list(APPEND GLOG_INCLUDE_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/include") + list(APPEND GLOG_LIBRARY_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/lib") + endif() +endif() + if (GLOG_PREFER_EXPORTED_GLOG_CMAKE_CONFIGURATION) # Try to find an exported CMake configuration for glog, as generated by # glog versions > 0.3.4 @@ -176,6 +197,7 @@ if (GLOG_PREFER_EXPORTED_GLOG_CMAKE_CONFIGURATION) # [1] http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_package find_package(glog QUIET NAMES google-glog glog + HINTS ${glog_DIR} ${HOMEBREW_INSTALL_PREFIX} NO_MODULE NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_BUILDS_PATH) diff --git a/cmake/FindSuiteSparse.cmake b/cmake/FindSuiteSparse.cmake index e4de8b029..453127771 100644 --- a/cmake/FindSuiteSparse.cmake +++ b/cmake/FindSuiteSparse.cmake @@ -165,6 +165,27 @@ if (MSVC) set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}") endif (MSVC) +# On macOS, add the Homebrew prefix (with appropriate suffixes) to the +# respective HINTS directories (after any user-specified locations). This +# handles Homebrew installations into non-standard locations (not /usr/local). +# We do not use CMAKE_PREFIX_PATH for this as given the search ordering of +# find_xxx(), doing so would override any user-specified HINTS locations with +# the Homebrew version if it exists. +if (CMAKE_SYSTEM_NAME MATCHES "Darwin") + find_program(HOMEBREW_EXECUTABLE brew) + mark_as_advanced(FORCE HOMEBREW_EXECUTABLE) + if (HOMEBREW_EXECUTABLE) + # Detected a Homebrew install, query for its install prefix. + execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix + OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Detected Homebrew with install prefix: " + "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.") + list(APPEND SUITESPARSE_INCLUDE_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/include") + list(APPEND SUITESPARSE_LIBRARY_DIR_HINTS "${HOMEBREW_INSTALL_PREFIX}/lib") + endif() +endif() + # Specify search directories for include files and libraries (this is the union # of the search directories for all OSs). Search user-specified hint # directories first if supplied, and search user-installed locations first