# 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: keir@google.com (Keir Mierle)
#          alexs.mac@gmail.com (Alex Stewart)

cmake_minimum_required(VERSION 3.22...4.4)

# Opt into the experimental software bill of materials (SBOM) generation.
# CMake enables an experimental feature only if its gate variable is set to a
# specific UUID. The UUID acknowledges that the feature is unstable and may
# change with every CMake release. The values used here are documented in the
# corresponding CMake sources:
#
# https://gitlab.kitware.com/cmake/cmake/-/blob/v4.3.5/Help/dev/experimental.rst
# https://gitlab.kitware.com/cmake/cmake/-/blob/v4.4.4/Help/dev/experimental.rst
if (CMAKE_VERSION VERSION_GREATER_EQUAL 4.3)
  if (CMAKE_VERSION VERSION_LESS 4.4)
    set(CMAKE_EXPERIMENTAL_GENERATE_SBOM
      ca494ed3-b261-4205-a01f-603c95e4cae0)
  else (CMAKE_VERSION VERSION_LESS 4.4)
    set(CMAKE_EXPERIMENTAL_GENERATE_SBOM
      2d856d6d-53e8-488b-a17f-d486d2cac317)
  endif (CMAKE_VERSION VERSION_LESS 4.4)
endif (CMAKE_VERSION VERSION_GREATER_EQUAL 4.3)

# 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.
#       Ceres_SOURCE_DIR (note, *not* CERES_SOURCE_DIR) instead, as these will
#       always point to the correct directories for the Ceres project, even if
#       it is nested inside another source tree, whereas the 'generic'
#       CMake variables refer to the *first* project() declaration, i.e. the
#       top-level project, not Ceres, if Ceres is nested.

# Make CMake aware of the cmake folder for local FindXXX scripts,
# append rather than set in case the user has passed their own
# additional paths via -D.
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

# Load the module early here to query Ceres' version. The remaining modules can
# be loaded later especially since some of them rely on enabled languages which
# is done by project() (and an explicit enable_language()).
include(ReadCeresVersionFromSource)

read_ceres_version_from_source(${CMAKE_CURRENT_SOURCE_DIR})

project(Ceres
  DESCRIPTION "A large scale non-linear optimization library"
  HOMEPAGE_URL http://ceres-solver.org/
  LANGUAGES C CXX
  VERSION ${CERES_VERSION}
)

# 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)
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)
# Set postfixes for generated libraries based on buildtype.
set(CMAKE_RELEASE_POSTFIX "")
set(CMAKE_DEBUG_POSTFIX "-debug")

# Configure CMake checks and helper includes.
include(AddCompileFlagsIfSupported)
include(AddGerritCommitHook)
include(CeresCompileOptionsToComponents)
include(CheckCXXCompilerFlag)
include(CheckLibraryExists)
include(CMakeDependentOption)
include(CMakePackageConfigHelpers)
include(CreateCeresConfig)
include(DetectBrokenStackCheckMacOSXcodePairing)
include(EnableSanitizer)
include(FeatureSummary)
include(GNUInstallDirs)
include(PrettyPrintCMakeList)

function(ceres_register_found_package PACKAGE_NAME)
  set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND "${PACKAGE_NAME}")
endfunction()

# Ceres configuration options.
option(BUILD_BENCHMARKS "Build Ceres benchmarking suite" ON)
option(BUILD_DOCUMENTATION "Build User's Guide (html)" OFF)
cmake_dependent_option(BUILD_EXAMPLES "Build examples" ON "NOT IOS" OFF)
option(BUILD_SHARED_LIBS "Build Ceres as a shared library." OFF)
option(BUILD_TESTING "Enable tests" ON)
cmake_dependent_option(WITH_ACCELERATESPARSE
  "Enable use of sparse solvers in Apple's Accelerate framework." ON
  APPLE OFF)
cmake_dependent_option(WITH_BITCODE
  "Enable bitcode for iOS builds (disables inline optimizations for Eigen)." OFF
  IOS OFF)
set(WITH_CUDA "default" CACHE STRING
  "Enable use of CUDA linear algebra solvers.")
option(WITH_CUSTOM_BLAS
  "Use handcoded BLAS routines (usually faster) instead of Eigen." ON)
cmake_dependent_option(WITH_EIGENMETIS "Enable Eigen METIS support." ON
  "NOT DEFINED WITH_EIGENSPARSE OR WITH_EIGENSPARSE" OFF)
# The controlling option is declared later and defaults to ON.
option(WITH_EIGENSPARSE
  "Enable Eigen as a sparse linear algebra library." ON)
# Apple considers the BLAS dsyrk_ symbol a private API and rejects iOS apps
# that contain it.
cmake_dependent_option(WITH_LAPACK
  "Enable use of LAPACK directly within Ceres." ON "NOT IOS" OFF)
set(WITH_SANITIZERS "" CACHE STRING
  "Semicolon-separated list of sanitizers to use (e.g address, memory, thread)")
option(WITH_SCHUR_SPECIALIZATIONS
  "Enable fixed-size schur specializations." ON)
cmake_dependent_option(WITH_STRIPPED_DEBUG_SYMBOLS
  "Strip debug symbols from Android builds (reduces file sizes)" ON
  ANDROID OFF)
option(WITH_SUITESPARSE "Enable SuiteSparse." OFF)
option(WITH_UNINSTALL_TARGET
  "Add a custom target to ease removal of installed targets" ON)

set_property(CACHE WITH_CUDA PROPERTY STRINGS OFF default static)

# Discover dependencies.
if (NOT EXISTS "${Ceres_SOURCE_DIR}/third_party/abseil-cpp/CMakeLists.txt")
  find_package(absl REQUIRED 20240116)
