blob: cfc866c3165b1d3ca19c72c2718386215d95e3d6 [file] [edit]
# Ceres Solver - A fast non-linear least squares minimizer
# Copyright 2026 Google Inc. All rights reserved.
# http://ceres-solver.org/
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# * Neither the name of Google Inc. nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Authors: pablo.speciale@gmail.com (Pablo Speciale)
# alexs.mac@gmail.com (Alex Stewart)
#
# Config file for Ceres Solver - Find Ceres & dependencies.
#
# This file is used by CMake when find_package(Ceres) is invoked and either
# the directory containing this file either is present in CMAKE_MODULE_PATH
# (if Ceres was installed), or exists in the local CMake package registry if
# the Ceres build directory was exported.
#
# This module defines the following variables:
#
# Ceres_FOUND / CERES_FOUND: True if Ceres has been successfully
# found. Both variables are set as although
# FindPackage() only references Ceres_FOUND
# in Config mode, given the conventions for
# <package>_FOUND when FindPackage() is
# called in Module mode, users could
# reasonably expect to use CERES_FOUND
# instead.
#
# CERES_VERSION: Version of Ceres found.
#
# CERES_LIBRARIES: Libraries for Ceres and all
# dependencies against which Ceres was
# compiled. This will not include any optional
# dependencies that were disabled when Ceres was
# compiled.
#
# NOTE: There is no equivalent of CERES_INCLUDE_DIRS as the exported
# CMake target already includes the definition of its public
# include directories.
@PACKAGE_INIT@
include(CMakeFindDependencyMacro)
# Called if Ceres or one of its required dependencies cannot be used. Clears
# the public result variables and provides the standard find_package failure
# reason. find_package controls whether and how the reason is reported.
macro(ceres_set_not_found REASON_MSG)
# FindPackage() only references Ceres_FOUND, and requires it to be
# explicitly set FALSE to denote not found (not merely undefined).
set(Ceres_FOUND FALSE)
set(CERES_FOUND FALSE)
unset(CERES_INCLUDE_DIR)
unset(CERES_INCLUDE_DIRS)
unset(CERES_LIBRARIES)
# Reset the CMake module path to its state when this script was called.
set(CMAKE_MODULE_PATH ${CALLERS_CMAKE_MODULE_PATH})
string(JOIN " " Ceres_NOT_FOUND_MESSAGE "${REASON_MSG}" ${ARGN})
return()
endmacro(ceres_set_not_found)
# The list of (optional) components this version of Ceres was compiled with.
set(CERES_COMPILED_COMPONENTS "@CERES_COMPILED_COMPONENTS@")
# Record the state of the CMake module path when this script was
# called so that we can ensure that we leave it in the same state on
# exit as it was on entry, but modify it locally.
set(CALLERS_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})
# Get the directory containing this file.
get_filename_component(CERES_CURRENT_CONFIG_DIR
"${CMAKE_CURRENT_LIST_FILE}" PATH)
# Use dependency find modules available relative to this package config.
list(PREPEND CMAKE_MODULE_PATH
${CERES_CURRENT_CONFIG_DIR}/CeresFindModules
${CERES_CURRENT_CONFIG_DIR})
# Set the version.
set(CERES_VERSION @CERES_VERSION@)
# Required dependencies
find_dependency(Threads)
# Optional dependencies
@METIS_DEPENDENCY@
@SuiteSparse_DEPENDENCY@
@CUDAToolkit_DEPENDENCY@
@cudss_DEPENDENCY@
# As imported CMake targets are not re-exported when a dependent target is
# exported, we must invoke find_package(XXX) here to reload the definition
# of their targets. Without this, the dependency target names (e.g.
# 'gflags-shared') which will be present in the ceres target would not be
# defined, and so CMake will assume that they refer to a library name and
# fail to link correctly.
# Abseil
set(_CERES_ABSL_VERSION @absl_VERSION@)
set(_CERES_USE_SYSTEM_ABSL @CERES_USE_SYSTEM_ABSL@)
if (_CERES_USE_SYSTEM_ABSL)
find_dependency(absl ${_CERES_ABSL_VERSION})
if (NOT absl_VERSION)
if (NOT TARGET absl::absl_vlog_is_on)
ceres_set_not_found("The version of abseil installed on the system "
"provides no version info and is missing TARGET 'absl::absl_vlog_is_on'")
endif ()
endif ()
else ()
# absl from submodule, configs installed with ceres-solver
set(_CERES_ABSL_HINTS
"${CERES_CURRENT_CONFIG_DIR}/third_party/abseil-cpp"
"${CERES_CURRENT_CONFIG_DIR}/../absl")
find_dependency(absl ${_CERES_ABSL_VERSION} HINTS ${_CERES_ABSL_HINTS})
unset(_CERES_ABSL_HINTS)
endif ()
unset(_CERES_ABSL_VERSION)
unset(_CERES_USE_SYSTEM_ABSL)
# Eigen.
# Flag set during configuration and build of Ceres.
set(CERES_EIGEN_VERSION @Eigen3_VERSION@)
# The search should be for an exact match, but for usability reasons do a soft
# match and reject with an explanation below.
find_package(Eigen3 ${CERES_EIGEN_VERSION} QUIET)
if (Eigen3_FOUND)
if (NOT Eigen3_VERSION VERSION_EQUAL CERES_EIGEN_VERSION)
# CMake's VERSION check in FIND_PACKAGE() will accept any version >= the
# specified version. However, only version = is supported. Improve
# usability by explaining why we don't accept non-exact version matching.
ceres_set_not_found("Found Eigen dependency, but the version of Eigen "
"found (${Eigen3_VERSION}) does not exactly match the version of Eigen "
"Ceres was compiled with (${CERES_EIGEN_VERSION}). This can cause subtle "
"bugs by triggering violations of the One Definition Rule. See the "
"Wikipedia article http://en.wikipedia.org/wiki/One_Definition_Rule "
"for more details")
endif ()
else (Eigen3_FOUND)
ceres_set_not_found("Missing required Ceres "
"dependency: Eigen version ${CERES_EIGEN_VERSION}, please set "
"Eigen3_DIR.")
endif (Eigen3_FOUND)
# Import exported Ceres targets, if they have not already been imported.
if (NOT TARGET ceres AND NOT Ceres_BINARY_DIR)
include(${CERES_CURRENT_CONFIG_DIR}/CeresTargets.cmake)
endif (NOT TARGET ceres AND NOT Ceres_BINARY_DIR)
# Set the expected XX_LIBRARIES variable for FindPackage().
set(CERES_LIBRARIES Ceres::ceres)
# Reset CMake module path to its state when this script was called.
set(CMAKE_MODULE_PATH ${CALLERS_CMAKE_MODULE_PATH})
# Advertise compiled components and let CMake apply required and optional
# component semantics.
foreach(_Ceres_component IN LISTS Ceres_FIND_COMPONENTS)
set(Ceres_${_Ceres_component}_FOUND FALSE)
endforeach()
foreach(_Ceres_component IN LISTS CERES_COMPILED_COMPONENTS)
set(Ceres_${_Ceres_component}_FOUND TRUE)
endforeach()
set(_Ceres_missing_required_components)
foreach(_Ceres_component IN LISTS Ceres_FIND_COMPONENTS)
if (Ceres_FIND_REQUIRED_${_Ceres_component}
AND NOT Ceres_${_Ceres_component}_FOUND)
list(APPEND _Ceres_missing_required_components ${_Ceres_component})
endif()
endforeach()
unset(_Ceres_component)
set(Ceres_FOUND TRUE)
check_required_components(Ceres)
if (NOT Ceres_FOUND)
list(LENGTH _Ceres_missing_required_components
_Ceres_missing_required_component_count)
if (_Ceres_missing_required_component_count EQUAL 1)
set(_Ceres_component_noun "component")
else()
set(_Ceres_component_noun "components")
endif()
string(JOIN ", " _Ceres_missing_required_components_string
${_Ceres_missing_required_components})
string(CONCAT _Ceres_missing_required_components_reason
"Missing required Ceres ${_Ceres_component_noun}: "
"${_Ceres_missing_required_components_string}.")
if (CERES_COMPILED_COMPONENTS)
string(JOIN ", " CERES_COMPILED_COMPONENTS_STRING
${CERES_COMPILED_COMPONENTS})
ceres_set_not_found(
"${_Ceres_missing_required_components_reason}"
"Available components: ${CERES_COMPILED_COMPONENTS_STRING}.")
else()
ceres_set_not_found(
"${_Ceres_missing_required_components_reason}"
"No Ceres components are available.")
endif()
endif()
# Preserve the legacy uppercase result variable.
set(CERES_FOUND ${Ceres_FOUND})
if (NOT TARGET ceres)
# For backwards compatibility, create a local 'alias' target with the
# non-namespace-qualified Ceres target name. Note that this is not a
# true ALIAS library in CMake terms as they cannot point to imported targets.
add_library(ceres INTERFACE IMPORTED)
set_target_properties(ceres PROPERTIES INTERFACE_LINK_LIBRARIES Ceres::ceres)
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.17)
set_target_properties(ceres PROPERTIES DEPRECATION
"The unscoped import target `ceres' is deprecated and will be removed in a \
future Ceres Solver release. Please use the Ceres::ceres import target instead.")
endif (CMAKE_VERSION VERSION_GREATER_EQUAL 3.17)
endif()