.. _chapter-installation:

============
Installation
============

.. _section-dependencies:

Dependencies
============

 .. note ::

    Starting with version 2.2, Ceres Solver requires a **fully
    C++17-compliant** compiler.

Ceres relies on a number of open source libraries, some of which are
optional. For details on customizing the build process, see
:ref:`section-customizing` .

- `CMake <https://cmake.org>`_ (**Required**) 3.22 or later.

- `Eigen <https://libeigen.gitlab.io/>`_
  (**Required**) 3.3.4 or later.

  .. NOTE ::

    Ceres can also use Eigen as a sparse linear algebra
    library. Please see the documentation for ``WITH_EIGENSPARSE`` for
    more details.

- `Abseil <https://abseil.io/>`_ (**Required**) 20240116 or later.

- `GoogleTest <https://github.com/google/googletest>`_ (**Optional**;
  Required if you wish to build and run tests) 1.14.0 or later.

- `Google Benchmark <https://github.com/google/benchmark>`_ (**Optional**;
  used if ``BUILD_BENCHMARKS`` is ``ON``).

- `SuiteSparse <https://people.engr.tamu.edu/davis/suitesparse.html>`_
  (**Optional; strongly recommended for large problems**) 4.5.6 or
  later (7.4.0 or later for single-precision ``CHOLMOD`` support). Needed
  for solving large sparse linear systems. Because ``SuiteSparse``'s
  supernodal ``CHOLMOD`` and ``SPQR`` components are licensed under the
  GPL, ``WITH_SUITESPARSE`` defaults to ``OFF``; pass
  ``-DWITH_SUITESPARSE=ON`` to ``CMake`` to enable it (see
  ``WITH_SUITESPARSE`` in :ref:`options-controlling-ceres-configuration`).

  .. NOTE ::

     If SuiteSparseQR is found, Ceres attempts to find the Intel
     Thread Building Blocks (TBB) library. If found, Ceres assumes
     SuiteSparseQR was compiled with TBB support and will link to the
     found TBB version. You can customize the searched TBB location
     with the ``TBB_ROOT`` variable.

- `METIS <https://github.com/KarypisLab/METIS>`_ (**Optional**) Used by
  ``SuiteSparse``, optionally by ``Eigen``'s sparse solvers (when
  ``WITH_EIGENMETIS=ON``), and directly by Ceres for graph partitioning.

- `Apple's Accelerate sparse solvers
  <https://developer.apple.com/documentation/accelerate/sparse-solvers-library>`_. (**Optional**)

  As of Xcode 9.0, Apple's Accelerate framework includes support for
  solving sparse linear systems across macOS, iOS et al.

- `BLAS <https://www.netlib.org/blas/>`_ and `LAPACK
  <https://www.netlib.org/lapack/>`_ (**Optional**) ``LAPACK`` and
  ``BLAS`` routines are used by ``SuiteSparse``, and optionally used by
  Ceres directly for some operations (controlled by ``WITH_LAPACK``).

  For best performance on ``x86`` based Linux systems we recommend
  using `Intel oneAPI MKL
  <https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html>`_.

  Another good option is `OpenBLAS
  <https://github.com/OpenMathLib/OpenBLAS>`_. However, one needs to be
  careful to `turn off the threading
  <https://www.openmathlib.org/OpenBLAS/docs/faq/#how-can-i-use-openblas-in-multi-threaded-applications>`_
  inside ``OpenBLAS`` as it conflicts with use of threads in Ceres.

  macOS ships with an optimized ``LAPACK`` and ``BLAS``
  implementation as part of the ``Accelerate`` framework. The Ceres
  build system will automatically detect and use it.

  On Windows, ``BLAS`` and ``LAPACK`` (such as ``OpenBLAS`` or ``Intel MKL``)
  can be installed via `vcpkg <https://github.com/microsoft/vcpkg>`_ or
  `MSYS2 <https://www.msys2.org/>`_, or obtained as part of the prebuilt
  ``SuiteSparse`` binary packages (see :ref:`section-windows`).


- `CUDA <https://developer.nvidia.com/cuda/toolkit>`_ and `cuDSS
  <https://developer.nvidia.com/cudss>`_ (**Optional**)

  If you have an NVIDIA GPU then Ceres Solver can use it to accelerate
  the solution of the Gauss-Newton linear systems using the CMake flag
  ``WITH_CUDA``.

  This support depends on two libraries from NVIDIA: ``CUDA`` and ``cuDSS``.

  If ``CUDA`` is available, Ceres Solver is able to use
  GPU acceleration to speed up ``DENSE_QR``, ``DENSE_NORMAL_CHOLESKY``,
  ``DENSE_SCHUR``, and ``CGNR``.  This also enables ``CUDA`` based
  mixed precision solves for ``DENSE_NORMAL_CHOLESKY`` and
  ``DENSE_SCHUR``.

  Additionally, if ``cuDSS`` is also available (controlled by
  ``WITH_CUDSS``), then GPU acceleration can be used for
  ``SPARSE_NORMAL_CHOLESKY`` and ``SPARSE_SCHUR`` via the
  ``CUDA_SPARSE`` sparse linear algebra library.

.. _section-source:

Getting the source code
=======================


You can start with the `latest stable release
<http://ceres-solver.org/ceres-solver-2.3.0.tar.gz>`_ . Or if you want
the latest version, you can clone the git repository

.. code-block:: bash

   git clone https://github.com/ceres-solver/ceres-solver

If your system does not have recent enough versions of `Abseil
<https://abseil.io/>`_ (>= 20240116) and/or `GoogleTest
<https://github.com/google/googletest>`_ (>= 1.14.0), then you can use
the versions included with Ceres Solver as git submodules by using the
command

.. code-block:: bash

   git clone --recurse-submodules https://github.com/ceres-solver/ceres-solver

The build instructions below use ``ceres-solver-2.3.0`` as the source
directory because they assume a release archive. If you build from a Git
checkout, replace it with the name of your checkout, usually ``ceres-solver``.


.. _section-linux:

Linux
=====

We will use `Ubuntu <https://ubuntu.com/>`_ as our example Linux
distribution.