endif()
find_package(AccelerateSparse)
# Version 1.3 was first to provide import targets.
find_package(benchmark 1.3)
find_package(BLAS)
find_package(LAPACK)
find_package(CUDAToolkit)
find_package(cudss NO_MODULE)

# Eigen3's CMake package prior to version 5.0.0 does not support version
# ranges with different major version components.
set (_Ceres_Eigen3_DIR)
if (Eigen3_DIR)
  set (_Ceres_Eigen3_DIR "${Eigen3_DIR}")
endif (Eigen3_DIR)

find_package(Eigen3 3.3.4...5 NO_MODULE)
if (NOT Eigen3_FOUND)
  if (_Ceres_Eigen3_DIR)
    set (Eigen3_DIR "${_Ceres_Eigen3_DIR}")
  endif (_Ceres_Eigen3_DIR)
  find_package(Eigen3 3.3.4 REQUIRED NO_MODULE)
endif (NOT Eigen3_FOUND)
unset (_Ceres_Eigen3_DIR)

if (NOT EXISTS "${Ceres_SOURCE_DIR}/third_party/googletest/CMakeLists.txt")
  find_package(GTest 1.14.0)
endif()

find_package(METIS)
find_package(Sphinx COMPONENTS sphinx_rtd_theme)
# Ubuntu 22.04 provides SuiteSparse 5.10.1, which remains supported.
find_package(SuiteSparse 4.5.6 COMPONENTS CHOLMOD SPQR
  OPTIONAL_COMPONENTS Partition)
find_package(Threads REQUIRED)

# Show dependencies in importance order in the CMake feature summary.
set_property(GLOBAL PROPERTY FeatureSummary_PKG_TYPES
  REQUIRED RECOMMENDED OPTIONAL)

check_cxx_compiler_flag(/bigobj HAVE_BIGOBJ)
# Older versions of Clang (<= 2.9) do not support the 'return-type-c-linkage'
# option, so check for its presence before adding it to the default flags set.
check_cxx_compiler_flag("-Wno-return-type-c-linkage"
                        HAVE_RETURN_TYPE_C_LINKAGE)
check_library_exists(m pow "" HAVE_LIBM)

detect_broken_stack_check_macos_xcode_pairing()
enable_sanitizer(${WITH_SANITIZERS})

if (BUILD_TESTING)
  enable_testing()
endif()

# Set up the git hook to make Gerrit Change-Id: lines in commit messages.
add_gerrit_commit_hook(${Ceres_SOURCE_DIR} ${Ceres_BINARY_DIR})

# Abseil
if (EXISTS "${Ceres_SOURCE_DIR}/third_party/abseil-cpp/CMakeLists.txt")
  # extract submodule absl_VERSION
  file(STRINGS "${Ceres_SOURCE_DIR}/third_party/abseil-cpp/CMakeLists.txt" project_calls REGEX "[ \t]*project\\([ \t]*absl")
  foreach(project_call IN LISTS project_calls)
    string(REGEX MATCH "VERSION[ ]+([0-9]+(\.(rc)?[0-9]+)?)" version_param "${project_call}")
      if (version_param)
        set(absl_VERSION "${CMAKE_MATCH_1}")
        break ()
      endif()
  endforeach()
  unset(project_calls)
  unset(project_call)
  unset(version_param)
  # 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)
  export(EXPORT abslTargets
    FILE "${Ceres_BINARY_DIR}/third_party/abseil-cpp/abslTargets.cmake"
    NAMESPACE absl::)
  set(absl_FOUND TRUE)
  ceres_register_found_package(absl)

  unset(CMAKE_CXX_STANDARD)
  unset(CMAKE_CXX_VISIBILITY_PRESET)

  set(CERES_USE_SYSTEM_ABSL NO)
else()
  if (NOT absl_VERSION)
    # In some installs, abseil will not export the version number, in
    # which case we check for vlog_is_on, which is a feature we need
    # before being able to use abseil.
    if (NOT TARGET absl::absl_vlog_is_on)
      message(FATAL_ERROR "The version of abseil installed on the system provides no version info and is missing TARGET 'absl::absl_vlog_is_on', need at least 20240116")
    endif()
  endif()
  set(CERES_USE_SYSTEM_ABSL YES)
endif()

# 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)
if (NOT absl_VERSION)
  install (CODE [=[message (FATAL_ERROR "Cannot generate CeresConfig.cmake due to missing Abseil version. Using resulting package configuration will likely result in integration errors. Set absl_VERSION manually to disable this error message.")]=])
endif()

# Google Test
if (BUILD_TESTING)
  if (EXISTS "${Ceres_SOURCE_DIR}/third_party/googletest/CMakeLists.txt")
    file(STRINGS "${Ceres_SOURCE_DIR}/third_party/googletest/CMakeLists.txt"
      googletest_version_lines REGEX "set\\([ \\t]*GOOGLETEST_VERSION")
    foreach(googletest_version_line IN LISTS googletest_version_lines)
      string(REGEX MATCH "GOOGLETEST_VERSION[ \\t]+([0-9]+(\\.[0-9]+)+)"
        googletest_version_match "${googletest_version_line}")
      if (googletest_version_match)
        set(GOOGLETEST_VERSION "${CMAKE_MATCH_1}")
        break()
      endif()
    endforeach()
    unset(googletest_version_lines)
    unset(googletest_version_line)
    unset(googletest_version_match)
    # 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")

    # GoogleTest is only needed for building the tests and must therefore not
    # be installed alongside Ceres.
    set(INSTALL_GTEST OFF)
    add_subdirectory(third_party/googletest)
    set(GTest_FOUND TRUE)
    ceres_register_found_package(GTest)
  else()
    if (NOT GTest_FOUND)
      message(FATAL_ERROR "GoogleTest 1.14.0 or newer is required to build tests")
    endif()
    set(GOOGLETEST_VERSION "${GTest_VERSION}")
  endif()
