Skip to content

Commit

Permalink
eigen can be built via FetchContent + bumped built version to 3.4.0
Browse files Browse the repository at this point in the history
eigen search order changed:
- first module is used
- then config file is sought
- lastly fetchcontent is used
  • Loading branch information
evaleev committed Nov 30, 2021
1 parent be1f9bd commit da87fe2
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 101 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -305,9 +305,10 @@ add_custom_target(External-tiledarray)
if(ENABLE_CUDA)
include(external/cuda.cmake)
endif()
# N.B. in case we build eigen3, it must come first since it defined 'check' target without checking if it exists
include(external/eigen.cmake)
include(FindOrFetchMADWorld)
detect_MADNESS_configuration()
include(external/eigen.cmake)
# the FetchContent-based version will not work due to BLT target name conflicts
# include(FindOrFetchUmpire)
# use the ExternalProject-based version
Expand Down
47 changes: 47 additions & 0 deletions cmake/modules/FindOrFetchEigen3.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# provides Eigen3::Eigen target, by looking for it, or building it (via FetchContent)

# if CUDA is enabled (assuming CUDA version is 9 or 10) need Eigen 3.3.7
# see https://gitlab.com/libeigen/eigen/issues/1491
if (ENABLE_CUDA)
set(_tiledarray_required_eigen_version 3.3.7)
else(ENABLE_CUDA)
set(_tiledarray_required_eigen_version ${TA_TRACKED_EIGEN_VERSION})
endif(ENABLE_CUDA)

if (NOT TARGET Eigen3::Eigen)
include(FindPackageRegimport)
# re:NO_CMAKE_PACKAGE_REGISTRY: eigen3 registers its *build* tree with the user package registry ...
# to avoid issues with wiped build directory look for installed eigen
find_package_regimport(Eigen3 ${_tiledarray_required_eigen_version} NO_MODULE NO_CMAKE_PACKAGE_REGISTRY)
if (TARGET Eigen3::Eigen)
message(STATUS "Found Eigen3 ${Eigen3_VERSION} via ${Eigen3_CONFIG}")
endif(TARGET Eigen3::Eigen)
endif (NOT TARGET Eigen3::Eigen)

# if not found, build via FetchContent
if (NOT TARGET Eigen3::Eigen)
include (FetchContent)
cmake_minimum_required (VERSION 3.14.0) # for FetchContent_MakeAvailable

