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 %CMake 3.5 (or later) is required to enable this functionality.

%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)  # Restricts to 3.4.z
```
or to support a range of versions:
```
find_package(Eigen3 3.4...5 REQUIRED NO_MODULE)  # Any version >=3.4.0 but <6.0.0.
```

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

*/

}