endif(BUILD_TESTING)

# IOS is defined iff using the iOS.cmake CMake toolchain to build a static
# library for iOS.
if (IOS)
  message(VERBOSE "Building Ceres for iOS platform: ${IOS_PLATFORM}")

  # Ceres requires at least iOS 7.0+.
  if (IOS_DEPLOYMENT_TARGET VERSION_LESS 7.0)
    message(FATAL_ERROR "Unsupported iOS version: ${IOS_DEPLOYMENT_TARGET}, Ceres "
      "requires at least iOS version 7.0")
  endif()
endif (IOS)

# Compute effective feature states once so build configuration and the summary
# cannot disagree about which optional components are available.
set(_Ceres_FEATURE_ACCELERATE OFF)
if (WITH_ACCELERATESPARSE AND AccelerateSparse_FOUND)
  set(_Ceres_FEATURE_ACCELERATE ON)
endif()

set(_Ceres_FEATURE_CUDA OFF)
if (WITH_CUDA AND CUDAToolkit_FOUND)
  set(_Ceres_FEATURE_CUDA ON)
endif()

set(_Ceres_FEATURE_CUDSS OFF)
if (_Ceres_FEATURE_CUDA AND cudss_FOUND)
  set(_Ceres_FEATURE_CUDSS ON)
endif()

set(_Ceres_FEATURE_EIGEN_METIS OFF)
if (WITH_EIGENMETIS AND METIS_FOUND)
  set(_Ceres_FEATURE_EIGEN_METIS ON)
endif()

set(_Ceres_FEATURE_EIGEN_SPARSE OFF)
if (WITH_EIGENSPARSE AND Eigen3_FOUND)
  set(_Ceres_FEATURE_EIGEN_SPARSE ON)
endif()

set(_Ceres_FEATURE_LAPACK OFF)
if (WITH_LAPACK AND LAPACK_FOUND)
  set(_Ceres_FEATURE_LAPACK ON)
endif()

set(_Ceres_FEATURE_SUITESPARSE OFF)
if (WITH_SUITESPARSE AND SuiteSparse_FOUND)
  set(_Ceres_FEATURE_SUITESPARSE ON)
endif()

set(_Ceres_FEATURE_CHOLMOD_PARTITION OFF)
if (_Ceres_FEATURE_SUITESPARSE AND SuiteSparse_Partition_FOUND)
  set(_Ceres_FEATURE_CHOLMOD_PARTITION ON)
endif()

set(_Ceres_FEATURE_DOCUMENTATION OFF)
if (BUILD_DOCUMENTATION AND Sphinx_FOUND)
  set(_Ceres_FEATURE_DOCUMENTATION ON)
endif()

set(_Ceres_FEATURE_BENCHMARKS OFF)
if (BUILD_BENCHMARKS AND benchmark_FOUND)
  set(_Ceres_FEATURE_BENCHMARKS ON)
endif()

set(WITH_CHOLMOD_FLOAT OFF)
if (_Ceres_FEATURE_SUITESPARSE AND
    SuiteSparse_VERSION VERSION_GREATER_EQUAL 7.4.0)
  set(WITH_CHOLMOD_FLOAT ON)
endif()

unset(CERES_COMPILE_OPTIONS)

if (_Ceres_FEATURE_EIGEN_SPARSE)
  list(APPEND CERES_COMPILE_OPTIONS CERES_USE_EIGEN_SPARSE)
else()
  add_definitions(-DEIGEN_MPL2_ONLY)
endif()

if (_Ceres_FEATURE_CUDA)
  set(CUDAToolkit_DEPENDENCY
    "find_dependency(CUDAToolkit ${CUDAToolkit_VERSION})")
  enable_language(CUDA)
  set(CMAKE_CUDA_ARCHITECTURES "")
  if (CUDAToolkit_VERSION VERSION_LESS "13.0")
    # Support Maxwell GPUs.
    list(APPEND CMAKE_CUDA_ARCHITECTURES "50")
    if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "8.0")
      # Support Pascal GPUs.
      list(APPEND CMAKE_CUDA_ARCHITECTURES "60")
    endif()
    if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "9.0")
      # Support Volta GPUs.
      list(APPEND CMAKE_CUDA_ARCHITECTURES "70")
    endif()
  endif()
  if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "10.0")
    # Support Turing GPUs.
    list(APPEND CMAKE_CUDA_ARCHITECTURES "75")
  endif()
  if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "11.0")
    # Support Ampere GPUs.
    list(APPEND CMAKE_CUDA_ARCHITECTURES "80")
  endif()
  if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "12.0")
    # Support Hopper GPUs.
    list(APPEND CMAKE_CUDA_ARCHITECTURES "90")
  endif()

  if (WITH_CUDA STREQUAL "static")
    set(CERES_CUDA_TARGET_SUFFIX "_static")
  else()
    set(CERES_CUDA_TARGET_SUFFIX "")
  endif()
  list(APPEND CERES_CUDA_LIBRARIES
    CUDA::cublas${CERES_CUDA_TARGET_SUFFIX}
    CUDA::cudart${CERES_CUDA_TARGET_SUFFIX}
    CUDA::cusolver${CERES_CUDA_TARGET_SUFFIX}
    CUDA::cusparse${CERES_CUDA_TARGET_SUFFIX})

  if (_Ceres_FEATURE_CUDSS)
    set(cudss_DEPENDENCY "find_dependency(cudss ${cudss_VERSION})")
    list(APPEND CERES_CUDA_LIBRARIES cudss${CERES_CUDA_TARGET_SUFFIX})
  else()
    list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUDSS)
  endif()

  unset (CERES_CUDA_TARGET_SUFFIX)
  set(CMAKE_CUDA_RUNTIME_LIBRARY NONE)