set(EIGEN3_URL_HASH ${TA_INSTALL_EIGEN_URL_HASH})
set(EIGEN3_URL https://gitlab.com/libeigen/eigen/-/archive/${TA_INSTALL_EIGEN_VERSION}/eigen-${TA_INSTALL_EIGEN_VERSION}.tar.bz2)

FetchContent_Declare(
eigen3
URL ${EIGEN3_URL}
URL_HASH ${EIGEN3_URL_HASH}
)
FetchContent_MakeAvailable(eigen3)
FetchContent_GetProperties(eigen3
SOURCE_DIR eigen3_SOURCE_DIR
BINARY_DIR eigen3_BINARY_DIR
)

set(Eigen3_CONFIG ${CMAKE_INSTALL_PREFIX}/share/eigen3/cmake/Eigen3Config.cmake)

endif(NOT TARGET Eigen3::Eigen)

# postcond check
if (NOT TARGET Eigen3::Eigen)
message(FATAL_ERROR "FindOrFetchEigen3 could not make Eigen3::Eigen target available")
endif(NOT TARGET Eigen3::Eigen)
4 changes: 4 additions & 0 deletions cmake/tiledarray-config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ if (NOT TARGET BTAS::BTAS)
get_filename_component(BTAS_DIR "@BTAS_CONFIG@" DIRECTORY)
find_package(BTAS 1.0.0 QUIET CONFIG REQUIRED HINTS "${BTAS_DIR}")
endif()
if (NOT TARGET Eigen3::Eigen)
get_filename_component(EIGEN3_DIR "@Eigen3_CONFIG@" DIRECTORY)
find_package(Eigen3 QUIET CONFIG NO_CMAKE_PACKAGE_REGISTRY HINTS "${EIGEN3_DIR}")
endif()
if(NOT TARGET MADworld)
# if madness installed separately, use the madness install discovered when configuring TA
set(MADNESS_CONFIG_DIR "@MADNESS_CONFIG_DIR@")
Expand Down
120 changes: 23 additions & 97 deletions external/eigen.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -13,33 +13,34 @@ else(ENABLE_CUDA)
endif(ENABLE_CUDA)

# Check for existing Eigen
# prefer CMake-configured-and-installed instance
# re:NO_CMAKE_PACKAGE_REGISTRY: eigen3 registers its *build* tree with the user package registry ...
# to avoid issues with wiped build directory look for installed eigen
find_package(Eigen3 ${_tiledarray_required_eigen_version} NO_MODULE QUIET NO_CMAKE_PACKAGE_REGISTRY)
if (TARGET Eigen3::Eigen)
# first try non-installed Eigen3

# otherwise use bundled FindEigen3.cmake module controlled by EIGEN3_INCLUDE_DIR
# but make sure EIGEN3_INCLUDE_DIR exists!
find_package(Eigen3 ${_tiledarray_required_eigen_version} MODULE)

if (EIGEN3_FOUND)
if (NOT EXISTS "${EIGEN3_INCLUDE_DIR}")
message(WARNING "Eigen3 is \"found\", but the reported EIGEN3_INCLUDE_DIR=${EIGEN3_INCLUDE_DIR} does not exist; likely corrupt Eigen3 build registered in user or system package registry; specify EIGEN3_INCLUDE_DIR manually or (better) configure (with CMake) and install Eigen3 package")
else(NOT EXISTS "${EIGEN3_INCLUDE_DIR}")
add_library(TiledArray_Eigen INTERFACE)
set_property(TARGET TiledArray_Eigen PROPERTY
INTERFACE_INCLUDE_DIRECTORIES ${EIGEN3_INCLUDE_DIR})
endif(NOT EXISTS "${EIGEN3_INCLUDE_DIR}")
endif (EIGEN3_FOUND)

# if not found, look for cmake-configured+installed Eigen3, or build it ourselves
if (NOT TARGET TiledArray_Eigen)
include(FindOrFetchEigen3)

# import alias into TiledArray "namespace"
add_library(TiledArray_Eigen INTERFACE)
foreach(prop INTERFACE_INCLUDE_DIRECTORIES INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_OPTIONS INTERFACE_LINK_LIBRARIES INTERFACE_POSITION_INDEPENDENT_CODE)
get_property(EIGEN3_${prop} TARGET Eigen3::Eigen PROPERTY ${prop})
set_property(TARGET TiledArray_Eigen PROPERTY
${prop} ${EIGEN3_${prop}})
endforeach()
else (TARGET Eigen3::Eigen)
# otherwise use bundled FindEigen3.cmake module controlled by EIGEN3_INCLUDE_DIR
# but make sure EIGEN3_INCLUDE_DIR exists!
find_package(Eigen3 ${_tiledarray_required_eigen_version})

if (EIGEN3_FOUND)
if (NOT EXISTS "${EIGEN3_INCLUDE_DIR}")
message(WARNING "Eigen3 is \"found\", but the reported EIGEN3_INCLUDE_DIR=${EIGEN3_INCLUDE_DIR} does not exist; likely corrupt Eigen3 build registered in user or system package registry; specify EIGEN3_INCLUDE_DIR manually or (better) configure (with CMake) and install Eigen3 package")
else(NOT EXISTS "${EIGEN3_INCLUDE_DIR}")
add_library(TiledArray_Eigen INTERFACE)
set_property(TARGET TiledArray_Eigen PROPERTY
INTERFACE_INCLUDE_DIRECTORIES ${EIGEN3_INCLUDE_DIR})
endif(NOT EXISTS "${EIGEN3_INCLUDE_DIR}")
endif (EIGEN3_FOUND)
endif (TARGET Eigen3::Eigen)
endif (NOT TARGET TiledArray_Eigen)

# validate found
if (TARGET TiledArray_Eigen)
Expand All @@ -49,11 +50,8 @@ if (TARGET TiledArray_Eigen)

# INTERFACE libraries cannot be used as CMAKE_REQUIRED_LIBRARIES, so must manually transfer deps info
get_property(EIGEN3_INCLUDE_DIRS TARGET TiledArray_Eigen PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
if (NOT MADNESS_INTERNAL_INCLUDE_DIRS)
message(FATAL_ERROR "eigen.cmake must be loaded after calling detect_MADNESS_config()")
endif()
list(APPEND CMAKE_REQUIRED_INCLUDES ${EIGEN3_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/src ${PROJECT_SOURCE_DIR}/src
${MADNESS_INTERNAL_INCLUDE_DIRS} ${LAPACK_INCLUDE_DIRS})
${LAPACK_INCLUDE_DIRS})
list(APPEND CMAKE_REQUIRED_LIBRARIES ${LAPACK_LIBRARIES})
foreach(_def ${LAPACK_COMPILE_DEFINITIONS})
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D${_def}")
Expand All @@ -79,82 +77,10 @@ if (TARGET TiledArray_Eigen)
message(FATAL_ERROR "Eigen3 found, but failed to compile test program")
endif()

elseif(TA_EXPERT)

message("** Eigen3 was not found")
message(FATAL_ERROR "** Downloading and building Eigen3 is explicitly disabled in EXPERT mode")

else()

set(Eigen3_VERSION 3.3.7)
set(EIGEN3_URL_HASH MD5=b9e98a200d2455f06db9c661c5610496)
set(EIGEN3_URL https://gitlab.com/libeigen/eigen/-/archive/${Eigen3_VERSION}/eigen-${Eigen3_VERSION}.tar.bz2)

include(ExternalProject)

# Set source and build path for Eigen3 in the TiledArray Project
set(EXTERNAL_SOURCE_DIR ${FETCHCONTENT_BASE_DIR}/eigen-src)
set(EXTERNAL_BUILD_DIR ${FETCHCONTENT_BASE_DIR}/eigen-build)

message("** Will build Eigen from ${EIGEN3_URL}")

ExternalProject_Add(eigen3
PREFIX ${CMAKE_INSTALL_PREFIX}
#--Download step--------------
DOWNLOAD_DIR ${EXTERNAL_SOURCE_DIR}
URL ${EIGEN3_URL}
URL_HASH ${EIGEN3_URL_HASH}
#--Configure step-------------
SOURCE_DIR ${EXTERNAL_SOURCE_DIR}
CONFIGURE_COMMAND ""
#--Build step-----------------
BINARY_DIR ${EXTERNAL_BUILD_DIR}
BUILD_COMMAND ""
#--Install step---------------
INSTALL_COMMAND ""
#--Custom targets-------------
STEP_TARGETS download
)

# Add eigen3 dependency to External
add_dependencies(External-tiledarray eigen3)

# create an exportable interface target for eigen3
add_library(TiledArray_Eigen INTERFACE)
set_property(TARGET TiledArray_Eigen PROPERTY
INTERFACE_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${EXTERNAL_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/eigen3>)

# Install Eigen 3
install(
DIRECTORY
${EXTERNAL_SOURCE_DIR}/Eigen
${EXTERNAL_SOURCE_DIR}/unsupported
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/eigen3
COMPONENT eigen3
)
install(
FILES ${EXTERNAL_SOURCE_DIR}/signature_of_eigen3_matrix_library
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/eigen3
COMPONENT eigen3
)

endif()
endif(TARGET TiledArray_Eigen)

# finish configuring TiledArray_Eigen and install
if (TARGET TiledArray_Eigen)
set(TiledArray_Eigen_VERSION "${Eigen3_VERSION}" CACHE STRING "Eigen3_VERSION of the library interfaced by TiledArray_Eigen target")
# TiledArray_Eigen uses LAPACK/MKL
# N.B. used to ... seems to be disabled
# target_link_libraries(TiledArray_Eigen INTERFACE ${LAPACK_LIBRARIES})
# target_include_directories(TiledArray_Eigen INTERFACE ${LAPACK_INCLUDE_DIRS})
# target_compile_definitions(TiledArray_Eigen INTERFACE ${LAPACK_COMPILE_DEFINITIONS})
# target_compile_options(TiledArray_Eigen INTERFACE ${LAPACK_COMPILE_OPTIONS})
# # Eigen's prototypes for BLAS interface libraries do not match MADNESS cblas
# if (MADNESS_HAS_MKL)
# # target_compile_definitions(TiledArray_Eigen INTERFACE EIGEN_USE_MKL EIGEN_USE_BLAS)
# else(MADNESS_HAS_MKL)
# # target_compile_definitions(TiledArray_Eigen INTERFACE EIGEN_USE_BLAS)
# endif(MADNESS_HAS_MKL)
install(TARGETS TiledArray_Eigen EXPORT tiledarray COMPONENT tiledarray)
endif(TARGET TiledArray_Eigen)
6 changes: 3 additions & 3 deletions external/versions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ set(TA_INSTALL_BOOST_PREVIOUS_URL_HASH 882b48708d211a5f48e60b0124cf5863c1534cd54
# N.B. may need to update INSTALL.md manually with the CUDA-specific version
set(TA_TRACKED_EIGEN_VERSION 3.3.5)
set(TA_TRACKED_EIGEN_PREVIOUS_VERSION 3.3)
set(TA_INSTALL_EIGEN_VERSION 3.3.7)
set(TA_INSTALL_EIGEN_VERSION 3.4.0)
set(TA_INSTALL_EIGEN_PREVIOUS_VERSION 3.3.7)
set(TA_INSTALL_EIGEN_URL_HASH b9e98a200d2455f06db9c661c5610496)
set(TA_INSTALL_EIGEN_PREVIOUS_URL_HASH b9e98a200d2455f06db9c661c5610496)
set(TA_INSTALL_EIGEN_URL_HASH SHA256=b4c198460eba6f28d34894e3a5710998818515104d6e74e5cc331ce31e46e626)
set(TA_INSTALL_EIGEN_PREVIOUS_URL_HASH MD5=b9e98a200d2455f06db9c661c5610496)

set(TA_TRACKED_MADNESS_TAG b8069a25460b696d21cc8b739a91c9249da26575)
set(TA_TRACKED_MADNESS_PREVIOUS_TAG f9aa38e4f46c5ea6ca6bbceb945beae5230f9ad0)
Expand Down

0 comments on commit da87fe2

Please sign in to comment.