.. NOTE::

   Ceres Solver always supports the previous and current Ubuntu LTS
   releases, currently 22.04 and 24.04 using the default Ubuntu
   repositories and compiler toolchain. Support for earlier versions
   is not guaranteed or maintained.

   Because the default ``apt`` repositories on Ubuntu 22.04 and 24.04
   ship versions of ``libabsl-dev`` older than ``20240116``, we
   recommend cloning Ceres with ``--recurse-submodules`` on those
   distributions so that CMake automatically builds the bundled
   ``Abseil`` and ``GoogleTest`` submodules in ``third_party/``. On
   newer distributions that ship ``Abseil >= 20240116`` and
   ``GoogleTest >= 1.14.0``, you can install ``libabsl-dev`` and
   ``libgtest-dev`` directly via ``apt``.

Start by installing the dependencies:

.. code-block:: bash

     # CMake
     sudo apt-get install cmake
     # BLAS & LAPACK
     sudo apt-get install libblas-dev liblapack-dev
     # Eigen3
     sudo apt-get install libeigen3-dev
     # SuiteSparse and METIS (optional)
     sudo apt-get install libsuitesparse-dev libmetis-dev
     # Abseil and GoogleTest (if your distribution ships >= 20240116 and >= 1.14.0;
     # otherwise clone Ceres with --recurse-submodules)
     sudo apt-get install libabsl-dev libgtest-dev

We are now ready to build, test, and install Ceres.

.. code-block:: bash

 tar zxf ceres-solver-2.3.0.tar.gz
 cmake -S ceres-solver-2.3.0 -B ceres-bin -DWITH_SUITESPARSE=ON
 cmake --build ceres-bin -j
 ctest --test-dir ceres-bin --output-on-failure
 # Optionally install Ceres system-wide (or use ceres-bin directly via Ceres_DIR;
 # see "Using Ceres with CMake" below).
 sudo cmake --install ceres-bin

You can also try running the command line bundling application with one of the
included problems, which comes from the University of Washington's BAL
dataset [Agarwal]_.

.. code-block:: bash

 ceres-bin/bin/simple_bundle_adjuster ceres-solver-2.3.0/data/problem-16-22106-pre.txt

This runs Ceres for a maximum of 10 iterations using the
``DENSE_SCHUR`` linear solver. The output should look something like
this.

.. code-block:: bash

    iter      cost      cost_change  |gradient|   |step|    tr_ratio  tr_radius  ls_iter  iter_time  total_time
       0  4.185660e+06    0.00e+00    1.09e+08   0.00e+00   0.00e+00  1.00e+04        0    2.18e-02    6.57e-02
       1  1.062590e+05    4.08e+06    8.99e+06   0.00e+00   9.82e-01  3.00e+04        1    5.07e-02    1.16e-01
       2  4.992817e+04    5.63e+04    8.32e+06   3.19e+02   6.52e-01  3.09e+04        1    4.75e-02    1.64e-01
       3  1.899774e+04    3.09e+04    1.60e+06   1.24e+02   9.77e-01  9.26e+04        1    4.74e-02    2.11e-01
       4  1.808729e+04    9.10e+02    3.97e+05   6.39e+01   9.51e-01  2.78e+05        1    4.75e-02    2.59e-01
       5  1.803399e+04    5.33e+01    1.48e+04   1.23e+01   9.99e-01  8.33e+05        1    4.74e-02    3.06e-01
       6  1.803390e+04    9.02e-02    6.35e+01   8.00e+01   1.00e+00  2.50e+06        1    4.76e-02    3.54e-01

    Solver Summary (v 2.3.0-eigen-(3.4.0)-lapack-suitesparse-(7.1.0)-metis-(5.1.0)-acceleratesparse-eigensparse)

                                         Original                  Reduced
    Parameter blocks                        22122                    22122
    Parameters                              66462                    66462
    Residual blocks                         83718                    83718
    Residuals                              167436                   167436

    Minimizer                        TRUST_REGION

    Dense linear algebra library            EIGEN
    Trust region strategy     LEVENBERG_MARQUARDT
                                            Given                     Used
    Linear solver                     DENSE_SCHUR              DENSE_SCHUR
    Threads                                     1                        1
    Linear solver ordering              AUTOMATIC                 22106,16
    Schur structure                         2,3,9                    2,3,9

    Cost:
    Initial                          4.185660e+06
    Final                            1.803390e+04
    Change                           4.167626e+06

    Minimizer iterations                        7
    Successful steps                            7
    Unsuccessful steps                          0

    Time (in seconds):
    Preprocessor                         0.043895

      Residual only evaluation           0.029855 (7)
      Jacobian & residual evaluation     0.120581 (7)
      Linear solver                      0.153665 (7)
    Minimizer                            0.339275

    Postprocessor                        0.000540
    Total                                0.383710

    Termination:                      CONVERGENCE (Function tolerance reached. |cost_change|/cost: 1.769759e-09 <= 1.000000e-06)


.. _section-macos:

macOS
=====

On macOS, you can either use `Homebrew <https://brew.sh/>`_
(recommended) or `MacPorts <https://www.macports.org/>`_ to install
Ceres Solver.

If using `Homebrew <https://brew.sh/>`_, then

.. code-block:: bash

      brew install ceres-solver

will install the latest stable version along with all the required
dependencies and

.. code-block:: bash

      brew install ceres-solver --HEAD

will install the latest version in the git repo.

If using `MacPorts <https://www.macports.org/>`_, then

.. code-block:: bash

   sudo port install ceres-solver

will install the latest version.

You can also install each of the dependencies by hand using `Homebrew
<https://brew.sh/>`_. There is no need to install
``BLAS`` or ``LAPACK`` separately as macOS ships with optimized
``BLAS`` and ``LAPACK`` routines as part of the `Accelerate
<https://developer.apple.com/documentation/accelerate>`_
framework.

.. code-block:: bash

      # CMake
      brew install cmake
      # Abseil and GoogleTest
      brew install abseil googletest
      # Eigen3
      brew install eigen
      # SuiteSparse and METIS (optional)
      brew install suite-sparse metis

We are now ready to build, test, and install Ceres.

.. code-block:: bash

   tar zxf ceres-solver-2.3.0.tar.gz
   cmake -S ceres-solver-2.3.0 -B ceres-bin -DWITH_SUITESPARSE=ON
   cmake --build ceres-bin -j
   ctest --test-dir ceres-bin --output-on-failure
   # Optionally install Ceres (or use ceres-bin directly via Ceres_DIR;
   # see "Using Ceres with CMake" below).
   cmake --install ceres-bin

.. _section-windows:

Windows
=======

Using a Library Manager
-----------------------

