Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build_test_cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ jobs:

- tag: gnu
external_toolchain_args: ""
build_args: "-DENABLE_LIBXC=ON -DENABLE_MLALGO=ON -DENABLE_LIBRI=ON"
build_args: "-DENABLE_LIBXC=ON -DENABLE_MLALGO=ON -DENABLE_LIBRI=ON -DENABLE_DFTD4=ON"
name: "Build extra components with GNU toolchain"
- tag: intel
external_toolchain_args: "--with-intel"
build_args: "-DENABLE_LIBXC=ON -DENABLE_PEXSI=ON -DENABLE_MLALGO=ON -DENABLE_LIBRI=ON"
build_args: "-DENABLE_LIBXC=ON -DENABLE_PEXSI=ON -DENABLE_MLALGO=ON -DENABLE_LIBRI=ON -DENABLE_DFTD4=ON"
name: "Build extra components with Intel toolchain"

- tag: cuda
Expand Down
86 changes: 45 additions & 41 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -238,14 +238,10 @@ if(NOT DEFINED CMAKE_CXX_STANDARD)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Enable DFT-D4 languages before finding OpenMP.
if(ENABLE_DFTD4)
# DFTD4 requires enabling C and Fortran to work
enable_language(C)
enable_language(Fortran)
# Avoid custom-lapack fallback when resolving DFT-D4 dependencies
find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)
find_package(dftd4 4.2.0 REQUIRED)
endif()

macro(set_if_higher VARIABLE VALUE)
Expand Down Expand Up @@ -335,6 +331,12 @@ if(DEBUG_INFO)
endif()

if(ENABLE_MPI)
if(NOT CMAKE_CROSSCOMPILING)
# FindMPI runs a probe executable to determine the MPI library version,
# which FindMKL.cmake uses to auto-detect the BLACS interface.
# When cross compiling, assume users know what they are doing.
set(MPI_DETERMINE_LIBRARY_VERSION TRUE)
endif()
find_package(MPI COMPONENTS CXX REQUIRED)
abacus_add_feature_definitions(__MPI)
endif()
Expand All @@ -357,6 +359,44 @@ if(USE_OPENMP)
find_package(OpenMP REQUIRED)
endif()

if(DEFINED ENV{MKLROOT} AND NOT DEFINED MKLROOT)
set(MKLROOT "$ENV{MKLROOT}")
endif()
if(USE_KML)
set(_kml_components BLAS LAPACK FFTW3)
if(ENABLE_MPI)
list(APPEND _kml_components ScaLAPACK)
endif()
if(ENABLE_FLOAT_FFTW)
list(APPEND _kml_components FFTW3_FLOAT)
endif()

find_package(KML REQUIRED COMPONENTS ${_kml_components})
abacus_add_feature_definitions(__KML)
elseif(MKLROOT OR MKL_ROOT)
find_package(MKL REQUIRED)
abacus_add_feature_definitions(__MKL)
elseif(NOT USE_SW)
find_package(Lapack REQUIRED)
# ScaLAPACK is a distributed-memory library and is only needed for the
# MPI build. A serial build (e.g. the native Windows serial version)
# must not require it.
if(ENABLE_MPI)
find_package(ScaLAPACK REQUIRED)
endif()
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Intel|Clang")
message(WARNING "Cannot determine the required Fortran runtime.")
endif()
endif()

if(NOT USE_KML AND NOT MKL_FOUND AND NOT USE_SW)
find_package(FFTW3 REQUIRED)
endif()

if(ENABLE_DFTD4)
find_package(dftd4 4.2.0 REQUIRED)
endif()

include(CheckLanguage)
check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
Expand Down Expand Up @@ -528,42 +568,6 @@ if(ENABLE_ASAN)
add_link_options(-fsanitize=address)
endif()

if(DEFINED ENV{MKLROOT} AND NOT DEFINED MKLROOT)
set(MKLROOT "$ENV{MKLROOT}")
endif()
if(USE_KML)
set(_kml_components BLAS LAPACK FFTW3)
if(ENABLE_MPI)
list(APPEND _kml_components ScaLAPACK)
endif()
if(ENABLE_FLOAT_FFTW)
list(APPEND _kml_components FFTW3_FLOAT)
endif()

find_package(KML REQUIRED COMPONENTS ${_kml_components})
abacus_add_feature_definitions(__KML)
elseif(MKLROOT)
set(MKL_INTERFACE lp64)
set(ENABLE_SCALAPACK ON)
find_package(MKL REQUIRED)
abacus_add_feature_definitions(__MKL)
elseif(NOT USE_SW)
find_package(Lapack REQUIRED)
# ScaLAPACK is a distributed-memory library and is only needed for the
# MPI build. A serial build (e.g. the native Windows serial version)
# must not require it.
if(ENABLE_MPI)
find_package(ScaLAPACK REQUIRED)
endif()
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Intel|Clang")
message(WARNING "Cannot determine the required Fortran runtime.")
endif()
endif()

if(NOT USE_KML AND NOT MKLROOT AND NOT USE_SW)
find_package(FFTW3 REQUIRED)
endif()

if(ENABLE_FLOAT_FFTW)
abacus_add_feature_definitions(__ENABLE_FLOAT_FFTW)
endif()
Expand Down
6 changes: 3 additions & 3 deletions cmake/CollectBuildInfoVars.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ else()
set(ABACUS_ELPA_VERSION "no")
endif()

if(MKLROOT)
if(MKL_FOUND)
Comment thread
Growl1234 marked this conversation as resolved.
set(ABACUS_MKL_SUPPORT "yes (version unknown)")
find_path(MKL_VERSION_HEADER mkl_version.h PATHS ${MKL_INCLUDE} NO_DEFAULT_PATH)
if(MKL_VERSION_HEADER)
Expand All @@ -190,9 +190,9 @@ else()
set(ABACUS_LIBXC_VERSION "no")
endif()

if(NOT USE_SW AND NOT MKLROOT AND FFTW3_VERSION)
if(NOT USE_SW AND NOT MKL_FOUND AND FFTW3_VERSION)
set(ABACUS_FFTW_VERSION "yes (v${FFTW3_VERSION})")
elseif(NOT USE_SW AND NOT MKLROOT)
elseif(NOT USE_SW AND NOT MKL_FOUND)
if(FFTW3_INCLUDE_DIR AND EXISTS "${FFTW3_INCLUDE_DIR}/fftw3.h")
file(STRINGS "${FFTW3_INCLUDE_DIR}/fftw3.h" _fftw_ver_line REGEX "^#define[\t ]+FFTW_VERSION[\t ]+\"[^\"]+\"")
if(_fftw_ver_line)
Expand Down
12 changes: 12 additions & 0 deletions cmake/modules/FindKML.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,18 @@ if(KML_FOUND)
endif()
endif()

# Compatibility with packages that consume the standard CMake math targets.
if(TARGET KML::BLAS AND NOT TARGET BLAS::BLAS)
add_library(BLAS::BLAS INTERFACE IMPORTED)
set_property(TARGET BLAS::BLAS PROPERTY
INTERFACE_LINK_LIBRARIES KML::BLAS)
endif()
if(TARGET KML::LAPACK AND NOT TARGET LAPACK::LAPACK)
add_library(LAPACK::LAPACK INTERFACE IMPORTED)
set_property(TARGET LAPACK::LAPACK PROPERTY
INTERFACE_LINK_LIBRARIES KML::LAPACK)
endif()

mark_as_advanced(
KML_INCLUDE_DIR
KML_RUNTIME_LIBRARY
Expand Down
Loading
Loading