Skip to content

Commit 7ed3dab

Browse files
authored
Merge pull request #5831 from blowekamp/eigen_update
Refactor third-party Eigen3 CMake code
2 parents f7023f4 + 7aa8ae2 commit 7ed3dab

6 files changed

Lines changed: 53 additions & 252 deletions

File tree

CMake/itkExternal_Eigen3.cmake

Lines changed: 0 additions & 113 deletions
This file was deleted.

CMakeLists.txt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -736,11 +736,6 @@ if(BUILD_TESTING OR ITK_BUILD_DOCUMENTATION OR ITK_WRAP_PYTHON)
736736
endif()
737737
endif()
738738

739-
#-----------------------------------------------------------------------------
740-
# Configure Eigen3 before ITKModuleEnablement
741-
# No download or build is performed. Generates Targets and Config.cmake files for Eigen
742-
include(itkExternal_Eigen3)
743-
744739
#----------------------------------------------------------------------
745740
# Make sure remote modules are downloaded before sorting out the module
746741
# dependencies.

Modules/ThirdParty/Eigen3/CMakeLists.txt

Lines changed: 43 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -8,109 +8,58 @@ option(
88
)
99
mark_as_advanced(ITK_USE_SYSTEM_EIGEN)
1010

11-
if(ITK_USE_SYSTEM_EIGEN)
12-
set(_eigen_itk_target Eigen3::Eigen)
13-
else()
14-
set(_eigen_itk_target ITKInternalEigen3::Eigen)
15-
endif()
16-
set(ITKEigen3_LIBRARIES ${_eigen_itk_target})
17-
# Assume that Eigen generates a Eigen3Config.cmake
18-
set(_Eigen3_min_version 3.3)
19-
20-
# Docs:
21-
# find_package(ITK REQUIRED COMPONENTS
22-
# ITKEigen3
23-
# )
24-
# When this module is required, the following cmake is invoked:
25-
# find_package(Eigen3 CONFIG) if ITK_USE_SYSTEM_EIGEN=ON
26-
# Or
27-
# find_package(ITKInternalEigen3 CONFIG) otherwise
28-
#
29-
# ITKInternalEigen3 does NOT allow the use of #include <Eigen/Core>, it requires #include <itkeigen/Eigen/Core>
30-
# This logic is handled automatically by the macro used internally `#include ITK_EIGEN(Core)`
11+
option(
12+
ITK_USE_EIGEN_MPL2_ONLY
13+
"Set compile definition EIGEN_MPL2_ONLY for eigen_internal."
14+
OFF
15+
)
16+
mark_as_advanced(ITK_USE_EIGEN_MPL2_ONLY)
3117

32-
# However, this does not scale well for external ITK modules that want
33-
# to link to third party libraries which are already using Eigen3.
34-
# To solve it, ITK also creates a Eigen3Config.cmake for external consumers (i.e. in ExternalModules).
35-
# This Eigen3Config in ITK/Modules points to the same internal headers than ITKInternalEigen,
36-
# but #include <Eigen/Core> can now be used.
37-
#
38-
# External consumers just need the following extra logic to reuse the internal ITK Eigen, but
39-
# without any change on the include of Eigen3 headers:
40-
#
41-
# Minimal Example:
42-
# CMakeLists.txt
43-
#
44-
# find_package(ITK REQUIRED COMPONENTS
45-
# ITKEigen3
46-
# ITKCommon
47-
# )
48-
# set(ITK_EIGEN_LIBRARIES "") # No extra libraries are required if ITK is using system Eigen3
49-
# if(DEFINED ITKInternalEigen3_DIR) # Equivalent to if(NOT ITK_USE_SYSTEM_EIGEN)
50-
# set(Eigen3_DIR ${ITKInternalEigen3_DIR})
51-
# find_package(Eigen3 REQUIRED CONFIG)
52-
# endif()
53-
# add_executable(script file_with_itk_and_eigen3.cpp)
54-
# target_link_library(script ${ITK_LIBRARIES})
55-
# target_link_library(script Eigen3::Eigen)
18+
set(_Eigen3_min_version 3.3)
5619

5720
if(ITK_USE_SYSTEM_EIGEN)
5821
set(_Eigen3_SYSTEM_OR_INTERNAL "Eigen3")
5922
find_package(${_Eigen3_SYSTEM_OR_INTERNAL} REQUIRED CONFIG)
60-
set(Eigen3_DIR_INSTALL ${Eigen3_DIR})
61-
set(Eigen3_DIR_BUILD ${Eigen3_DIR})
62-
else()
63-
set(_Eigen3_SYSTEM_OR_INTERNAL "ITKInternalEigen3")
64-
find_package(${_Eigen3_SYSTEM_OR_INTERNAL} REQUIRED CONFIG)
65-
set(Eigen3_DIR_INSTALL "\${ITK_MODULES_DIR}")
66-
set(_eigen3_build_dir "${ITK_BINARY_DIR}/ITKInternalEigen3-build")
67-
set(Eigen3_DIR_BUILD "${_eigen3_build_dir}")
68-
endif()
69-
if(${_Eigen3_SYSTEM_OR_INTERNAL}_VERSION VERSION_LESS ${_Eigen3_min_version})
70-
message(
71-
FATAL_ERROR
72-
"Eigen3 version ${_Eigen3_min_version} or later is required."
73-
)
74-
endif()
23+
set(ITKEigen3_LIBRARIES Eigen3::Eigen)
7524

