Skip to content

Commit df2df52

Browse files
committed
WIP: Refactor third-party Eigen3 CMake code
Remove Eigen3 external project, use itk module macros to install and export eigen_internal target. Remove the CMake code to install auxiliary cmake and configuration file for target. This target is now imported through ITKTargets, and not a separate export and configuration file. Preserve Eigen3::Eigen project exports.
1 parent 7f1814d commit df2df52

File tree

4 files changed

+41
-201
lines changed

4 files changed

+41
-201
lines changed

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: 38 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ mark_as_advanced(ITK_USE_SYSTEM_EIGEN)
1111
if(ITK_USE_SYSTEM_EIGEN)
1212
set(_eigen_itk_target Eigen3::Eigen)
1313
else()
14-
set(_eigen_itk_target ITKInternalEigen3::Eigen)
14+
set(_eigen_itk_target eigen_internal)
1515
endif()
1616
set(ITKEigen3_LIBRARIES ${_eigen_itk_target})
1717
# Assume that Eigen generates a Eigen3Config.cmake
@@ -57,60 +57,51 @@ set(_Eigen3_min_version 3.3)
5757
if(ITK_USE_SYSTEM_EIGEN)
5858
set(_Eigen3_SYSTEM_OR_INTERNAL "Eigen3")
5959
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()
7560

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-
)
61+
set(ITKEigen3_NO_SRC 1)
8962

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})
63+
if(${_Eigen3_SYSTEM_OR_INTERNAL}_VERSION VERSION_LESS ${_Eigen3_min_version})
64+
message(
65+
FATAL_ERROR
66+
"Eigen3 version ${_Eigen3_min_version} or later is required."
67+
)
68+
endif()
69+
70+
# When this module is loaded by an app, load Eigen too.
71+
# Load ITKInternalEigen3 or Eigen3 depending on ITK_USE_SYSTEM_EIGEN
72+
set(
73+
ITKEigen3_EXPORT_CODE_INSTALL
74+
"
75+
find_package(\"Eigen3\" REQUIRED CONFIG)
76+
if(Eigen3_VERSION VERSION_LESS ${_Eigen3_min_version})
9977
message(FATAL_ERROR \"Eigen3 version ${_Eigen3_min_version} or later is required.\")
10078
endif()
10179
"
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})
80+
)
81+
set(
82+
ITKEigen3_EXPORT_CODE_BUILD
83+
"
84+
if(NOT ITK_BINARY_DIR)
85+
86+
find_package(\"Eigen3\" REQUIRED CONFIG)
87+
if(Eigen3_VERSION VERSION_LESS ${_Eigen3_min_version})
11088
message(FATAL_ERROR \"Eigen3 version ${_Eigen3_min_version} or later is required.\")
11189
endif()
90+
endif()
11291
"
113-
)
92+
)
93+
else()
94+
set(_Eigen3_SYSTEM_OR_INTERNAL "ITKInternalEigen3")
95+
96+
set(ITKEigen3_INCLUDE_DIRS ${ITKEigen3_SOURCE_DIR}/src)
97+
98+
set(Eigen3_DIR_INSTALL "\${ITK_MODULES_DIR}")
99+
set(_eigen3_build_dir "${ITK_BINARY_DIR}/ITKInternalEigen3-build")
100+
set(Eigen3_DIR_BUILD "${_eigen3_build_dir}")
101+
endif()
102+
103+
# For the generated itk_eigen.h
104+
list(APPEND ITKEigen3_INCLUDE_DIRS ${ITKEigen3_BINARY_DIR}/src)
114105

115106
# Eigen3 targets are not installed if ITK_USE_SYSTEM_EIGEN==True
116107
itk_module_impl()

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

Lines changed: 3 additions & 36 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")
@@ -908,40 +906,9 @@ endif()
908906
# INSTALL: headers require pre-prend itkeigen/Eigen/X.
909907
target_include_directories (eigen_internal SYSTEM INTERFACE
910908
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
911-
# $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
912-
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_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)