`vcpkg <https://github.com/microsoft/vcpkg>`_ is a library manager for Microsoft
Windows that can be used to install Ceres Solver and all its dependencies.

#. Install the library manager into a top-level directory ``vcpkg/`` on Windows
   following the `guide
   <https://github.com/microsoft/vcpkg#quick-start-windows>`_, e.g., using
   Visual Studio 2022 community edition, or simply run

    .. code:: bat

        git clone https://github.com/Microsoft/vcpkg.git
        cd vcpkg
        .\bootstrap-vcpkg.bat
        .\vcpkg integrate install

#. Use vcpkg to install and build Ceres and all its dependencies, e.g., for 64
   bit Windows

   .. code:: bat

      vcpkg\vcpkg.exe install ceres:x64-windows

   Or with optional components, e.g., SuiteSparse, using

   .. code:: bat

      vcpkg\vcpkg.exe install ceres[suitesparse]:x64-windows

#. Integrate vcpkg packages with Visual Studio to allow it to automatically
   find all the libraries installed by vcpkg.

   .. code:: bat

      vcpkg\vcpkg.exe integrate install

#. To use Ceres in a CMake project, follow our :ref:`instructions
   <section-using-ceres>`.


Building from Source
--------------------

Ceres Solver can also be built from source on Windows using Visual Studio 2019
or newer (or MSYS2 / MinGW-w64).

#. Create a top-level directory for dependencies, build, and sources somewhere,
   e.g., ``ceres/``

#. Obtain the Ceres source code and its dependencies:

   #. **Abseil** (>= 20240116) and **GoogleTest** (>= 1.14.0): The simplest way
      to provide ``Abseil`` and ``GoogleTest`` when building from source on
      Windows is to clone Ceres with ``--recurse-submodules``:

      .. code:: bat

         git clone --recurse-submodules https://github.com/ceres-solver/ceres-solver

      Alternatively, you can build and install ``Abseil`` and ``GoogleTest``
      separately using CMake and pass their install prefix via
      ``CMAKE_PREFIX_PATH`` (or set ``absl_DIR`` / ``absl_ROOT`` and
      ``GTest_DIR`` / ``GTest_ROOT``).

   #. **Eigen** (>= 3.3.4): Unpack and configure/install Eigen using CMake, and
      pass ``-DEigen3_ROOT=<path/to/eigen>`` (or
      ``-DEigen3_DIR=<path/to/Eigen3Config.cmake>``) when configuring Ceres.

   #. (Optional) **SuiteSparse**: You can build SuiteSparse on Windows using
      `suitesparse-metis-for-windows
      <https://github.com/jlblancoc/suitesparse-metis-for-windows>`_ or
      official ``SuiteSparse`` CMake releases, or use the prebuilt binary
      packages for Visual Studio 2019 and 2022 provided by the `CMake support
      for SuiteSparse <https://github.com/sergiud/SuiteSparse>`_ project that
      also include `reference LAPACK <https://www.netlib.org/blas/>`_ (and
      BLAS). When using the prebuilt ``SuiteSparse`` archive, add its directory
      to ``CMAKE_PREFIX_PATH``, enable ``-DWITH_SUITESPARSE=ON``, and set
      ``BLAS_blas_LIBRARY`` and ``LAPACK_lapack_LIBRARY`` to
      ``<suitesparse_path>/lib/libblas.lib`` and
      ``<suitesparse_path>/lib/liblapack.lib``.

#. Install ``CMake``.

#. Configure and build Ceres out-of-tree in ``ceres-bin`` (either from the
   command line or using ``cmake-gui`` and the Visual Studio IDE):

   .. code:: bat

      cmake -S ceres-solver -B ceres-bin -DEigen3_ROOT=C:\path\to\eigen
      cmake --build ceres-bin --config Release

   If you are using ``cmake-gui``, select ``ceres-solver`` as the source
   directory and ``ceres-bin`` as the build directory, click **Configure**, set
   any missing dependency locations (see
   :ref:`options-controlling-ceres-dependency-locations`), click **Generate**,
   and then open the generated Visual Studio solution in ``ceres-bin`` to build
   it.

#. To run the tests, run ``ctest`` from the command line:

   .. code:: bat

      ctest --test-dir ceres-bin -C Release --output-on-failure

   Or in Visual Studio, select the ``RUN_TESTS`` target and click **Build
   RUN_TESTS** from the build menu.

Like the Linux build, you should now be able to run
``ceres-bin\bin\Release\simple_bundle_adjuster.exe``.

.. note::

    #. The default multi-config build in Visual Studio is ``Debug``; always pass
       ``--config Release`` on the command line or switch the active
       configuration to ``Release`` in Visual Studio for optimal performance.
    #. CMake puts the resulting binaries in ``ceres-bin/bin/Debug`` or
       ``ceres-bin/bin/Release`` by default.
    #. Without a sparse linear algebra library, only a subset of
       solvers is usable, namely: ``DENSE_QR``, ``DENSE_NORMAL_CHOLESKY``,
       ``DENSE_SCHUR``, ``CGNR``, and ``ITERATIVE_SCHUR``.


.. _section-android:

Android
=======

.. NOTE::

    You will need Android NDK r20 or higher (current LTS such as r27 is
    recommended) to build Ceres Solver with full C++17 support.

To build Ceres for Android, clone Ceres with ``--recurse-submodules`` (so that
``Abseil`` is built alongside Ceres for the target Android ABI, or provide a
cross-compiled ``Abseil`` via ``-Dabsl_DIR=...``) and instruct ``CMake`` to use
the toolchain file from the Android NDK. For example, assuming you have
specified ``$NDK_DIR``:

.. code-block:: bash

    cmake -S <PATH_TO_CERES_SOURCE> -B ceres-bin \
      -DCMAKE_TOOLCHAIN_FILE=$NDK_DIR/build/cmake/android.toolchain.cmake \
      -DEigen3_DIR=/path/to/Eigen3Config.cmake \
      -DANDROID_ABI=arm64-v8a \
      -DANDROID_STL=c++_shared \
      -DANDROID_NATIVE_API_LEVEL=android-29 \
      -DBUILD_SHARED_LIBS=ON \
      -DBUILD_TESTING=OFF \
      -DBUILD_EXAMPLES=OFF \
      -DBUILD_BENCHMARKS=OFF
    cmake --build ceres-bin -j

You can build for any supported Android STL or ABI (such as ``arm64-v8a``,
``armeabi-v7a``, ``x86_64``, or ``x86``). Several API levels are supported;
use an API level appropriate for your Android project.