else()
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUDSS)
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUDA)
endif()

if (NOT _Ceres_FEATURE_LAPACK)
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_LAPACK)
endif()

# Set the install path for the installed CeresConfig.cmake configuration file
# relative to CMAKE_INSTALL_PREFIX.
set(RELATIVE_CMAKECONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/Ceres)
set(_Ceres_CONFIG_DEPENDENCY_MODULES)

if (_Ceres_FEATURE_SUITESPARSE)
  # SuiteSparse support is opt-in and was explicitly requested. If it and
  # all of its dependencies are found, Ceres is built with SuiteSparse
  # support.

  set(SuiteSparse_DEPENDENCY "find_dependency(SuiteSparse ${SuiteSparse_VERSION})")
  if (NOT WITH_CHOLMOD_FLOAT)
    list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CHOLMOD_FLOAT)
  endif()
  if (SuiteSparse_NO_CMAKE OR NOT SuiteSparse_DIR)
    list(APPEND _Ceres_CONFIG_DEPENDENCY_MODULES
      ${Ceres_SOURCE_DIR}/cmake/FindSuiteSparse.cmake
      ${Ceres_SOURCE_DIR}/cmake/FindMETIS.cmake)
  endif (SuiteSparse_NO_CMAKE OR NOT SuiteSparse_DIR)
else()
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_SUITESPARSE)
endif()

if (NOT _Ceres_FEATURE_CHOLMOD_PARTITION)
  list (APPEND CERES_COMPILE_OPTIONS CERES_NO_CHOLMOD_PARTITION)
endif()

if (_Ceres_FEATURE_EIGEN_METIS)
    # Since METIS is a private dependency of Ceres, it requires access to the
    # link-only METIS::METIS target to avoid undefined linker errors in projects
    # relying on Ceres. We do not actually need to propagate anything besides
    # the link libraries (such as include directories.)
    set(METIS_DEPENDENCY "find_dependency(METIS ${METIS_VERSION})")
    # METIS find module must be installed unless a package config is being used.
    if (NOT METIS_DIR)
      list(APPEND _Ceres_CONFIG_DEPENDENCY_MODULES
        ${Ceres_SOURCE_DIR}/cmake/FindMETIS.cmake)
    endif (NOT METIS_DIR)
else()
  list (APPEND CERES_COMPILE_OPTIONS CERES_NO_EIGEN_METIS)
endif()

if (NOT _Ceres_FEATURE_ACCELERATE)
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_ACCELERATE_SPARSE)
  mark_as_advanced(FORCE AccelerateSparse_INCLUDE_DIR
                         AccelerateSparse_LIBRARY)
endif()

# ANDROID define is set by the Android CMake toolchain file.
if (ANDROID)
  if (WITH_STRIPPED_DEBUG_SYMBOLS)
    # Strip debug information unconditionally to avoid +200MB library file sizes.
    set( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -s" )
    set( CMAKE_SHARED_LINKER_FLAGS  "${CMAKE_SHARED_LINKER_FLAGS} -s" )
  endif()
endif()

if (NOT WITH_SCHUR_SPECIALIZATIONS)
  list(APPEND CERES_COMPILE_OPTIONS CERES_RESTRICT_SCHUR_SPECIALIZATION)
endif (NOT WITH_SCHUR_SPECIALIZATIONS)

if (NOT WITH_CUSTOM_BLAS)
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUSTOM_BLAS)
endif (NOT WITH_CUSTOM_BLAS)

# Change the default build type from Debug to Release, while still
# supporting overriding the build type.
#
# The CACHE STRING logic here and elsewhere is needed to force CMake
# to pay attention to the value of these variables.
if (NOT CMAKE_BUILD_TYPE)
  message(STATUS "No build type specified; defaulting to CMAKE_BUILD_TYPE=Release.")
  set(CMAKE_BUILD_TYPE Release CACHE STRING
    "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
    FORCE)
else (NOT CMAKE_BUILD_TYPE)
  if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    message(STATUS "\n=================================================================================")
    message(STATUS "\nBuild type: Debug. Performance will be terrible!")
    message(STATUS "Add -DCMAKE_BUILD_TYPE=Release to the CMake command line to get an optimized build.")
    message(STATUS "\n=================================================================================")
  endif (CMAKE_BUILD_TYPE STREQUAL "Debug")
endif (NOT CMAKE_BUILD_TYPE)

# After the tweaks for the compile settings, disable some warnings on MSVC.
if (MSVC)
  # Insecure standard library functions
  add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
  # std::numeric_limits<T>::has_denorm is deprecated in C++23
  add_compile_definitions($<$<COMPILE_LANGUAGE:CXX>:_SILENCE_CXX23_DENORM_DEPRECATION_WARNING>)
  # std::aligned_storage is deprecated in C++23
  add_compile_definitions($<$<COMPILE_LANGUAGE:CXX>:_SILENCE_CXX23_ALIGNED_STORAGE_DEPRECATION_WARNING>)
  # Disable signed/unsigned int conversion warnings.
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/wd4018>)
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/wd4267>)
  # Disable warning about using struct/class for the same symbol.
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/wd4099>)
  # Disable performance warning about int-to-bool conversion.
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/wd4800>)
  # Disable warning about int64 to int32 conversion. Disabling
  # this warning may not be correct; needs investigation.
  # TODO(keir): Investigate these warnings in more detail.
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/wd4244>)
  # MSVC warns about exported classes with members whose types, such as those
  # from the standard library, are not exported themselves. This cannot be
  # avoided portably, so disable the warning.
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/wd4251>)

  # Add bigobj flag otherwise the build would fail due to large object files
  # probably resulting from generated headers (like the fixed-size schur
  # specializations).
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/bigobj>)
endif (MSVC)

