diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index ef6c3ac671..4de0ca4698 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -398,6 +398,10 @@ if(USE_MMAP) endif() endif() +# 3.3.9 is the version currently used on the Windows build. +# 3.4.0 is the version shipped with Ubuntu 22.04. +set(EIGEN_MIN_VERSION 3.3.9) + # 1.74 is the version shipped with Ubuntu 22.04. set(BOOST_MIN_VERSION 1.74) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14) diff --git a/cmake/FindEigen3.cmake b/cmake/FindEigen3.cmake index e886310e89..8e4c9a961d 100644 --- a/cmake/FindEigen3.cmake +++ b/cmake/FindEigen3.cmake @@ -10,11 +10,25 @@ UNIFY_ENVVARS_AND_CACHE(EIGEN_DIR) if(EXISTS "${EIGEN_DIR}") + file(STRINGS "${EIGEN_DIR}/Eigen/src/Core/util/Macros.h" eigen_version_world_line REGEX "^#define EIGEN_WORLD_VERSION") + file(STRINGS "${EIGEN_DIR}/Eigen/src/Core/util/Macros.h" eigen_version_major_line REGEX "^#define EIGEN_MAJOR_VERSION") + file(STRINGS "${EIGEN_DIR}/Eigen/src/Core/util/Macros.h" eigen_version_minor_line REGEX "^#define EIGEN_MINOR_VERSION") + string(REGEX REPLACE "^#define EIGEN_WORLD_VERSION ([0-9]+)$" "\\1" eigen_version_world "${eigen_version_world_line}") + string(REGEX REPLACE "^#define EIGEN_MAJOR_VERSION ([0-9]+)$" "\\1" eigen_version_major "${eigen_version_major_line}") + string(REGEX REPLACE "^#define EIGEN_MINOR_VERSION ([0-9]+)$" "\\1" eigen_version_minor "${eigen_version_minor_line}") + set(Eigen3_VERSION "${eigen_version_world}.${eigen_version_major}.${eigen_version_minor}") + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Eigen3 + REQUIRED_VARS EIGEN_DIR + VERSION_VAR Eigen3_VERSION + ) + # Mimic Eigen3Config.cmake target. add_library(Eigen3::Eigen INTERFACE IMPORTED) target_include_directories(Eigen3::Eigen INTERFACE "${EIGEN_DIR}") else() - find_package(Eigen3 CONFIG) + find_package(Eigen3 ${Eigen3_FIND_VERSION} CONFIG) if(Eigen3_DIR) message(STATUS "Eigen3: found config at '${Eigen3_DIR}'.") else() diff --git a/src/helpers/CMakeLists.txt b/src/helpers/CMakeLists.txt index 81e8fc83ee..2450d3dade 100644 --- a/src/helpers/CMakeLists.txt +++ b/src/helpers/CMakeLists.txt @@ -34,7 +34,7 @@ message("Running CMakeLists.txt in /src/helpers") # (ifcopenshell.util.element) # * Element — get_predefined_type (ifcopenshell.util.element) -find_package(Eigen3 REQUIRED) +find_package(Eigen3 ${EIGEN_MIN_VERSION} REQUIRED) # helpers_math: the schema-free subset — unit conversion tables and Helmert # matrix math over plain numbers. No IfcParse, no Qt, no schema dispatch, so it diff --git a/src/ifcgeom/CMakeLists.txt b/src/ifcgeom/CMakeLists.txt index fc73187bcd..426e7d11ce 100644 --- a/src/ifcgeom/CMakeLists.txt +++ b/src/ifcgeom/CMakeLists.txt @@ -41,7 +41,7 @@ if(UNIX) find_package(Threads) endif() -find_package(Eigen3 REQUIRED) +find_package(Eigen3 ${EIGEN_MIN_VERSION} REQUIRED) add_subdirectory(kernels) set(kernel_libraries ${kernel_libraries} PARENT_SCOPE) diff --git a/src/ifcgeom/mapping/CMakeLists.txt b/src/ifcgeom/mapping/CMakeLists.txt index 300c1311c4..6090d6e648 100644 --- a/src/ifcgeom/mapping/CMakeLists.txt +++ b/src/ifcgeom/mapping/CMakeLists.txt @@ -1,4 +1,4 @@ -find_package(Eigen3 REQUIRED) +find_package(Eigen3 ${EIGEN_MIN_VERSION} REQUIRED) set(mapping_plugin_runtime_dir "$") diff --git a/src/ifcviewer/CMakeLists.txt b/src/ifcviewer/CMakeLists.txt index 820af7ed30..b426b26398 100644 --- a/src/ifcviewer/CMakeLists.txt +++ b/src/ifcviewer/CMakeLists.txt @@ -30,7 +30,7 @@ endif() # Eigen3 — used by Federation matrices, ViewportWindow's instance compose, # the per-model coordinate-operation matrices stored on ModelGpuData, and # everywhere a 4x4 transform shows up. Header-only, works under Emscripten. -find_package(Eigen3 REQUIRED) +find_package(Eigen3 ${EIGEN_MIN_VERSION} REQUIRED) # wgpu-native — fetched as a pre-built binary release from upstream. # Under Emscripten this whole block is skipped; the web build links diff --git a/src/ifcviewer/tests/CMakeLists.txt b/src/ifcviewer/tests/CMakeLists.txt index 94c1c2fb27..bf0f7cd2ff 100644 --- a/src/ifcviewer/tests/CMakeLists.txt +++ b/src/ifcviewer/tests/CMakeLists.txt @@ -93,7 +93,7 @@ add_ifcviewer_unit_test(test_sidecar_layout # InstanceCompose: matrix composition + cross-model object_id lookup. # Pulls in wgpu_native for the WGPUBuffer typedef via ModelGpuData.h # (never touched at runtime). Eigen for Matrix4d. -find_package(Eigen3 REQUIRED) +find_package(Eigen3 ${EIGEN_MIN_VERSION} REQUIRED) add_ifcviewer_unit_test(test_instance_compose SOURCES ${IFCVIEWER_SRC}/InstanceCompose.cpp LIBS wgpu_native Eigen3::Eigen @@ -150,7 +150,7 @@ endif() # directly and enable AUTOMOC for the Q_OBJECT moc-generation. find_package(Qt${QT_VERSION} COMPONENTS Core Gui Test REQUIRED PATHS ${QT_DIR}) -find_package(Eigen3 REQUIRED) +find_package(Eigen3 ${EIGEN_MIN_VERSION} REQUIRED) add_executable(test_federation test_federation.cpp