.. NOTE::

    You must always use the same API level and STL library for
    your Android project and the Ceres binaries.

After building, you get a ``libceres.so`` library (and Abseil libraries if
built as shared libraries), which you can link into your Android build.

If you also build the Ceres sample binaries (by setting
``-DBUILD_EXAMPLES=ON``) and would like to verify your library on an Android
device, place the sample binary together with ``libceres.so`` (and the NDK STL
shared library ``libc++_shared.so`` and any other shared dependencies) in an
executable directory on the device such as ``/data/local/tmp``, and run:

.. code-block:: bash

    adb shell
    cd /data/local/tmp
    LD_LIBRARY_PATH=/data/local/tmp ./helloworld

.. _section-ios:

iOS
===

.. NOTE::

   You need at least iOS 7.0 or higher to build Ceres Solver (iOS 12.0 or
   higher is recommended for modern Xcode toolchains).

To build Ceres for iOS, clone Ceres with ``--recurse-submodules`` (or provide
``Abseil`` for iOS via ``-Dabsl_DIR=...``) and instruct ``CMake`` to use the
``cmake/iOS.cmake`` toolchain file:

.. code-block:: bash

   cmake -S <PATH_TO_CERES_SOURCE> -B ceres-bin \
     -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_CERES_SOURCE>/cmake/iOS.cmake \
     -DEigen3_DIR=/path/to/Eigen3Config.cmake \
     -DIOS_PLATFORM=<PLATFORM> \
     -DBUILD_TESTING=OFF \
     -DBUILD_EXAMPLES=OFF \
     -DBUILD_BENCHMARKS=OFF
   cmake --build ceres-bin --config Release

``PLATFORM`` can be ``OS`` (``iphoneos``, ``arm64``), ``SIMULATOR64``
(``iphonesimulator``, ``x86_64``), or ``SIMULATOR`` (``iphonesimulator``,
``i386``). See ``cmake/iOS.cmake`` for additional options such as
``IOS_DEPLOYMENT_TARGET``.

After building, you will get ``libceres.a`` (and the required ``Abseil`` static
libraries when built from the submodule), which you will need to link into your
Xcode project.

