libeigen/eigen!2838 Closes #3088 Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
175 lines
6.4 KiB
Plaintext
175 lines
6.4 KiB
Plaintext
namespace Eigen {
|
|
|
|
/**
|
|
|
|
\page TopicCMakeGuide Using %Eigen in CMake Projects
|
|
|
|
%Eigen provides native CMake support which allows the library to be easily
|
|
used in CMake projects.
|
|
|
|
\note Configuring and installing %Eigen requires %CMake 3.17 (or later). The generated `Eigen3Config.cmake`
|
|
imposes no version floor of its own, so a project consuming an already-installed %Eigen may use an older %CMake;
|
|
the \ref title_fetchcontent route below adds %Eigen's own build to your project and so requires 3.17 as well.
|
|
|
|
%Eigen exports a CMake target called `Eigen3::Eigen` which can be imported
|
|
using the `find_package` CMake command and used by calling
|
|
`target_link_libraries` as in the following example:
|
|
\code{.cmake}
|
|
cmake_minimum_required (VERSION 3.5)
|
|
project (myproject)
|
|
|
|
find_package (Eigen3 REQUIRED NO_MODULE)
|
|
|
|
add_executable (example example.cpp)
|
|
target_link_libraries (example Eigen3::Eigen)
|
|
\endcode
|
|
|
|
The above code snippet must be placed in a file called `CMakeLists.txt` alongside
|
|
`example.cpp`. After running
|
|
\code{.sh}
|
|
$ cmake path-to-example-directory
|
|
\endcode
|
|
CMake will produce project files that generate an executable called `example`.
|
|
Here, `path-to-example-directory` is the path to the directory that contains
|
|
both `CMakeLists.txt` and `example.cpp`. Note that if you have multiple
|
|
instances of %Eigen installed, `find_package` will use the first one
|
|
encountered. To request a specific version of %Eigen, use the `<version>`
|
|
option in `find_package`:
|
|
```
|
|
find_package(Eigen3 3.4 REQUIRED NO_MODULE) # Any version >=3.4 but <4.0.0.
|
|
```
|
|
Starting with Eigen 3.4.1, we also support a range spanning major versions:
|
|
```
|
|
find_package(Eigen3 3.4...5 REQUIRED NO_MODULE) # Any version >=3.4.1 but <6.0.0.
|
|
```
|
|
\note Version ranges are `find_package` syntax introduced in %CMake 3.19. Older %CMake
|
|
passes `3.4...5` through as a single version string, which `Eigen3ConfigVersion.cmake`
|
|
cannot parse and therefore rejects.
|
|
|
|
Do not forget to set the <a href="https://cmake.org/cmake/help/v3.7/variable/CMAKE_PREFIX_PATH.html">\c CMAKE_PREFIX_PATH </a> variable if Eigen is not installed in a default location or if you want to pick a specific version. For instance:
|
|
\code{.sh}
|
|
$ cmake path-to-example-directory -DCMAKE_PREFIX_PATH=$HOME/mypackages
|
|
\endcode
|
|
An alternative is to set the \c Eigen3_DIR cmake's variable to the respective path containing the \c Eigen3*.cmake files. For instance:
|
|
\code{.sh}
|
|
$ cmake path-to-example-directory -DEigen3_DIR=$HOME/mypackages/share/eigen3/cmake/
|
|
\endcode
|
|
|
|
If the `REQUIRED` option is omitted when locating %Eigen using
|
|
`find_package`, one can check whether the package was found as follows:
|
|
\code{.cmake}
|
|
find_package (Eigen3 NO_MODULE)
|
|
|
|
if (TARGET Eigen3::Eigen)
|
|
# Use the imported target
|
|
endif (TARGET Eigen3::Eigen)
|
|
\endcode
|
|
|
|
\section title_fetchcontent Using FetchContent
|
|
|
|
You can use the
|
|
<a href="https://cmake.org/cmake/help/latest/module/FetchContent.html">FetchContent</a>
|
|
module to download and include %Eigen directly in your project without
|
|
installing it first. This adds %Eigen's own build to your project, so it requires
|
|
%CMake 3.17 rather than the 3.11 that introduced FetchContent.
|
|
|
|
A basic example:
|
|
\code{.cmake}
|
|
cmake_minimum_required(VERSION 3.17)
|
|
project(myproject)
|
|
|
|
include(FetchContent)
|
|
FetchContent_Declare(
|
|
Eigen
|
|
GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
|
|
GIT_TAG master
|
|
GIT_SHALLOW TRUE
|
|
)
|
|
FetchContent_MakeAvailable(Eigen)
|
|
|
|
add_executable(example example.cpp)
|
|
target_link_libraries(example Eigen3::Eigen)
|
|
\endcode
|
|
|
|
\subsection title_fetchcontent_options Disabling Eigen build options
|
|
|
|
When %Eigen is added as a sub-project, its documentation, testing, and
|
|
pkg-config targets may collide with your project's own targets. Disable
|
|
them before calling \c FetchContent_MakeAvailable:
|
|
\code{.cmake}
|
|
set(EIGEN_BUILD_DOC OFF CACHE BOOL "" FORCE)
|
|
set(EIGEN_BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
|
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
|
set(EIGEN_BUILD_PKGCONFIG OFF CACHE BOOL "" FORCE)
|
|
|
|
FetchContent_MakeAvailable(Eigen)
|
|
\endcode
|
|
|
|
\subsection title_fetchcontent_install Disabling Eigen's install rules
|
|
|
|
%Eigen's install rules are enabled even when it is built as a sub-project, so
|
|
that a project embedding %Eigen can ship it as part of its own package. If your
|
|
project does not want %Eigen's headers to land in \c CMAKE_INSTALL_PREFIX (or in
|
|
a \c CPack package), set \c EIGEN_INSTALL to \c OFF:
|
|
\code{.cmake}
|
|
set(EIGEN_INSTALL OFF CACHE BOOL "" FORCE)
|
|
|
|
FetchContent_MakeAvailable(Eigen)
|
|
\endcode
|
|
|
|
%Eigen then places no file at all under \c CMAKE_INSTALL_PREFIX, the generated
|
|
documentation included.
|
|
|
|
\note %CMake refuses to generate an \c install(EXPORT ...) whose targets link a
|
|
target that no installed export set provides. So if you export your own targets
|
|
and their public interface links \c Eigen3::Eigen, you must either leave
|
|
\c EIGEN_INSTALL on and install %Eigen's CMake package alongside them, or consume
|
|
%Eigen through \c find_package instead of embedding it.
|
|
|
|
\subsection title_fetchcontent_exclude Using EXCLUDE_FROM_ALL
|
|
|
|
Projects that depend on %Eigen should typically exclude installing %Eigen by
|
|
default to avoid overwriting a previous installation. Passing
|
|
\c EXCLUDE_FROM_ALL to \c add_subdirectory drops %Eigen's install rules, and in
|
|
addition keeps %Eigen's targets out of the default build. That form works on
|
|
every %CMake version %Eigen supports:
|
|
\code{.cmake}
|
|
add_subdirectory(path/to/eigen eigen-build EXCLUDE_FROM_ALL)
|
|
\endcode
|
|
|
|
\c FetchContent_Declare accepts the same keyword, but only from %CMake 3.28
|
|
onwards, so a project using it has to say so:
|
|
\code{.cmake}
|
|
cmake_minimum_required(VERSION 3.28)
|
|
|
|
include(FetchContent)
|
|
FetchContent_Declare(
|
|
Eigen
|
|
GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
|
|
GIT_TAG master
|
|
GIT_SHALLOW TRUE
|
|
EXCLUDE_FROM_ALL
|
|
)
|
|
FetchContent_MakeAvailable(Eigen)
|
|
\endcode
|
|
|
|
\warning %CMake 3.17 through 3.27 accept \c EXCLUDE_FROM_ALL in
|
|
\c FetchContent_Declare without complaint and ignore it, so %Eigen is installed
|
|
anyway. Below 3.28, use \c EIGEN_INSTALL or the \c add_subdirectory form.
|
|
|
|
\subsection title_fetchcontent_cmake330 Note for CMake 3.30 and later
|
|
|
|
CMake 3.30 changed the default value of the
|
|
<a href="https://cmake.org/cmake/help/latest/policy/CMP0168.html">CMP0168</a>
|
|
policy so that \c FetchContent_Declare uses
|
|
\c FetchContent_Populate internally with a different sub-build strategy.
|
|
If you encounter issues with sub-builds you can either upgrade to a
|
|
compatible %Eigen version or set the policy explicitly:
|
|
\code{.cmake}
|
|
cmake_policy(SET CMP0168 OLD)
|
|
\endcode
|
|
|
|
*/
|
|
|
|
}
|