fix(build): resolve Eigen3::Eigen via CMAKE_PREFIX_PATH fallback

find_package(Eigen3 CONFIG) may not work in static builds where
find_package is skipped globally. As fallback, manually create the
Eigen3::Eigen IMPORTED target pointing to the eigen3 headers installed
by deps/ (under CMAKE_PREFIX_PATH/include/eigen3). This ensures libigl
and admesh always get a modern Eigen (5.x) with Eigen::all support.
This commit is contained in:
thysson2701
2026-07-21 14:33:28 +02:00
parent 563ade1276
commit 0f1e69110f

View File

@@ -1,12 +1,36 @@
cmake_minimum_required(VERSION 3.13)
project(eigen)
# Use the pre-built Eigen from deps/ (Eigen3Config.cmake is installed there via CMAKE_PREFIX_PATH).
# The bundled headers in this directory are an older version and must not be used directly,
# as libigl and admesh require Eigen3::Eigen with Eigen 3.4+ features (e.g. Eigen::all).
find_package(Eigen3 REQUIRED NO_MODULE)
# Try to find the pre-built Eigen3 installed by deps/ CMakeLists (Eigen 5.x).
# This must succeed: libigl and admesh use Eigen 3.4+ features (e.g. Eigen::all).
find_package(Eigen3 CONFIG QUIET)
# Provide a plain "eigen" alias for any code that links to the unnamespaced target.
if(Eigen3_FOUND OR TARGET Eigen3::Eigen)
message(STATUS "deps_src/eigen: using pre-built Eigen3 from CMAKE_PREFIX_PATH")
else()
# Fall back: construct the include path from the known deps install location.
# CMAKE_PREFIX_PATH points to deps/build/OrcaSlicer_dep/usr/local;
# Eigen installs its headers under <prefix>/include/eigen3.
set(_eigen_include "")
foreach(_prefix ${CMAKE_PREFIX_PATH})
if(EXISTS "${_prefix}/include/eigen3")
set(_eigen_include "${_prefix}/include/eigen3")
break()
endif()
endforeach()
if(_eigen_include)
message(STATUS "deps_src/eigen: using eigen3 headers from ${_eigen_include}")
add_library(Eigen3::Eigen INTERFACE IMPORTED GLOBAL)
set_target_properties(Eigen3::Eigen PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_eigen_include}")
else()
message(FATAL_ERROR "deps_src/eigen: could not locate Eigen3 headers. "
"Ensure deps/ has been built first (cmake --build deps/build).")
endif()
endif()
# Provide unnamespaced "eigen" alias for targets that link against it directly.
if(NOT TARGET eigen)
add_library(eigen INTERFACE)
target_link_libraries(eigen INTERFACE Eigen3::Eigen)