The default iOS configuration builds Ceres Solver using ``Eigen`` and
``Abseil``, which is sufficient for solving small to moderate sized problems
(and can also use Apple's ``Accelerate`` sparse solvers when available).

If you decide to use ``Accelerate`` (including ``AccelerateSparse``), you also
need to add ``Accelerate.framework`` to your Xcode project's linked
frameworks.

.. _section-customizing:

Customizing the build
=====================

It is possible to reduce the libraries needed to build Ceres and
customize the build process by setting the appropriate options in
``CMake``.  These options can either be set in the ``CMake`` GUI, or
via ``-D<OPTION>=<ON/OFF>`` when running ``CMake`` from the command
line.  In general, you should only modify these options from their
defaults if you know what you are doing.

For additional configure diagnostics, pass ``--log-level=VERBOSE``,
``--log-level=DEBUG`` or ``--log-level=TRACE`` to ``CMake``.  To keep a log
level for subsequent configure runs in a build directory, set
``CMAKE_MESSAGE_LOG_LEVEL``, for example with
``-DCMAKE_MESSAGE_LOG_LEVEL=DEBUG``.  The command-line option takes precedence
over the variable.

``STATUS`` messages describe normal configuration progress.  ``VERBOSE``
messages add detailed toolchain and configuration choices.  ``DEBUG`` messages
expose internal setup details.  ``TRACE`` is reserved for temporary low-level
diagnostics.

.. NOTE::

   Passing ``-D<VARIABLE>=<VALUE>`` on the command line forcibly overwrites
   ``<VARIABLE>`` in the ``CMake`` cache at the start of every configure. If you
   are using the interactive ``ccmake`` terminal GUI, avoid passing ``-D`` on
   the ``ccmake`` command line so that interactive changes in the GUI (use
   ``<t>`` to toggle *Advanced View*) are not overwritten on reconfigure.


Modifying default compilation flags
-----------------------------------

The ``CMAKE_CXX_FLAGS`` variable can be used to define additional
default compilation flags for all build types.  Any flags specified
in ``CMAKE_CXX_FLAGS`` will be used in addition to the default
flags used by Ceres for the current build type.

For example, if you wished to build Ceres with `-march=native
<https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html>`_ which is not
enabled by default (even if ``CMAKE_BUILD_TYPE=Release``) you would invoke
CMake with:

.. code-block:: bash

       cmake -DCMAKE_CXX_FLAGS="-march=native" <PATH_TO_CERES_SOURCE>

.. NOTE ::

    The use of ``-march=native`` will limit portability, as it will tune the
    implementation to the specific CPU of the compiling machine (e.g. use of
    AVX if available).  Run-time segfaults may occur if you then tried to
    run the resulting binaries on a machine with a different processor, even
    if it is from the same family (e.g. x86) if the specific options available
    are different.  Note that the performance gains from the use of
    ``-march=native`` are not guaranteed to be significant.

.. _options-controlling-ceres-configuration:

Options controlling Ceres configuration
---------------------------------------

Ceres-specific feature options use the ``WITH_`` prefix. The configure step
prints a summary of enabled features and discovered dependencies at the end of
the output. The summary includes the Ceres version, package versions when they
are reported by the package finders, and optional packages that were not found.
An unavailable optional package does not change the corresponding cache option.

#. ``BUILD_BENCHMARKS [Default: ON]``: Enable the Ceres benchmarking suite
   when the benchmark dependency is available.

#. ``BUILD_DOCUMENTATION [Default: OFF]``: Use this to enable building
   the documentation. This requires `Sphinx <https://www.sphinx-doc.org/>`_ and
   the `sphinx-rtd-theme
   <https://pypi.org/project/sphinx-rtd-theme/>`_ package
   available from the Python package index. In addition, ``make ceres_docs``
   can be used to build only the documentation.

#. ``BUILD_EXAMPLES [Default: ON]``: Build the Ceres example programs.

#. ``BUILD_SHARED_LIBS [Default: OFF]``: By default Ceres is built as
   a static library. Turn this ``ON`` to build Ceres as a shared library.

#. ``BUILD_TESTING [Default: ON]``: Enable the Ceres unit and integration tests.

#. ``CMAKE_EXPORT_PACKAGE_REGISTRY [Default: OFF]``: Ceres always generates a
   build-tree package export, so clients can use the build directory without
   installing Ceres. Set this standard CMake variable to ``ON`` to also have
   ``export(PACKAGE)`` register the build directory in the `user's local
   CMake package registry
   <https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#user-package-registry>`_,
   so that it is found automatically by ``find_package(Ceres)`` without
   setting ``Ceres_DIR``. It is left disabled by default, matching CMake's
   own default for ``export(PACKAGE)``.

#. ``CMAKE_INSTALL_LIBDIR [Default: platform-dependent]``: Set this standard
   CMake variable to choose the directory below ``CMAKE_INSTALL_PREFIX`` where
   Ceres libraries are installed. It defaults according to CMake's
   ``GNUInstallDirs`` module.

#. ``CMAKE_MSVC_RUNTIME_LIBRARY [Default: compiler default]`` *Windows Only*:
   Set this standard CMake variable to select the MSVC runtime library used to
   build Ceres. When it is not set, CMake uses the compiler default.

#. ``WITH_ACCELERATESPARSE [Default: ON]``: By default, Ceres will link to
   Apple's Accelerate framework directly if a version of it is detected
   which supports solving sparse linear systems. On Apple operating systems,
   Accelerate usually also provides the BLAS and LAPACK implementations and
   is linked irrespective of this option.

#. ``WITH_BITCODE [Default: OFF]`` *Apple platforms*: Enable bitcode for iOS
   builds. This disables Eigen's additional Clang inlining optimization.

#. ``WITH_CUDA [Default: default]``: Enable CUDA linear algebra solvers. The
   value can be ``OFF``, ``default``, or ``static``. The latter links against
   static CUDA runtime libraries when supported.

#. ``WITH_CUDSS [Default: ON]``: Enable NVIDIA cuDSS support for sparse CUDA
   linear solvers (``CUDA_SPARSE``). This option is available when ``WITH_CUDA``
   is enabled and the ``cudss`` package is found.

#. ``WITH_CUSTOM_BLAS [Default: ON]``: Use Ceres' custom BLAS routines instead
   of Eigen's implementations where available.

#. ``WITH_EIGENMETIS [Default: ON]``: Enable METIS support for Eigen's sparse
   solvers when METIS is available. This option is available when
   ``WITH_EIGENSPARSE`` is enabled.

#. ``WITH_EIGENSPARSE [Default: ON]``: By default, Ceres will use Eigen's
   sparse Cholesky factorization.

#. ``WITH_LAPACK [Default: ON]``: If this option is enabled, and the ``BLAS`` and
   ``LAPACK`` libraries are found, Ceres will enable **direct** use of
   ``LAPACK`` routines. If this option is disabled, Ceres does not use
   ``LAPACK`` directly. SuiteSparse determines its own ``BLAS`` and ``LAPACK``
   link dependencies independently. Direct LAPACK use is always disabled for
   iOS builds because Apple treats ``dsyrk_`` as a private API.

#. ``WITH_SANITIZERS [Default: empty]``: A semicolon-separated list of
   sanitizers to enable, such as ``address`` or ``thread``.

#. ``WITH_SCHUR_SPECIALIZATIONS [Default: ON]``: If you are concerned about
   binary size or compilation time over some small performance gains in the
   ``SPARSE_SCHUR`` solver, you can disable some of the template
   specializations by turning this ``OFF``.

#. ``WITH_STRIPPED_DEBUG_SYMBOLS [Default: ON]`` *Android platforms*: Strip
   debug symbols from Android builds to reduce file sizes.

#. ``WITH_SUITESPARSE [Default: OFF]``: SuiteSparse support is opt-in. Turn this
   ``ON`` to link Ceres against ``SuiteSparse``, provided it and all of its
   dependencies are present.

   .. WARNING::

      SuiteSparse is licensed under a mixture of GPL/LGPL/Commercial terms.
      Ceres requires the CHOLMOD supernodal factorization and SPQR components,
      which are only available under GPL/Commercial terms. Consequently, unless
      you hold a commercial SuiteSparse license, a Ceres build with
      ``WITH_SUITESPARSE=ON`` is GPL licensed. This is why SuiteSparse support is
      opt-in rather than enabled by default. Obtaining a commercial SuiteSparse
      license removes this restriction.

#. ``WITH_UNINSTALL_TARGET [Default: ON]``: Add an ``uninstall`` target to
   remove files installed by Ceres.


.. _options-controlling-ceres-dependency-locations:

Options controlling Ceres dependency locations
----------------------------------------------

Ceres uses the ``CMake`` `find_package()
<https://cmake.org/cmake/help/latest/command/find_package.html>`_
command to find all of its dependencies.

#. **Config-mode packages** (``Eigen3``, ``absl``, ``GTest``, ``benchmark``,
   ``cudss``, ``TBB``, and ``SuiteSparse`` >= 7.0):

   These dependencies provide CMake package configuration files
   (``<PackageName>Config.cmake`` or ``<lowercase>-config.cmake``). You can
   customize where CMake searches for them using standard CMake variables:

   - ``CMAKE_PREFIX_PATH``: A semicolon-separated list of installation prefixes
     to search (e.g., ``-DCMAKE_PREFIX_PATH="/opt/local;/custom/prefix"``).
   - ``<PackageName>_ROOT``: The installation prefix for a specific package
     (e.g., ``-DEigen3_ROOT=/path/to/eigen``, ``-Dabsl_ROOT=/path/to/abseil``,
     ``-DTBB_ROOT=/path/to/tbb``).
   - ``<PackageName>_DIR``: The exact directory containing the package's
     ``<PackageName>Config.cmake`` file (e.g., ``-DEigen3_DIR=...``,
     ``-Dabsl_DIR=...``, ``-DGTest_DIR=...``, ``-Dcudss_DIR=...``).

   Note that if ``third_party/abseil-cpp`` and ``third_party/googletest`` are
   present (e.g., when Ceres is cloned with ``--recurse-submodules``), Ceres
   uses the bundled submodules directly instead of searching for installed
   ``absl`` and ``GTest`` packages.

#. **CUDA Toolkit** (``CUDAToolkit``):

   When ``WITH_CUDA`` is enabled, Ceres uses CMake's standard
   `FindCUDAToolkit
   <https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html>`_ module.
   You can customize the CUDA installation location using ``CUDAToolkit_ROOT``
   or ``CUDACXX``.

