| .. _chapter-installation: | 
 |  | 
 | ============ | 
 | Installation | 
 | ============ | 
 |  | 
 | Getting the source code | 
 | ======================= | 
 | .. _section-source: | 
 |  | 
 | You can start with the `latest stable release | 
 | <http://ceres-solver.org/ceres-solver-2.1.0.tar.gz>`_ . Or if you want | 
 | the latest version, you can clone the git repository | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |        git clone https://ceres-solver.googlesource.com/ceres-solver | 
 |  | 
 | .. _section-dependencies: | 
 |  | 
 | Dependencies | 
 | ============ | 
 |  | 
 |  .. note :: | 
 |  | 
 |     Ceres Solver 2.2 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 <http://www.cmake.org>`_ 3.10 or later **required**. | 
 |  | 
 | - `Eigen <http://eigen.tuxfamily.org/index.php?title=Main_Page>`_ | 
 |   3.3 or later **required**. | 
 |  | 
 |   .. NOTE :: | 
 |  | 
 |     Ceres can also use Eigen as a sparse linear algebra | 
 |     library. Please see the documentation for ``EIGENSPARSE`` for | 
 |     more details. | 
 |  | 
 | - `glog <https://github.com/google/glog>`_ 0.3.5 or | 
 |   later. **Recommended** | 
 |  | 
 |   ``glog`` is used extensively throughout Ceres for logging detailed | 
 |   information about memory allocations and time consumed in various | 
 |   parts of the solve, internal error conditions etc. The Ceres | 
 |   developers use it extensively to observe and analyze Ceres's | 
 |   performance. `glog <https://github.com/google/glog>`_ allows you to | 
 |   control its behaviour from the command line. Starting with | 
 |   ``-logtostderr`` you can add ``-v=N`` for increasing values of ``N`` | 
 |   to get more and more verbose and detailed information about Ceres | 
 |   internals. | 
 |  | 
 |   Ceres also ships with a minimal replacement of ``glog`` called | 
 |   ``miniglog`` that can be enabled with the ``MINIGLOG`` build option. | 
 |   ``miniglog`` is supplied for platforms which do not support the full | 
 |   version of ``glog``. | 
 |  | 
 |   In an attempt to reduce dependencies, it may be tempting to use | 
 |   ``miniglog`` on platforms which already support ``glog``. While | 
 |   there is nothing preventing the user from doing so, we strongly | 
 |   recommend against it. ``miniglog`` has worse performance than | 
 |   ``glog`` and is much harder to control and use. | 
 |  | 
 | - `gflags <https://github.com/gflags/gflags>`_. Needed to build | 
 |   examples and tests and usually a dependency for glog. | 
 |  | 
 | - `SuiteSparse <http://faculty.cse.tamu.edu/davis/suitesparse.html>`_ | 
 |   4.5.6 or later. Needed for solving large sparse linear | 
 |   systems. **Optional; strongly recommended for large scale bundle | 
 |   adjustment** | 
 |  | 
 |   .. 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. | 
 |  | 
 |   A CMake native version of SuiteSparse that can be compiled on a variety of | 
 |   platforms (e.g., using Visual Studio, Xcode, MinGW, etc.) is maintained by the | 
 |   `CMake support for SuiteSparse <https://github.com/sergiud/SuiteSparse>`_ | 
 |   project. | 
 |  | 
 | - `Apple's Accelerate sparse solvers <https://developer.apple.com/documentation/accelerate/sparse_solvers>`_. | 
 |   As of Xcode 9.0, Apple's Accelerate framework includes support for | 
 |   solving sparse linear systems across macOS, iOS et al. **Optional** | 
 |  | 
 | - `BLAS <http://www.netlib.org/blas/>`_ and `LAPACK | 
 |   <http://www.netlib.org/lapack/>`_ routines are needed by | 
 |   ``SuiteSparse``, and optionally used by Ceres directly for some | 
 |   operations. | 
 |  | 
 |   For best performance on ``x86`` based Linux systems we recommend | 
 |   using `Intel MKL | 
 |   <https://www.intel.com/content/www/us/en/develop/documentation/get-started-with-mkl-for-dpcpp/top.html>`_. | 
 |  | 
 |   Two other good options are `ATLAS | 
 |   <http://math-atlas.sourceforge.net/>`_, which includes ``BLAS`` and | 
 |   ``LAPACK`` routines and `OpenBLAS | 
 |   <https://github.com/xianyi/OpenBLAS>`_ . However, one needs to be | 
 |   careful to `turn off the threading | 
 |   <https://github.com/xianyi/OpenBLAS/wiki/faq#wiki-multi-threaded>`_ | 
 |   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. | 
 |  | 
 |   For Windows things are much more complicated. `LAPACK For | 
 |   Windows <http://icl.cs.utk.edu/lapack-for-windows/lapack/>`_ | 
 |   has detailed instructions.. | 
 |  | 
 |   **Optional but required for** ``SuiteSparse``. | 
 |  | 
 | - `CUDA <https://developer.nvidia.com/cuda-toolkit>`_ If you have an | 
 |   NVIDIA GPU then Ceres Solver can use it accelerate the solution of | 
 |   the Gauss-Newton linear systems using the CMake flag ``USE_CUDA``. | 
 |   Currently this support is limited to using the dense linear solvers that ship | 
 |   with ``CUDA``. As a result GPU acceleration can be used to speed up | 
 |   ``DENSE_QR``, ``DENSE_NORMAL_CHOLESKY`` and | 
 |   ``DENSE_SCHUR``. This also enables ``CUDA`` mixed precision solves | 
 |   for ``DENSE_NORMAL_CHOLESKY`` and ``DENSE_SCHUR``.  **Optional**. | 
 |  | 
 | .. _section-linux: | 
 |  | 
 | Linux | 
 | ===== | 
 |  | 
 | We will use `Ubuntu <http://www.ubuntu.com>`_ as our example linux | 
 | distribution. | 
 |  | 
 | .. NOTE:: | 
 |  | 
 |    Ceres Solver always supports the previous and current Ubuntu LTS | 
 |    releases, currently 18.04 and 20.04, using the default Ubuntu | 
 |    repositories and compiler toolchain. Support for earlier versions | 
 |    is not guaranteed or maintained. | 
 |  | 
 | Start by installing all the dependencies. | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |      # CMake | 
 |      sudo apt-get install cmake | 
 |      # google-glog + gflags | 
 |      sudo apt-get install libgoogle-glog-dev libgflags-dev | 
 |      # Use ATLAS for BLAS & LAPACK | 
 |      sudo apt-get install libatlas-base-dev | 
 |      # Eigen3 | 
 |      sudo apt-get install libeigen3-dev | 
 |      # SuiteSparse (optional) | 
 |      sudo apt-get install libsuitesparse-dev | 
 |  | 
 | We are now ready to build, test, and install Ceres. | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |  tar zxf ceres-solver-2.1.0.tar.gz | 
 |  mkdir ceres-bin | 
 |  cd ceres-bin | 
 |  cmake ../ceres-solver-2.1.0 | 
 |  make -j3 | 
 |  make test | 
 |  # Optionally install Ceres, it can also be exported using CMake which | 
 |  # allows Ceres to be used without requiring installation, see the documentation | 
 |  # for the EXPORT_BUILD_DIR option for more information. | 
 |  make install | 
 |  | 
 | 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 | 
 |  | 
 |  bin/simple_bundle_adjuster ../ceres-solver-2.1.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    7.59e-02    3.37e-01 | 
 |        1  1.062590e+05    4.08e+06    8.99e+06   5.36e+02   9.82e-01  3.00e+04       1    1.65e-01    5.03e-01 | 
 |        2  4.992817e+04    5.63e+04    8.32e+06   3.19e+02   6.52e-01  3.09e+04       1    1.45e-01    6.48e-01 | 
 |        3  1.899774e+04    3.09e+04    1.60e+06   1.24e+02   9.77e-01  9.26e+04       1    1.43e-01    7.92e-01 | 
 |        4  1.808729e+04    9.10e+02    3.97e+05   6.39e+01   9.51e-01  2.78e+05       1    1.45e-01    9.36e-01 | 
 |        5  1.803399e+04    5.33e+01    1.48e+04   1.23e+01   9.99e-01  8.33e+05       1    1.45e-01    1.08e+00 | 
 |        6  1.803390e+04    9.02e-02    6.35e+01   8.00e-01   1.00e+00  2.50e+06       1    1.50e-01    1.23e+00 | 
 |  | 
 |   Solver Summary (v 2.1.0-eigen-(3.4.0)-lapack-suitesparse-(5.10.1)-acceleratesparse-eigensparse-no_openmp) | 
 |  | 
 | 				       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.121654 | 
 |  | 
 |     Residual only evaluation           0.065968 (7) | 
 |     Jacobian & residual evaluation     0.303356 (7) | 
 |     Linear solver                      0.436650 (7) | 
 |   Minimizer                            0.890535 | 
 |  | 
 |   Postprocessor                        0.001684 | 
 |   Total                                1.013873 | 
 |  | 
 |   Termination:                      CONVERGENCE (Function tolerance reached. |cost_change|/cost: 1.769756e-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 `vecLib | 
 | <https://developer.apple.com/library/mac/#documentation/Performance/Conceptual/vecLib/Reference/reference.html>`_ | 
 | framework. | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |       # CMake | 
 |       brew install cmake | 
 |       # google-glog and gflags | 
 |       brew install glog gflags | 
 |       # Eigen3 | 
 |       brew install eigen | 
 |       # SuiteSparse | 
 |       brew install suite-sparse | 
 |  | 
 | We are now ready to build, test, and install Ceres. | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |    tar zxf ceres-solver-2.1.0.tar.gz | 
 |    mkdir ceres-bin | 
 |    cd ceres-bin | 
 |    cmake ../ceres-solver-2.1.0 | 
 |    make -j3 | 
 |    make test | 
 |    # Optionally install Ceres, it can also be exported using CMake which | 
 |    # allows Ceres to be used without requiring installation, see the | 
 |    # documentation for the EXPORT_BUILD_DIR option for more information. | 
 |    make install | 
 |  | 
 | .. _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. For this purpose, we support Visual | 
 | Studio 2019 and newer. | 
 |  | 
 | .. NOTE:: | 
 |  | 
 |   If you find the following CMake difficult to set up, then you may | 
 |   be interested in a `Microsoft Visual Studio wrapper | 
 |   <https://github.com/tbennun/ceres-windows>`_ for Ceres Solver by Tal | 
 |   Ben-Nun. | 
 |  | 
 | #. Create a top-level directory for dependencies, build, and sources somewhere, | 
 |    e.g., ``ceres/`` | 
 |  | 
 | #. Get dependencies; unpack them as subdirectories in ``ceres/`` | 
 |    (``ceres/eigen``, ``ceres/glog``, etc.) | 
 |  | 
 |    #. ``Eigen`` 3.3 . Configure and optionally install Eigen. It should be | 
 |       exported into the CMake package registry by default as part of the | 
 |       configure stage so installation should not be necessary. | 
 |  | 
 |    #. ``google-glog`` Open up the Visual Studio solution and build it. | 
 |    #. ``gflags`` Open up the Visual Studio solution and build it. | 
 |  | 
 |    #. (Experimental) ``SuiteSparse`` Previously SuiteSparse was not | 
 |       available on Windows, recently it has become possible to build | 
 |       it on Windows using the `suitesparse-metis-for-windows | 
 |       <https://github.com/jlblancoc/suitesparse-metis-for-windows>`_ | 
 |       project.  If you wish to use ``SuiteSparse``, follow their | 
 |       instructions for obtaining and building it. | 
 |  | 
 |       Alternatively, Ceres Solver supports ``SuiteSparse`` binary | 
 |       packages available for Visual Studio 2019 and 2022 provided by | 
 |       the `CMake support for SuiteSparse | 
 |       <https://github.com/sergiud/SuiteSparse>`_ project that also | 
 |       include `reference LAPACK <http://www.netlib.org/blas>`_ (and | 
 |       BLAS). The binary packages are used by Ceres Solver for | 
 |       continuous testing on Github. | 
 |  | 
 | #. Unpack the Ceres tarball into ``ceres``. For the tarball, you | 
 |    should get a directory inside ``ceres`` similar to | 
 |    ``ceres-solver-2.1.0``. Alternately, checkout Ceres via ``git`` to | 
 |    get ``ceres-solver.git`` inside ``ceres``. | 
 |  | 
 | #. Install ``CMake``, | 
 |  | 
 | #. Create a directory ``ceres/ceres-bin`` (for an out-of-tree build) | 
 |  | 
 |    #. If you use the above binary ``SuiteSparse`` package, make sure CMake can | 
 |       find it, e.g., by assigning the path of the directory that contains the | 
 |       unzipped contents to the ``CMAKE_PREFIX_PATH`` environment variable. In a | 
 |       Windows command prompt this can be achieved as follows: | 
 |  | 
 |       .. code:: bat | 
 |  | 
 |         export CMAKE_PREFIX_PATH=C:/Downloads/SuiteSparse-5.11.0-cmake.1-vc16-Win64-Release-shared-gpl | 
 |  | 
 | #. Run ``CMake``; select the ``ceres-solver-X.Y.Z`` or | 
 |    ``ceres-solver.git`` directory for the CMake file. Then select the | 
 |    ``ceres-bin`` for the build directory. | 
 |  | 
 | #. Try running ``Configure`` which can fail at first because some dependencies | 
 |    cannot be automatically located. In this case, you must set the following | 
 |    CMake variables to the appropriate directories where you unpacked/built them: | 
 |  | 
 |    #. ``Eigen3_DIR`` (Set to directory containing ``Eigen3Config.cmake``) | 
 |    #. ``GLOG_INCLUDE_DIR_HINTS`` | 
 |    #. ``GLOG_LIBRARY_DIR_HINTS`` | 
 |    #. (Optional) ``gflags_DIR`` (Set to directory containing ``gflags-config.cmake``) | 
 |    #. (SuiteSparse binary package) ``BLAS_blas_LIBRARY`` and | 
 |       ``LAPACK_lapack_LIBRARY`` CMake variables must be `explicitly set` to | 
 |       ``<path>/lib/blas.lib`` and ``<path>/lib/lapack.lib``, respectively, both | 
 |       located in the unzipped package directory ``<path>``. | 
 |  | 
 |    If any of the variables are not visible in the ``CMake`` GUI, create a new | 
 |    entry for them.  We recommend using the | 
 |    ``<NAME>_(INCLUDE/LIBRARY)_DIR_HINTS`` variables rather than setting the | 
 |    ``<NAME>_INCLUDE_DIR`` & ``<NAME>_LIBRARY`` variables directly to keep all of | 
 |    the validity checking, and to avoid having to specify the library files | 
 |    manually. | 
 |  | 
 | #. You may have to tweak some more settings to generate a MSVC | 
 |    project.  After each adjustment, try pressing Configure & Generate | 
 |    until it generates successfully. | 
 |  | 
 | #. Open the solution and build it in MSVC | 
 |  | 
 |  | 
 | To run the tests, select the ``RUN_TESTS`` target and hit **Build | 
 | RUN_TESTS** from the build menu. | 
 |  | 
 | Like the Linux build, you should now be able to run | 
 | ``bin/simple_bundle_adjuster``. | 
 |  | 
 | .. note:: | 
 |  | 
 |     #. The default build is ``Debug``; consider switching it to ``Release`` for | 
 |        optimal performance. | 
 |     #. CMake puts the resulting test binaries in ``ceres-bin/examples/Debug`` by | 
 |        default. | 
 |     #. Without a sparse linear algebra library, only a subset of | 
 |        solvers is usable, namely: ``DENSE_QR``, ``DENSE_SCHUR``, | 
 |        ``CGNR``, and ``ITERATIVE_SCHUR``. | 
 |  | 
 |  | 
 | .. _section-android: | 
 |  | 
 | Android | 
 | ======= | 
 |  | 
 | .. NOTE:: | 
 |  | 
 |     You will need Android NDK r15 or higher to build Ceres solver. | 
 |  | 
 | To build Ceres for Android, we need to force ``CMake`` to find | 
 | the toolchains from the Android NDK instead of using the standard | 
 | ones. For example, assuming you have specified ``$NDK_DIR``: | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |     cmake \ | 
 |     -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 \ | 
 |     -DMINIGLOG=ON \ | 
 |     <PATH_TO_CERES_SOURCE> | 
 |  | 
 | You can build for any Android STL or ABI, but the c++_shared STL | 
 | and the armeabi-v7a or arm64-v8a ABI are recommended for 32bit | 
 | and 64bit architectures, respectively. Several API levels may | 
 | be supported, but it is recommended that you use the highest | 
 | level that is suitable 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, which you can | 
 | link in your Android build system by using a | 
 | ``PREBUILT_SHARED_LIBRARY`` target in your build script. | 
 |  | 
 | If you are building any Ceres samples and would like to verify | 
 | your library, you will need to place them in an executable public | 
 | directory together with ``libceres.so`` on your Android device | 
 | (e.g. in /data/local/tmp) and ensure that the STL library from | 
 | your NDK is present in that same directory. You may then execute | 
 | the sample by running for example: | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |     adb shell | 
 |     cd /data/local/tmp | 
 |     LD_LIBRARY_PATH=/data/local/tmp ./helloworld | 
 |  | 
 | Note that any solvers or other shared dependencies you include in | 
 | your project must also be present in your android build config and | 
 | your test directory on Android. | 
 |  | 
 | .. _section-ios: | 
 |  | 
 | iOS | 
 | === | 
 |  | 
 | .. NOTE:: | 
 |  | 
 |    You need iOS version 7.0 or higher to build Ceres Solver. | 
 |  | 
 | To build Ceres for iOS, we need to force ``CMake`` to find the | 
 | toolchains from the iOS SDK instead of using the standard ones. For | 
 | example: | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |    cmake \ | 
 |    -DCMAKE_TOOLCHAIN_FILE=../ceres-solver/cmake/iOS.cmake \ | 
 |    -DEigen3_DIR=/path/to/Eigen3Config.cmake \ | 
 |    -DIOS_PLATFORM=<PLATFORM> \ | 
 |    <PATH_TO_CERES_SOURCE> | 
 |  | 
 | ``PLATFORM`` can be: ``OS``, ``SIMULATOR`` or ``SIMULATOR64``. You can | 
 | build for ``OS`` (``armv7``, ``armv7s``, ``arm64``), ``SIMULATOR`` | 
 | (``i386``) or ``SIMULATOR64`` (``x86_64``) separately and use ``lipo`` | 
 | to merge them into one static library.  See ``cmake/iOS.cmake`` for | 
 | more options. | 
 |  | 
 | .. NOTE:: | 
 |  | 
 |    iOS version 11.0+ requires a 64-bit architecture, so you cannot | 
 |    build for armv7/armv7s with iOS 11.0+ (only arm64 is supported). | 
 |  | 
 | After building, you will get a ``libceres.a`` library, which you will | 
 | need to add to your Xcode project. | 
 |  | 
 | The default CMake configuration builds a bare bones version of Ceres | 
 | Solver that only depends on Eigen (``MINIGLOG`` is compiled into Ceres | 
 | if it is used), this should be sufficient for solving small to | 
 | moderate sized problems. | 
 |  | 
 | If you decide to use ``LAPACK`` and ``BLAS``, then you also need to | 
 | add ``Accelerate.framework`` to your Xcode project's linking | 
 | dependency. | 
 |  | 
 | .. _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. | 
 |  | 
 | .. NOTE:: | 
 |  | 
 |  If you are setting variables via ``-D<VARIABLE>=<VALUE>`` when | 
 |  calling ``CMake``, it is important to understand that this forcibly | 
 |  **overwrites** the variable ``<VARIABLE>`` in the ``CMake`` cache at | 
 |  the start of *every configure*. | 
 |  | 
 |  This can lead to confusion if you are invoking the ``CMake`` `curses | 
 |  <http://www.gnu.org/software/ncurses/ncurses.html>`_ terminal GUI | 
 |  (via ``ccmake``, e.g. ```ccmake -D<VARIABLE>=<VALUE> | 
 |  <PATH_TO_SRC>``).  In this case, even if you change the value of | 
 |  ``<VARIABLE>`` in the ``CMake`` GUI, your changes will be | 
 |  **overwritten** with the value passed via ``-D<VARIABLE>=<VALUE>`` | 
 |  (if one exists) at the start of each configure. | 
 |  | 
 |  As such, it is generally easier not to pass values to ``CMake`` via | 
 |  ``-D`` and instead interactively experiment with their values in the | 
 |  ``CMake`` GUI.  If they are not present in the *Standard View*, | 
 |  toggle to the *Advanced View* with ``<t>``. | 
 |  | 
 |  | 
 | 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 | 
 | --------------------------------------- | 
 |  | 
 | #. ``LAPACK [Default: ON]``: If this option is enabled, and the ``BLAS`` and | 
 |    ``LAPACK`` libraries are found, Ceres will enable **direct** use of | 
 |    ``LAPACK`` routines (i.e. Ceres itself will call them).  If this option is | 
 |    disabled, then Ceres will not require ``LAPACK`` or ``BLAS``.  It is | 
 |    however still possible that Ceres may call ``LAPACK`` routines indirectly | 
 |    via SuiteSparse if ``LAPACK=OFF`` and ``SUITESPARSE=ON``.  Finally | 
 |    note that if ``LAPACK=ON`` and ``SUITESPARSE=ON``, the ``LAPACK`` and | 
 |    ``BLAS`` libraries used by SuiteSparse and Ceres should be the same. | 
 |  | 
 | #. ``SUITESPARSE [Default: ON]``: By default, Ceres will link to | 
 |    ``SuiteSparse`` if it and all of its dependencies are present. Turn | 
 |    this ``OFF`` to build Ceres without ``SuiteSparse``. | 
 |  | 
 |    .. NOTE:: | 
 |  | 
 |       SuiteSparse is licensed under a mixture of GPL/LGPL/Commercial | 
 |       terms.  Ceres requires some components that are only licensed under | 
 |       GPL/Commercial terms. | 
 |  | 
 | #. ``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.  Note that on Apple OSs | 
 |    Accelerate usually also provides the BLAS/LAPACK implementations and | 
 |    so would be linked against irrespective of the value of ``ACCELERATESPARSE``. | 
 |  | 
 | #. ``EIGENSPARSE [Default: ON]``: By default, Ceres will use Eigen's | 
 |    sparse Cholesky factorization. | 
 |  | 
 | #. ``GFLAGS [Default: ON]``: Turn this ``OFF`` to build Ceres without | 
 |    ``gflags``. This will also prevent some of the example code from | 
 |    building. | 
 |  | 
 | #. ``MINIGLOG [Default: OFF]``: Ceres includes a stripped-down, | 
 |    minimal implementation of ``glog`` which can optionally be used as | 
 |    a substitute for ``glog``, thus removing ``glog`` as a required | 
 |    dependency. Turn this ``ON`` to use this minimal ``glog`` | 
 |    implementation. | 
 |  | 
 | #. ``SCHUR_SPECIALIZATIONS [Default: ON]``: If you are concerned about | 
 |    binary size/compilation time over some small (10-20%) performance | 
 |    gains in the ``SPARSE_SCHUR`` solver, you can disable some of the | 
 |    template specializations by turning this ``OFF``. | 
 |  | 
 | #. ``BUILD_SHARED_LIBS [Default: OFF]``: By default Ceres is built as | 
 |    a static library, turn this ``ON`` to instead build Ceres as a | 
 |    shared library. | 
 |  | 
 | #. ``EXPORT_BUILD_DIR [Default: OFF]``: By default Ceres is configured | 
 |    solely for installation, and so must be installed in order for | 
 |    clients to use it.  Turn this ``ON`` to export Ceres' build | 
 |    directory location into the `user's local CMake package registry | 
 |    <http://www.cmake.org/cmake/help/v3.5/manual/cmake-packages.7.html#user-package-registry>`_ | 
 |    where it will be detected **without requiring installation** in a | 
 |    client project using CMake when `find_package(Ceres) | 
 |    <http://www.cmake.org/cmake/help/v3.5/command/find_package.html>`_ | 
 |    is invoked. | 
 |  | 
 | #. ``BUILD_DOCUMENTATION [Default: OFF]``: Use this to enable building | 
 |    the documentation, requires `Sphinx <http://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. | 
 |  | 
 | #. ``MSVC_USE_STATIC_CRT [Default: OFF]`` *Windows Only*: By default | 
 |    Ceres will use the Visual Studio default, *shared* C-Run Time (CRT) | 
 |    library.  Turn this ``ON`` to use the *static* C-Run Time library | 
 |    instead. | 
 |  | 
 | #. ``LIB_SUFFIX [Default: "64" on non-Debian/Arch based 64-bit Linux, | 
 |    otherwise: ""]``: The suffix to append to the library install | 
 |    directory, built from: | 
 |    ``${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}``. | 
 |  | 
 |    The filesystem hierarchy standard recommends that 64-bit systems | 
 |    install native libraries to lib64 rather than lib.  Most Linux | 
 |    distributions follow this convention, but Debian and Arch based | 
 |    distros do not.  Note that the only generally sensible values for | 
 |    ``LIB_SUFFIX`` are "" and "64". | 
 |  | 
 |    Although by default Ceres will auto-detect non-Debian/Arch based | 
 |    64-bit Linux distributions and default ``LIB_SUFFIX`` to "64", this | 
 |    can always be overridden by manually specifying LIB_SUFFIX using: | 
 |    ``-DLIB_SUFFIX=<VALUE>`` when invoking CMake. | 
 |  | 
 |  | 
 | Options controlling Ceres dependency locations | 
 | ---------------------------------------------- | 
 |  | 
 | Ceres uses the ``CMake`` `find_package | 
 | <http://www.cmake.org/cmake/help/v3.5/command/find_package.html>`_ | 
 | function to find all of its dependencies. Dependencies that reliably | 
 | provide config files on all supported platforms are expected to be | 
 | found in "Config" mode of ``find_package`` (``Eigen``, ``gflags``). | 
 | This means you can use the standard ``CMake`` facilities to customize | 
 | where these dependencies are found, such as ``CMAKE_PREFIX_PATH``, | 
 | the ``<DEPENDENCY_NAME>_DIR`` variables, or since ``CMake`` 3.12 the | 
 | ``<DEPENDENCY_NAME>_ROOT`` variables. | 
 |  | 
 | Other dependencies are found using | 
 | ``Find<DEPENDENCY_NAME>.cmake`` scripts which are either included in | 
 | Ceres (for most dependencies) or are shipped as standard with | 
 | ``CMake`` (for ``LAPACK`` & ``BLAS``).  These scripts will search all | 
 | of the "standard" install locations for various OSs for each | 
 | dependency.  However, particularly for Windows, they may fail to find | 
 | the library, in this case you will have to manually specify its | 
 | installed location.  The ``Find<DEPENDENCY_NAME>.cmake`` scripts | 
 | shipped with Ceres support two ways for you to do this: | 
 |  | 
 | #. Set the *hints* variables specifying the *directories* to search in | 
 |    preference, but in addition, to the search directories in the | 
 |    ``Find<DEPENDENCY_NAME>.cmake`` script: | 
 |  | 
 |    - ``<DEPENDENCY_NAME (CAPS)>_INCLUDE_DIR_HINTS`` | 
 |    - ``<DEPENDENCY_NAME (CAPS)>_LIBRARY_DIR_HINTS`` | 
 |  | 
 |    These variables should be set via ``-D<VAR>=<VALUE>`` | 
 |    ``CMake`` arguments as they are not visible in the GUI. | 
 |  | 
 | #. Set the variables specifying the *explicit* include directory | 
 |    and library file to use: | 
 |  | 
 |    - ``<DEPENDENCY_NAME (CAPS)>_INCLUDE_DIR`` | 
 |    - ``<DEPENDENCY_NAME (CAPS)>_LIBRARY`` | 
 |  | 
 |    This bypasses *all* searching in the | 
 |    ``Find<DEPENDENCY_NAME>.cmake`` script, but validation is still | 
 |    performed. | 
 |  | 
 |    These variables are available to set in the ``CMake`` GUI. They are | 
 |    visible in the *Standard View* if the library has not been found | 
 |    (but the current Ceres configuration requires it), but are always | 
 |    visible in the *Advanced View*.  They can also be set directly via | 
 |    ``-D<VAR>=<VALUE>`` arguments to ``CMake``. | 
 |  | 
 | 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`` 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-using-ceres: | 
 |  | 
 | Using Ceres with CMake | 
 | ====================== | 
 |  | 
 | In order to use Ceres in client code with CMake using `find_package() | 
 | <http://www.cmake.org/cmake/help/v3.5/command/find_package.html>`_ | 
 | then either: | 
 |  | 
 | #. Ceres must have been installed with ``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`. | 
 |  | 
 |     Note that if you are using a non-standard install location you | 
 |     should consider exporting Ceres instead, as this will not require | 
 |     any extra information to be provided in client code for Ceres to | 
 |     be detected. | 
 |  | 
 | #. Or Ceres' build directory must have been exported by enabling the | 
 |     ``EXPORT_BUILD_DIR`` option when Ceres was configured. | 
 |  | 
 |  | 
 | 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.5) | 
 |  | 
 |     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 using LAPACK (``LAPACK=ON``). | 
 |  | 
 | #. ``SuiteSparse``: Ceres built with SuiteSparse (``SUITESPARSE=ON``). | 
 |  | 
 | #. ``AccelerateSparse``: Ceres built with Apple's Accelerate sparse solvers (``ACCELERATESPARSE=ON``). | 
 |  | 
 | #. ``EigenSparse``: Ceres built with Eigen's sparse Cholesky factorization | 
 |    (``EIGENSPARSE=ON``). | 
 |  | 
 | #. ``SparseLinearAlgebraLibrary``: Ceres built with *at least one* | 
 |    sparse linear algebra library.  This is equivalent to | 
 |    ``SuiteSparse`` **OR** ``AccelerateSparse`` **OR** ``EigenSparse``. | 
 |  | 
 | #. ``SchurSpecializations``: Ceres built with Schur specializations | 
 |    (``SCHUR_SPECIALIZATIONS=ON``). | 
 |  | 
 | To specify one/multiple Ceres components use the ``COMPONENTS`` argument to | 
 | `find_package() | 
 | <http://www.cmake.org/cmake/help/v3.5/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() | 
 | <http://www.cmake.org/cmake/help/v3.5/command/find_package.html>`_ | 
 | call.  For example: | 
 |  | 
 | .. code-block:: cmake | 
 |  | 
 |     find_package(Ceres 1.2.3 REQUIRED) | 
 |  | 
 | .. _section-local-installations: | 
 |  | 
 | Local installations | 
 | ------------------- | 
 |  | 
 | If Ceres was installed in a non-standard path by specifying | 
 | ``-DCMAKE_INSTALL_PREFIX="/some/where/local"``, then the user should | 
 | add the **PATHS** option to the ``find_package()`` command, e.g., | 
 |  | 
 | .. code-block:: cmake | 
 |  | 
 |    find_package(Ceres REQUIRED PATHS "/some/where/local/") | 
 |  | 
 | Note that this can be used to have multiple versions of Ceres | 
 | installed.  However, particularly if you have only a single version of | 
 | Ceres which you want to use but do not wish to install to a system | 
 | location, you should consider exporting Ceres using the | 
 | ``EXPORT_BUILD_DIR`` option instead of a local install, as exported | 
 | versions of Ceres will be automatically detected by CMake, | 
 | irrespective of their location. | 
 |  | 
 | 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 <http://www.cmake.org/cmake-tutorial/>`_ | 
 |  | 
 |    Provides a tour of the core features of CMake. | 
 |  | 
 | - `ProjectConfig tutorial | 
 |   <http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file>`_ | 
 |   and the `cmake-packages documentation | 
 |   <http://www.cmake.org/cmake/help/git-master/manual/cmake-packages.7.html>`_ | 
 |  | 
 |    Cover how to write a ``ProjectConfig.cmake`` file, discussed below, | 
 |    for your own project when installing or exporting it using CMake. | 
 |    It also covers how these processes in conjunction with | 
 |    ``find_package()`` are actually handled by CMake.  The | 
 |    `ProjectConfig tutorial | 
 |    <http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file>`_ | 
 |    is the older style, currently used by Ceres for compatibility with | 
 |    older versions of CMake. | 
 |  | 
 |   .. NOTE :: **Targets in CMake.** | 
 |  | 
 |     All libraries and executables built using CMake are represented as | 
 |     *targets* created using `add_library() | 
 |     <http://www.cmake.org/cmake/help/v3.5/command/add_library.html>`_ | 
 |     and `add_executable() | 
 |     <http://www.cmake.org/cmake/help/v3.5/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 into the local CMake package registry (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 (if Ceres' build | 
 | directory is exported).  When `find_package | 
 | <http://www.cmake.org/cmake/help/v3.5/command/find_package.html>`_ is | 
 | invoked, CMake checks various standard install locations (including | 
 | ``/usr/local`` on Linux & UNIX systems), 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 an alias target called ``ceres`` is still provided in v2.0 for backwards | 
 | compatibility, 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. | 
 |  | 
 | Note that this description applies both to projects that are | 
 | **installed** using CMake, and to those whose **build directory is | 
 | exported** using `export() | 
 | <http://www.cmake.org/cmake/help/v3.5/command/export.html>`_ (instead | 
 | of `install() | 
 | <http://www.cmake.org/cmake/help/v3.5/command/install.html>`_).  Ceres | 
 | supports both installation and export of its build directory if the | 
 | ``EXPORT_BUILD_DIR`` option is enabled, see | 
 | :ref:`section-customizing`. | 
 |  | 
 | .. _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.  When a | 
 | project's build directory is **exported**, instead of copying the | 
 | compiled libraries and headers, CMake creates an entry for the project | 
 | in the `user's local CMake package registry | 
 | <http://www.cmake.org/cmake/help/v3.5/manual/cmake-packages.7.html#user-package-registry>`_, | 
 | ``<USER_HOME>/.cmake/packages`` on Linux & macOS, which contains the | 
 | path to the project's build directory which will be checked by CMake | 
 | during a call to ``find_package()``.  The effect of which is that any | 
 | client code uses the compiled libraries and headers in the build | 
 | directory directly, **thus not requiring the project to be installed | 
 | to be used**. | 
 |  | 
 | 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``.  However, | 
 | the definition of ``ceres`` as an imported target is **not | 
 | (re)exported** when Foo is exported.  Hence, without any additional | 
 | steps, when processing ``Bar``, ``ceres`` will not be defined as an | 
 | imported target.  Thus, when processing ``Bar``, CMake will assume | 
 | that ``ceres`` refers only to: ``libceres.a/so/dylib/lib`` (the | 
 | compiled Ceres library) directly if it is on the current list of | 
 | search paths.  In which case, no CMake errors will occur, but ``Bar`` | 
 | will not link properly, as it does not have the required public link | 
 | dependencies of Ceres, which are stored in the imported target | 
 | definition. | 
 |  | 
 | The solution to this is for ``Foo`` (i.e., the project that uses | 
 | Ceres) to invoke ``find_package(Ceres)`` in ``FooConfig.cmake``, thus | 
 | ``ceres`` will be defined as an imported target when CMake processes | 
 | ``Bar``.  An example of the required modifications to | 
 | ``FooConfig.cmake`` are show below: | 
 |  | 
 | .. code-block:: cmake | 
 |  | 
 |     # Importing Ceres in FooConfig.cmake using CMake 3.x style. | 
 |     # | 
 |     # In CMake v3.x, the find_dependency() macro exists to forward 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.0 | 
 | ----------- | 
 |  | 
 | - When using Ceres with CMake, the target name in v2.0 is | 
 |   ``Ceres::ceres`` following modern naming convetions. 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. | 
 | - When building Ceres, some dependencies (Eigen, gflags) are not found | 
 |   using custom ``Find<DEPENDENCY_NAME>.cmake`` modules any | 
 |   more. Hence, instead of the custom variables (``<DEPENDENCY_NAME (CAPS)>_INCLUDE_DIR_HINTS``, | 
 |   ``<DEPENDENCY_NAME (CAPS)>_INCLUDE_DIR``, ...) you should use standard | 
 |   CMake facilities to customize where these dependencies are found, such as | 
 |   ``CMAKE_PREFIX_PATH``, the ``<DEPENDENCY_NAME>_DIR`` variables, or | 
 |   since CMake 3.12 the ``<DEPENDENCY_NAME>_ROOT`` variables. | 
 | - 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. |