Handle possible presence of library prefixes in MSVC. - On MSVC, a Ceres dependency such as glog, may be named glog.lib, or libglog.lib. By default, CMake assumes no prefix for libraries on MSVC when using find_library(), thus find_library(glog) would fail if glog was named libglog.lib. - This patch caches & updates CMAKE_FIND_LIBRARY_PREFIXES in all of Ceres' find_package scripts to include lib & "" (no prefix) on MSVC and then returns CMAKE_FIND_LIBRARY_PREFIXES to its original state before returning. Change-Id: Ic82799e3b786cfb7228a51183bc189578b072bbe
diff --git a/cmake/FindCXSparse.cmake b/cmake/FindCXSparse.cmake index 8ffbae9..5eef530 100644 --- a/cmake/FindCXSparse.cmake +++ b/cmake/FindCXSparse.cmake
@@ -67,6 +67,14 @@ # CXSPARSE_LIBRARY: CXSparse library, not including the libraries of any # dependencies. +# Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when +# FindCXSparse was invoked. +MACRO(CXSPARSE_RESET_FIND_LIBRARY_PREFIX) + IF (MSVC) + SET(CMAKE_FIND_LIBRARY_PREFIXES "${CALLERS_CMAKE_FIND_LIBRARY_PREFIXES}") + ENDIF (MSVC) +ENDMACRO(CXSPARSE_RESET_FIND_LIBRARY_PREFIX) + # Called if we failed to find CXSparse or any of it's required dependencies, # unsets all public (designed to be used externally) variables and reports # error message at priority depending upon [REQUIRED/QUIET/<NONE>] argument. @@ -78,6 +86,9 @@ # been found so that user does not have to toggle to advanced view. MARK_AS_ADVANCED(CLEAR CXSPARSE_INCLUDE_DIR CXSPARSE_LIBRARY) + + CXSPARSE_RESET_FIND_LIBRARY_PREFIX() + # Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by FindPackage() # use the camelcase library name, not uppercase. IF (CXSparse_FIND_QUIETLY) @@ -91,6 +102,17 @@ ENDIF () ENDMACRO(CXSPARSE_REPORT_NOT_FOUND) +# Handle possible presence of lib prefix for libraries on MSVC, see +# also CXSPARSE_RESET_FIND_LIBRARY_PREFIX(). +IF (MSVC) + # Preserve the caller's original values for CMAKE_FIND_LIBRARY_PREFIXES + # s/t we can set it back before returning. + SET(CALLERS_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") + # The empty string in this list is important, it represents the case when + # the libraries have no prefix (shared libraries / DLLs). + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}") +ENDIF (MSVC) + # Search user-installed locations first, so that we prefer user installs # to system installs where both exist. # @@ -190,6 +212,8 @@ SET(CXSPARSE_LIBRARIES ${CXSPARSE_LIBRARY}) ENDIF (CXSPARSE_FOUND) +CXSPARSE_RESET_FIND_LIBRARY_PREFIX() + # Handle REQUIRED / QUIET optional arguments and version. INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(CXSparse
diff --git a/cmake/FindGflags.cmake b/cmake/FindGflags.cmake index 959b4e3..b144a05 100644 --- a/cmake/FindGflags.cmake +++ b/cmake/FindGflags.cmake
@@ -65,6 +65,14 @@ # GFLAGS_LIBRARY: gflags library, not including the libraries of any # dependencies. +# Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when +# FindGflags was invoked. +MACRO(GFLAGS_RESET_FIND_LIBRARY_PREFIX) + IF (MSVC) + SET(CMAKE_FIND_LIBRARY_PREFIXES "${CALLERS_CMAKE_FIND_LIBRARY_PREFIXES}") + ENDIF (MSVC) +ENDMACRO(GFLAGS_RESET_FIND_LIBRARY_PREFIX) + # Called if we failed to find gflags or any of it's required dependencies, # unsets all public (designed to be used externally) variables and reports # error message at priority depending upon [REQUIRED/QUIET/<NONE>] argument. @@ -82,6 +90,9 @@ MARK_AS_ADVANCED(CLEAR GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY GFLAGS_NAMESPACE) + + GFLAGS_RESET_FIND_LIBRARY_PREFIX() + # Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by FindPackage() # use the camelcase library name, not uppercase. IF (Gflags_FIND_QUIETLY) @@ -177,6 +188,17 @@ ENDIF() ENDMACRO() +# Handle possible presence of lib prefix for libraries on MSVC, see +# also GFLAGS_RESET_FIND_LIBRARY_PREFIX(). +IF (MSVC) + # Preserve the caller's original values for CMAKE_FIND_LIBRARY_PREFIXES + # s/t we can set it back before returning. + SET(CALLERS_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") + # The empty string in this list is important, it represents the case when + # the libraries have no prefix (shared libraries / DLLs). + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}") +ENDIF (MSVC) + # Search user-installed locations first, so that we prefer user installs # to system installs where both exist. # @@ -396,6 +418,8 @@ SET(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY} ${GFLAGS_LINK_LIBRARIES}) ENDIF (GFLAGS_FOUND) +GFLAGS_RESET_FIND_LIBRARY_PREFIX() + # Handle REQUIRED / QUIET optional arguments. INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Gflags DEFAULT_MSG
diff --git a/cmake/FindGlog.cmake b/cmake/FindGlog.cmake index 9759c6b..3180c1f 100644 --- a/cmake/FindGlog.cmake +++ b/cmake/FindGlog.cmake
@@ -60,6 +60,14 @@ # GLOG_LIBRARY: glog library, not including the libraries of any # dependencies. +# Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when +# FindGlog was invoked. +MACRO(GLOG_RESET_FIND_LIBRARY_PREFIX) + IF (MSVC) + SET(CMAKE_FIND_LIBRARY_PREFIXES "${CALLERS_CMAKE_FIND_LIBRARY_PREFIXES}") + ENDIF (MSVC) +ENDMACRO(GLOG_RESET_FIND_LIBRARY_PREFIX) + # Called if we failed to find glog or any of it's required dependencies, # unsets all public (designed to be used externally) variables and reports # error message at priority depending upon [REQUIRED/QUIET/<NONE>] argument. @@ -71,6 +79,9 @@ # been found so that user does not have to toggle to advanced view. MARK_AS_ADVANCED(CLEAR GLOG_INCLUDE_DIR GLOG_LIBRARY) + + GLOG_RESET_FIND_LIBRARY_PREFIX() + # Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by FindPackage() # use the camelcase library name, not uppercase. IF (Glog_FIND_QUIETLY) @@ -84,6 +95,17 @@ ENDIF () ENDMACRO(GLOG_REPORT_NOT_FOUND) +# Handle possible presence of lib prefix for libraries on MSVC, see +# also GLOG_RESET_FIND_LIBRARY_PREFIX(). +IF (MSVC) + # Preserve the caller's original values for CMAKE_FIND_LIBRARY_PREFIXES + # s/t we can set it back before returning. + SET(CALLERS_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") + # The empty string in this list is important, it represents the case when + # the libraries have no prefix (shared libraries / DLLs). + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}") +ENDIF (MSVC) + # Search user-installed locations first, so that we prefer user installs # to system installs where both exist. # @@ -159,6 +181,8 @@ SET(GLOG_LIBRARIES ${GLOG_LIBRARY}) ENDIF (GLOG_FOUND) +GLOG_RESET_FIND_LIBRARY_PREFIX() + # Handle REQUIRED / QUIET optional arguments. INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Glog DEFAULT_MSG
diff --git a/cmake/FindSuiteSparse.cmake b/cmake/FindSuiteSparse.cmake index 881786a..3b5e814 100644 --- a/cmake/FindSuiteSparse.cmake +++ b/cmake/FindSuiteSparse.cmake
@@ -110,6 +110,14 @@ # TBB_FOUND # TBB_LIBRARIES +# Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when +# FindSuiteSparse was invoked. +MACRO(SUITESPARSE_RESET_FIND_LIBRARY_PREFIX) + IF (MSVC) + SET(CMAKE_FIND_LIBRARY_PREFIXES "${CALLERS_CMAKE_FIND_LIBRARY_PREFIXES}") + ENDIF (MSVC) +ENDMACRO(SUITESPARSE_RESET_FIND_LIBRARY_PREFIX) + # Called if we failed to find SuiteSparse or any of it's required dependencies, # unsets all public (designed to be used externally) variables and reports # error message at priority depending upon [REQUIRED/QUIET/<NONE>] argument. @@ -125,6 +133,8 @@ # FindPackageHandleStandardArgs() to generate the automatic error message on # failure which highlights which components are missing. + SUITESPARSE_RESET_FIND_LIBRARY_PREFIX() + # Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by FindPackage() # use the camelcase library name, not uppercase. IF (SuiteSparse_FIND_QUIETLY) @@ -140,6 +150,17 @@ # Do not call RETURN(), s/t we keep processing if not called with REQUIRED. ENDMACRO(SUITESPARSE_REPORT_NOT_FOUND) +# Handle possible presence of lib prefix for libraries on MSVC, see +# also SUITESPARSE_RESET_FIND_LIBRARY_PREFIX(). +IF (MSVC) + # Preserve the caller's original values for CMAKE_FIND_LIBRARY_PREFIXES + # s/t we can set it back before returning. + SET(CALLERS_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") + # The empty string in this list is important, it represents the case when + # the libraries have no prefix (shared libraries / DLLs). + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}") +ENDIF (MSVC) + # 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 @@ -611,6 +632,8 @@ ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux" AND SUITESPARSE_VERSION VERSION_EQUAL 3.4.0) +SUITESPARSE_RESET_FIND_LIBRARY_PREFIX() + # Handle REQUIRED and QUIET arguments to FIND_PACKAGE INCLUDE(FindPackageHandleStandardArgs) IF (SUITESPARSE_FOUND)