#. **Find-module dependencies** (``METIS``, ``SuiteSparse`` < 7.0 without
   CMake config files, ``AccelerateSparse``, and ``Sphinx``):

   When a dependency does not provide a CMake package configuration file, Ceres
   uses its bundled ``Find<Package>.cmake`` modules. You can guide these modules
   using ``CMAKE_PREFIX_PATH``, ``CMAKE_INCLUDE_PATH``, ``CMAKE_LIBRARY_PATH``,
   ``<Package>_ROOT``, or by setting explicit cache variables:

   - **METIS**: ``METIS_INCLUDE_DIR`` and ``METIS_LIBRARY``.
   - **SuiteSparse** (fallback when ``SuiteSparseConfig.cmake`` is not present):
     ``SuiteSparse_<COMPONENT>_INCLUDE_DIR`` and
     ``SuiteSparse_<COMPONENT>_LIBRARY`` (for components ``AMD``, ``CAMD``,
     ``CCOLAMD``, ``CHOLMOD``, ``COLAMD``, ``SPQR``, ``Config``).
   - **Sphinx**: ``Sphinx_BUILD_EXECUTABLE``.

.. NOTE::

   The legacy Ceres-specific ``<DEPENDENCY_NAME>_INCLUDE_DIR_HINTS`` and
   ``<DEPENDENCY_NAME>_LIBRARY_DIR_HINTS`` variables from earlier versions of
   Ceres have been removed. Use ``CMAKE_PREFIX_PATH`` or ``<PackageName>_ROOT``
   instead.

Building using custom BLAS & LAPACK installs
----------------------------------------------

If the standard find package scripts for ``BLAS`` & ``LAPACK`` which
ship with ``CMake`` fail to find the desired libraries on your system,
try setting ``CMAKE_LIBRARY_PATH`` (or ``CMAKE_PREFIX_PATH``) to the path(s) to
the directories containing the ``BLAS`` & ``LAPACK`` libraries when invoking
``CMake`` to build Ceres via ``-D<VAR>=<VALUE>``.  This should result in the
libraries being found for any common variant of each.

Alternatively, you may also directly specify the ``BLAS_LIBRARIES`` and
``LAPACK_LIBRARIES`` variables via ``-D<VAR>=<VALUE>`` when invoking CMake
to configure Ceres.

.. _section-bazel:

Building with Bazel
===================

Ceres Solver also provides a `Bazel <https://bazel.build/>`_ build configuration
using Bzlmod (``MODULE.bazel``), which builds Ceres with ``Eigen`` and
``Abseil`` (and ``GoogleTest`` / ``Google Benchmark`` for tests and benchmarks):

.. code-block:: bash

   # Build the Ceres library
   bazel build //:ceres

   # Build and run the unit tests
   bazel test //...

   # Build the example binaries
   bazel build //examples/...

.. _section-using-ceres:

Using Ceres with CMake
======================

In order to use Ceres in client code with CMake using `find_package()
<https://cmake.org/cmake/help/latest/command/find_package.html>`_
then either:

#. Ceres must have been installed with ``cmake --install`` (or
   ``make install``). If the install location is non-standard (i.e. is not in
   CMake's default search paths) then it will not be detected by default; see
   :ref:`section-local-installations`.

#. Or Ceres' build directory can be used directly without installing (see
   :ref:`section-install-vs-export`) by setting ``Ceres_DIR`` to the Ceres
   build directory (or by enabling ``CMAKE_EXPORT_PACKAGE_REGISTRY=ON`` when
   configuring Ceres).


As an example of how to use Ceres, to compile `examples/helloworld.cc
<https://ceres-solver.googlesource.com/ceres-solver/+/master/examples/helloworld.cc>`_
in a separate standalone project, the following CMakeList.txt can be
used:

.. code-block:: cmake

    cmake_minimum_required(VERSION 3.22)

    project(helloworld)

    find_package(Ceres REQUIRED)

    # helloworld
    add_executable(helloworld helloworld.cc)
    target_link_libraries(helloworld Ceres::ceres)

Irrespective of whether Ceres was installed or exported, if multiple
versions are detected, set: ``Ceres_DIR`` to control which is used.
If Ceres was installed ``Ceres_DIR`` should be the path to the
directory containing the installed ``CeresConfig.cmake`` file
(e.g. ``/usr/local/lib/cmake/Ceres``).  If Ceres was exported, then
``Ceres_DIR`` should be the path to the exported Ceres build
directory.

  .. NOTE ::

     You do not need to call include_directories(${CERES_INCLUDE_DIRS})
     as the exported Ceres CMake target already contains the definitions
     of its public include directories which will be automatically
     included by CMake when compiling a target that links against Ceres.
     In fact, since v2.0 ``CERES_INCLUDE_DIRS`` is not even set.

Specify Ceres components
-------------------------------------

You can specify particular Ceres components that you require (in order
for Ceres to be reported as found) when invoking
``find_package(Ceres)``.  This allows you to specify, for example,
that you require a version of Ceres built with SuiteSparse support.
By definition, if you do not specify any components when calling
``find_package(Ceres)`` (the default) any version of Ceres detected
will be reported as found, irrespective of which components it was
built with.

The Ceres components which can be specified are:

#. ``LAPACK``: Ceres built with direct LAPACK support (``WITH_LAPACK=ON``).

#. ``SuiteSparse``: Ceres built with SuiteSparse support (``WITH_SUITESPARSE=ON``).

#. ``AccelerateSparse``: Ceres built with Apple's Accelerate sparse solver
   support (``WITH_ACCELERATESPARSE=ON``).

#. ``EigenSparse``: Ceres built with Eigen's sparse Cholesky factorization
   support (``WITH_EIGENSPARSE=ON``).

#. ``CUDA``: Ceres built with NVIDIA CUDA support for ``DENSE_QR``,
   ``DENSE_NORMAL_CHOLESKY``, ``DENSE_SCHUR``, and ``CGNR`` (``WITH_CUDA``).

#. ``cuDSS``: Ceres built with NVIDIA cuDSS sparse solver support
   (``WITH_CUDA`` and ``WITH_CUDSS=ON``).

#. ``SparseLinearAlgebraLibrary``: Ceres built with *at least one*
   sparse linear algebra library.  This is equivalent to
   ``SuiteSparse`` **OR** ``AccelerateSparse`` **OR** ``EigenSparse`` **OR**
   ``cuDSS``.

