Add the ability to use system installed versions of abseil and googletest
If the user has checked out the submodules in third_party, they will be
used, otherwise we will try and find the system installed versions of
these dependencies and use them if they are modern enough.
Change-Id: I52164bc48a6ea804b85cdda05fee9cb94632f6c0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7b926c5..529c99b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,41 +32,12 @@
cmake_minimum_required(VERSION 3.16...3.29)
project(Ceres C CXX)
-# NOTE: The following CMake variables (and those further below) must be applied
-# consistently to all targets in project to avoid visibility warnings by placing
-# the variables at the project top.
-
# Always build position-independent code (PIC), even when building Ceres as a
# static library so that shared libraries can link against it, not just
# executables (PIC does not apply on Windows). Global variable can be overridden
# by the user whereas target properties can be not.
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-# Abseil
-
-# In the normal course of things, we would not need the following constraint.
-# However, if we do not set the standard, then std::basic_string_view is not
-# available, which absl depends on and linking the test fails.
-set(CMAKE_CXX_STANDARD 17)
-# Abseil does not handle symbol visibility correctly. As a workaround, we let it
-# expose all the symbols to avoid linker errors.
-set(CMAKE_CXX_VISIBILITY_PRESET default)
-# ABSL plans to enable this flag to be on by default in the future. If it is not
-# set, then it issues a warning. We force enable it, both to silence the warning
-# but to also be safe going forward.
-option(ABSL_PROPAGATE_CXX_STD "Use CMake C++ standard meta features
-(e.g. cxx_std_14) that propagate to targets that link to Abseil" ON)
-option(ABSL_ENABLE_INSTALL "Enable install rules" ON)
-add_subdirectory(third_party/abseil-cpp)
-unset(CMAKE_CXX_STANDARD)
-unset(CMAKE_CXX_VISIBILITY_PRESET)
-
-# Set the default symbol visibility to hidden to unify the behavior among
-# the various compilers and to get smaller binaries
-set(CMAKE_C_VISIBILITY_PRESET hidden)
-set(CMAKE_CXX_VISIBILITY_PRESET hidden)
-set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
-
# NOTE: The 'generic' CMake variables CMAKE_[SOURCE/BINARY]_DIR should not be
# used. Always use the project-specific variants (generated by CMake):
# <PROJECT_NAME_MATCHING_CASE>_[SOURCE/BINARY]_DIR, e.g.
@@ -151,6 +122,67 @@
option(ANDROID_STRIP_DEBUG_SYMBOLS "Strip debug symbols from Android builds (reduces file sizes)" ON)
endif()
+# Abseil
+if (EXISTS "${Ceres_SOURCE_DIR}/third_party/abseil-cpp/CMakeLists.txt")
+ message("-- Using the version of abseil in ceres-solver/third_party/abseil-cpp")
+ # In the normal course of things, we would not need the following constraint.
+ # However, if we do not set the standard, then std::basic_string_view is not
+ # available, which absl depends on and linking the test fails.
+ set(CMAKE_CXX_STANDARD 17)
+ # Abseil does not handle symbol visibility correctly. As a workaround, we let it
+ # expose all the symbols to avoid linker errors.
+ set(CMAKE_CXX_VISIBILITY_PRESET default)
+ # ABSL plans to enable this flag to be on by default in the future. If it is not
+ # set, then it issues a warning. We force enable it, both to silence the warning
+ # but to also be safe going forward.
+
+ option(ABSL_PROPAGATE_CXX_STD "Use CMake C++ standard meta features
+ (e.g. cxx_std_14) that propagate to targets that link to Abseil" ON)
+ option(ABSL_ENABLE_INSTALL "Enable install rules" ON)
+
+ add_subdirectory(third_party/abseil-cpp)
+
+ unset(CMAKE_CXX_STANDARD)
+ unset(CMAKE_CXX_VISIBILITY_PRESET)
+
+ # Set the default symbol visibility to hidden to unify the behavior among
+ # the various compilers and to get smaller binaries
+ set(CMAKE_C_VISIBILITY_PRESET hidden)
+ set(CMAKE_CXX_VISIBILITY_PRESET hidden)
+ set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
+else()
+ message("-- ceres-solver/third_party/abseil-cpp is empty, so falling back to system installed abseil")
+ find_package(absl REQUIRED)
+ message("-- Found abseil version ${absl_VERSION}: ${absl_DIR}")
+ # For some reason unknown to me having the version number in the
+ # find_package call fails. So we check for he minimum version
+ # manually.
+ if (absl_VERSION VERSION_LESS 20240116.2)
+ message(FATAL_ERROR "The version of abseil installed on the system is " ${absl_VERSION} " need at least 20240116.2")
+ endif()
+endif()
+
+# Google Test
+if (BUILD_TESTING)
+ if (EXISTS "${Ceres_SOURCE_DIR}/third_party/googletest/CMakeLists.txt")
+ message("-- Using the version of googletest in ceres-solver/third_party/googletest")
+ # Now that we have absl as a dependency, it would make sense to tell
+ # googletest to use absl also, but doing so seems to be problematic
+ # for now, since if there is a version of absl and re2 installed in
+ # the system then we start getting errors because we maybe using the
+ # absl from our submodule, but the re2 installed on the system only
+ # sees the absl installed on the system. It is possible that we will
+ # need to include re2 as a submodule also, for the following to
+ # work.
+
+ # set(GTEST_HAS_ABSL ON CACHE BOOL "Use ABSL when building gtest")
+ add_subdirectory(${Ceres_SOURCE_DIR}/third_party/googletest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/googletest)
+ else()
+ message("-- ceres-solver/third_party/googletest is empty, so falling back to system installed googletest")
+ find_package(GTest 1.14.0 REQUIRED)
+ endif()
+endif(BUILD_TESTING)
+
# IOS is defined iff using the iOS.cmake CMake toolchain to build a static
# library for iOS.
if (IOS)
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index c997a4d..5331843 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -362,18 +362,6 @@
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
if (BUILD_TESTING)
- # Now that we have absl as a dependency, it would make sense to tell
- # googletest to use absl also, but doing so seems to be problematic
- # for now, since if there is a version of absl and re2 installed in
- # the system then we start getting errors because we maybe using the
- # absl from our submodule, but the re2 installed on the system only
- # sees the absl installed on the system. It is possible that we will
- # need to include re2 as a submodule also, for the following to
- # work.
-
- # set(GTEST_HAS_ABSL ON CACHE BOOL "Use ABSL when building gtest")
- add_subdirectory(${Ceres_SOURCE_DIR}/third_party/googletest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/googletest)
-
add_library(test_util STATIC
evaluator_test_utils.cc
numeric_diff_test_utils.cc