76-
# Eigen3 is header only, but there are compile definitions that we want to provide
77-
# to enforce use of MPL only code, and to disable warnings.
78-
# We only need to add the location of the header itk_eigen.h used internally.
79-
get_target_property(
80-
Eigen_INCLUDE_DIRS
81-
${_eigen_itk_target}
82-
INTERFACE_INCLUDE_DIRECTORIES
83-
)
84-
set(
85-
ITKEigen3_INCLUDE_DIRS
86-
${Eigen_INCLUDE_DIRS}
87-
${ITKEigen3_BINARY_DIR}/src # For the generated itk_eigen.h
88-
)
25+
set(ITKEigen3_NO_SRC 1)
8926

90-
# When this module is loaded by an app, load Eigen too.
91-
# Load ITKInternalEigen3 or Eigen3 depending on ITK_USE_SYSTEM_EIGEN
92-
set(
93-
ITKEigen3_EXPORT_CODE_INSTALL
94-
"
95-
set(ITK_USE_SYSTEM_EIGEN \"${ITK_USE_SYSTEM_EIGEN}\")
96-
set(${_Eigen3_SYSTEM_OR_INTERNAL}_DIR \"${Eigen3_DIR_INSTALL}\")
97-
find_package(${_Eigen3_SYSTEM_OR_INTERNAL} REQUIRED CONFIG)
98-
if(${_Eigen3_SYSTEM_OR_INTERNAL}_VERSION VERSION_LESS ${_Eigen3_min_version})
99-
message(FATAL_ERROR \"Eigen3 version ${_Eigen3_min_version} or later is required.\")
100-
endif()
27+
if(${_Eigen3_SYSTEM_OR_INTERNAL}_VERSION VERSION_LESS ${_Eigen3_min_version})
28+
message(
29+
FATAL_ERROR
30+
"Eigen3 version ${_Eigen3_min_version} or later is required."
31+
)
32+
endif()
33+
34+
# When this module is loaded by an app, load Eigen too.
35+
# Load ITKInternalEigen3 or Eigen3 depending on ITK_USE_SYSTEM_EIGEN
36+
set(
37+
ITKEigen3_EXPORT_CODE_INSTALL
38+
"
39+
find_package(\"Eigen3\" REQUIRED CONFIG)
40+
if(Eigen3_VERSION VERSION_LESS ${_Eigen3_min_version})
41+
message(FATAL_ERROR \"Eigen3 version ${_Eigen3_min_version} or later is required.\")
42+
endif()
10143
"
102-
)
103-
set(
104-
ITKEigen3_EXPORT_CODE_BUILD
105-
"
106-
set(ITK_USE_SYSTEM_EIGEN \"${ITK_USE_SYSTEM_EIGEN}\")
107-
set(${_Eigen3_SYSTEM_OR_INTERNAL}_DIR \"${Eigen3_DIR_BUILD}\")
108-
find_package(${_Eigen3_SYSTEM_OR_INTERNAL} REQUIRED CONFIG)
109-
if(${_Eigen3_SYSTEM_OR_INTERNAL}_VERSION VERSION_LESS ${_Eigen3_min_version})
110-
message(FATAL_ERROR \"Eigen3 version ${_Eigen3_min_version} or later is required.\")
111-
endif()
44+
)
45+
set(
46+
ITKEigen3_EXPORT_CODE_BUILD
47+
"
48+
if(NOT ITK_BINARY_DIR)
49+
find_package(\"Eigen3\" REQUIRED CONFIG)
50+
if(Eigen3_VERSION VERSION_LESS ${_Eigen3_min_version})
51+
message(FATAL_ERROR \"Eigen3 version ${_Eigen3_min_version} or later is required.\")
52+
endif()
53+
endif()
11254
"
113-
)
55+
)
56+
else()
57+
set(ITKEigen3_LIBRARIES eigen_internal)
58+
set(ITKEigen3_INCLUDE_DIRS ${ITKEigen3_SOURCE_DIR}/src)
59+
endif()
60+
61+
# For the generated itk_eigen.h
62+
list(APPEND ITKEigen3_INCLUDE_DIRS ${ITKEigen3_BINARY_DIR}/src)
11463

11564
# Eigen3 targets are not installed if ITK_USE_SYSTEM_EIGEN==True
11665
itk_module_impl()

Modules/ThirdParty/Eigen3/itk-module-init.cmake

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
set(ITK3P_INSTALL_EXPORT_NAME "${ITKEigen3-targets}")
2+
set(ITK3P_INSTALL_INCLUDE_DIR "${ITKEigen3_INSTALL_INCLUDE_DIR}")
3+
set(ITK3P_INSTALL_RUNTIME_DIR "${ITKEigen3_INSTALL_RUNTIME_DIR}")
4+
5+
add_subdirectory(itkeigen)
6+
itk_module_target(eigen_internal NO_INSTALL)

Modules/ThirdParty/Eigen3/src/itkeigen/CMakeLists.txt

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
882882
# Install files (used for both eigen_external and eigen_internal)
883883
install(
884884
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Eigen/"
885-
DESTINATION "${INCLUDE_INSTALL_DIR}/itkeigen/Eigen"
885+
DESTINATION "${ITK3P_INSTALL_INCLUDE_DIR}/itkeigen/Eigen"
886886
PATTERN "*.txt" EXCLUDE)
887887

888888
######################### eigen_internal #####################################
@@ -896,8 +896,6 @@ add_library (ITKInternalEigen3::Eigen ALIAS eigen_internal)
896896
# This would wrongly enforce EIGEN_MPL2_ONLY to other libraries using Eigen.
897897
# We wrap this definition in ITK_USE_EIGEN_MPL2_ONLY, and only enabling it internally in the dashboards and CI,
898898
# to avoid introducing GPL code from Eigen3 internally in ITK.
899-
option(ITK_USE_EIGEN_MPL2_ONLY "Set compile definition EIGEN_MPL2_ONLY for ITKInternalEigen3." OFF)
900-
mark_as_advanced(ITK_USE_EIGEN_MPL2_ONLY)
901899

902900
if(ITK_USE_EIGEN_MPL2_ONLY)
903901
target_compile_definitions (eigen_internal INTERFACE "EIGEN_MPL2_ONLY")
@@ -907,41 +905,10 @@ endif()
907905
# #include <itkeigen/Eigen/x>
908906
# INSTALL: headers require pre-prend itkeigen/Eigen/X.
909907
target_include_directories (eigen_internal SYSTEM INTERFACE
910-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
911-
# $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
912-
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
908+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
909+
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${ITK3P_INSTALL_INCLUDE_DIR}/itkeigen>;"
913910
)
914911

915912
# Export as title case Eigen
916-
set_target_properties (eigen_internal PROPERTIES EXPORT_NAME Eigen)
917-
install (TARGETS eigen_internal EXPORT ITKInternalEigen3Targets)
913+
install (TARGETS eigen_internal EXPORT ${ITK3P_INSTALL_EXPORT_NAME})
918914

919-
set(EIGEN3_TARGETS_FILE ITKInternalEigen3Targets.cmake)
920-
configure_package_config_file (
921-
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3Config.cmake.in
922-
${CMAKE_CURRENT_BINARY_DIR}/ITKInternalEigen3Config.cmake
923-
INSTALL_DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}
924-
NO_CHECK_REQUIRED_COMPONENTS_MACRO # Eigen does not provide components
925-
)
926-
# Remove CMAKE_SIZEOF_VOID_P from Eigen3ConfigVersion.cmake since Eigen does
927-
# not depend on architecture specific settings or libraries. More
928-
# specifically, an Eigen3Config.cmake generated from a 64 bit target can be
929-
# used for 32 bit targets as well (and vice versa).
930-
set (_Eigen3_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
931-
unset (CMAKE_SIZEOF_VOID_P)
932-
write_basic_package_version_file (ITKInternalEigen3ConfigVersion.cmake
933-
VERSION ${EIGEN_VERSION_NUMBER}
934-
COMPATIBILITY SameMajorVersion)
935-
set (CMAKE_SIZEOF_VOID_P ${_Eigen3_CMAKE_SIZEOF_VOID_P})
936-
# The Eigen target will be located in the Eigen3 namespace. Other CMake
937-
# targets can refer to it using Eigen3::Eigen.
938-
export (TARGETS eigen_internal NAMESPACE ITKInternalEigen3:: FILE ITKInternalEigen3Targets.cmake)
939-
install (EXPORT ITKInternalEigen3Targets NAMESPACE ITKInternalEigen3:: DESTINATION ${CMAKEPACKAGE_INSTALL_DIR})
940-
# Files already installed in eigen_external
941-
# install(
942-
# DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Eigen/"
943-
# DESTINATION "${INCLUDE_INSTALL_DIR}/itkeigen/Eigen"
944-
# PATTERN "*.txt" EXCLUDE)
945-
install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/ITKInternalEigen3Config.cmake
946-
${CMAKE_CURRENT_BINARY_DIR}/ITKInternalEigen3ConfigVersion.cmake
947-
DESTINATION ${CMAKEPACKAGE_INSTALL_DIR} )

0 commit comments

Comments
 (0)