#. ``SchurSpecializations``: Ceres built with Schur specializations
   (``WITH_SCHUR_SPECIALIZATIONS=ON``).

#. ``Multithreading``: Ceres built with multithreading support, which is
   always available.

To specify one/multiple Ceres components use the ``COMPONENTS`` argument to
`find_package()
<https://cmake.org/cmake/help/latest/command/find_package.html>`_ like so:

.. code-block:: cmake

    # Find a version of Ceres compiled with SuiteSparse & EigenSparse support.
    #
    # NOTE: This will report Ceres as **not** found if the detected version of
    #            Ceres was not compiled with both SuiteSparse & EigenSparse.
    #            Remember, if you have multiple versions of Ceres installed, you
    #            can use Ceres_DIR to specify which should be used.
    find_package(Ceres REQUIRED COMPONENTS SuiteSparse EigenSparse)


Specify Ceres version
---------------------

Additionally, when CMake has found Ceres it can optionally check the package
version, if it has been specified in the `find_package()
<https://cmake.org/cmake/help/latest/command/find_package.html>`_
call.  For example:

.. code-block:: cmake

    find_package(Ceres 2.3.0 REQUIRED)

.. _section-local-installations:

Local installations
-------------------

If Ceres was installed in a non-standard path by specifying
``-DCMAKE_INSTALL_PREFIX="/some/where/local"``, you can either pass
``-DCMAKE_PREFIX_PATH="/some/where/local"`` (or
``-DCeres_DIR="/some/where/local/lib/cmake/Ceres"``) when running CMake to
configure your project, or add the **PATHS** option to the ``find_package()``
command in your ``CMakeLists.txt``:

.. code-block:: cmake

   find_package(Ceres REQUIRED PATHS "/some/where/local/")

If you do not wish to install Ceres to a system location, you can also use
Ceres directly from its build directory (see :ref:`section-install-vs-export`).

Understanding the CMake Package System
----------------------------------------

Although a full tutorial on CMake is outside the scope of this guide,
here we cover some of the most common CMake misunderstandings that
crop up when using Ceres.  For more detailed CMake usage, the
following references are very useful:

- The `official CMake tutorial <https://cmake.org/cmake/help/latest/guide/tutorial/index.html>`_

   Provides a tour of the core features of CMake.

- `cmake-packages documentation
  <https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html>`_

   Covers how to write a ``ProjectConfig.cmake`` file, discussed below,
   for your own project when installing or exporting it using CMake,
   and how these processes in conjunction with ``find_package()`` are
   handled by CMake.

  .. NOTE :: **Targets in CMake.**

    All libraries and executables built using CMake are represented as
    *targets* created using `add_library()
    <https://cmake.org/cmake/help/latest/command/add_library.html>`_
    and `add_executable()
    <https://cmake.org/cmake/help/latest/command/add_executable.html>`_.
    Targets encapsulate the rules and dependencies (which can be other
    targets) required to build or link against an object.  This allows
    CMake to implicitly manage dependency chains.  Thus it is
    sufficient to tell CMake that a library target: ``B`` depends on a
    previously declared library target ``A``, and CMake will
    understand that this means that ``B`` also depends on all of the
    public dependencies of ``A``.

When a project like Ceres is installed using CMake, or its build
directory is exported (see :ref:`section-install-vs-export`), in addition to
the public headers and compiled libraries, a set of CMake-specific project
configuration files are also installed to: ``<INSTALL_ROOT>/lib/cmake/Ceres``
(if Ceres is installed), or created in the build directory. When `find_package
<https://cmake.org/cmake/help/latest/command/find_package.html>`_ is
invoked, CMake checks various standard install locations (including
``/usr/local`` on Linux & UNIX systems), any paths specified via
``CMAKE_PREFIX_PATH`` or ``Ceres_DIR``, and the local CMake package
registry for CMake configuration files for the project to be found
(i.e. Ceres in the case of ``find_package(Ceres)``).  Specifically it
looks for:

- ``<PROJECT_NAME>Config.cmake`` (or
  ``<lower_case_project_name>-config.cmake``)

   Which is written by the developers of the project, and is
   configured with the selected options and installed locations when
   the project is built and imports the project targets and/or defines
   the legacy CMake variables: ``<PROJECT_NAME>_INCLUDE_DIRS`` &
   ``<PROJECT_NAME>_LIBRARIES`` which are used by the caller.

The ``<PROJECT_NAME>Config.cmake`` typically includes a second file
installed to the same location:

- ``<PROJECT_NAME>Targets.cmake``

   Which is autogenerated by CMake as part of the install process and defines
   **imported targets** for the project in the caller's CMake scope.

An **imported target** contains the same information about a library
as a CMake target that was declared locally in the current CMake
project using ``add_library()``.  However, imported targets refer to
objects that have already been built by a different CMake project.
Principally, an imported target contains the location of the compiled
object and all of its public dependencies required to link against it
as well as all required include directories.  Any locally declared target
can depend on an imported target, and CMake will manage the dependency
chain, just as if the imported target had been declared locally by the
current project.

Crucially, just like any locally declared CMake target, an imported target is
identified by its **name** when adding it as a dependency to another target.

Since v2.0, Ceres has used the target namespace feature of CMake to prefix
its export targets: ``Ceres::ceres``.  However, historically the Ceres target
did not have a namespace, and was just called ``ceres``.

Whilst a deprecated target called ``ceres`` is still provided for backwards
compatibility (and emits a CMake deprecation warning when linked against), it
creates a potential drawback: if you failed to call
``find_package(Ceres)``, and Ceres is installed in a default search path for
your compiler, then instead of matching the imported Ceres target, it will
instead match the installed ``libceres.so``/``dylib``/``a`` library.  If this
happens you will get either compiler errors for missing include directories or
linker errors due to missing references to Ceres public dependencies. Always
link against ``Ceres::ceres``.

.. _section-install-vs-export:

Installing a project with CMake vs Exporting its build directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When a project is **installed**, the compiled libraries and headers
are copied from the source & build directory to the install location,
and it is these copied files that are used by any client code.

Ceres also generates ``CeresConfig.cmake`` and ``CeresTargets.cmake`` directly
in its **build directory** using `export()
<https://cmake.org/cmake/help/latest/command/export.html>`_, so client code can
use the compiled libraries and headers in the build directory directly
**without requiring Ceres to be installed**:

- By default, you can point a client project at the Ceres build directory by
  passing ``-DCeres_DIR=/path/to/ceres-bin`` when configuring the client
  project.
