aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt62
-rw-r--r--cmake/Eigen3Config.cmake.in41
-rw-r--r--cmake/Eigen3ConfigLegacy.cmake.in28
-rw-r--r--doc/Manual.dox1
-rw-r--r--doc/TopicCMakeGuide.dox40
5 files changed, 139 insertions, 33 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f38e22973..6c1520d7d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -510,15 +510,59 @@ set ( EIGEN_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_DIR}" )
set ( EIGEN_INCLUDE_DIRS ${EIGEN_INCLUDE_DIR} )
set ( EIGEN_ROOT_DIR ${CMAKE_INSTALL_PREFIX} )
-configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3Config.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
- @ONLY ESCAPE_QUOTES
- )
-
-install ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UseEigen3.cmake
- ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
- DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}
- )
+# Interface libraries require at least CMake 3.0
+if (NOT CMAKE_VERSION VERSION_LESS 3.0)
+ include (CMakePackageConfigHelpers)
+
+ # Imported target support
+ add_library (eigen INTERFACE)
+
+ target_compile_definitions (eigen INTERFACE ${EIGEN_DEFINITIONS})
+ target_include_directories (eigen INTERFACE
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+ $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
+ )
+
+ # Export as title case Eigen
+ set_target_properties (eigen PROPERTIES EXPORT_NAME Eigen)
+
+ install (TARGETS eigen EXPORT Eigen3Targets)
+
+ configure_package_config_file (
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3Config.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
+ INSTALL_DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}
+ NO_CHECK_REQUIRED_COMPONENTS_MACRO # Eigen does not provide components
+ )
+ write_basic_package_version_file (Eigen3ConfigVersion.cmake
+ VERSION ${EIGEN_VERSION_NUMBER} COMPATIBILITY SameMajorVersion)
+
+ # The Eigen target will be located in the Eigen3 namespace. Other CMake
+ # targets can refer to it using Eigen3::Eigen.
+ export (TARGETS eigen NAMESPACE Eigen3:: FILE Eigen3Targets.cmake)
+ # Export Eigen3 package to CMake registry such that it can be easily found by
+ # CMake even if it has not been installed to a standard directory.
+ export (PACKAGE Eigen3)
+
+ install (EXPORT Eigen3Targets NAMESPACE Eigen3:: DESTINATION
+ ${CMAKEPACKAGE_INSTALL_DIR})
+ install (FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/Eigen3ConfigVersion.cmake
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UseEigen3.cmake
+ DESTINATION ${CMAKEPACKAGE_INSTALL_DIR})
+else (NOT CMAKE_VERSION VERSION_LESS 3.0)
+ # Fallback to legacy Eigen3Config.cmake without the imported target
+ configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3ConfigLegacy.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
+ @ONLY ESCAPE_QUOTES
+ )
+
+ install ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UseEigen3.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
+ DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}
+ )
+endif (NOT CMAKE_VERSION VERSION_LESS 3.0)
# Add uninstall target
add_custom_target ( uninstall
diff --git a/cmake/Eigen3Config.cmake.in b/cmake/Eigen3Config.cmake.in
index 04e7886ce..01937a3cc 100644
--- a/cmake/Eigen3Config.cmake.in
+++ b/cmake/Eigen3Config.cmake.in
@@ -1,28 +1,21 @@
-# -*- cmake -*-
-#
-# Eigen3Config.cmake(.in)
+# This file exports the Eigen3::Eigen CMake target which should be passed to the
+# target_link_libraries command.
-# Use the following variables to compile and link against Eigen:
-# EIGEN3_FOUND - True if Eigen was found on your system
-# EIGEN3_USE_FILE - The file making Eigen usable
-# EIGEN3_DEFINITIONS - Definitions needed to build with Eigen
-# EIGEN3_INCLUDE_DIR - Directory where signature_of_eigen3_matrix_library can be found
-# EIGEN3_INCLUDE_DIRS - List of directories of Eigen and it's dependencies
-# EIGEN3_ROOT_DIR - The base directory of Eigen
-# EIGEN3_VERSION_STRING - A human-readable string containing the version
-# EIGEN3_VERSION_MAJOR - The major version of Eigen
-# EIGEN3_VERSION_MINOR - The minor version of Eigen
-# EIGEN3_VERSION_PATCH - The patch version of Eigen
+@PACKAGE_INIT@
-set ( EIGEN3_FOUND 1 )
-set ( EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake" )
+include ("${CMAKE_CURRENT_LIST_DIR}/Eigen3Targets.cmake")
-set ( EIGEN3_DEFINITIONS "@EIGEN_DEFINITIONS@" )
-set ( EIGEN3_INCLUDE_DIR "@EIGEN_INCLUDE_DIR@" )
-set ( EIGEN3_INCLUDE_DIRS "@EIGEN_INCLUDE_DIRS@" )
-set ( EIGEN3_ROOT_DIR "@EIGEN_ROOT_DIR@" )
+# Legacy variables, do *not* use. May be removed in the future.
-set ( EIGEN3_VERSION_STRING "@EIGEN_VERSION_STRING@" )
-set ( EIGEN3_VERSION_MAJOR "@EIGEN_VERSION_MAJOR@" )
-set ( EIGEN3_VERSION_MINOR "@EIGEN_VERSION_MINOR@" )
-set ( EIGEN3_VERSION_PATCH "@EIGEN_VERSION_PATCH@" )
+set (EIGEN3_FOUND 1)
+set (EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake")
+
+set (EIGEN3_DEFINITIONS "@EIGEN_DEFINITIONS@")
+set (EIGEN3_INCLUDE_DIR "@EIGEN_INCLUDE_DIR@")
+set (EIGEN3_INCLUDE_DIRS "@EIGEN_INCLUDE_DIRS@")
+set (EIGEN3_ROOT_DIR "@EIGEN_ROOT_DIR@")
+
+set (EIGEN3_VERSION_STRING "@EIGEN_VERSION_STRING@")
+set (EIGEN3_VERSION_MAJOR "@EIGEN_VERSION_MAJOR@")
+set (EIGEN3_VERSION_MINOR "@EIGEN_VERSION_MINOR@")
+set (EIGEN3_VERSION_PATCH "@EIGEN_VERSION_PATCH@")
diff --git a/cmake/Eigen3ConfigLegacy.cmake.in b/cmake/Eigen3ConfigLegacy.cmake.in
new file mode 100644
index 000000000..04e7886ce
--- /dev/null
+++ b/cmake/Eigen3ConfigLegacy.cmake.in
@@ -0,0 +1,28 @@
+# -*- cmake -*-
+#
+# Eigen3Config.cmake(.in)
+
+# Use the following variables to compile and link against Eigen:
+# EIGEN3_FOUND - True if Eigen was found on your system
+# EIGEN3_USE_FILE - The file making Eigen usable
+# EIGEN3_DEFINITIONS - Definitions needed to build with Eigen
+# EIGEN3_INCLUDE_DIR - Directory where signature_of_eigen3_matrix_library can be found
+# EIGEN3_INCLUDE_DIRS - List of directories of Eigen and it's dependencies
+# EIGEN3_ROOT_DIR - The base directory of Eigen
+# EIGEN3_VERSION_STRING - A human-readable string containing the version
+# EIGEN3_VERSION_MAJOR - The major version of Eigen
+# EIGEN3_VERSION_MINOR - The minor version of Eigen
+# EIGEN3_VERSION_PATCH - The patch version of Eigen
+
+set ( EIGEN3_FOUND 1 )
+set ( EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake" )
+
+set ( EIGEN3_DEFINITIONS "@EIGEN_DEFINITIONS@" )
+set ( EIGEN3_INCLUDE_DIR "@EIGEN_INCLUDE_DIR@" )
+set ( EIGEN3_INCLUDE_DIRS "@EIGEN_INCLUDE_DIRS@" )
+set ( EIGEN3_ROOT_DIR "@EIGEN_ROOT_DIR@" )
+
+set ( EIGEN3_VERSION_STRING "@EIGEN_VERSION_STRING@" )
+set ( EIGEN3_VERSION_MAJOR "@EIGEN_VERSION_MAJOR@" )
+set ( EIGEN3_VERSION_MINOR "@EIGEN_VERSION_MINOR@" )
+set ( EIGEN3_VERSION_PATCH "@EIGEN_VERSION_PATCH@" )
diff --git a/doc/Manual.dox b/doc/Manual.dox
index a08609ad7..342b145fd 100644
--- a/doc/Manual.dox
+++ b/doc/Manual.dox
@@ -26,6 +26,7 @@ namespace Eigen {
- \subpage TopicPitfalls
- \subpage TopicTemplateKeyword
- \subpage UserManual_UnderstandingEigen
+ - \subpage TopicCMakeGuide
*/
/** \page UserManual_UnderstandingEigen Understanding Eigen
diff --git a/doc/TopicCMakeGuide.dox b/doc/TopicCMakeGuide.dox
new file mode 100644
index 000000000..5362413d6
--- /dev/null
+++ b/doc/TopicCMakeGuide.dox
@@ -0,0 +1,40 @@
+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.0 (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.0)
+project (myproject)
+
+find_package (Eigen3 3.3 REQUIRED)
+
+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`
+which requires at least version 3.3 of %Eigen. Here, `path-to-example-directory`
+is the path to the directory that contains both `CMakeLists.txt` and
+`example.cpp`.
+
+
+*/
+
+}
+
+// vim: set ft=cpp.doxygen