if (UNIX)
  # Flags which we add to GCC to make it more picky about stuff
  # we do care about,
  add_cxx_compiler_flag_if_supported(CERES_STRICT_CXX_FLAGS
                                     -Wmissing-declarations)
  # Flags which we add to GCC to silence lots of annoying false-positives.
  add_cxx_compiler_flag_if_supported(CERES_STRICT_CXX_FLAGS
                                     -Wno-unknown-pragmas)
  add_cxx_compiler_flag_if_supported(CERES_STRICT_CXX_FLAGS
                                     -Wno-sign-compare)
  add_cxx_compiler_flag_if_supported(CERES_STRICT_CXX_FLAGS
                                     -Wno-unused-parameter)
  add_cxx_compiler_flag_if_supported(CERES_STRICT_CXX_FLAGS
                                     -Wno-missing-field-initializers)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CERES_STRICT_CXX_FLAGS}")
endif (UNIX)

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Matches Clang & AppleClang.
  # Optimize for Eigen OR enable bitcode; you cannot do both since bitcode is an
  # intermediate representation.
  if (WITH_BITCODE)
    set(CMAKE_CXX_FLAGS
      "${CMAKE_CXX_FLAGS} -fembed-bitcode")
  else ()
    # Use a larger inlining threshold for Clang, since it hobbles Eigen,
    # resulting in an unreasonably slow version of the blas routines. The
    # -Qunused-arguments is needed because CMake passes the inline
    # threshold to the linker and clang complains about it and dies.
    set(CMAKE_CXX_FLAGS
      "${CMAKE_CXX_FLAGS} -Qunused-arguments -mllvm -inline-threshold=600")
  endif ()
  if (HAVE_RETURN_TYPE_C_LINKAGE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type-c-linkage")
  endif(HAVE_RETURN_TYPE_C_LINKAGE)
endif ()

add_compile_definitions($<$<BOOL:${WIN32}>:NOMINMAX>)

# Configure the Ceres config.h compile options header using the current
# compile options and put the configured header into the Ceres build
# directory.  Note that the ceres/internal subdir in <build>/config where
# the configured config.h is placed is important, because Ceres will be
# built against this configured header, it needs to have the same relative
# include path as it would if it were in the source tree (or installed).
list(REMOVE_DUPLICATES CERES_COMPILE_OPTIONS)
create_ceres_config("${CERES_COMPILE_OPTIONS}"
  ${Ceres_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/ceres/internal)

add_subdirectory(internal/ceres)

if (_Ceres_FEATURE_DOCUMENTATION)
  # Generate the User's Guide (html).
  # The corresponding target is ceres_docs, but is included in ALL.
  add_subdirectory(docs)
endif (_Ceres_FEATURE_DOCUMENTATION)

if (BUILD_EXAMPLES)
  add_subdirectory(examples)
endif (BUILD_EXAMPLES)

# Setup installation of Ceres public headers.
file(GLOB CERES_HDRS ${Ceres_SOURCE_DIR}/include/ceres/*.h)
install(FILES ${CERES_HDRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ceres)

file(GLOB CERES_PUBLIC_INTERNAL_HDRS ${Ceres_SOURCE_DIR}/include/ceres/internal/*.h)
install(FILES ${CERES_PUBLIC_INTERNAL_HDRS} DESTINATION
  ${CMAKE_INSTALL_INCLUDEDIR}/ceres/internal)

# Also setup installation of Ceres config.h configured with the current
# build options and export.h into the installed headers directory.
install(DIRECTORY ${Ceres_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

# Ceres supports two mechanisms by which it can be detected & imported into
# client code which uses CMake via find_package(Ceres):
#
#   1) Installation (e.g. to /usr/local), using CMake's install() function.
#
#   2) (Optional) Export of the current build directory into the local CMake
#      package registry, using CMake's export() function.  This allows use of
#      Ceres from other projects without requiring installation.
#
# In both cases, we need to generate a configured CeresConfig.cmake which
# includes additional autogenerated files which in concert create an imported
# target for Ceres in a client project when find_package(Ceres) is invoked.
# The key distinctions are where this file is located, and whether client code
# references installed copies of the compiled Ceres headers/libraries,
# (option #1: installation), or the originals in the source/build directories
# (option #2: export of build directory).
#
# NOTE: If Ceres is both exported and installed, provided that the installation
#       path is present in CMAKE_MODULE_PATH when find_package(Ceres) is called,
#       the installed version is preferred.

# Build the list of Ceres components for CeresConfig.cmake from the current set
# of compile options.
ceres_compile_options_to_components("${CERES_COMPILE_OPTIONS}"
  CERES_COMPILED_COMPONENTS)

# Make dependency modules available relative to the package config.
list(REMOVE_DUPLICATES _Ceres_CONFIG_DEPENDENCY_MODULES)
set(_Ceres_FIND_MODULES
  "${Ceres_SOURCE_DIR}/cmake/FindAccelerateSparse.cmake"
  "${Ceres_SOURCE_DIR}/cmake/FindMETIS.cmake"
  "${Ceres_SOURCE_DIR}/cmake/FindSphinx.cmake"
  "${Ceres_SOURCE_DIR}/cmake/FindSuiteSparse.cmake")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
  ${_Ceres_FIND_MODULES})
set(_Ceres_FIND_MODULES_LINK "${Ceres_BINARY_DIR}/CeresFindModules")
if (IS_SYMLINK "${_Ceres_FIND_MODULES_LINK}")
  file(REMOVE "${_Ceres_FIND_MODULES_LINK}")
elseif(EXISTS "${_Ceres_FIND_MODULES_LINK}"
    AND NOT IS_DIRECTORY "${_Ceres_FIND_MODULES_LINK}")
  message(FATAL_ERROR
    "CeresFindModules exists but is not a directory: "
    "${_Ceres_FIND_MODULES_LINK}")
endif()
file(MAKE_DIRECTORY "${_Ceres_FIND_MODULES_LINK}")
foreach(_Ceres_FIND_MODULE IN LISTS _Ceres_FIND_MODULES)
  get_filename_component(_Ceres_FIND_MODULE_NAME
    "${_Ceres_FIND_MODULE}" NAME)
  file(CREATE_LINK
    "${_Ceres_FIND_MODULE}"
    "${_Ceres_FIND_MODULES_LINK}/${_Ceres_FIND_MODULE_NAME}"
    SYMBOLIC COPY_ON_ERROR
    RESULT _Ceres_FIND_MODULE_LINK_RESULT)
  if (_Ceres_FIND_MODULE_LINK_RESULT)
    message(FATAL_ERROR
      "Creating the link for '${_Ceres_FIND_MODULE}' returned "
      "'${_Ceres_FIND_MODULE_LINK_RESULT}', expected '0'")
  endif()
endforeach()
if (_Ceres_CONFIG_DEPENDENCY_MODULES)
  install(FILES ${_Ceres_CONFIG_DEPENDENCY_MODULES}
    DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR})
endif()

# The license of the installed package covers the Ceres sources and the
# installed find modules, but not the dependencies which are licensed
# separately.
set(_Ceres_SPDX_LICENSE BSD-3-Clause)
if ("${Ceres_SOURCE_DIR}/cmake/FindMETIS.cmake" IN_LIST
    _Ceres_CONFIG_DEPENDENCY_MODULES)
  string(APPEND _Ceres_SPDX_LICENSE " AND MIT")
endif()
unset(_Ceres_CONFIG_DEPENDENCY_MODULES)
unset(_Ceres_FIND_MODULE)
unset(_Ceres_FIND_MODULE_LINK_RESULT)
unset(_Ceres_FIND_MODULE_NAME)
unset(_Ceres_FIND_MODULES)
unset(_Ceres_FIND_MODULES_LINK)


# Create a CeresConfigVersion.cmake file containing the version information,
# used by both export() & install().
write_basic_package_version_file("${Ceres_BINARY_DIR}/CeresConfigVersion.cmake"
  VERSION ${CERES_VERSION}
  COMPATIBILITY SameMajorVersion)

# Generate one package config for build-tree use and installation.
configure_package_config_file(
  "${Ceres_SOURCE_DIR}/cmake/CeresConfig.cmake.in"
  "${Ceres_BINARY_DIR}/CeresConfig.cmake"
  INSTALL_DESTINATION "${RELATIVE_CMAKECONFIG_INSTALL_DIR}"
  NO_SET_AND_CHECK_MACRO)

# Install method #1: Put Ceres in CMAKE_INSTALL_PREFIX: /usr/local or equivalent.

# This "exports" for installation all targets which have been put into the
# export set "CeresExport". This generates a CeresTargets.cmake file which,
# when read in by a client project as part of find_package(Ceres) creates
# imported library targets for Ceres (with dependency relations) which can be
# used in target_link_libraries() calls in the client project to use Ceres.
#
install(EXPORT CeresExport
        NAMESPACE Ceres::
        DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR} FILE CeresTargets.cmake)

# Install the configuration files into the same directory as the autogenerated
# CeresTargets.cmake file.  We include the find_package() scripts for libraries
# whose headers are included in the public API of Ceres and should thus be
# present in CERES_INCLUDE_DIRS.
install(FILES "${Ceres_BINARY_DIR}/CeresConfig.cmake"
        DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR})
install(FILES "${Ceres_BINARY_DIR}/CeresConfigVersion.cmake"
        DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR})

set_property(TARGET ceres PROPERTY SPDX_LICENSE BSD-3-Clause)

if (TARGET ceres_cuda_kernels)
  set_property(TARGET ceres_cuda_kernels PROPERTY SPDX_LICENSE BSD-3-Clause)
endif (TARGET ceres_cuda_kernels)

# SBOM generation fails for targets whose link libraries contain generator
# expressions, such as the whole archive linkage of a static Abseil.
set(_Ceres_SBOM_SUPPORTED OFF)

if (CMAKE_VERSION VERSION_GREATER_EQUAL 4.3
    AND CMAKE_EXPERIMENTAL_GENERATE_SBOM)
  set(_Ceres_SBOM_SUPPORTED ON)

  foreach (_Ceres_TARGET IN ITEMS ceres ceres_cuda_kernels)
    if (NOT TARGET ${_Ceres_TARGET})
      continue()
    endif (NOT TARGET ${_Ceres_TARGET})

    get_target_property(_Ceres_LINK_LIBRARIES ${_Ceres_TARGET} LINK_LIBRARIES)

    if (_Ceres_LINK_LIBRARIES MATCHES "\\$<")
      message(WARNING "Skipping SBOM generation because the link libraries "
        "of target ${_Ceres_TARGET} contain generator expressions: "
        "${_Ceres_LINK_LIBRARIES}")
      set(_Ceres_SBOM_SUPPORTED OFF)
    endif (_Ceres_LINK_LIBRARIES MATCHES "\\$<")
  endforeach (_Ceres_TARGET IN ITEMS ceres ceres_cuda_kernels)

  unset(_Ceres_LINK_LIBRARIES)
  unset(_Ceres_TARGET)
endif (CMAKE_VERSION VERSION_GREATER_EQUAL 4.3
  AND CMAKE_EXPERIMENTAL_GENERATE_SBOM)

if (_Ceres_SBOM_SUPPORTED)
  set(_Ceres_SBOM_ARGUMENTS
    PROJECT Ceres
    DESTINATION ${CMAKE_INSTALL_DATADIR}/sbom
    VERSION ${CERES_VERSION}
    LICENSE ${_Ceres_SPDX_LICENSE}
    DESCRIPTION "${PROJECT_DESCRIPTION}"
    HOMEPAGE_URL ${PROJECT_HOMEPAGE_URL}
    FORMAT spdx-3.0+json
  )

  if (CMAKE_VERSION VERSION_GREATER_EQUAL 4.4)
    # The experimental SBOM support is enabled deliberately. Silence the
    # corresponding warning for this command only.
    block(SCOPE_FOR DIAGNOSTICS)
      cmake_diagnostic(SET CMD_EXPERIMENTAL IGNORE)
      install(SBOM Ceres
        EXPORTS CeresExport
        PACKAGE_URL https://github.com/ceres-solver/ceres-solver
        ${_Ceres_SBOM_ARGUMENTS}
      )
    endblock()
  else (CMAKE_VERSION VERSION_GREATER_EQUAL 4.4)
    # CMake 4.3 provides no means to silence the warning from within the
    # project. Users can pass -Wno-dev instead.
    install(SBOM Ceres
      EXPORT CeresExport
      ${_Ceres_SBOM_ARGUMENTS}
    )
  endif (CMAKE_VERSION VERSION_GREATER_EQUAL 4.4)

  unset(_Ceres_SBOM_ARGUMENTS)
endif (_Ceres_SBOM_SUPPORTED)

unset(_Ceres_SBOM_SUPPORTED)
unset(_Ceres_SPDX_LICENSE)

if (WITH_UNINSTALL_TARGET)
  # Create an uninstall target to remove all installed files.
  configure_file("${Ceres_SOURCE_DIR}/cmake/uninstall.cmake.in"
                 "${Ceres_BINARY_DIR}/cmake/uninstall.cmake"
                 @ONLY)
  add_custom_target(uninstall
                    COMMAND ${CMAKE_COMMAND} -P ${Ceres_BINARY_DIR}/cmake/uninstall.cmake)
endif()

# Install method #2: Export the Ceres build directory.
#
# The package files are always generated in the build tree. CMake's
# CMAKE_EXPORT_PACKAGE_REGISTRY variable controls whether export(PACKAGE)
# registers the package in the user package registry.
set (Ceres_EXPORT_TARGETS ceres)

if (TARGET ceres_cuda_kernels)
  # The target ceres depends on ceres_cuda_kernels requiring the latter to be
  # exported as part of the same export set.
  list (APPEND Ceres_EXPORT_TARGETS ceres_cuda_kernels)
endif (TARGET ceres_cuda_kernels)

export(TARGETS ${Ceres_EXPORT_TARGETS}
       NAMESPACE Ceres::
       FILE ${Ceres_BINARY_DIR}/CeresTargets.cmake)
export(PACKAGE ${CMAKE_PROJECT_NAME})

unset (Ceres_EXPORT_TARGETS)

add_feature_info("SuiteSparse solvers" _Ceres_FEATURE_SUITESPARSE
  "Sparse solvers from SuiteSparse")
add_feature_info("CUDA solvers" _Ceres_FEATURE_CUDA
  "CUDA-accelerated linear solvers")
add_feature_info("cuDSS solver" _Ceres_FEATURE_CUDSS
  "Use the cuDSS sparse linear solver when available")
add_feature_info("Accelerate sparse solvers" _Ceres_FEATURE_ACCELERATE
  "Sparse solvers from Apple's Accelerate framework")
add_feature_info("Eigen sparse solvers" _Ceres_FEATURE_EIGEN_SPARSE
  "Sparse linear solvers using Eigen")
add_feature_info("Eigen METIS ordering" _Ceres_FEATURE_EIGEN_METIS
  "METIS ordering for Eigen sparse solvers")
add_feature_info("CHOLMOD partitioning" _Ceres_FEATURE_CHOLMOD_PARTITION
  "CHOLMOD graph partitioning")
add_feature_info("CHOLMOD single precision" WITH_CHOLMOD_FLOAT
  "Single-precision CHOLMOD factorization")
add_feature_info("Use LAPACK" _Ceres_FEATURE_LAPACK
  "Use LAPACK directly for linear algebra operations")
add_feature_info("Custom BLAS" WITH_CUSTOM_BLAS
  "Use Ceres hand-written BLAS routines")
add_feature_info("Schur specializations" WITH_SCHUR_SPECIALIZATIONS
  "Fixed-size Schur solver specializations")
add_feature_info("Shared library" BUILD_SHARED_LIBS
  "Build Ceres as a shared library instead of a static library")
add_feature_info("Documentation" _Ceres_FEATURE_DOCUMENTATION
  "Build the Ceres HTML documentation with Sphinx")
add_feature_info("Examples" BUILD_EXAMPLES "Build Ceres example programs")
add_feature_info("Benchmarks" _Ceres_FEATURE_BENCHMARKS
  "Build Ceres microbenchmark programs")
add_feature_info("Tests" BUILD_TESTING "Build Ceres unit and integration tests")

function(ceres_dependency_description OUTPUT DESCRIPTION VERSION)
  if (VERSION)
    set(DESCRIPTION "${DESCRIPTION} (version ${VERSION})")
  endif()
  set(${OUTPUT} "${DESCRIPTION}" PARENT_SCOPE)
endfunction()

ceres_dependency_description(CERES_ABSL_DESCRIPTION
  "C++ common libraries from Google" "${absl_VERSION}")
ceres_dependency_description(CERES_BENCHMARK_DESCRIPTION
  "A microbenchmark support library" "${benchmark_VERSION}")
ceres_dependency_description(CERES_CUDA_DESCRIPTION
  "NVIDIA CUDA toolkit" "${CUDAToolkit_VERSION}")
ceres_dependency_description(CERES_CUDSS_DESCRIPTION
  "NVIDIA CUDA sparse solver library" "${cudss_VERSION}")
ceres_dependency_description(CERES_EIGEN3_DESCRIPTION
  "C++ template library for linear algebra" "${Eigen3_VERSION}")
ceres_dependency_description(CERES_GTEST_DESCRIPTION
  "Google's C++ testing framework" "${GOOGLETEST_VERSION}")
ceres_dependency_description(CERES_METIS_DESCRIPTION
  "Serial graph partitioning and fill-reducing matrix ordering"
  "${METIS_VERSION}")
ceres_dependency_description(CERES_PYTHON_DESCRIPTION
  "Python interpreter" "${Python_VERSION}")
ceres_dependency_description(CERES_SPHINX_DESCRIPTION
  "Documentation generator" "${Sphinx_VERSION}")
ceres_dependency_description(CERES_SUITESPARSE_DESCRIPTION
  "A suite of sparse matrix algorithms" "${SuiteSparse_VERSION}")
ceres_dependency_description(CERES_TBB_DESCRIPTION
  "Threading Building Blocks" "${TBB_VERSION}")

set_package_properties(absl PROPERTIES
  DESCRIPTION "${CERES_ABSL_DESCRIPTION}"
  TYPE REQUIRED
  URL "https://abseil.io")
set_package_properties(AccelerateSparse PROPERTIES
  DESCRIPTION "Apple's Accelerate framework with sparse linear solvers")
set_package_properties(benchmark PROPERTIES
  DESCRIPTION "${CERES_BENCHMARK_DESCRIPTION}"
  URL "https://github.com/google/benchmark"
  PURPOSE "Benchmarking of Ceres")
set_package_properties(BLAS PROPERTIES
  DESCRIPTION "Basic Linear Algebra Subprograms implementation"
  PURPOSE "LAPACK dependency")
set_package_properties(CUDAToolkit PROPERTIES
  DESCRIPTION "${CERES_CUDA_DESCRIPTION}"
  URL "https://developer.nvidia.com/cuda-toolkit"
  PURPOSE "CUDA solver acceleration")
set_package_properties(cudss PROPERTIES
  DESCRIPTION "${CERES_CUDSS_DESCRIPTION}"
  URL "https://developer.nvidia.com/cudss"
  PURPOSE "CUDA sparse solver support")
set_package_properties(Eigen3 PROPERTIES
  DESCRIPTION "${CERES_EIGEN3_DESCRIPTION}"
  TYPE REQUIRED
  URL "https://eigen.tuxfamily.org")
set_package_properties(GTest PROPERTIES
  DESCRIPTION "${CERES_GTEST_DESCRIPTION}"
  URL "https://github.com/google/googletest"
  PURPOSE "Ceres unit tests")
set_package_properties(LAPACK PROPERTIES
  DESCRIPTION "Linear Algebra PACKage implementation"
  TYPE RECOMMENDED)
set_package_properties(METIS PROPERTIES
  DESCRIPTION "${CERES_METIS_DESCRIPTION}"
  TYPE RECOMMENDED)
set_package_properties(Python PROPERTIES
  DESCRIPTION "${CERES_PYTHON_DESCRIPTION}"
  URL "https://www.python.org"
  PURPOSE "Sphinx documentation generation")
set_package_properties(Sphinx PROPERTIES
  DESCRIPTION "${CERES_SPHINX_DESCRIPTION}"
  URL "https://www.sphinx-doc.org"
  PURPOSE "Building the Ceres documentation")
set_package_properties(SuiteSparse PROPERTIES
  DESCRIPTION "${CERES_SUITESPARSE_DESCRIPTION}"
  TYPE RECOMMENDED
  URL "https://github.com/DrTimothyAldenDavis/SuiteSparse")
set_package_properties(TBB PROPERTIES
  DESCRIPTION "${CERES_TBB_DESCRIPTION}"
  PURPOSE "SuiteSparseQR dependency")
set_package_properties(Threads PROPERTIES
  DESCRIPTION "Native platform threading support"
  PURPOSE "Multithreading support")

foreach(CERES_PACKAGE_PROPERTY IN ITEMS PACKAGES_FOUND PACKAGES_NOT_FOUND)
  # Keep package summary output unique and alphabetically ordered.
  get_property(CERES_PACKAGE_NAMES GLOBAL PROPERTY ${CERES_PACKAGE_PROPERTY})
  list(REMOVE_DUPLICATES CERES_PACKAGE_NAMES)
  list(SORT CERES_PACKAGE_NAMES COMPARE STRING CASE INSENSITIVE)
  set_property(GLOBAL PROPERTY ${CERES_PACKAGE_PROPERTY} "${CERES_PACKAGE_NAMES}")
endforeach()

feature_summary(WHAT
  REQUIRED_PACKAGES_FOUND
  RECOMMENDED_PACKAGES_FOUND
  OPTIONAL_PACKAGES_FOUND
  REQUIRED_PACKAGES_NOT_FOUND
  RECOMMENDED_PACKAGES_NOT_FOUND
  OPTIONAL_PACKAGES_NOT_FOUND
  ENABLED_FEATURES
  DISABLED_FEATURES
  DESCRIPTION "Ceres ${CERES_VERSION} configuration summary")