- Alternatively, if you pass ``-DCMAKE_EXPORT_PACKAGE_REGISTRY=ON`` when
  configuring Ceres, CMake also records the path to the Ceres build directory
  in the `user's local CMake package registry
  <https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#user-package-registry>`_
  (``<USER_HOME>/.cmake/packages`` on Linux & macOS), which is checked
  automatically during ``find_package(Ceres)``.

Installing / Exporting a project that uses Ceres
--------------------------------------------------

As described in `Understanding the CMake Package System`_, the contents of
the ``CERES_LIBRARIES`` variable is the **name** of an imported target which
represents Ceres.  If you are installing / exporting your *own* project which
*uses* Ceres, it is important to understand that:

**Imported targets are not (re)exported when a project which imported them is
exported**.

Thus, when a project ``Foo`` which uses Ceres is exported, its list of
dependencies as seen by another project ``Bar`` which imports ``Foo``
via: ``find_package(Foo REQUIRED)`` will contain: ``Ceres::ceres``.  However,
the definition of ``Ceres::ceres`` as an imported target is **not
(re)exported** when ``Foo`` is exported.  Hence, without any additional
steps, when processing ``Bar``, ``Ceres::ceres`` will not be defined as an
imported target.

The solution to this is for ``Foo`` (i.e., the project that uses
Ceres) to invoke ``find_dependency(Ceres)`` in ``FooConfig.cmake``, thus
``Ceres::ceres`` will be defined as an imported target when CMake processes
``Bar``.  An example of the required modifications to
``FooConfig.cmake`` is shown below:

.. code-block:: cmake

    # Importing Ceres in FooConfig.cmake.
    #
    # The find_dependency() macro forwards the REQUIRED / QUIET parameters to
    # find_package() when searching for dependencies.
    #
    # Note that find_dependency() does not take a path hint, so if Ceres was
    # installed in a non-standard location, that location must be added to
    # CMake's search list before this call.
    include(CMakeFindDependencyMacro)
    find_dependency(Ceres)

.. _section-migration:

Migration
=========

The following includes some hints for migrating from previous versions.

Version 2.3
-----------

- **Abseil replaces glog, gflags, and miniglog**: ``google-glog``, ``gflags``,
  and ``MINIGLOG`` are no longer used by Ceres. Instead, Ceres requires
  `Abseil <https://abseil.io/>`_ (version ``20240116`` or later) and uses
  `GoogleTest <https://github.com/google/googletest>`_ (version ``1.14.0`` or
  later) when ``BUILD_TESTING=ON``. If your system does not provide recent
  enough versions of ``Abseil`` or ``GoogleTest``, clone Ceres with
  ``git clone --recurse-submodules`` so that CMake automatically builds the
  bundled submodules in ``third_party/``.
- **CMake minimum version**: Building Ceres now requires CMake 3.22 or later.
- **CMake feature options use the ``WITH_`` prefix**:
  The Ceres-specific CMake options have been standardized to use the ``WITH_``
  prefix:

  - ``SUITESPARSE`` :math:`\rightarrow` ``WITH_SUITESPARSE``
  - ``EIGENSPARSE`` :math:`\rightarrow` ``WITH_EIGENSPARSE``
  - ``ACCELERATESPARSE`` :math:`\rightarrow` ``WITH_ACCELERATESPARSE``
  - ``USE_CUDA`` :math:`\rightarrow` ``WITH_CUDA`` (accepts ``OFF``,
    ``default``, or ``static``)
  - ``LAPACK`` :math:`\rightarrow` ``WITH_LAPACK``
  - ``CUSTOM_BLAS`` :math:`\rightarrow` ``WITH_CUSTOM_BLAS``
  - ``EIGENMETIS`` :math:`\rightarrow` ``WITH_EIGENMETIS``
  - ``SCHUR_SPECIALIZATIONS`` :math:`\rightarrow` ``WITH_SCHUR_SPECIALIZATIONS``
  - ``IOS_BITCODE`` :math:`\rightarrow` ``WITH_BITCODE``
  - ``ANDROID_STRIP_DEBUG_SYMBOLS`` :math:`\rightarrow`
    ``WITH_STRIPPED_DEBUG_SYMBOLS``
  - ``PROVIDE_UNINSTALL_TARGET`` :math:`\rightarrow` ``WITH_UNINSTALL_TARGET``

- **SuiteSparse is now opt-in (``WITH_SUITESPARSE=OFF`` by default)**:
  Because ``SuiteSparse``'s supernodal ``CHOLMOD`` and ``SPQR`` components are
  licensed under the GPL, ``WITH_SUITESPARSE`` now defaults to ``OFF``. Pass
  ``-DWITH_SUITESPARSE=ON`` to CMake to build Ceres with ``SuiteSparse``
  support.
- **Standard CMake variables replace custom Ceres variables**:

  - ``EXPORT_BUILD_DIR`` has been removed; use the standard
    ``CMAKE_EXPORT_PACKAGE_REGISTRY`` variable instead.
  - ``LIB_SUFFIX`` has been removed; use the standard ``CMAKE_INSTALL_LIBDIR``
    variable instead.
  - ``MSVC_USE_STATIC_CRT`` has been removed; use the standard
    ``CMAKE_MSVC_RUNTIME_LIBRARY`` variable instead.
  - Custom ``<DEPENDENCY>_INCLUDE_DIR_HINTS`` and
    ``<DEPENDENCY>_LIBRARY_DIR_HINTS`` variables have been removed; use
    ``CMAKE_PREFIX_PATH``, ``<PackageName>_ROOT``, or ``<PackageName>_DIR``
    instead.

Version 2.0
-----------

- When using Ceres with CMake, the target name in v2.0 is
  ``Ceres::ceres`` following modern naming conventions. The legacy
  target ``ceres`` exists for backwards compatibility, but is
  deprecated. ``CERES_INCLUDE_DIRS`` is not set any more, as the
  exported Ceres CMake target already contains the definitions of its
  public include directories which will be automatically included by
  CMake when compiling a target that links against Ceres.
- While TBB is not used any more directly by Ceres, it might still try
  to link against it, if SuiteSparseQR was found. The variable (environment
  or CMake) to customize this is ``TBB_ROOT`` (used to be ``TBBROOT``).
  For example, use ``cmake -DTBB_ROOT=/opt/intel/tbb ...`` if you want to
  link against TBB installed from Intel's binary packages on Linux.
