From 0c10a8d25cc1a36a4a664777abe923d843f4068f Mon Sep 17 00:00:00 2001 From: SY Wang Date: Mon, 19 Oct 2026 12:47:17 +0800 Subject: [PATCH 1/2] Precommit: Prettify CMake files (Part I) --- .pre-commit-config.yaml | 10 +- CMakeLists.txt | 186 ++++--- cmake-format.yaml | 4 + cmake/BuildInfo.cmake | 27 +- cmake/CollectBuildInfoVars.cmake | 335 ++++++------ cmake/CompilerConfiguration.cmake | 26 +- cmake/Testing.cmake | 73 ++- cmake/modules/FindBlas.cmake | 12 +- cmake/modules/FindDeePMD.cmake | 170 +++--- cmake/modules/FindELPA.cmake | 54 +- cmake/modules/FindFFTW3.cmake | 105 ++-- cmake/modules/FindKML.cmake | 147 +++--- cmake/modules/FindLapack.cmake | 8 +- cmake/modules/FindLibComm.cmake | 24 +- cmake/modules/FindLibRI.cmake | 23 +- cmake/modules/FindMKL.cmake | 131 +++-- cmake/modules/FindNEP.cmake | 40 +- cmake/modules/FindPLUMED.cmake | 24 +- cmake/modules/FindScaLAPACK.cmake | 39 +- cmake/modules/FindTensorFlow.cmake | 23 +- cmake/modules/SetupCuBlasMp.cmake | 43 +- cmake/modules/SetupCuSolverMp.cmake | 132 +++-- cmake/modules/SetupNccl.cmake | 36 +- python/pyabacus/CMakeLists.txt | 47 +- python/pyabacus/src/ModuleBase/CMakeLists.txt | 40 +- .../pyabacus/src/ModuleDriver/CMakeLists.txt | 12 +- .../pyabacus/src/ModuleESolver/CMakeLists.txt | 46 +- python/pyabacus/src/ModuleNAO/CMakeLists.txt | 68 +-- python/pyabacus/src/hsolver/CMakeLists.txt | 73 ++- source/CMakeLists.txt | 482 +++++++++--------- tests/CMakeLists.txt | 2 +- 31 files changed, 1301 insertions(+), 1141 deletions(-) create mode 100644 cmake-format.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ab7a8094aac..b94491ca55f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,11 +10,11 @@ repos: rev: v23.1.3 hooks: - id: clang-format - # - repo: https://github.com/cheshirekow/cmake-format-precommit - # rev: v0.6.13 - # hooks: - # - id: cmake-format - # additional_dependencies: [pyyaml] + - repo: https://github.com/cheshirekow/cmake-format-precommit + rev: v0.6.13 + hooks: + - id: cmake-format + additional_dependencies: [pyyaml] - repo: local hooks: - id: abacus-agent-governance diff --git a/CMakeLists.txt b/CMakeLists.txt index 62843068f6d..b04ceec1e06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,12 +10,13 @@ if(EXISTS "${LOC_PATH}") endif() include(CMakeDependentOption) -message(WARNING - "The build system now uses cmake_dependent_option extensively.\n" - "Many advanced options are now conditionally enabled based on their dependencies; " - "when dependency conditions are not met, the corresponding options will be" - "automatically turned OFF and hidden in cmake-gui/ccmake.\n" - "Please review your configuration if you previously set these options manually." +message( + WARNING + "The build system now uses cmake_dependent_option extensively.\n" + "Many advanced options are now conditionally enabled based on their dependencies; " + "when dependency conditions are not met, the corresponding options will be" + "automatically turned OFF and hidden in cmake-gui/ccmake.\n" + "Please review your configuration if you previously set these options manually." ) if(POLICY CMP0135) # https://cmake.org/cmake/help/git-stage/policy/CMP0135.html @@ -35,9 +36,9 @@ project( option(ENABLE_MPI "Enable MPI" ON) option(ENABLE_OPENMP "Enable OpenMP" ON) option(USE_CUDA "Enable CUDA" OFF) -cmake_dependent_option(ENABLE_GPU_NEIGHBOR_LIST - "Enable the CUDA GPU neighbor-list implementation" - OFF "USE_CUDA" OFF) +cmake_dependent_option( + ENABLE_GPU_NEIGHBOR_LIST "Enable the CUDA GPU neighbor-list implementation" + OFF "USE_CUDA" OFF) option(USE_ROCM "Enable ROCm" OFF) option(USE_DSP "Enable DSP" OFF) option(USE_CUDA_ON_DCU "Enable CUDA on DCU" OFF) @@ -69,42 +70,60 @@ option(ENABLE_JSON "Enable JSON output" OFF) option(ENABLE_CNPY "Enable cnpy usage" OFF) # Options requiring MPI and LCAO -cmake_dependent_option(ENABLE_ELPA "Enable ELPA eigensolver" ON "ENABLE_MPI" OFF) -cmake_dependent_option(ENABLE_LIBRI "Enable LibRI for hybrid functional" - OFF "ENABLE_LCAO;ENABLE_MPI" OFF) -cmake_dependent_option(ENABLE_PEXSI "Enable PEXSI for LCAO" OFF "ENABLE_LCAO;ENABLE_MPI" OFF) +cmake_dependent_option(ENABLE_ELPA "Enable ELPA eigensolver" ON "ENABLE_MPI" + OFF) +cmake_dependent_option(ENABLE_LIBRI "Enable LibRI for hybrid functional" OFF + "ENABLE_LCAO;ENABLE_MPI" OFF) +cmake_dependent_option(ENABLE_PEXSI "Enable PEXSI for LCAO" OFF + "ENABLE_LCAO;ENABLE_MPI" OFF) cmake_dependent_option(ENABLE_MLALGO "Enable the machine learning algorithms" OFF "ENABLE_LCAO;ENABLE_MPI" OFF) # Two-center FFT is only used in LCAO -cmake_dependent_option(ENABLE_FFT_TWO_CENTER "Enable FFT-based two-center integral method" - ON "ENABLE_LCAO" OFF) +cmake_dependent_option( + ENABLE_FFT_TWO_CENTER "Enable FFT-based two-center integral method" ON + "ENABLE_LCAO" OFF) # Benchmark requires BUILD_TESTING -cmake_dependent_option(ENABLE_GOOGLEBENCH "Enable GOOGLE-benchmark usage" - OFF "BUILD_TESTING" OFF) +cmake_dependent_option(ENABLE_GOOGLEBENCH "Enable GOOGLE-benchmark usage" OFF + "BUILD_TESTING" OFF) # Options requiring CUDA -cmake_dependent_option(USE_CUDA_MPI "Enable CUDA-aware MPI" OFF "USE_CUDA;ENABLE_MPI" OFF) -cmake_dependent_option(ENABLE_CUSOLVERMP "Enable cuSOLVERMp" - OFF "USE_CUDA;ENABLE_MPI;ENABLE_LCAO" OFF) -cmake_dependent_option(ENABLE_CUBLASMP "Enable cuBLASMp" OFF "ENABLE_CUSOLVERMP" OFF) -cmake_dependent_option(ENABLE_NCCL_PARALLEL_DEVICE - "Enable NCCL-backed collectives in parallel_device; requires MPI" - OFF "USE_CUDA;ENABLE_MPI" OFF) +cmake_dependent_option(USE_CUDA_MPI "Enable CUDA-aware MPI" OFF + "USE_CUDA;ENABLE_MPI" OFF) +cmake_dependent_option(ENABLE_CUSOLVERMP "Enable cuSOLVERMp" OFF + "USE_CUDA;ENABLE_MPI;ENABLE_LCAO" OFF) +cmake_dependent_option(ENABLE_CUBLASMP "Enable cuBLASMp" OFF + "ENABLE_CUSOLVERMP" OFF) +cmake_dependent_option( + ENABLE_NCCL_PARALLEL_DEVICE + "Enable NCCL-backed collectives in parallel_device; requires MPI" OFF + "USE_CUDA;ENABLE_MPI" OFF) # ============================================================================== # Deprecated options (TODO: Remove this section in the future release) # ============================================================================== function(abacus_rename_option old_name new_name) - get_property(_old_defined CACHE "${old_name}" PROPERTY TYPE SET) + get_property( + _old_defined + CACHE "${old_name}" + PROPERTY TYPE + SET) if(NOT _old_defined) return() endif() message(DEPRECATION "${old_name} has been renamed to ${new_name}.") - get_property(_type CACHE "${new_name}" PROPERTY TYPE) - get_property(_help CACHE "${new_name}" PROPERTY HELPSTRING) - set("${new_name}" "${${old_name}}" CACHE "${_type}" "${_help}" FORCE) + get_property( + _type + CACHE "${new_name}" + PROPERTY TYPE) + get_property( + _help + CACHE "${new_name}" + PROPERTY HELPSTRING) + set("${new_name}" + "${${old_name}}" + CACHE "${_type}" "${_help}" FORCE) unset("${old_name}" CACHE) endfunction() abacus_rename_option(USE_OPENMP ENABLE_OPENMP) @@ -124,14 +143,12 @@ if(DEFINED CACHE{ENABLE_LIBCOMM}) DEPRECATION "Option ENABLE_LIBCOMM is deprecated and will be ignored in a future release. " "LibComm is now treated as an implementation dependency of LibRI; " - "please use -DENABLE_LIBRI=ON instead." - ) + "please use -DENABLE_LIBRI=ON instead.") if(ENABLE_LIBCOMM AND NOT ENABLE_LIBRI) message( FATAL_ERROR "ENABLE_LIBCOMM was set, but LibComm is not a standalone ABACUS feature. " - "Please use -DENABLE_LIBRI=ON instead." - ) + "Please use -DENABLE_LIBRI=ON instead.") endif() unset(ENABLE_LIBCOMM CACHE) endif() @@ -189,12 +206,12 @@ endif() # Determine the ABACUS executable name. if(NOT ENABLE_LCAO) set(_abacus_bin_level "pw") -# TODO: Not well-defined now. + # TODO: Not well-defined now. elseif(ENABLE_LIBRI AND ENABLE_MLALGO) set(_abacus_bin_level "max") elseif(ENABLE_LIBRI) set(_abacus_bin_level "std") -# TODO: Not well-defined now. + # TODO: Not well-defined now. elseif(ENABLE_MLALGO) set(_abacus_bin_level "ml") else() @@ -234,8 +251,7 @@ if(USE_DSP AND ENABLE_ELPA) message(FATAL_ERROR "USE_DSP is incompatible with ELPA.") endif() -list(APPEND CMAKE_MODULE_PATH - "${CMAKE_CURRENT_SOURCE_DIR}/cmake" +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${PROJECT_SOURCE_DIR}/cmake/modules") if(ENABLE_COVERAGE) @@ -247,11 +263,11 @@ if(ENABLE_COVERAGE) GIT_REPOSITORY https://github.com/RWTH-HPC/CMake-codecov.git GIT_TAG master GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - ) + GIT_PROGRESS TRUE) FetchContent_Populate(cmakecodecov) list(APPEND CMAKE_MODULE_PATH ${cmakecodecov_SOURCE_DIR}/cmake) - set(CMAKE_MODULE_PATH "${cmakecodecov_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) + set(CMAKE_MODULE_PATH "${cmakecodecov_SOURCE_DIR}/cmake" + ${CMAKE_MODULE_PATH}) find_package(codecov REQUIRED) endif() endif() @@ -302,7 +318,10 @@ endif() if(CMAKE_CXX_COMPILER_ID MATCHES Intel) # Force turn off ENABLE_ABACUS_LIBM on Intel Compiler - message(WARNING "ENABLE_ABACUS_LIBM is not available with Intel compilers; switching it off") + message( + WARNING + "ENABLE_ABACUS_LIBM is not available with Intel compilers; switching it off" + ) set(ENABLE_ABACUS_LIBM OFF) endif() @@ -312,7 +331,8 @@ endif() if(ENABLE_PEXSI) find_package(PEXSI REQUIRED CONFIG) if(PEXSI_VERSION VERSION_LESS "2.0.0") - message(FATAL_ERROR "PEXSI >= 2.0.0 is required; found version ${PEXSI_VERSION}") + message( + FATAL_ERROR "PEXSI >= 2.0.0 is required; found version ${PEXSI_VERSION}") endif() set(CMAKE_CXX_STANDARD 14) endif() @@ -324,7 +344,10 @@ if(ENABLE_MPI) # When cross compiling, assume users know what they are doing. set(MPI_DETERMINE_LIBRARY_VERSION TRUE) endif() - find_package(MPI COMPONENTS CXX REQUIRED) + find_package( + MPI + COMPONENTS CXX + REQUIRED) endif() if(USE_SW) @@ -365,14 +388,17 @@ elseif(NOT USE_SW) endif() endif() -if(NOT USE_KML AND NOT MKL_FOUND AND NOT USE_SW) +if(NOT USE_KML + AND NOT MKL_FOUND + AND NOT USE_SW) find_package(FFTW3 REQUIRED) endif() if(ENABLE_DFTD4) find_package(dftd4 REQUIRED) if(dftd4_VERSION VERSION_LESS "4.3.0") - message(FATAL_ERROR "dftd4 >= 4.3.0 is required; found version ${dftd4_VERSION}") + message( + FATAL_ERROR "dftd4 >= 4.3.0 is required; found version ${dftd4_VERSION}") endif() endif() @@ -394,21 +420,22 @@ if(CMAKE_CUDA_COMPILER) endif() else() # CUDA not found if(USE_CUDA) - message( - FATAL_ERROR - "USE_CUDA is set but no CUDA components found.") + message(FATAL_ERROR "USE_CUDA is set but no CUDA components found.") endif() endif() if(USE_CUDA) cmake_minimum_required(VERSION 3.18) # required by `CUDA_ARCHITECTURES` below - + # Always find CUDAToolkit to get CUDAToolkit_VERSION find_package(CUDAToolkit REQUIRED) - + set_if_higher(CMAKE_CXX_STANDARD 14) if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL "13.0") - message(STATUS "CUDA ${CUDAToolkit_VERSION} detected. Setting CMAKE_CUDA_STANDARD to 17.") + message( + STATUS + "CUDA ${CUDAToolkit_VERSION} detected. Setting CMAKE_CUDA_STANDARD to 17." + ) set_if_higher(CMAKE_CXX_STANDARD 17) endif() set(CMAKE_CXX_EXTENSIONS ON) @@ -419,21 +446,20 @@ if(USE_CUDA) # check # https://gitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Internal/CMakeCUDAArchitecturesAll.cmake # for available architectures in different CUDA versions - + # CUDA 13.0+ dropped support for architectures below 75 if(CUDAToolkit_VERSION VERSION_LESS "13.0") - set(CMAKE_CUDA_ARCHITECTURES - 60 # P100 - 70 # V100 + set(CMAKE_CUDA_ARCHITECTURES 60 # P100 + 70 # V100 ) else() # Start with empty list; architectures 75+ will be added below set(CMAKE_CUDA_ARCHITECTURES) endif() - + # Add your CUDA arch here Check the Compute Capability version of your # GPU at: https://en.wikipedia.org/wiki/CUDA#GPUs_supported - + if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 10.0) list(APPEND CMAKE_CUDA_ARCHITECTURES 75) # T4 endif() @@ -449,29 +475,31 @@ if(USE_CUDA) endif() enable_language(CUDA) if(USE_CUDA) - if (ENABLE_NCCL_PARALLEL_DEVICE) + if(ENABLE_NCCL_PARALLEL_DEVICE) include(cmake/modules/SetupNccl.cmake) abacus_setup_nccl() endif() - if (ENABLE_CUSOLVERMP) + if(ENABLE_CUSOLVERMP) # Keep cuSOLVERMp discovery/linking logic in a dedicated module. include(cmake/modules/SetupCuSolverMp.cmake) abacus_setup_cusolvermp() endif() - if (ENABLE_CUBLASMP) + if(ENABLE_CUBLASMP) # Enforcement 1: cuBLASMp requires cuSOLVERMp to be enabled - if (NOT ENABLE_CUSOLVERMP) - message(FATAL_ERROR - "ENABLE_CUBLASMP is set to ON, but ENABLE_CUSOLVERMP is OFF." - "In ABACUS, cuBLASMp support requires cuSOLVERMp to be enabled simultaneously." - "Please set -DENABLE_CUSOLVERMP=ON.") + if(NOT ENABLE_CUSOLVERMP) + message( + FATAL_ERROR + "ENABLE_CUBLASMP is set to ON, but ENABLE_CUSOLVERMP is OFF." + "In ABACUS, cuBLASMp support requires cuSOLVERMp to be enabled simultaneously." + "Please set -DENABLE_CUSOLVERMP=ON.") endif() # Enforcement 2: cuBLASMp 0.8.0+ is incompatible with CAL backend # Note: _use_cal is defined inside abacus_setup_cusolvermp - if (_use_cal) - message(FATAL_ERROR - "cuBLASMp 0.8.0+ requires NCCL Symmetric Memory, but cuSOLVERMp is using CAL backend." - "Please upgrade cuSOLVERMp to >= 0.7.0 to use NCCL for both.") + if(_use_cal) + message( + FATAL_ERROR + "cuBLASMp 0.8.0+ requires NCCL Symmetric Memory, but cuSOLVERMp is using CAL backend." + "Please upgrade cuSOLVERMp to >= 0.7.0 to use NCCL for both.") endif() include(cmake/modules/SetupCuBlasMp.cmake) abacus_setup_cublasmp() @@ -485,7 +513,7 @@ endif() if(USE_ROCM) message( DEPRECATION - "Option USE_ROCM is deprecated and will be ignored in a future release. ") + "Option USE_ROCM is deprecated and will be ignored in a future release. ") cmake_minimum_required(VERSION 3.18) if(NOT DEFINED ROCM_PATH) set(ROCM_PATH @@ -545,6 +573,7 @@ if(ENABLE_MLALGO) GIT_PROGRESS TRUE) FetchContent_MakeAvailable(libnpy) else() + endif() endif() @@ -561,20 +590,17 @@ if(ENABLE_MLALGO OR DEFINED Torch_DIR) set(ABACUS_TORCH_CXX_FLAGS "${TORCH_CXX_FLAGS}") endif() -if (ENABLE_CNPY) - find_path(cnpy_SOURCE_DIR - cnpy.h - HINTS ${libnpy_INCLUDE_DIR} - ) +if(ENABLE_CNPY) + find_path(cnpy_SOURCE_DIR cnpy.h HINTS ${libnpy_INCLUDE_DIR}) if(NOT cnpy_SOURCE_DIR) include(FetchContent) FetchContent_Declare( cnpy GIT_REPOSITORY https://github.com/rogersce/cnpy.git - GIT_PROGRESS TRUE - ) + GIT_PROGRESS TRUE) FetchContent_MakeAvailable(cnpy) else() + endif() # find ZLIB and link @@ -614,7 +640,8 @@ endif() if(ENABLE_LIBXC) find_package(Libxc CONFIG REQUIRED) if(Libxc_VERSION VERSION_LESS "5.1.7") - message(FATAL_ERROR "Libxc >= 5.1.7 is required; found version ${Libxc_VERSION}") + message( + FATAL_ERROR "Libxc >= 5.1.7 is required; found version ${Libxc_VERSION}") endif() endif() @@ -636,7 +663,10 @@ if(ENABLE_PLUMED) # FindPLUMED.cmake, which prefers pkg-config (plumed.pc) and falls back to # a manual -DPLUMED_ROOT= hint. find_package(PLUMED REQUIRED) - message(STATUS "PLUMED support is enabled: version ${PLUMED_VERSION}, include ${PLUMED_INCLUDE_DIRS}") + message( + STATUS + "PLUMED support is enabled: version ${PLUMED_VERSION}, include ${PLUMED_INCLUDE_DIRS}" + ) endif() if(MATH_INFO) diff --git a/cmake-format.yaml b/cmake-format.yaml new file mode 100644 index 00000000000..a6a7d784319 --- /dev/null +++ b/cmake-format.yaml @@ -0,0 +1,4 @@ +# Do not prettify comments +# Workaround due to cmake-format bug; should use "--enable-markup=false" in args instead +markup: + enable_markup: false diff --git a/cmake/BuildInfo.cmake b/cmake/BuildInfo.cmake index 80ce7df2e45..5def4392813 100644 --- a/cmake/BuildInfo.cmake +++ b/cmake/BuildInfo.cmake @@ -5,24 +5,21 @@ # include_guard(GLOBAL) function(setup_build_info) - message(STATUS "Setting up build information...") + message(STATUS "Setting up build information...") - include(${PROJECT_SOURCE_DIR}/cmake/CollectBuildInfoVars.cmake) + include(${PROJECT_SOURCE_DIR}/cmake/CollectBuildInfoVars.cmake) -set(BUILD_INFO_TEMPLATE "${CMAKE_SOURCE_DIR}/source/source_io/build_info.h.in") -set(BUILD_INFO_OUTPUT "${CMAKE_BINARY_DIR}/source/source_io/build_info.h") + set(BUILD_INFO_TEMPLATE + "${CMAKE_SOURCE_DIR}/source/source_io/build_info.h.in") + set(BUILD_INFO_OUTPUT "${CMAKE_BINARY_DIR}/source/source_io/build_info.h") -configure_file( - ${BUILD_INFO_TEMPLATE} - ${BUILD_INFO_OUTPUT} - @ONLY -) + configure_file(${BUILD_INFO_TEMPLATE} ${BUILD_INFO_OUTPUT} @ONLY) - # add_library(BuildInfo::Headers INTERFACE IMPORTED GLOBAL) - # target_include_directories(BuildInfo::Headers - # INTERFACE - # ${CMAKE_BINARY_DIR}/source/source_io - # ) + # add_library(BuildInfo::Headers INTERFACE IMPORTED GLOBAL) + # target_include_directories(BuildInfo::Headers + # INTERFACE + # ${CMAKE_BINARY_DIR}/source/source_io + # ) - message(STATUS "Build info header configured: ${BUILD_INFO_OUTPUT}") + message(STATUS "Build info header configured: ${BUILD_INFO_OUTPUT}") endfunction() diff --git a/cmake/CollectBuildInfoVars.cmake b/cmake/CollectBuildInfoVars.cmake index 740c50ca4b0..d74e8c0243b 100644 --- a/cmake/CollectBuildInfoVars.cmake +++ b/cmake/CollectBuildInfoVars.cmake @@ -13,9 +13,9 @@ else() set(ABACUS_BUILD_TYPE "Default") endif() if(DEFINED ENV{USER}) - set(ABACUS_BUILD_USER "$ENV{USER}") + set(ABACUS_BUILD_USER "$ENV{USER}") else() - set(ABACUS_BUILD_USER "Unknown") + set(ABACUS_BUILD_USER "Unknown") endif() site_name(ABACUS_BUILD_HOST) set(ABACUS_CXX_COMPILER_ID ${CMAKE_CXX_COMPILER_ID}) @@ -38,29 +38,29 @@ string(REPLACE ";" " " ABACUS_CUDA_FLAGS "${TEMP_CUDA_FLAGS_LIST}") # --- 2. Determine Target Platform --- if(USE_DSP) - set(ABACUS_PLATFORM_NAME "DSP") + set(ABACUS_PLATFORM_NAME "DSP") elseif(USE_SW) - set(ABACUS_PLATFORM_NAME "CPU + SW-MATH") + set(ABACUS_PLATFORM_NAME "CPU + SW-MATH") elseif(USE_CUDA_ON_DCU) - set(ABACUS_PLATFORM_NAME "CPU + DCU (Hygon CUDA)") + set(ABACUS_PLATFORM_NAME "CPU + DCU (Hygon CUDA)") elseif(USE_CUDA) - set(ABACUS_PLATFORM_NAME "CPU + NVIDIA CUDA") + set(ABACUS_PLATFORM_NAME "CPU + NVIDIA CUDA") elseif(USE_ROCM) - set(ABACUS_PLATFORM_NAME "CPU + AMD ROCm") + set(ABACUS_PLATFORM_NAME "CPU + AMD ROCm") else() - set(ABACUS_PLATFORM_NAME "CPU") + set(ABACUS_PLATFORM_NAME "CPU") endif() # --- 3. Sanitizers & Debugging --- if(ENABLE_ASAN) - set(ABACUS_ASAN_STATUS "yes") + set(ABACUS_ASAN_STATUS "yes") else() - set(ABACUS_ASAN_STATUS "no") + set(ABACUS_ASAN_STATUS "no") endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(ABACUS_DEBUG_SYMBOLS "yes") + set(ABACUS_DEBUG_SYMBOLS "yes") else() - set(ABACUS_DEBUG_SYMBOLS "no") + set(ABACUS_DEBUG_SYMBOLS "no") endif() # --- 4. Get Dependency Versions (Enhanced with path fallback) --- @@ -69,50 +69,56 @@ set(ABACUS_MPI_IMPLEMENTATION "no") set(ABACUS_MPI_VERSION "no") set(ABACUS_CUDA_AWARE_MPI "no") if(ENABLE_MPI) - if("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "Intel") - set(ABACUS_MPI_IMPLEMENTATION "Intel MPI") - elseif("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "Open MPI") - set(ABACUS_MPI_IMPLEMENTATION "OpenMPI") - elseif("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "MPICH") - set(ABACUS_MPI_IMPLEMENTATION "MPICH") - else() - set(ABACUS_MPI_IMPLEMENTATION "Unknown") - endif() - set(ABACUS_MPI_VERSION "(MPI standard: ${MPI_CXX_VERSION})") - if(USE_CUDA) - # OpenMPI hint - find_program(OMPI_INFO_EXECUTABLE ompi_info) - if(OMPI_INFO_EXECUTABLE) - execute_process(COMMAND ${OMPI_INFO_EXECUTABLE} --parsable --all OUTPUT_VARIABLE OMPI_INFO_OUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if(OMPI_INFO_OUT MATCHES "mpi_built_with_cuda_support:value:true") - if(USE_CUDA_MPI) - set(ABACUS_CUDA_AWARE_MPI "yes") - else() - set(ABACUS_CUDA_AWARE_MPI "no (available but not enabled)") - endif() - else() - set(ABACUS_CUDA_AWARE_MPI "no (or undetectable)") - endif() + if("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "Intel") + set(ABACUS_MPI_IMPLEMENTATION "Intel MPI") + elseif("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "Open MPI") + set(ABACUS_MPI_IMPLEMENTATION "OpenMPI") + elseif("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "MPICH") + set(ABACUS_MPI_IMPLEMENTATION "MPICH") + else() + set(ABACUS_MPI_IMPLEMENTATION "Unknown") + endif() + set(ABACUS_MPI_VERSION "(MPI standard: ${MPI_CXX_VERSION})") + if(USE_CUDA) + # OpenMPI hint + find_program(OMPI_INFO_EXECUTABLE ompi_info) + if(OMPI_INFO_EXECUTABLE) + execute_process( + COMMAND ${OMPI_INFO_EXECUTABLE} --parsable --all + OUTPUT_VARIABLE OMPI_INFO_OUT + OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) + if(OMPI_INFO_OUT MATCHES "mpi_built_with_cuda_support:value:true") + if(USE_CUDA_MPI) + set(ABACUS_CUDA_AWARE_MPI "yes") else() - execute_process(COMMAND ${MPI_CXX_COMPILER} -showme:compile OUTPUT_VARIABLE MPI_COMPILE_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if(MPI_COMPILE_FLAGS MATCHES "cuda" OR MPI_COMPILE_FLAGS MATCHES "CUDA") - set(ABACUS_CUDA_AWARE_MPI "yes (likely)") - else() - set(ABACUS_CUDA_AWARE_MPI "no (or undetectable)") - endif() + set(ABACUS_CUDA_AWARE_MPI "no (available but not enabled)") endif() + else() + set(ABACUS_CUDA_AWARE_MPI "no (or undetectable)") + endif() else() - set(ABACUS_CUDA_AWARE_MPI "no (CUDA not enabled)") + execute_process( + COMMAND ${MPI_CXX_COMPILER} -showme:compile + OUTPUT_VARIABLE MPI_COMPILE_FLAGS + OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) + if(MPI_COMPILE_FLAGS MATCHES "cuda" OR MPI_COMPILE_FLAGS MATCHES "CUDA") + set(ABACUS_CUDA_AWARE_MPI "yes (likely)") + else() + set(ABACUS_CUDA_AWARE_MPI "no (or undetectable)") + endif() endif() + else() + set(ABACUS_CUDA_AWARE_MPI "no (CUDA not enabled)") + endif() endif() # OpenMP Version if(ENABLE_OPENMP AND OpenMP_CXX_VERSION) - set(ABACUS_OPENMP_VERSION "yes (v${OpenMP_CXX_VERSION})") + set(ABACUS_OPENMP_VERSION "yes (v${OpenMP_CXX_VERSION})") elseif(ENABLE_OPENMP) - set(ABACUS_OPENMP_VERSION "yes (version unknown)") + set(ABACUS_OPENMP_VERSION "yes (version unknown)") else() - set(ABACUS_OPENMP_VERSION "no") + set(ABACUS_OPENMP_VERSION "no") endif() if(ENABLE_LCAO) @@ -131,10 +137,15 @@ if(MKL_FOUND) set(ABACUS_BLAS_VENDOR "MKL") set(ABACUS_FFTW_VERSION "Using MKL") set(ABACUS_MKL_SUPPORT "yes (version unknown)") - find_path(MKL_VERSION_HEADER mkl_version.h PATHS ${MKL_INCLUDE} NO_DEFAULT_PATH) + find_path( + MKL_VERSION_HEADER mkl_version.h + PATHS ${MKL_INCLUDE} + NO_DEFAULT_PATH) if(MKL_VERSION_HEADER) - file(STRINGS "${MKL_VERSION_HEADER}" MKL_VERSION_LINE REGEX "^#define INTEL_MKL_VERSION [0-9]+") - string(REGEX REPLACE "^#define INTEL_MKL_VERSION ([0-9]+)" "\\1" MKL_VER_NUM "${MKL_VERSION_LINE}") + file(STRINGS "${MKL_VERSION_HEADER}" MKL_VERSION_LINE + REGEX "^#define INTEL_MKL_VERSION [0-9]+") + string(REGEX REPLACE "^#define INTEL_MKL_VERSION ([0-9]+)" "\\1" + MKL_VER_NUM "${MKL_VERSION_LINE}") if(MKL_VER_NUM) math(EXPR MKL_MAJOR "${MKL_VER_NUM} / 10000") math(EXPR MKL_MINOR "(${MKL_VER_NUM} % 10000) / 100") @@ -162,53 +173,57 @@ endif() # ELPA eigensolver if(ENABLE_ELPA) - set(ABACUS_ELPA_VERSION "yes (v${ELPA_VERSION})") + set(ABACUS_ELPA_VERSION "yes (v${ELPA_VERSION})") else() - set(ABACUS_ELPA_VERSION "no") + set(ABACUS_ELPA_VERSION "no") endif() if(ENABLE_LIBXC AND Libxc_VERSION) - set(ABACUS_LIBXC_VERSION "yes (v${Libxc_VERSION})") + set(ABACUS_LIBXC_VERSION "yes (v${Libxc_VERSION})") elseif(ENABLE_LIBXC) - set(ABACUS_LIBXC_VERSION "yes (path: ${Libxc_DIR})") + set(ABACUS_LIBXC_VERSION "yes (path: ${Libxc_DIR})") else() - set(ABACUS_LIBXC_VERSION "no") + set(ABACUS_LIBXC_VERSION "no") endif() if(ENABLE_DFTD4) - set(ABACUS_DFTD4_VERSION "yes (v${dftd4_VERSION})") + set(ABACUS_DFTD4_VERSION "yes (v${dftd4_VERSION})") else() - set(ABACUS_DFTD4_VERSION "no") + set(ABACUS_DFTD4_VERSION "no") endif() # Accelerators if(USE_CUDA AND CUDAToolkit_VERSION) - set(ABACUS_CUDA_VERSION "yes (v${CUDAToolkit_VERSION})") + set(ABACUS_CUDA_VERSION "yes (v${CUDAToolkit_VERSION})") elseif(USE_CUDA) - set(ABACUS_CUDA_VERSION "yes (version unknown)") + set(ABACUS_CUDA_VERSION "yes (version unknown)") else() - set(ABACUS_CUDA_VERSION "no") + set(ABACUS_CUDA_VERSION "no") endif() if(USE_ROCM) - set(ABACUS_ROCM_VERSION "yes (version unknown)") - if(HIP_VERSION) + set(ABACUS_ROCM_VERSION "yes (version unknown)") + if(HIP_VERSION) set(ABACUS_ROCM_VERSION "yes (v${HIP_VERSION})") - else() - find_program(HIPCC_EXECUTABLE hipcc) - if(HIPCC_EXECUTABLE) - execute_process(COMMAND ${HIPCC_EXECUTABLE} --version OUTPUT_VARIABLE HIPCC_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - string(REGEX MATCH "HIP version: ([0-9]+\\.[0-9]+\\.[0-9]+)" _ "${HIPCC_VERSION_OUTPUT}") - if(CMAKE_MATCH_1) - set(ABACUS_ROCM_VERSION "yes (v${CMAKE_MATCH_1})") -endif() - endif() - endif() - if(ABACUS_ROCM_VERSION STREQUAL "yes (version unknown)" AND ROCM_PATH) - set(ABACUS_ROCM_VERSION "yes (path: ${ROCM_PATH})") + else() + find_program(HIPCC_EXECUTABLE hipcc) + if(HIPCC_EXECUTABLE) + execute_process( + COMMAND ${HIPCC_EXECUTABLE} --version + OUTPUT_VARIABLE HIPCC_VERSION_OUTPUT + OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) + string(REGEX MATCH "HIP version: ([0-9]+\\.[0-9]+\\.[0-9]+)" _ + "${HIPCC_VERSION_OUTPUT}") + if(CMAKE_MATCH_1) + set(ABACUS_ROCM_VERSION "yes (v${CMAKE_MATCH_1})") + endif() endif() + endif() + if(ABACUS_ROCM_VERSION STREQUAL "yes (version unknown)" AND ROCM_PATH) + set(ABACUS_ROCM_VERSION "yes (path: ${ROCM_PATH})") + endif() else() - set(ABACUS_ROCM_VERSION "no") + set(ABACUS_ROCM_VERSION "no") endif() if(DEFINED CAL_CUSOLVERMP_PATH AND ENABLE_CUSOLVERMP) @@ -233,24 +248,30 @@ endif() # EXX Libraries if(ENABLE_LIBRI) - set(ABACUS_LIBRI_VERSION "yes (version unknown)") - set(LIBRI_VERSION_HEADER "${LIBRI_DIR}/include/RI/version.h") - if(EXISTS ${LIBRI_VERSION_HEADER}) - file(STRINGS "${LIBRI_VERSION_HEADER}" LIBRI_MAJOR_LINE REGEX "__LIBRI_VERSION_MAJOR") - file(STRINGS "${LIBRI_VERSION_HEADER}" LIBRI_MINOR_LINE REGEX "__LIBRI_VERSION_MINOR") - file(STRINGS "${LIBRI_VERSION_HEADER}" LIBRI_PATCH_LINE REGEX "__LIBRI_VERSION_PATCH") - string(REGEX MATCH "([0-9]+)" LIBRI_MAJOR "${LIBRI_MAJOR_LINE}") - string(REGEX MATCH "([0-9]+)" LIBRI_MINOR "${LIBRI_MINOR_LINE}") - string(REGEX MATCH "([0-9]+)" LIBRI_PATCH "${LIBRI_PATCH_LINE}") - if(LIBRI_MAJOR AND LIBRI_MINOR AND LIBRI_PATCH) - set(ABACUS_LIBRI_VERSION "yes (v${LIBRI_MAJOR}.${LIBRI_MINOR}.${LIBRI_PATCH})") - endif() - endif() - if(ABACUS_LIBRI_VERSION STREQUAL "yes (version unknown)" AND LIBRI_DIR) - set(ABACUS_LIBRI_VERSION "yes (path: ${LIBRI_DIR})") + set(ABACUS_LIBRI_VERSION "yes (version unknown)") + set(LIBRI_VERSION_HEADER "${LIBRI_DIR}/include/RI/version.h") + if(EXISTS ${LIBRI_VERSION_HEADER}) + file(STRINGS "${LIBRI_VERSION_HEADER}" LIBRI_MAJOR_LINE + REGEX "__LIBRI_VERSION_MAJOR") + file(STRINGS "${LIBRI_VERSION_HEADER}" LIBRI_MINOR_LINE + REGEX "__LIBRI_VERSION_MINOR") + file(STRINGS "${LIBRI_VERSION_HEADER}" LIBRI_PATCH_LINE + REGEX "__LIBRI_VERSION_PATCH") + string(REGEX MATCH "([0-9]+)" LIBRI_MAJOR "${LIBRI_MAJOR_LINE}") + string(REGEX MATCH "([0-9]+)" LIBRI_MINOR "${LIBRI_MINOR_LINE}") + string(REGEX MATCH "([0-9]+)" LIBRI_PATCH "${LIBRI_PATCH_LINE}") + if(LIBRI_MAJOR + AND LIBRI_MINOR + AND LIBRI_PATCH) + set(ABACUS_LIBRI_VERSION + "yes (v${LIBRI_MAJOR}.${LIBRI_MINOR}.${LIBRI_PATCH})") endif() + endif() + if(ABACUS_LIBRI_VERSION STREQUAL "yes (version unknown)" AND LIBRI_DIR) + set(ABACUS_LIBRI_VERSION "yes (path: ${LIBRI_DIR})") + endif() else() - set(ABACUS_LIBRI_VERSION "no") + set(ABACUS_LIBRI_VERSION "no") endif() # LibComm Version @@ -264,26 +285,36 @@ endif() # Cereal Version (Enhanced) if(ENABLE_LIBRI) - set(ABACUS_CEREAL_VERSION "yes (version unknown)") - if(NOT CEREAL_INCLUDE_DIR) - find_path(CEREAL_INCLUDE_DIR cereal/version.hpp) - endif() - if(CEREAL_INCLUDE_DIR AND EXISTS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp") - file(STRINGS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp" CEREAL_MAJOR_LINE REGEX "^#define CEREAL_VERSION_MAJOR") - file(STRINGS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp" CEREAL_MINOR_LINE REGEX "^#define CEREAL_VERSION_MINOR") - file(STRINGS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp" CEREAL_PATCH_LINE REGEX "^#define CEREAL_VERSION_PATCH") - string(REGEX REPLACE "^#define CEREAL_VERSION_MAJOR +([0-9]+).*" "\\1" CEREAL_MAJOR "${CEREAL_MAJOR_LINE}") - string(REGEX REPLACE "^#define CEREAL_VERSION_MINOR +([0-9]+).*" "\\1" CEREAL_MINOR "${CEREAL_MINOR_LINE}") - string(REGEX REPLACE "^#define CEREAL_VERSION_PATCH +([0-9]+).*" "\\1" CEREAL_PATCH "${CEREAL_PATCH_LINE}") - if(CEREAL_MAJOR AND CEREAL_MINOR AND CEREAL_PATCH) - set(ABACUS_CEREAL_VERSION "yes (v${CEREAL_MAJOR}.${CEREAL_MINOR}.${CEREAL_PATCH})") - endif() - endif() - if(ABACUS_CEREAL_VERSION STREQUAL "yes (version unknown)" AND CEREAL_INCLUDE_DIR) - set(ABACUS_CEREAL_VERSION "yes (path: ${CEREAL_INCLUDE_DIR})") + set(ABACUS_CEREAL_VERSION "yes (version unknown)") + if(NOT CEREAL_INCLUDE_DIR) + find_path(CEREAL_INCLUDE_DIR cereal/version.hpp) + endif() + if(CEREAL_INCLUDE_DIR AND EXISTS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp") + file(STRINGS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp" CEREAL_MAJOR_LINE + REGEX "^#define CEREAL_VERSION_MAJOR") + file(STRINGS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp" CEREAL_MINOR_LINE + REGEX "^#define CEREAL_VERSION_MINOR") + file(STRINGS "${CEREAL_INCLUDE_DIR}/cereal/version.hpp" CEREAL_PATCH_LINE + REGEX "^#define CEREAL_VERSION_PATCH") + string(REGEX REPLACE "^#define CEREAL_VERSION_MAJOR +([0-9]+).*" "\\1" + CEREAL_MAJOR "${CEREAL_MAJOR_LINE}") + string(REGEX REPLACE "^#define CEREAL_VERSION_MINOR +([0-9]+).*" "\\1" + CEREAL_MINOR "${CEREAL_MINOR_LINE}") + string(REGEX REPLACE "^#define CEREAL_VERSION_PATCH +([0-9]+).*" "\\1" + CEREAL_PATCH "${CEREAL_PATCH_LINE}") + if(CEREAL_MAJOR + AND CEREAL_MINOR + AND CEREAL_PATCH) + set(ABACUS_CEREAL_VERSION + "yes (v${CEREAL_MAJOR}.${CEREAL_MINOR}.${CEREAL_PATCH})") endif() + endif() + if(ABACUS_CEREAL_VERSION STREQUAL "yes (version unknown)" + AND CEREAL_INCLUDE_DIR) + set(ABACUS_CEREAL_VERSION "yes (path: ${CEREAL_INCLUDE_DIR})") + endif() else() - set(ABACUS_CEREAL_VERSION "no") + set(ABACUS_CEREAL_VERSION "no") endif() # ML & AI Libraries @@ -294,83 +325,88 @@ else() endif() if((DEFINED Torch_DIR OR ENABLE_MLALGO) AND Torch_VERSION) - set(ABACUS_LIBTORCH_VERSION "yes (v${Torch_VERSION})") + set(ABACUS_LIBTORCH_VERSION "yes (v${Torch_VERSION})") elseif(DEFINED Torch_DIR OR ENABLE_MLALGO) - set(ABACUS_LIBTORCH_VERSION "yes (path: ${Torch_DIR})") + set(ABACUS_LIBTORCH_VERSION "yes (path: ${Torch_DIR})") else() - set(ABACUS_LIBTORCH_VERSION "no") + set(ABACUS_LIBTORCH_VERSION "no") endif() if(DEFINED DeePMD_DIR) - set(ABACUS_DEEPMD_VERSION "yes (version unknown)") - set(DEEPMD_VERSION_HEADER "${DeePMD_DIR}/include/deepmd/version.h") - if(EXISTS ${DEEPMD_VERSION_HEADER}) - file(STRINGS "${DEEPMD_VERSION_HEADER}" DEEPMD_VERSION_LINE REGEX "global_install_prefix") - if(DEEPMD_VERSION_LINE) - string(REGEX MATCH "global_install_prefix=\".*deepmd-kit-([0-9]+\\.[0-9]+\\.[0-9]+)\"" _ "${DEEPMD_VERSION_LINE}") - if(CMAKE_MATCH_1) - set(ABACUS_DEEPMD_VERSION "yes (v${CMAKE_MATCH_1})") -endif() - endif() - endif() - if(ABACUS_DEEPMD_VERSION STREQUAL "yes (version unknown)") - set(ABACUS_DEEPMD_VERSION "yes (path: ${DeePMD_DIR})") + set(ABACUS_DEEPMD_VERSION "yes (version unknown)") + set(DEEPMD_VERSION_HEADER "${DeePMD_DIR}/include/deepmd/version.h") + if(EXISTS ${DEEPMD_VERSION_HEADER}) + file(STRINGS "${DEEPMD_VERSION_HEADER}" DEEPMD_VERSION_LINE + REGEX "global_install_prefix") + if(DEEPMD_VERSION_LINE) + string( + REGEX + MATCH + "global_install_prefix=\".*deepmd-kit-([0-9]+\\.[0-9]+\\.[0-9]+)\"" _ + "${DEEPMD_VERSION_LINE}") + if(CMAKE_MATCH_1) + set(ABACUS_DEEPMD_VERSION "yes (v${CMAKE_MATCH_1})") + endif() endif() + endif() + if(ABACUS_DEEPMD_VERSION STREQUAL "yes (version unknown)") + set(ABACUS_DEEPMD_VERSION "yes (path: ${DeePMD_DIR})") + endif() else() - set(ABACUS_DEEPMD_VERSION "no") + set(ABACUS_DEEPMD_VERSION "no") endif() if(DEFINED NEP_DIR AND NEP_VERSION) - set(ABACUS_NEP_VERSION "yes (v${NEP_VERSION})") + set(ABACUS_NEP_VERSION "yes (v${NEP_VERSION})") elseif(DEFINED NEP_DIR) - set(ABACUS_NEP_VERSION "yes (path: ${NEP_DIR})") + set(ABACUS_NEP_VERSION "yes (path: ${NEP_DIR})") else() - set(ABACUS_NEP_VERSION "no") + set(ABACUS_NEP_VERSION "no") endif() if(DEFINED TensorFlow_DIR) - set(ABACUS_TENSORFLOW_VERSION "yes (path: ${TensorFlow_DIR})") + set(ABACUS_TENSORFLOW_VERSION "yes (path: ${TensorFlow_DIR})") else() - set(ABACUS_TENSORFLOW_VERSION "no") + set(ABACUS_TENSORFLOW_VERSION "no") endif() # Testing & Other Libraries if(BUILD_TESTING) - set(ABACUS_GTEST_VERSION "yes (from git origin/main)") - set(ABACUS_TESTING "ON") + set(ABACUS_GTEST_VERSION "yes (from git origin/main)") + set(ABACUS_TESTING "ON") else() - set(ABACUS_GTEST_VERSION "no") - set(ABACUS_TESTING "OFF") + set(ABACUS_GTEST_VERSION "no") + set(ABACUS_TESTING "OFF") endif() if(ENABLE_GOOGLEBENCH) - set(ABACUS_GOOGLEBENCH_VERSION "Enabled") + set(ABACUS_GOOGLEBENCH_VERSION "Enabled") else() - set(ABACUS_GOOGLEBENCH_VERSION "Disabled") + set(ABACUS_GOOGLEBENCH_VERSION "Disabled") endif() if(ENABLE_JSON) - set(ABACUS_JSON_VERSION "yes (nlohmann-json v${nlohmann_json_VERSION})") + set(ABACUS_JSON_VERSION "yes (nlohmann-json v${nlohmann_json_VERSION})") else() - set(ABACUS_JSON_VERSION "no") + set(ABACUS_JSON_VERSION "no") endif() if(ENABLE_MLALGO) - set(ABACUS_LIBNPY_VERSION "yes (path: ${libnpy_SOURCE_DIR})") + set(ABACUS_LIBNPY_VERSION "yes (path: ${libnpy_SOURCE_DIR})") else() - set(ABACUS_LIBNPY_VERSION "no") + set(ABACUS_LIBNPY_VERSION "no") endif() if(ENABLE_PEXSI) - set(ABACUS_PEXSI_VERSION "yes (v${PEXSI_VERSION})") + set(ABACUS_PEXSI_VERSION "yes (v${PEXSI_VERSION})") else() - set(ABACUS_PEXSI_VERSION "no") + set(ABACUS_PEXSI_VERSION "no") endif() if(ENABLE_CNPY) - set(ABACUS_CNPY_VERSION "yes (path: ${cnpy_SOURCE_DIR})") + set(ABACUS_CNPY_VERSION "yes (path: ${cnpy_SOURCE_DIR})") else() - set(ABACUS_CNPY_VERSION "no") + set(ABACUS_CNPY_VERSION "no") endif() # --- 5. Collect CMake Configuration Summary --- @@ -386,7 +422,7 @@ list(APPEND CMAKE_OPTIONS_LIST " ENABLE_MLALGO=${ENABLE_MLALGO}") list(APPEND CMAKE_OPTIONS_LIST " ENABLE_ASAN=${ENABLE_ASAN}") list(APPEND CMAKE_OPTIONS_LIST " BUILD_TESTING=${BUILD_TESTING}") foreach(option_line ${CMAKE_OPTIONS_LIST}) - set(ABACUS_CMAKE_OPTIONS "${ABACUS_CMAKE_OPTIONS}${option_line}") + set(ABACUS_CMAKE_OPTIONS "${ABACUS_CMAKE_OPTIONS}${option_line}") endforeach() set(ABACUS_CMAKE_FIND_PACKAGES "FindPackage Results:") @@ -399,7 +435,7 @@ list(APPEND CMAKE_FIND_PACKAGES_LIST " Libxc Found=${Libxc_FOUND}") list(APPEND CMAKE_FIND_PACKAGES_LIST " PEXSI Found=${PEXSI_FOUND}") list(APPEND CMAKE_FIND_PACKAGES_LIST " LibRI Found=${LIBRI_FOUND}") foreach(package_line ${CMAKE_FIND_PACKAGES_LIST}) - set(ABACUS_CMAKE_FIND_PACKAGES "${ABACUS_CMAKE_FIND_PACKAGES}${package_line}") + set(ABACUS_CMAKE_FIND_PACKAGES "${ABACUS_CMAKE_FIND_PACKAGES}${package_line}") endforeach() # ============================================================================== @@ -410,9 +446,12 @@ message(" ABACUS Build Summary ") message(" ===================================================================") message(" Build Type : ${ABACUS_BUILD_TYPE}") message(" Platform : ${ABACUS_PLATFORM_NAME}") -message(" Compiler : ${ABACUS_CXX_COMPILER_ID} ${ABACUS_CXX_COMPILER_VERSION}") +message( + " Compiler : ${ABACUS_CXX_COMPILER_ID} ${ABACUS_CXX_COMPILER_VERSION}" +) message(" -------------------------------------------------------------------") -message(" MPI Support : ${ABACUS_MPI_IMPLEMENTATION} ${ABACUS_MPI_VERSION}") +message( + " MPI Support : ${ABACUS_MPI_IMPLEMENTATION} ${ABACUS_MPI_VERSION}") message(" CUDA-Aware MPI : ${ABACUS_CUDA_AWARE_MPI}") message(" OpenMP Support : ${ABACUS_OPENMP_VERSION}") message(" -------------------------------------------------------------------") diff --git a/cmake/CompilerConfiguration.cmake b/cmake/CompilerConfiguration.cmake index 79a3c33a064..345f46e6e36 100644 --- a/cmake/CompilerConfiguration.cmake +++ b/cmake/CompilerConfiguration.cmake @@ -6,13 +6,16 @@ if(NOT CMAKE_BUILD_TYPE AND NOT MSVC) target_compile_options(abacus_compile_requirements INTERFACE -O3 -g) endif() -target_compile_options(abacus_compile_requirements INTERFACE - "$<$:-fp-model=strict;-Wno-write-strings>") +target_compile_options( + abacus_compile_requirements + INTERFACE + "$<$:-fp-model=strict;-Wno-write-strings>" +) if(ENABLE_NATIVE_OPTIMIZATION AND NOT CMAKE_CROSSCOMPILING) set(_abacus_native_candidates) - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES + "Clang") set(_abacus_native_candidates -march=native -mcpu=native) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel") set(_abacus_native_candidates -xHOST) @@ -21,22 +24,25 @@ if(ENABLE_NATIVE_OPTIMIZATION AND NOT CMAKE_CROSSCOMPILING) string(MAKE_C_IDENTIFIER "ABACUS_HAS_${_flag}" _var) check_cxx_compiler_flag("${_flag}" ${_var}) if(${_var}) - target_compile_options(abacus_compile_requirements INTERFACE - "$<$:${_flag}>") + target_compile_options(abacus_compile_requirements + INTERFACE "$<$:${_flag}>") break() endif() endforeach() endif() if(USE_CUDA) - target_compile_options(abacus_compile_requirements INTERFACE - "$<$,$>:-g;-G>") + target_compile_options( + abacus_compile_requirements + INTERFACE + "$<$,$>:-g;-G>") if(ENABLE_OPENMP AND OpenMP_CXX_FOUND) separate_arguments(_abacus_openmp_cxx_flags NATIVE_COMMAND "${OpenMP_CXX_FLAGS}") foreach(_flag IN LISTS _abacus_openmp_cxx_flags) - target_compile_options(abacus_compile_requirements INTERFACE - "$<$:-Xcompiler=${_flag}>") + target_compile_options( + abacus_compile_requirements + INTERFACE "$<$:-Xcompiler=${_flag}>") endforeach() endif() endif() diff --git a/cmake/Testing.cmake b/cmake/Testing.cmake index a68871f4b47..49376d1cd86 100644 --- a/cmake/Testing.cmake +++ b/cmake/Testing.cmake @@ -30,48 +30,47 @@ if(BUILD_TESTING AND ENABLE_GOOGLEBENCH) endif() endif() - function(AddTest) # function for UT - cmake_parse_arguments(UT "DYN" "TARGET" - "LIBS;DYN_LIBS;STATIC_LIBS;SOURCES;DEPENDS;KEEP_FEATURE_DEFINITIONS" ${ARGN}) - add_executable(${UT_TARGET} ${UT_SOURCES}) +function(AddTest) # function for UT + cmake_parse_arguments( + UT "DYN" "TARGET" + "LIBS;DYN_LIBS;STATIC_LIBS;SOURCES;DEPENDS;KEEP_FEATURE_DEFINITIONS" + ${ARGN}) + add_executable(${UT_TARGET} ${UT_SOURCES}) - # Let this target keep feature definitions (e.g. __MPI) that its source - # directory disables via abacus_disable_feature_definitions(). Needed by - # tests that genuinely exercise the feature. - if(UT_KEEP_FEATURE_DEFINITIONS) - set_property(TARGET ${UT_TARGET} PROPERTY - ABACUS_KEPT_FEATURE_DEFINITIONS ${UT_KEEP_FEATURE_DEFINITIONS}) - endif() + # Let this target keep feature definitions (e.g. __MPI) that its source + # directory disables via abacus_disable_feature_definitions(). Needed by + # tests that genuinely exercise the feature. + if(UT_KEEP_FEATURE_DEFINITIONS) + set_property(TARGET ${UT_TARGET} PROPERTY ABACUS_KEPT_FEATURE_DEFINITIONS + ${UT_KEEP_FEATURE_DEFINITIONS}) + endif() - if(ENABLE_COVERAGE) - add_coverage(${UT_TARGET}) - endif() + if(ENABLE_COVERAGE) + add_coverage(${UT_TARGET}) + endif() - # Dependencies & link library - # Share the numerical/MPI/OpenMP runtime closure but not - # the optional feature closure of the final binary - target_link_libraries(${UT_TARGET} PRIVATE - ${UT_LIBS} - GTest::gtest_main - GTest::gmock_main - abacus::linalg_libs) - if(BUILD_TESTING AND ENABLE_GOOGLEBENCH) - target_link_libraries( - ${UT_TARGET} PRIVATE benchmark::benchmark) - endif() + # Dependencies & link library + # Share the numerical/MPI/OpenMP runtime closure but not + # the optional feature closure of the final binary + target_link_libraries( + ${UT_TARGET} PRIVATE ${UT_LIBS} GTest::gtest_main GTest::gmock_main + abacus::linalg_libs) + if(BUILD_TESTING AND ENABLE_GOOGLEBENCH) + target_link_libraries(${UT_TARGET} PRIVATE benchmark::benchmark) + endif() + # Link to build info if needed + if("${UT_SOURCES}" MATCHES "parse_args.cpp") + target_include_directories(${UT_TARGET} + PUBLIC ${CMAKE_BINARY_DIR}/source/source_io) + endif() - # Link to build info if needed - if("${UT_SOURCES}" MATCHES "parse_args.cpp") - target_include_directories(${UT_TARGET} PUBLIC ${CMAKE_BINARY_DIR}/source/source_io) - endif() - - install(TARGETS ${UT_TARGET} DESTINATION ${CMAKE_BINARY_DIR}/tests) - add_test( - NAME ${UT_TARGET} - COMMAND ${UT_TARGET} - WORKING_DIRECTORY $) - endfunction(AddTest) + install(TARGETS ${UT_TARGET} DESTINATION ${CMAKE_BINARY_DIR}/tests) + add_test( + NAME ${UT_TARGET} + COMMAND ${UT_TARGET} + WORKING_DIRECTORY $) +endfunction(AddTest) if(BUILD_TESTING) set_if_higher(CMAKE_CXX_STANDARD 14) # Required in orbital diff --git a/cmake/modules/FindBlas.cmake b/cmake/modules/FindBlas.cmake index c75fc1dc9f1..9e0ab08b676 100644 --- a/cmake/modules/FindBlas.cmake +++ b/cmake/modules/FindBlas.cmake @@ -1,8 +1,8 @@ if(DEFINED BLAS_DIR) - string(APPEND CMAKE_PREFIX_PATH ";${BLAS_DIR}") + string(APPEND CMAKE_PREFIX_PATH ";${BLAS_DIR}") endif() if(DEFINED BLAS_LIBRARY) - set(BLAS_LIBRARIES ${BLAS_LIBRARY}) + set(BLAS_LIBRARIES ${BLAS_LIBRARY}) endif() # Delegate to CMake's builtin FindBLAS module. On case-insensitive @@ -17,8 +17,8 @@ find_package(BLAS REQUIRED) set(CMAKE_MODULE_PATH "${_abacus_blas_saved_module_path}") if(NOT TARGET BLAS::BLAS) - add_library(BLAS::BLAS UNKNOWN IMPORTED) - set_target_properties(BLAS::BLAS PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${BLAS_LIBRARIES}") + add_library(BLAS::BLAS UNKNOWN IMPORTED) + set_target_properties( + BLAS::BLAS PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${BLAS_LIBRARIES}") endif() diff --git a/cmake/modules/FindDeePMD.cmake b/cmake/modules/FindDeePMD.cmake index d8aab27efda..18c968c9c26 100644 --- a/cmake/modules/FindDeePMD.cmake +++ b/cmake/modules/FindDeePMD.cmake @@ -9,80 +9,81 @@ # # C API -find_path(DeePMD_INCLUDE_C_DIR - deepmd/deepmd.hpp - deepmd/c_api.h - HINTS ${DeePMD_DIR} - PATH_SUFFIXES "include" - ) -find_library(deepmd_c - NAMES deepmd_c - HINTS ${DeePMD_DIR} - PATH_SUFFIXES "lib" - ) +find_path( + DeePMD_INCLUDE_C_DIR deepmd/deepmd.hpp deepmd/c_api.h + HINTS ${DeePMD_DIR} + PATH_SUFFIXES "include") +find_library( + deepmd_c + NAMES deepmd_c + HINTS ${DeePMD_DIR} + PATH_SUFFIXES "lib") # C++ API -find_path(DeePMD_INCLUDE_DIR - deepmd/DeepPot.h - HINTS ${DeePMD_DIR} - PATH_SUFFIXES "include" - ) -find_library(deepmd_cc - NAMES deepmd_cc - HINTS ${DeePMD_DIR} - PATH_SUFFIXES "lib" - ) +find_path( + DeePMD_INCLUDE_DIR deepmd/DeepPot.h + HINTS ${DeePMD_DIR} + PATH_SUFFIXES "include") +find_library( + deepmd_cc + NAMES deepmd_cc + HINTS ${DeePMD_DIR} + PATH_SUFFIXES "lib") # Handle the QUIET and REQUIRED arguments and # set DeePMD_FOUND to TRUE if all variables are non-zero. include(FindPackageHandleStandardArgs) -if (DeePMD_INCLUDE_C_DIR) - find_package_handle_standard_args(DeePMD DEFAULT_MSG deepmd_c DeePMD_INCLUDE_C_DIR) - if (DeePMD_FOUND) - set(DeePMDC_FOUND TRUE) - set(DeePMD_INCLUDE_DIR ${DeePMD_INCLUDE_C_DIR}) - if(NOT TARGET DeePMD::deepmd_c) - add_library(DeePMD::deepmd_c UNKNOWN IMPORTED) - set_target_properties(DeePMD::deepmd_c PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${deepmd_c}" - INTERFACE_INCLUDE_DIRECTORIES "${DeePMD_INCLUDE_DIR}") - endif() +if(DeePMD_INCLUDE_C_DIR) + find_package_handle_standard_args(DeePMD DEFAULT_MSG deepmd_c + DeePMD_INCLUDE_C_DIR) + if(DeePMD_FOUND) + set(DeePMDC_FOUND TRUE) + set(DeePMD_INCLUDE_DIR ${DeePMD_INCLUDE_C_DIR}) + if(NOT TARGET DeePMD::deepmd_c) + add_library(DeePMD::deepmd_c UNKNOWN IMPORTED) + set_target_properties( + DeePMD::deepmd_c + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${deepmd_c}" + INTERFACE_INCLUDE_DIRECTORIES "${DeePMD_INCLUDE_DIR}") endif() + endif() else() - find_package_handle_standard_args(DeePMD DEFAULT_MSG deepmd_cc DeePMD_INCLUDE_DIR) - if(DeePMD_FOUND) - set(DeePMD_INCLUDE_DIR ${DeePMD_INCLUDE_DIR}) - if(NOT TARGET DeePMD::deepmd_cc) - add_library(DeePMD::deepmd_cc UNKNOWN IMPORTED) - set_target_properties(DeePMD::deepmd_cc PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${deepmd_cc}" - INTERFACE_INCLUDE_DIRECTORIES "${DeePMD_INCLUDE_DIR}") - endif() + find_package_handle_standard_args(DeePMD DEFAULT_MSG deepmd_cc + DeePMD_INCLUDE_DIR) + if(DeePMD_FOUND) + set(DeePMD_INCLUDE_DIR ${DeePMD_INCLUDE_DIR}) + if(NOT TARGET DeePMD::deepmd_cc) + add_library(DeePMD::deepmd_cc UNKNOWN IMPORTED) + set_target_properties( + DeePMD::deepmd_cc + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${deepmd_cc}" + INTERFACE_INCLUDE_DIRECTORIES "${DeePMD_INCLUDE_DIR}") endif() + endif() endif() set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${DeePMD_INCLUDE_DIR}) include(CheckCXXSourceCompiles) if(DeePMD_FOUND) - # The communication constructor is inline and calls into the DeePMD - # library, so the feature probe must link against the selected API library. - set(_abacus_saved_required_libraries ${CMAKE_REQUIRED_LIBRARIES}) - if(DeePMDC_FOUND) - set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${deepmd_c}) - else() - set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${deepmd_cc}) - endif() - if(DeePMDC_FOUND) - set(_abacus_dp_nlist_type "deepmd::hpp::InputNlist") - set(_abacus_dp_nlist_header "#include ") - else() - set(_abacus_dp_nlist_type "deepmd::InputNlist") - set(_abacus_dp_nlist_header "#include ") - endif() - check_cxx_source_compiles( - "${_abacus_dp_nlist_header} + # The communication constructor is inline and calls into the DeePMD + # library, so the feature probe must link against the selected API library. + set(_abacus_saved_required_libraries ${CMAKE_REQUIRED_LIBRARIES}) + if(DeePMDC_FOUND) + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${deepmd_c}) + else() + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${deepmd_cc}) + endif() + if(DeePMDC_FOUND) + set(_abacus_dp_nlist_type "deepmd::hpp::InputNlist") + set(_abacus_dp_nlist_header "#include ") + else() + set(_abacus_dp_nlist_type "deepmd::InputNlist") + set(_abacus_dp_nlist_header "#include ") + endif() + check_cxx_source_compiles( + "${_abacus_dp_nlist_header} int main() { ${_abacus_dp_nlist_type} nlist(0, nullptr, nullptr, nullptr, @@ -90,12 +91,12 @@ if(DeePMD_FOUND) nullptr, nullptr, nullptr, nullptr, 1); return 0; }" - DeePMD_HAS_COMM_NLIST_13) - if(DeePMD_HAS_COMM_NLIST_13) - set(DeePMD_INPUT_NLIST_COMM_ARGS 13) - else() - check_cxx_source_compiles( - "${_abacus_dp_nlist_header} + DeePMD_HAS_COMM_NLIST_13) + if(DeePMD_HAS_COMM_NLIST_13) + set(DeePMD_INPUT_NLIST_COMM_ARGS 13) + else() + check_cxx_source_compiles( + "${_abacus_dp_nlist_header} int main() { ${_abacus_dp_nlist_type} nlist(0, nullptr, nullptr, nullptr, @@ -103,32 +104,35 @@ if(DeePMD_FOUND) nullptr, nullptr, nullptr, nullptr); return 0; }" - DeePMD_HAS_COMM_NLIST_12) - if(DeePMD_HAS_COMM_NLIST_12) - set(DeePMD_INPUT_NLIST_COMM_ARGS 12) - else() - set(DeePMD_INPUT_NLIST_COMM_ARGS 0) - endif() + DeePMD_HAS_COMM_NLIST_12) + if(DeePMD_HAS_COMM_NLIST_12) + set(DeePMD_INPUT_NLIST_COMM_ARGS 12) + else() + set(DeePMD_INPUT_NLIST_COMM_ARGS 0) endif() - check_cxx_source_compiles( - "${_abacus_dp_nlist_header} + endif() + check_cxx_source_compiles( + "${_abacus_dp_nlist_header} int main() { ${_abacus_dp_nlist_type} nlist(0, nullptr, nullptr, nullptr); nlist.set_mapping(nullptr); return 0; }" - DeePMD_HAS_NLIST_MAPPING) - set(CMAKE_REQUIRED_LIBRARIES ${_abacus_saved_required_libraries}) - unset(_abacus_saved_required_libraries) - unset(_abacus_dp_nlist_type) - unset(_abacus_dp_nlist_header) + DeePMD_HAS_NLIST_MAPPING) + set(CMAKE_REQUIRED_LIBRARIES ${_abacus_saved_required_libraries}) + unset(_abacus_saved_required_libraries) + unset(_abacus_dp_nlist_type) + unset(_abacus_dp_nlist_header) endif() -if(DeePMD_FOUND AND DEFINED DeePMD_INPUT_NLIST_COMM_ARGS AND DeePMD_INPUT_NLIST_COMM_ARGS EQUAL 0) - message(WARNING - "The installed DeePMD API has no communication-capable InputNlist constructor; " - "message-passing MDCell support requires a newer DeePMD-kit API.") +if(DeePMD_FOUND + AND DEFINED DeePMD_INPUT_NLIST_COMM_ARGS + AND DeePMD_INPUT_NLIST_COMM_ARGS EQUAL 0) + message( + WARNING + "The installed DeePMD API has no communication-capable InputNlist constructor; " + "message-passing MDCell support requires a newer DeePMD-kit API.") endif() mark_as_advanced(DeePMD_INCLUDE_DIR deepmd_c deepmd_cc) diff --git a/cmake/modules/FindELPA.cmake b/cmake/modules/FindELPA.cmake index 90594e467d2..42a16b9e83d 100644 --- a/cmake/modules/FindELPA.cmake +++ b/cmake/modules/FindELPA.cmake @@ -9,7 +9,10 @@ # Migrate caches created when FindPkgConfig used the public ELPA prefix. if(DEFINED CACHE{ELPA_LIBRARIES}) - get_property(_elpa_libraries_cache_type CACHE ELPA_LIBRARIES PROPERTY TYPE) + get_property( + _elpa_libraries_cache_type + CACHE ELPA_LIBRARIES + PROPERTY TYPE) if(_elpa_libraries_cache_type STREQUAL "INTERNAL") unset(ELPA_LIBRARIES CACHE) unset(ELPA_INCLUDE_DIRS CACHE) @@ -20,7 +23,8 @@ unset(_elpa_libraries_cache_type) # Compatible layer towards old manual routines if(DEFINED ELPA_DIR) - message(WARNING "ELPA_DIR is deprecated and will be removed in the future release.") + message( + WARNING "ELPA_DIR is deprecated and will be removed in the future release.") endif() if(DEFINED ELPA_INCLUDE_DIR) set(ELPA_INCLUDE_DIRS ${ELPA_INCLUDE_DIR}) @@ -29,11 +33,10 @@ if(DEFINED ELPA_LIBRARIES) set(ELPA_LINK_LIBRARIES ${ELPA_LIBRARIES}) endif() -find_path(ELPA_INCLUDE_DIRS - elpa/elpa.h - HINTS ${ELPA_DIR} - PATH_SUFFIXES "include" "include/elpa" - ) +find_path( + ELPA_INCLUDE_DIRS elpa/elpa.h + HINTS ${ELPA_DIR} + PATH_SUFFIXES "include" "include/elpa") # Fix #3589 # First if judges if ELPA dir specified if(ELPA_INCLUDE_DIRS MATCHES "^/usr/include/elpa/.*") @@ -43,17 +46,17 @@ if(ELPA_INCLUDE_DIRS MATCHES "^/usr/include/elpa/.*") endif() endif() if(ENABLE_OPENMP) - find_library(ELPA_LINK_LIBRARIES + find_library( + ELPA_LINK_LIBRARIES NAMES elpa_openmp elpa HINTS ${ELPA_DIR} - PATH_SUFFIXES "lib" - ) + PATH_SUFFIXES "lib") else() - find_library(ELPA_LINK_LIBRARIES + find_library( + ELPA_LINK_LIBRARIES NAMES elpa HINTS ${ELPA_DIR} - PATH_SUFFIXES "lib" - ) + PATH_SUFFIXES "lib") endif() # ======================================================================== @@ -63,7 +66,9 @@ endif() if(NOT ELPA_INCLUDE_DIRS) find_package(PkgConfig) if(NOT PKG_CONFIG_FOUND) - message(FATAL_ERROR "Pkg-config is needed to get all information about the ELPA library") + message( + FATAL_ERROR + "Pkg-config is needed to get all information about the ELPA library") endif() # Find preferred library corresponding with ABACUS configuration first if(ENABLE_OPENMP) @@ -83,7 +88,8 @@ endif() # Handle the QUIET and REQUIRED arguments and # set ELPA_FOUND to TRUE if all variables are non-zero. include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(ELPA DEFAULT_MSG ELPA_LINK_LIBRARIES ELPA_INCLUDE_DIRS) +find_package_handle_standard_args(ELPA DEFAULT_MSG ELPA_LINK_LIBRARIES + ELPA_INCLUDE_DIRS) # Copy the results to the output variables and target. if(ELPA_FOUND) @@ -95,10 +101,11 @@ if(ELPA_FOUND) add_library(ELPA::ELPA ALIAS PkgConfig::ELPA_PKG) else() add_library(ELPA::ELPA UNKNOWN IMPORTED) - set_target_properties(ELPA::ELPA PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${ELPA_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${ELPA_INCLUDE_DIR}") + set_target_properties( + ELPA::ELPA + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${ELPA_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${ELPA_INCLUDE_DIR}") endif() endif() endif() @@ -108,17 +115,18 @@ set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ELPA_INCLUDE_DIR}) # Compability workaround for ELPA_DIR # TODO: Remove this check with the deprecated ELPA_DIR path. include(CheckCXXSourceCompiles) -check_cxx_source_compiles(" +check_cxx_source_compiles( + " #include #if ELPA_API_VERSION < 20210430 #error ELPA version is too old. #endif int main(){} " -ELPA_VERSION_SATISFIES -) + ELPA_VERSION_SATISFIES) if(NOT ELPA_VERSION_SATISFIES) - message(FATAL_ERROR "ELPA version is too old. We support version 2021 or higher.") + message( + FATAL_ERROR "ELPA version is too old. We support version 2021 or higher.") endif() mark_as_advanced(ELPA_INCLUDE_DIR ELPA_LIBRARY) diff --git a/cmake/modules/FindFFTW3.cmake b/cmake/modules/FindFFTW3.cmake index 350a7fa1250..1eebe8ee549 100644 --- a/cmake/modules/FindFFTW3.cmake +++ b/cmake/modules/FindFFTW3.cmake @@ -7,32 +7,32 @@ # FFTW3_VERSION - Version from the selected library's pkgconfig/fftw3.pc, if available. # -find_path(FFTW3_INCLUDE_DIR - NAMES fftw3.h - HINTS ${FFTW3_DIR} - PATH_SUFFIXES "include" - ) -find_library(FFTW3_LIBRARY - NAMES fftw3 - HINTS ${FFTW3_DIR} - PATH_SUFFIXES "lib" - ) +find_path( + FFTW3_INCLUDE_DIR + NAMES fftw3.h + HINTS ${FFTW3_DIR} + PATH_SUFFIXES "include") +find_library( + FFTW3_LIBRARY + NAMES fftw3 + HINTS ${FFTW3_DIR} + PATH_SUFFIXES "lib") if(ENABLE_FLOAT_FFTW) - find_library(FFTW3_FLOAT_LIBRARY - NAMES fftw3f - HINTS ${FFTW3_DIR} - PATH_SUFFIXES "lib" - ) + find_library( + FFTW3_FLOAT_LIBRARY + NAMES fftw3f + HINTS ${FFTW3_DIR} + PATH_SUFFIXES "lib") endif() # Both libfftw3.so and libfftw3_omp.so are required for OpenMP builds. -if (ENABLE_OPENMP) - find_library(FFTW3_OMP_LIBRARY - NAMES fftw3_omp - HINTS ${FFTW3_DIR} - PATH_SUFFIXES "lib" - ) +if(ENABLE_OPENMP) + find_library( + FFTW3_OMP_LIBRARY + NAMES fftw3_omp + HINTS ${FFTW3_DIR} + PATH_SUFFIXES "lib") endif() # Handle the QUIET and REQUIRED arguments and @@ -50,47 +50,52 @@ find_package_handle_standard_args(FFTW3 DEFAULT_MSG ${_fftw3_required_vars}) # Copy the results to the output variables and target. set(FFTW3_VERSION "") if(FFTW3_FOUND) - set(FFTW3_LIBRARIES ${FFTW3_LIBRARY}) - if (ENABLE_OPENMP) - list(APPEND FFTW3_LIBRARIES ${FFTW3_OMP_LIBRARY}) - endif() + set(FFTW3_LIBRARIES ${FFTW3_LIBRARY}) + if(ENABLE_OPENMP) + list(APPEND FFTW3_LIBRARIES ${FFTW3_OMP_LIBRARY}) + endif() - set(FFTW3_INCLUDE_DIRS ${FFTW3_INCLUDE_DIR}) + set(FFTW3_INCLUDE_DIRS ${FFTW3_INCLUDE_DIR}) # Read the literal version from metadata beside the selected library. get_filename_component(_fftw3_library_dir "${FFTW3_LIBRARY}" DIRECTORY) set(_fftw3_pc "${_fftw3_library_dir}/pkgconfig/fftw3.pc") if(EXISTS "${_fftw3_pc}") - file(STRINGS "${_fftw3_pc}" _fftw3_version_line REGEX "^Version:[ \t]*[0-9]") + file(STRINGS "${_fftw3_pc}" _fftw3_version_line + REGEX "^Version:[ \t]*[0-9]") if(_fftw3_version_line) - string(REGEX REPLACE "^Version:[ \t]*" "" FFTW3_VERSION "${_fftw3_version_line}") + string(REGEX REPLACE "^Version:[ \t]*" "" FFTW3_VERSION + "${_fftw3_version_line}") string(STRIP "${FFTW3_VERSION}" FFTW3_VERSION) endif() endif() - if(NOT TARGET FFTW3::FFTW3) - add_library(FFTW3::FFTW3 UNKNOWN IMPORTED) - set_target_properties(FFTW3::FFTW3 PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${FFTW3_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}") - endif() - if(ENABLE_FLOAT_FFTW AND NOT TARGET FFTW3::FFTW3_FLOAT) - add_library(FFTW3::FFTW3_FLOAT UNKNOWN IMPORTED) - set_target_properties(FFTW3::FFTW3_FLOAT PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${FFTW3_FLOAT_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}") - endif() - if (ENABLE_OPENMP) - if(NOT TARGET FFTW3::FFTW3_OMP) - add_library(FFTW3::FFTW3_OMP UNKNOWN IMPORTED) - set_target_properties(FFTW3::FFTW3_OMP PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${FFTW3_OMP_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}") - endif() + if(NOT TARGET FFTW3::FFTW3) + add_library(FFTW3::FFTW3 UNKNOWN IMPORTED) + set_target_properties( + FFTW3::FFTW3 + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${FFTW3_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}") + endif() + if(ENABLE_FLOAT_FFTW AND NOT TARGET FFTW3::FFTW3_FLOAT) + add_library(FFTW3::FFTW3_FLOAT UNKNOWN IMPORTED) + set_target_properties( + FFTW3::FFTW3_FLOAT + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${FFTW3_FLOAT_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}") + endif() + if(ENABLE_OPENMP) + if(NOT TARGET FFTW3::FFTW3_OMP) + add_library(FFTW3::FFTW3_OMP UNKNOWN IMPORTED) + set_target_properties( + FFTW3::FFTW3_OMP + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${FFTW3_OMP_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}") endif() + endif() endif() mark_as_advanced(FFTW3_INCLUDE_DIR FFTW3_LIBRARY FFTW3_OMP_LIBRARY) diff --git a/cmake/modules/FindKML.cmake b/cmake/modules/FindKML.cmake index 90aeed49257..935cc5d95b9 100644 --- a/cmake/modules/FindKML.cmake +++ b/cmake/modules/FindKML.cmake @@ -29,15 +29,20 @@ include(FindPackageHandleStandardArgs) -set(KML_ROOT "" CACHE PATH "KML installation prefix") +set(KML_ROOT + "" + CACHE PATH "KML installation prefix") -set(KML_ARCH "neon" CACHE STRING "KML library variant (neon, sve, or sve512)") +set(KML_ARCH + "neon" + CACHE STRING "KML library variant (neon, sve, or sve512)") set_property(CACHE KML_ARCH PROPERTY STRINGS neon sve sve512) -set(KML_BLAS_THREADING "auto" CACHE STRING - "KML kblas variant (auto, multi, locking, or nolocking)") -set_property(CACHE KML_BLAS_THREADING PROPERTY STRINGS - auto multi locking nolocking) +set(KML_BLAS_THREADING + "auto" + CACHE STRING "KML kblas variant (auto, multi, locking, or nolocking)") +set_property(CACHE KML_BLAS_THREADING PROPERTY STRINGS auto multi locking + nolocking) set(_kml_arch_variants neon sve sve512) if(NOT KML_ARCH IN_LIST _kml_arch_variants) @@ -56,8 +61,9 @@ else() endif() if(NOT _kml_blas_threading IN_LIST _kml_thread_variants) - message(FATAL_ERROR - "KML_BLAS_THREADING must be auto or one of: ${_kml_thread_variants}") + message( + FATAL_ERROR + "KML_BLAS_THREADING must be auto or one of: ${_kml_thread_variants}") endif() set(_kml_blas_arch "${KML_ARCH}") @@ -82,19 +88,22 @@ endif() get_filename_component(_kml_root_name "${_kml_explicit_root}" NAME) if(_kml_root_name STREQUAL "gcc") if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - message(FATAL_ERROR - "KML_ROOT points to the GCC KML bundle, but the C++ compiler is " - "${CMAKE_CXX_COMPILER_ID}.") + message( + FATAL_ERROR + "KML_ROOT points to the GCC KML bundle, but the C++ compiler is " + "${CMAKE_CXX_COMPILER_ID}.") endif() elseif(_kml_root_name STREQUAL "bisheng") if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - message(FATAL_ERROR - "KML_ROOT points to the BiShengLLVM KML bundle, but the C++ compiler is " - "${CMAKE_CXX_COMPILER_ID}.") + message( + FATAL_ERROR + "KML_ROOT points to the BiShengLLVM KML bundle, but the C++ compiler is " + "${CMAKE_CXX_COMPILER_ID}.") endif() endif() -find_path(KML_INCLUDE_DIR +find_path( + KML_INCLUDE_DIR NAMES kblas.h klapack.h kscalapack.h HINTS ${_kml_prefix_hints} PATH_SUFFIXES include) @@ -102,49 +111,57 @@ find_path(KML_INCLUDE_DIR if(KML_INCLUDE_DIR) get_filename_component(_kml_prefix "${KML_INCLUDE_DIR}" DIRECTORY) - find_library(KML_RUNTIME_LIBRARY + find_library( + KML_RUNTIME_LIBRARY NAMES kml_rt HINTS "${_kml_prefix}" PATH_SUFFIXES lib NO_DEFAULT_PATH) - find_library(KML_BLAS_LIBRARY + find_library( + KML_BLAS_LIBRARY NAMES kblas HINTS "${_kml_prefix}" PATH_SUFFIXES "lib/${_kml_blas_arch}/kblas/${_kml_blas_threading}" NO_DEFAULT_PATH) - find_library(KML_LAPACK_LIBRARY + find_library( + KML_LAPACK_LIBRARY NAMES klapack_full HINTS "${_kml_prefix}" PATH_SUFFIXES "lib/${KML_ARCH}" NO_DEFAULT_PATH) - find_library(KML_SCALAPACK_LIBRARY + find_library( + KML_SCALAPACK_LIBRARY NAMES kscalapack_full HINTS "${_kml_prefix}" PATH_SUFFIXES "lib/${KML_ARCH}" NO_DEFAULT_PATH) - find_library(KML_FFTW3_LIBRARY + find_library( + KML_FFTW3_LIBRARY NAMES fftw3 HINTS "${_kml_prefix}" PATH_SUFFIXES lib/noarch NO_DEFAULT_PATH) - find_library(KML_KFFT_LIBRARY + find_library( + KML_KFFT_LIBRARY NAMES kfft HINTS "${_kml_prefix}" PATH_SUFFIXES "lib/${KML_ARCH}" NO_DEFAULT_PATH) - find_library(KML_FFTW3_FLOAT_LIBRARY + find_library( + KML_FFTW3_FLOAT_LIBRARY NAMES fftw3f HINTS "${_kml_prefix}" PATH_SUFFIXES lib/noarch NO_DEFAULT_PATH) - find_library(KML_KFFTF_LIBRARY + find_library( + KML_KFFTF_LIBRARY NAMES kfftf HINTS "${_kml_prefix}" PATH_SUFFIXES "lib/${KML_ARCH}" @@ -168,14 +185,18 @@ endif() set(KML_SCALAPACK_FOUND "${KML_ScaLAPACK_FOUND}") set(KML_FFTW3_FOUND FALSE) -if(KML_INCLUDE_DIR AND EXISTS "${KML_INCLUDE_DIR}/fftw3.h" AND - KML_FFTW3_LIBRARY AND KML_KFFT_LIBRARY) +if(KML_INCLUDE_DIR + AND EXISTS "${KML_INCLUDE_DIR}/fftw3.h" + AND KML_FFTW3_LIBRARY + AND KML_KFFT_LIBRARY) set(KML_FFTW3_FOUND TRUE) endif() set(KML_FFTW3_FLOAT_FOUND FALSE) -if(KML_INCLUDE_DIR AND EXISTS "${KML_INCLUDE_DIR}/fftw3.h" AND - KML_FFTW3_FLOAT_LIBRARY AND KML_KFFTF_LIBRARY) +if(KML_INCLUDE_DIR + AND EXISTS "${KML_INCLUDE_DIR}/fftw3.h" + AND KML_FFTW3_FLOAT_LIBRARY + AND KML_KFFTF_LIBRARY) set(KML_FFTW3_FLOAT_FOUND TRUE) endif() @@ -186,15 +207,15 @@ if(KML_FIND_COMPONENTS) list(APPEND _kml_required_vars KML_BLAS_LIBRARY) elseif(_kml_component STREQUAL "LAPACK") list(APPEND _kml_required_vars KML_LAPACK_LIBRARY KML_BLAS_LIBRARY) - elseif(_kml_component STREQUAL "ScaLAPACK" OR _kml_component STREQUAL "SCALAPACK") + elseif(_kml_component STREQUAL "ScaLAPACK" OR _kml_component STREQUAL + "SCALAPACK") set(KML_${_kml_component}_FOUND "${KML_ScaLAPACK_FOUND}") - list(APPEND _kml_required_vars - KML_SCALAPACK_LIBRARY KML_LAPACK_LIBRARY KML_BLAS_LIBRARY) + list(APPEND _kml_required_vars KML_SCALAPACK_LIBRARY KML_LAPACK_LIBRARY + KML_BLAS_LIBRARY) elseif(_kml_component STREQUAL "FFTW3") list(APPEND _kml_required_vars KML_FFTW3_LIBRARY KML_KFFT_LIBRARY) elseif(_kml_component STREQUAL "FFTW3_FLOAT") - list(APPEND _kml_required_vars - KML_FFTW3_FLOAT_LIBRARY KML_KFFTF_LIBRARY) + list(APPEND _kml_required_vars KML_FFTW3_FLOAT_LIBRARY KML_KFFTF_LIBRARY) else() set(KML_${_kml_component}_FOUND FALSE) endif() @@ -204,7 +225,8 @@ else() endif() list(REMOVE_DUPLICATES _kml_required_vars) -find_package_handle_standard_args(KML +find_package_handle_standard_args( + KML REQUIRED_VARS ${_kml_required_vars} HANDLE_COMPONENTS) @@ -213,51 +235,57 @@ if(KML_FOUND) if(KML_RUNTIME_LIBRARY AND NOT TARGET KML::Runtime) add_library(KML::Runtime UNKNOWN IMPORTED) - set_target_properties(KML::Runtime PROPERTIES - IMPORTED_LOCATION "${KML_RUNTIME_LIBRARY}") + set_target_properties(KML::Runtime PROPERTIES IMPORTED_LOCATION + "${KML_RUNTIME_LIBRARY}") endif() if(KML_BLAS_FOUND AND NOT TARGET KML::BLAS) add_library(KML::BLAS UNKNOWN IMPORTED) - set_target_properties(KML::BLAS PROPERTIES - IMPORTED_LOCATION "${KML_BLAS_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}") + set_target_properties( + KML::BLAS PROPERTIES IMPORTED_LOCATION "${KML_BLAS_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}") if(TARGET KML::Runtime) - set_property(TARGET KML::BLAS APPEND PROPERTY - INTERFACE_LINK_LIBRARIES KML::Runtime) + set_property( + TARGET KML::BLAS + APPEND + PROPERTY INTERFACE_LINK_LIBRARIES KML::Runtime) endif() endif() if(KML_LAPACK_FOUND AND NOT TARGET KML::LAPACK) add_library(KML::LAPACK UNKNOWN IMPORTED) - set_target_properties(KML::LAPACK PROPERTIES - IMPORTED_LOCATION "${KML_LAPACK_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES KML::BLAS) + set_target_properties( + KML::LAPACK + PROPERTIES IMPORTED_LOCATION "${KML_LAPACK_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES KML::BLAS) endif() if(KML_ScaLAPACK_FOUND AND NOT TARGET KML::ScaLAPACK) add_library(KML::ScaLAPACK UNKNOWN IMPORTED) - set_target_properties(KML::ScaLAPACK PROPERTIES - IMPORTED_LOCATION "${KML_SCALAPACK_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES KML::LAPACK) + set_target_properties( + KML::ScaLAPACK + PROPERTIES IMPORTED_LOCATION "${KML_SCALAPACK_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES KML::LAPACK) endif() if(KML_FFTW3_FOUND AND NOT TARGET KML::FFTW3) add_library(KML::FFTW3 UNKNOWN IMPORTED) - set_target_properties(KML::FFTW3 PROPERTIES - IMPORTED_LOCATION "${KML_FFTW3_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${KML_KFFT_LIBRARY}") + set_target_properties( + KML::FFTW3 + PROPERTIES IMPORTED_LOCATION "${KML_FFTW3_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${KML_KFFT_LIBRARY}") endif() if(KML_FFTW3_FLOAT_FOUND AND NOT TARGET KML::FFTW3_FLOAT) add_library(KML::FFTW3_FLOAT UNKNOWN IMPORTED) - set_target_properties(KML::FFTW3_FLOAT PROPERTIES - IMPORTED_LOCATION "${KML_FFTW3_FLOAT_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${KML_KFFTF_LIBRARY}") + set_target_properties( + KML::FFTW3_FLOAT + PROPERTIES IMPORTED_LOCATION "${KML_FFTW3_FLOAT_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${KML_KFFTF_LIBRARY}") endif() if(TARGET KML::LAPACK) @@ -270,13 +298,12 @@ 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) + 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) + set_property(TARGET LAPACK::LAPACK PROPERTY INTERFACE_LINK_LIBRARIES + KML::LAPACK) endif() mark_as_advanced( diff --git a/cmake/modules/FindLapack.cmake b/cmake/modules/FindLapack.cmake index 1e4d0fc9a61..c20efa48e43 100644 --- a/cmake/modules/FindLapack.cmake +++ b/cmake/modules/FindLapack.cmake @@ -20,8 +20,8 @@ find_package(LAPACK REQUIRED) set(CMAKE_MODULE_PATH "${_abacus_lapack_saved_module_path}") if(NOT TARGET LAPACK::LAPACK) - add_library(LAPACK::LAPACK UNKNOWN IMPORTED) - set_target_properties(LAPACK::LAPACK PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${LAPACK_LIBRARIES}") + add_library(LAPACK::LAPACK UNKNOWN IMPORTED) + set_target_properties( + LAPACK::LAPACK PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${LAPACK_LIBRARIES}") endif() diff --git a/cmake/modules/FindLibComm.cmake b/cmake/modules/FindLibComm.cmake index 64b34333998..334b8dbd742 100644 --- a/cmake/modules/FindLibComm.cmake +++ b/cmake/modules/FindLibComm.cmake @@ -5,21 +5,19 @@ # LIBCOMM_FOUND - True if LibComm is found. # LIBCOMM_DIR - Where to find LibComm files. -find_path(LIBCOMM_DIR - include/Comm/Comm_Tools.h - HINTS ${LIBCOMM_DIR} - HINTS ${LibComm_DIR} - HINTS ${libcomm_DIR} -) +find_path( + LIBCOMM_DIR include/Comm/Comm_Tools.h + HINTS ${LIBCOMM_DIR} + HINTS ${LibComm_DIR} + HINTS ${libcomm_DIR}) if(NOT LIBCOMM_DIR) - include(FetchContent) - FetchContent_Declare( - LibComm - URL https://codeload.github.com/abacusmodeling/LibComm/tar.gz/965bf90 - ) - FetchContent_Populate(LibComm) - set(LIBCOMM_DIR ${libcomm_SOURCE_DIR}) + include(FetchContent) + FetchContent_Declare( + LibComm + URL https://codeload.github.com/abacusmodeling/LibComm/tar.gz/965bf90) + FetchContent_Populate(LibComm) + set(LIBCOMM_DIR ${libcomm_SOURCE_DIR}) endif() # Handle the QUIET and REQUIRED arguments and # set LIBCOMM_FOUND to TRUE if all variables are non-zero. diff --git a/cmake/modules/FindLibRI.cmake b/cmake/modules/FindLibRI.cmake index fa7e8833f41..32d60116259 100644 --- a/cmake/modules/FindLibRI.cmake +++ b/cmake/modules/FindLibRI.cmake @@ -5,21 +5,18 @@ # LIBRI_FOUND - True if LibRI is found. # LIBRI_DIR - Where to find LibRI files. -find_path(LIBRI_DIR - include/RI/version.h - HINTS ${LIBRI_DIR} - HINTS ${LibRI_DIR} - HINTS ${libri_DIR} -) +find_path( + LIBRI_DIR include/RI/version.h + HINTS ${LIBRI_DIR} + HINTS ${LibRI_DIR} + HINTS ${libri_DIR}) if(NOT LIBRI_DIR) - include(FetchContent) - FetchContent_Declare( - LibRI - URL https://codeload.github.com/abacusmodeling/LibRI/tar.gz/b0eff7a - ) - FetchContent_Populate(LibRI) - set(LIBRI_DIR ${libri_SOURCE_DIR}) + include(FetchContent) + FetchContent_Declare( + LibRI URL https://codeload.github.com/abacusmodeling/LibRI/tar.gz/b0eff7a) + FetchContent_Populate(LibRI) + set(LIBRI_DIR ${libri_SOURCE_DIR}) endif() # Handle the QUIET and REQUIRED arguments and # set LIBRI_FOUND to TRUE if all variables are non-zero. diff --git a/cmake/modules/FindMKL.cmake b/cmake/modules/FindMKL.cmake index 8d324666bc1..7026fc30870 100644 --- a/cmake/modules/FindMKL.cmake +++ b/cmake/modules/FindMKL.cmake @@ -22,9 +22,10 @@ if(TARGET abacus::mkl) set(MKL_LIBRARIES abacus::mkl) if(ENABLE_MPI) if(NOT TARGET abacus::mkl_scalapack) - message(FATAL_ERROR - "The existing ABACUS MKL configuration lacks abacus::mkl_scalapack " - "for an MPI build.") + message( + FATAL_ERROR + "The existing ABACUS MKL configuration lacks abacus::mkl_scalapack " + "for an MPI build.") endif() set(MKL_LIBRARIES abacus::mkl_scalapack) endif() @@ -51,7 +52,9 @@ set(_mkl_root_hints "${MKLROOT}" "${MKL_ROOT}" "$ENV{MKLROOT}") list(REMOVE_ITEM _mkl_root_hints "") list(REMOVE_DUPLICATES _mkl_root_hints) -set(MKL_LINK AUTO CACHE STRING "oneMKL link mode: AUTO, static, or dynamic") +set(MKL_LINK + AUTO + CACHE STRING "oneMKL link mode: AUTO, static, or dynamic") set_property(CACHE MKL_LINK PROPERTY STRINGS AUTO static dynamic) string(TOLOWER "${MKL_LINK}" _mkl_link) if(NOT _mkl_link MATCHES "^(auto|static|dynamic)$") @@ -70,15 +73,19 @@ if(ENABLE_OPENMP) endif() if(ENABLE_MPI) - set(MKL_MPI AUTO CACHE STRING "oneMKL MPI interface: AUTO, openmpi, intelmpi, or mpich") + set(MKL_MPI + AUTO + CACHE STRING "oneMKL MPI interface: AUTO, openmpi, intelmpi, or mpich") set_property(CACHE MKL_MPI PROPERTY STRINGS AUTO openmpi intelmpi mpich) string(TOLOWER "${MKL_MPI}" _mkl_mpi) if(_mkl_mpi STREQUAL "auto") if(CMAKE_CROSSCOMPILING) message( - FATAL_ERROR "CMake cannot auto-determine MKL-BLACS interface correctly with cross compiling. " - "Please manually pass -DMKL_MPI= flag to CMake.") + FATAL_ERROR + "CMake cannot auto-determine MKL-BLACS interface correctly with cross compiling. " + "Please manually pass -DMKL_MPI= flag to CMake." + ) endif() if("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "Open MPI") set(_mkl_mpi openmpi) @@ -96,30 +103,34 @@ if(ENABLE_MPI) endif() # These are result variables of this finder, not user configuration inputs. -foreach(_mkl_result_var IN ITEMS - MKL_INCLUDE - MKL_FFTW_INCLUDE - MKL_INTERFACE_LIB - MKL_THREAD - MKL_CORE - MKL_SCALAPACK - MKL_BLACS) +foreach( + _mkl_result_var IN + ITEMS MKL_INCLUDE + MKL_FFTW_INCLUDE + MKL_INTERFACE_LIB + MKL_THREAD + MKL_CORE + MKL_SCALAPACK + MKL_BLACS) if(DEFINED CACHE{${_mkl_result_var}}) - message(WARNING - "${_mkl_result_var} is an internal result of FindMKL.cmake and will be ignored.") + message( + WARNING + "${_mkl_result_var} is an internal result of FindMKL.cmake and will be ignored." + ) unset(${_mkl_result_var} CACHE) endif() unset(${_mkl_result_var}) endforeach() -foreach(_mkl_internal_var IN ITEMS - _abacus_mkl_include - _abacus_mkl_fftw_include - _abacus_mkl_interface_lib - _abacus_mkl_thread - _abacus_mkl_core - _abacus_mkl_scalapack - _abacus_mkl_blacs) +foreach( + _mkl_internal_var IN + ITEMS _abacus_mkl_include + _abacus_mkl_fftw_include + _abacus_mkl_interface_lib + _abacus_mkl_thread + _abacus_mkl_core + _abacus_mkl_scalapack + _abacus_mkl_blacs) unset(${_mkl_internal_var}) unset(${_mkl_internal_var} CACHE) endforeach() @@ -131,44 +142,51 @@ elseif(_mkl_link STREQUAL "dynamic") set(CMAKE_FIND_LIBRARY_SUFFIXES ".so") endif() -find_path(_abacus_mkl_include +find_path( + _abacus_mkl_include NAMES mkl.h PATHS ${_mkl_root_hints} PATH_SUFFIXES include NO_DEFAULT_PATH) -find_path(_abacus_mkl_fftw_include +find_path( + _abacus_mkl_fftw_include NAMES fftw3.h PATHS ${_mkl_root_hints} PATH_SUFFIXES include/fftw NO_DEFAULT_PATH) -find_library(_abacus_mkl_interface_lib +find_library( + _abacus_mkl_interface_lib NAMES ${_mkl_interface_name} PATHS ${_mkl_root_hints} PATH_SUFFIXES lib/intel64 lib NO_DEFAULT_PATH) -find_library(_abacus_mkl_thread +find_library( + _abacus_mkl_thread NAMES mkl_${_mkl_threading} PATHS ${_mkl_root_hints} PATH_SUFFIXES lib/intel64 lib NO_DEFAULT_PATH) -find_library(_abacus_mkl_core +find_library( + _abacus_mkl_core NAMES mkl_core PATHS ${_mkl_root_hints} PATH_SUFFIXES lib/intel64 lib NO_DEFAULT_PATH) if(ENABLE_MPI) - find_library(_abacus_mkl_scalapack + find_library( + _abacus_mkl_scalapack NAMES mkl_scalapack_lp64 PATHS ${_mkl_root_hints} PATH_SUFFIXES lib/intel64 lib NO_DEFAULT_PATH) - find_library(_abacus_mkl_blacs + find_library( + _abacus_mkl_blacs NAMES ${_mkl_blacs_name} PATHS ${_mkl_root_hints} PATH_SUFFIXES lib/intel64 lib @@ -188,7 +206,8 @@ if(ENABLE_MPI) set(MKL_BLACS "${_abacus_mkl_blacs}") endif() -set(_mkl_required_vars MKL_INCLUDE MKL_FFTW_INCLUDE MKL_INTERFACE_LIB MKL_THREAD MKL_CORE) +set(_mkl_required_vars MKL_INCLUDE MKL_FFTW_INCLUDE MKL_INTERFACE_LIB + MKL_THREAD MKL_CORE) if(ENABLE_MPI) list(APPEND _mkl_required_vars MKL_SCALAPACK MKL_BLACS) endif() @@ -215,9 +234,11 @@ if(MKL_FOUND) "Choose a consistent MKL_LINK mode or library set.") endif() if(_mkl_link STREQUAL "static" AND NOT _mkl_all_static) - message(FATAL_ERROR "MKL_LINK=static did not select static oneMKL libraries.") + message( + FATAL_ERROR "MKL_LINK=static did not select static oneMKL libraries.") elseif(_mkl_link STREQUAL "dynamic" AND _mkl_all_static) - message(FATAL_ERROR "MKL_LINK=dynamic did not select shared oneMKL libraries.") + message( + FATAL_ERROR "MKL_LINK=dynamic did not select shared oneMKL libraries.") endif() # oneMKL requires pthread even with mkl_sequential @@ -232,9 +253,13 @@ if(MKL_FOUND) function(_mkl_link_group output) if(_mkl_all_static AND CMAKE_SYSTEM_NAME STREQUAL "Linux") list(JOIN ARGN "," _mkl_archives) - set(${output} "-Wl,--start-group,${_mkl_archives},--end-group" PARENT_SCOPE) + set(${output} + "-Wl,--start-group,${_mkl_archives},--end-group" + PARENT_SCOPE) else() - set(${output} "${ARGN}" PARENT_SCOPE) + set(${output} + "${ARGN}" + PARENT_SCOPE) endif() endfunction() @@ -243,29 +268,25 @@ if(MKL_FOUND) add_library(abacus_mkl INTERFACE) add_library(abacus::mkl ALIAS abacus_mkl) - target_include_directories( - abacus_mkl - INTERFACE - "${MKL_INCLUDE}" - "${MKL_FFTW_INCLUDE}") + target_include_directories(abacus_mkl INTERFACE "${MKL_INCLUDE}" + "${MKL_FFTW_INCLUDE}") target_link_libraries(abacus_mkl INTERFACE ${_mkl_base} ${_mkl_runtime}) if(ENABLE_MPI) add_library(abacus_mkl_scalapack INTERFACE) add_library(abacus::mkl_scalapack ALIAS abacus_mkl_scalapack) - target_include_directories( - abacus_mkl_scalapack - INTERFACE - "${MKL_INCLUDE}" - "${MKL_FFTW_INCLUDE}") + target_include_directories(abacus_mkl_scalapack + INTERFACE "${MKL_INCLUDE}" "${MKL_FFTW_INCLUDE}") if(_mkl_all_static AND CMAKE_SYSTEM_NAME STREQUAL "Linux") - _mkl_link_group(_mkl_cluster ${MKL_SCALAPACK} ${MKL_BLACS} ${_mkl_base_archives}) + _mkl_link_group(_mkl_cluster ${MKL_SCALAPACK} ${MKL_BLACS} + ${_mkl_base_archives}) target_link_libraries( - abacus_mkl_scalapack INTERFACE ${_mkl_cluster} MPI::MPI_CXX ${_mkl_runtime}) + abacus_mkl_scalapack INTERFACE ${_mkl_cluster} MPI::MPI_CXX + ${_mkl_runtime}) else() target_link_libraries( - abacus_mkl_scalapack INTERFACE - ${MKL_SCALAPACK} ${MKL_BLACS} abacus::mkl MPI::MPI_CXX) + abacus_mkl_scalapack INTERFACE ${MKL_SCALAPACK} ${MKL_BLACS} + abacus::mkl MPI::MPI_CXX) endif() set(MKL_LIBRARIES abacus::mkl_scalapack) else() @@ -277,13 +298,13 @@ endif() if(TARGET abacus::mkl) if(NOT TARGET BLAS::BLAS) add_library(BLAS::BLAS INTERFACE IMPORTED) - set_property(TARGET BLAS::BLAS PROPERTY - INTERFACE_LINK_LIBRARIES abacus::mkl) + set_property(TARGET BLAS::BLAS PROPERTY INTERFACE_LINK_LIBRARIES + abacus::mkl) endif() if(NOT TARGET LAPACK::LAPACK) add_library(LAPACK::LAPACK INTERFACE IMPORTED) - set_property(TARGET LAPACK::LAPACK PROPERTY - INTERFACE_LINK_LIBRARIES abacus::mkl) + set_property(TARGET LAPACK::LAPACK PROPERTY INTERFACE_LINK_LIBRARIES + abacus::mkl) endif() endif() diff --git a/cmake/modules/FindNEP.cmake b/cmake/modules/FindNEP.cmake index e20734f5c03..c37dd5e3559 100644 --- a/cmake/modules/FindNEP.cmake +++ b/cmake/modules/FindNEP.cmake @@ -19,31 +19,29 @@ # Note: Currently only CPU version is supported, Since the NEP interface with GPU support is not available yet. # In feature, if available, we can use USE_CUDA to switch between CPU and GPU version. -find_path(NEP_INCLUDE_DIR nep.h - HINTS ${NEP_DIR} - PATH_SUFFIXES "include" - ) +find_path( + NEP_INCLUDE_DIR nep.h + HINTS ${NEP_DIR} + PATH_SUFFIXES "include") -find_library(NEP_LIBRARY - NAMES nep - HINTS ${NEP_DIR} - PATH_SUFFIXES "lib" - ) +find_library( + NEP_LIBRARY + NAMES nep + HINTS ${NEP_DIR} + PATH_SUFFIXES "lib") include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(NEP - DEFAULT_MSG - NEP_LIBRARY NEP_INCLUDE_DIR) +find_package_handle_standard_args(NEP DEFAULT_MSG NEP_LIBRARY NEP_INCLUDE_DIR) if(NEP_FOUND) - if(NOT TARGET NEP::nep) - add_library(NEP::nep UNKNOWN IMPORTED) - set_target_properties(NEP::nep PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${NEP_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${NEP_INCLUDE_DIR}" - ) - endif() + if(NOT TARGET NEP::nep) + add_library(NEP::nep UNKNOWN IMPORTED) + set_target_properties( + NEP::nep + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${NEP_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${NEP_INCLUDE_DIR}") + endif() endif() -mark_as_advanced(NEP_INCLUDE_DIR NEP_LIBRARY) \ No newline at end of file +mark_as_advanced(NEP_INCLUDE_DIR NEP_LIBRARY) diff --git a/cmake/modules/FindPLUMED.cmake b/cmake/modules/FindPLUMED.cmake index d32760e7a3f..b905f8d0a4c 100644 --- a/cmake/modules/FindPLUMED.cmake +++ b/cmake/modules/FindPLUMED.cmake @@ -23,29 +23,29 @@ if(PLUMED_PKG_FOUND) set(PLUMED_VERSION ${PLUMED_PKG_VERSION}) else() # Fallback: manual discovery, e.g. -DPLUMED_ROOT=/path/to/prefix - find_path(PLUMED_INCLUDE_DIRS - plumed/wrapper/Plumed.h + find_path( + PLUMED_INCLUDE_DIRS plumed/wrapper/Plumed.h HINTS ${PLUMED_ROOT} - PATH_SUFFIXES "include" - ) - find_library(PLUMED_LIBRARIES + PATH_SUFFIXES "include") + find_library( + PLUMED_LIBRARIES NAMES plumed HINTS ${PLUMED_ROOT} - PATH_SUFFIXES "lib" - ) + PATH_SUFFIXES "lib") endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(PLUMED +find_package_handle_standard_args( + PLUMED REQUIRED_VARS PLUMED_LIBRARIES PLUMED_INCLUDE_DIRS VERSION_VAR PLUMED_VERSION) if(PLUMED_FOUND AND NOT TARGET PLUMED::plumed) add_library(PLUMED::plumed UNKNOWN IMPORTED) - set_target_properties(PLUMED::plumed PROPERTIES - IMPORTED_LOCATION "${PLUMED_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${PLUMED_INCLUDE_DIRS}" - ) + set_target_properties( + PLUMED::plumed + PROPERTIES IMPORTED_LOCATION "${PLUMED_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${PLUMED_INCLUDE_DIRS}") endif() mark_as_advanced(PLUMED_INCLUDE_DIRS PLUMED_LIBRARIES) diff --git a/cmake/modules/FindScaLAPACK.cmake b/cmake/modules/FindScaLAPACK.cmake index febecd2de41..55db7507ebc 100644 --- a/cmake/modules/FindScaLAPACK.cmake +++ b/cmake/modules/FindScaLAPACK.cmake @@ -6,42 +6,31 @@ # # Accept common root hints from cache vars and environment. -set(_scalapack_hints - ${SCALAPACK_DIR} - ${SCALAPACK_ROOT} - $ENV{SCALAPACK_DIR} - $ENV{SCALAPACK_ROOT} -) +set(_scalapack_hints ${SCALAPACK_DIR} ${SCALAPACK_ROOT} $ENV{SCALAPACK_DIR} + $ENV{SCALAPACK_ROOT}) -find_library(ScaLAPACK_LIBRARY - NAMES - scalapack - scalapack-openmpi - scalapack-mpi - scalapack-mpich - HINTS ${_scalapack_hints} - PATH_SUFFIXES lib lib64 -) +find_library( + ScaLAPACK_LIBRARY + NAMES scalapack scalapack-openmpi scalapack-mpi scalapack-mpich + HINTS ${_scalapack_hints} + PATH_SUFFIXES lib lib64) unset(_scalapack_hints) # Handle the QUIET and REQUIRED arguments and # set ScaLAPACK_FOUND to TRUE if all variables are non-zero. include(FindPackageHandleStandardArgs) -find_package_handle_standard_args( - ScaLAPACK - REQUIRED_VARS ScaLAPACK_LIBRARY -) +find_package_handle_standard_args(ScaLAPACK REQUIRED_VARS ScaLAPACK_LIBRARY) # Copy the results to the output variables and target. if(ScaLAPACK_FOUND) - set(ScaLAPACK_LIBRARIES ${ScaLAPACK_LIBRARY}) + set(ScaLAPACK_LIBRARIES ${ScaLAPACK_LIBRARY}) - if(NOT TARGET ScaLAPACK::ScaLAPACK) - add_library(ScaLAPACK::ScaLAPACK UNKNOWN IMPORTED) - set_target_properties(ScaLAPACK::ScaLAPACK PROPERTIES - IMPORTED_LOCATION "${ScaLAPACK_LIBRARY}") - endif() + if(NOT TARGET ScaLAPACK::ScaLAPACK) + add_library(ScaLAPACK::ScaLAPACK UNKNOWN IMPORTED) + set_target_properties(ScaLAPACK::ScaLAPACK + PROPERTIES IMPORTED_LOCATION "${ScaLAPACK_LIBRARY}") + endif() endif() mark_as_advanced(ScaLAPACK_LIBRARY) diff --git a/cmake/modules/FindTensorFlow.cmake b/cmake/modules/FindTensorFlow.cmake index a391111bc4d..f29a96c3947 100644 --- a/cmake/modules/FindTensorFlow.cmake +++ b/cmake/modules/FindTensorFlow.cmake @@ -5,12 +5,11 @@ # TensorFlow_FOUND - True if lib is found. # TensorFlow_LIBRARIES - List of libraries - -find_library(tensorflow_cc - NAMES tensorflow_cc libtensorflow_cc.so.2 - HINTS ${TensorFlow_DIR} - PATH_SUFFIXES "lib" - ) +find_library( + tensorflow_cc + NAMES tensorflow_cc libtensorflow_cc.so.2 + HINTS ${TensorFlow_DIR} + PATH_SUFFIXES "lib") # Handle the QUIET and REQUIRED arguments and # set TensorFlow_FOUND to TRUE if all variables are non-zero. @@ -18,12 +17,12 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(TensorFlow DEFAULT_MSG tensorflow_cc) if(TensorFlow_FOUND) - if(NOT TARGET TensorFlow::tensorflow_cc) - add_library(TensorFlow::tensorflow_cc UNKNOWN IMPORTED) - set_target_properties(TensorFlow::tensorflow_cc PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${tensorflow_cc}") - endif() + if(NOT TARGET TensorFlow::tensorflow_cc) + add_library(TensorFlow::tensorflow_cc UNKNOWN IMPORTED) + set_target_properties( + TensorFlow::tensorflow_cc PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${tensorflow_cc}") + endif() endif() mark_as_advanced(tensorflow_cc) diff --git a/cmake/modules/SetupCuBlasMp.cmake b/cmake/modules/SetupCuBlasMp.cmake index 2ba8fe1877e..2e3a565fb35 100644 --- a/cmake/modules/SetupCuBlasMp.cmake +++ b/cmake/modules/SetupCuBlasMp.cmake @@ -7,19 +7,23 @@ include_guard(GLOBAL) function(abacus_setup_cublasmp) # 1. Search for cuBLASMp library and header files # libcublasmp.so - find_library(CUBLASMP_LIBRARY NAMES cublasmp - HINTS ${CUBLASMP_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES lib lib64 math_libs/lib math_libs/lib64) + find_library( + CUBLASMP_LIBRARY + NAMES cublasmp + HINTS ${CUBLASMP_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES lib lib64 math_libs/lib math_libs/lib64) # cublasmp.h - find_path(CUBLASMP_INCLUDE_DIR NAMES cublasmp.h - HINTS ${CUBLASMP_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES include math_libs/include) + find_path( + CUBLASMP_INCLUDE_DIR + NAMES cublasmp.h + HINTS ${CUBLASMP_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES include math_libs/include) if(NOT CUBLASMP_LIBRARY OR NOT CUBLASMP_INCLUDE_DIR) - message(FATAL_ERROR - "cuBLASMp not found. Please ensure CUBLASMP_PATH is set correctly." - ) + message( + FATAL_ERROR + "cuBLASMp not found. Please ensure CUBLASMP_PATH is set correctly.") endif() message(STATUS "Found cuBLASMp: ${CUBLASMP_LIBRARY}") @@ -27,7 +31,7 @@ function(abacus_setup_cublasmp) # 2. Version validation by parsing header macros set(CUBLASMP_VERSION_STR "") set(CUBLASMP_VERSION_HEADER "${CUBLASMP_INCLUDE_DIR}/cublasmp.h") - + if(EXISTS "${CUBLASMP_VERSION_HEADER}") # Extract version lines using regular expressions from cublasmp.h file(STRINGS "${CUBLASMP_VERSION_HEADER}" CUBLASMP_MAJOR_LINE @@ -36,12 +40,12 @@ function(abacus_setup_cublasmp) REGEX "^#define[ \t]+CUBLASMP_VER_MINOR[ \t]+[0-9]+") file(STRINGS "${CUBLASMP_VERSION_HEADER}" CUBLASMP_PATCH_LINE REGEX "^#define[ \t]+CUBLASMP_VER_PATCH[ \t]+[0-9]+") - + # Extract numeric values from the matched strings string(REGEX MATCH "([0-9]+)" CUBLASMP_VER_MAJOR "${CUBLASMP_MAJOR_LINE}") string(REGEX MATCH "([0-9]+)" CUBLASMP_VER_MINOR "${CUBLASMP_MINOR_LINE}") string(REGEX MATCH "([0-9]+)" CUBLASMP_VER_PATCH "${CUBLASMP_PATCH_LINE}") - + if(NOT CUBLASMP_VER_MAJOR STREQUAL "" AND NOT CUBLASMP_VER_MINOR STREQUAL "" AND NOT CUBLASMP_VER_PATCH STREQUAL "") @@ -54,10 +58,10 @@ function(abacus_setup_cublasmp) # 3. Version constraint: ABACUS requires cuBLASMp >= 0.8.0 if(CUBLASMP_VERSION_STR AND CUBLASMP_VERSION_STR VERSION_LESS "0.8.0") - message(FATAL_ERROR - "cuBLASMp version ${CUBLASMP_VERSION_STR} is too old. " - "ABACUS requires cuBLASMp >= 0.8.0 for NCCL Symmetric Memory support." - ) + message( + FATAL_ERROR + "cuBLASMp version ${CUBLASMP_VERSION_STR} is too old. " + "ABACUS requires cuBLASMp >= 0.8.0 for NCCL Symmetric Memory support.") elseif(NOT CUBLASMP_VERSION_STR) message(WARNING "Could not detect cuBLASMp version. Proceeding cautiously.") endif() @@ -65,9 +69,10 @@ function(abacus_setup_cublasmp) # 4. Create cublasMp::cublasMp imported target if(NOT TARGET cublasMp::cublasMp) add_library(cublasMp::cublasMp IMPORTED INTERFACE) - set_target_properties(cublasMp::cublasMp PROPERTIES - INTERFACE_LINK_LIBRARIES "${CUBLASMP_LIBRARY};NCCL::NCCL" - INTERFACE_INCLUDE_DIRECTORIES "${CUBLASMP_INCLUDE_DIR}") + set_target_properties( + cublasMp::cublasMp + PROPERTIES INTERFACE_LINK_LIBRARIES "${CUBLASMP_LIBRARY};NCCL::NCCL" + INTERFACE_INCLUDE_DIRECTORIES "${CUBLASMP_INCLUDE_DIR}") endif() endfunction() diff --git a/cmake/modules/SetupCuSolverMp.cmake b/cmake/modules/SetupCuSolverMp.cmake index 0adb44fa9ea..f0214454a94 100644 --- a/cmake/modules/SetupCuSolverMp.cmake +++ b/cmake/modules/SetupCuSolverMp.cmake @@ -6,17 +6,21 @@ include_guard(GLOBAL) function(abacus_setup_cusolvermp) # Find cuSOLVERMp first, then decide communicator backend. - find_library(CUSOLVERMP_LIBRARY NAMES cusolverMp - HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES lib lib64 math_libs/lib math_libs/lib64) - - find_path(CUSOLVERMP_INCLUDE_DIR NAMES cusolverMp.h - HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES include math_libs/include) + find_library( + CUSOLVERMP_LIBRARY + NAMES cusolverMp + HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES lib lib64 math_libs/lib math_libs/lib64) + + find_path( + CUSOLVERMP_INCLUDE_DIR + NAMES cusolverMp.h + HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES include math_libs/include) if(NOT CUSOLVERMP_LIBRARY OR NOT CUSOLVERMP_INCLUDE_DIR) - message(FATAL_ERROR - "cuSOLVERMp not found. Set CUSOLVERMP_PATH or NVHPC_ROOT_DIR." + message( + FATAL_ERROR "cuSOLVERMp not found. Set CUSOLVERMP_PATH or NVHPC_ROOT_DIR." ) endif() @@ -31,31 +35,35 @@ function(abacus_setup_cusolvermp) REGEX "^#define[ \t]+CUSOLVERMP_VER_MINOR[ \t]+[0-9]+") file(STRINGS "${CUSOLVERMP_VERSION_HEADER}" CUSOLVERMP_PATCH_LINE REGEX "^#define[ \t]+CUSOLVERMP_VER_PATCH[ \t]+[0-9]+") - string(REGEX MATCH "([0-9]+)" CUSOLVERMP_VER_MAJOR "${CUSOLVERMP_MAJOR_LINE}") - string(REGEX MATCH "([0-9]+)" CUSOLVERMP_VER_MINOR "${CUSOLVERMP_MINOR_LINE}") - string(REGEX MATCH "([0-9]+)" CUSOLVERMP_VER_PATCH "${CUSOLVERMP_PATCH_LINE}") + string(REGEX MATCH "([0-9]+)" CUSOLVERMP_VER_MAJOR + "${CUSOLVERMP_MAJOR_LINE}") + string(REGEX MATCH "([0-9]+)" CUSOLVERMP_VER_MINOR + "${CUSOLVERMP_MINOR_LINE}") + string(REGEX MATCH "([0-9]+)" CUSOLVERMP_VER_PATCH + "${CUSOLVERMP_PATCH_LINE}") if(NOT CUSOLVERMP_VER_MAJOR STREQUAL "" AND NOT CUSOLVERMP_VER_MINOR STREQUAL "" AND NOT CUSOLVERMP_VER_PATCH STREQUAL "") set(CUSOLVERMP_VERSION_STR - "${CUSOLVERMP_VER_MAJOR}.${CUSOLVERMP_VER_MINOR}.${CUSOLVERMP_VER_PATCH}") + "${CUSOLVERMP_VER_MAJOR}.${CUSOLVERMP_VER_MINOR}.${CUSOLVERMP_VER_PATCH}" + ) endif() endif() # Check minimum version requirement (>= 0.9.0) if(NOT CUSOLVERMP_VERSION_STR) - message(FATAL_ERROR - "Unable to detect the cuSOLVERMp version from ${CUSOLVERMP_VERSION_HEADER}. " - "ABACUS requires cuSOLVERMp >= 0.9.0." - ) + message( + FATAL_ERROR + "Unable to detect the cuSOLVERMp version from ${CUSOLVERMP_VERSION_HEADER}. " + "ABACUS requires cuSOLVERMp >= 0.9.0.") elseif(CUSOLVERMP_VERSION_STR VERSION_LESS "0.9.0") - message(FATAL_ERROR - "cuSOLVERMp version ${CUSOLVERMP_VERSION_STR} is too old. " - "NVIDIA documents an STEDC defect in cuSOLVERMp 0.4.2 through 0.8.0 that affects " - "non-power-of-two block sizes and certain 2D process grids; Syevd and " - "Sygvd use STEDC internally. " - "ABACUS requires cuSOLVERMp >= 0.9.0. Please upgrade cuSOLVERMp." - ) + message( + FATAL_ERROR + "cuSOLVERMp version ${CUSOLVERMP_VERSION_STR} is too old. " + "NVIDIA documents an STEDC defect in cuSOLVERMp 0.4.2 through 0.8.0 that affects " + "non-power-of-two block sizes and certain 2D process grids; Syevd and " + "Sygvd use STEDC internally. " + "ABACUS requires cuSOLVERMp >= 0.9.0. Please upgrade cuSOLVERMp.") endif() # Auto-select communicator backend by cuSOLVERMp version. @@ -63,29 +71,41 @@ function(abacus_setup_cusolvermp) set(_use_cal OFF) if(CUSOLVERMP_VERSION_STR AND CUSOLVERMP_VERSION_STR VERSION_LESS "0.7.0") set(_use_cal ON) - message(STATUS - "Detected cuSOLVERMp ${CUSOLVERMP_VERSION_STR} (< 0.7.0). Using CAL backend.") + message( + STATUS + "Detected cuSOLVERMp ${CUSOLVERMP_VERSION_STR} (< 0.7.0). Using CAL backend." + ) elseif(CUSOLVERMP_VERSION_STR) - message(STATUS - "Detected cuSOLVERMp ${CUSOLVERMP_VERSION_STR} (>= 0.7.0). Using NCCL backend.") + message( + STATUS + "Detected cuSOLVERMp ${CUSOLVERMP_VERSION_STR} (>= 0.7.0). Using NCCL backend." + ) elseif(NOT CUSOLVERMP_VERSION_STR) - message(WARNING - "Unable to detect cuSOLVERMp version from header. Using NCCL backend by default.") + message( + WARNING + "Unable to detect cuSOLVERMp version from header. Using NCCL backend by default." + ) endif() # Raise the variable to the caller's scope - set(_use_cal ${_use_cal} PARENT_SCOPE) + set(_use_cal + ${_use_cal} + PARENT_SCOPE) # Backend selection: # - _use_cal=ON -> cal communicator backend # - _use_cal=OFF -> NCCL communicator backend if(_use_cal) - find_library(CAL_LIBRARY NAMES cal - HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES lib lib64 math_libs/lib64) - find_path(CAL_INCLUDE_DIR NAMES cal.h - HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES include math_libs/include) + find_library( + CAL_LIBRARY + NAMES cal + HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES lib lib64 math_libs/lib64) + find_path( + CAL_INCLUDE_DIR + NAMES cal.h + HINTS ${CAL_CUSOLVERMP_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES include math_libs/include) if(NOT CAL_LIBRARY OR NOT CAL_INCLUDE_DIR) message(FATAL_ERROR "CAL not found. Set CAL_PATH or NVHPC_ROOT_DIR.") @@ -94,19 +114,23 @@ function(abacus_setup_cusolvermp) message(STATUS "Found CAL: ${CAL_LIBRARY}") if(NOT TARGET CAL::CAL) add_library(CAL::CAL IMPORTED INTERFACE) - set_target_properties(CAL::CAL PROPERTIES - INTERFACE_LINK_LIBRARIES "${CAL_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${CAL_INCLUDE_DIR}") + set_target_properties( + CAL::CAL PROPERTIES INTERFACE_LINK_LIBRARIES "${CAL_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${CAL_INCLUDE_DIR}") endif() else() - find_library(NCCL_LIBRARY NAMES nccl - HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES lib lib64 comm_libs/nccl/lib) - find_path(NCCL_INCLUDE_DIR NAMES nccl.h - HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} - PATHS ${CUDA_TOOLKIT_ROOT_DIR} - PATH_SUFFIXES include comm_libs/nccl/include) + find_library( + NCCL_LIBRARY + NAMES nccl + HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES lib lib64 comm_libs/nccl/lib) + find_path( + NCCL_INCLUDE_DIR + NAMES nccl.h + HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} + PATHS ${CUDA_TOOLKIT_ROOT_DIR} + PATH_SUFFIXES include comm_libs/nccl/include) if(NOT NCCL_LIBRARY OR NOT NCCL_INCLUDE_DIR) message(FATAL_ERROR "NCCL not found. Set NCCL_PATH or NVHPC_ROOT_DIR.") @@ -115,18 +139,20 @@ function(abacus_setup_cusolvermp) message(STATUS "Found NCCL: ${NCCL_LIBRARY}") if(NOT TARGET NCCL::NCCL) add_library(NCCL::NCCL IMPORTED INTERFACE) - set_target_properties(NCCL::NCCL PROPERTIES - INTERFACE_LINK_LIBRARIES "${NCCL_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${NCCL_INCLUDE_DIR}") + set_target_properties( + NCCL::NCCL + PROPERTIES INTERFACE_LINK_LIBRARIES "${NCCL_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${NCCL_INCLUDE_DIR}") endif() endif() # Create cusolverMp::cusolverMp imported target if(NOT TARGET cusolverMp::cusolverMp) add_library(cusolverMp::cusolverMp IMPORTED INTERFACE) - set_target_properties(cusolverMp::cusolverMp PROPERTIES - INTERFACE_LINK_LIBRARIES "${CUSOLVERMP_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${CUSOLVERMP_INCLUDE_DIR}") + set_target_properties( + cusolverMp::cusolverMp + PROPERTIES INTERFACE_LINK_LIBRARIES "${CUSOLVERMP_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${CUSOLVERMP_INCLUDE_DIR}") endif() endfunction() diff --git a/cmake/modules/SetupNccl.cmake b/cmake/modules/SetupNccl.cmake index 8eb0327845a..b0c3f847ebb 100644 --- a/cmake/modules/SetupNccl.cmake +++ b/cmake/modules/SetupNccl.cmake @@ -3,13 +3,17 @@ include_guard(GLOBAL) include(CheckIncludeFileCXX) function(abacus_setup_nccl) - find_library(NCCL_LIBRARY NAMES nccl - HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} - PATH_SUFFIXES lib lib64 comm_libs/nccl/lib) - find_path(NCCL_INCLUDE_DIR NAMES nccl.h - HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} - PATHS ${CUDAToolkit_ROOT} - PATH_SUFFIXES include comm_libs/nccl/include) + find_library( + NCCL_LIBRARY + NAMES nccl + HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} + PATH_SUFFIXES lib lib64 comm_libs/nccl/lib) + find_path( + NCCL_INCLUDE_DIR + NAMES nccl.h + HINTS ${NCCL_PATH} ${NVHPC_ROOT_DIR} + PATHS ${CUDAToolkit_ROOT} + PATH_SUFFIXES include comm_libs/nccl/include) check_include_file_cxx("nccl.h" HAVE_NCCL_HEADER) @@ -18,24 +22,26 @@ function(abacus_setup_nccl) endif() if(NOT NCCL_INCLUDE_DIR AND NOT HAVE_NCCL_HEADER) - message(FATAL_ERROR - "NCCL not found. Set NCCL_PATH or NVHPC_ROOT_DIR.") + message(FATAL_ERROR "NCCL not found. Set NCCL_PATH or NVHPC_ROOT_DIR.") endif() if(NCCL_INCLUDE_DIR) message(STATUS "Found NCCL for parallel_device: ${NCCL_LIBRARY}") else() - message(STATUS "Using default compiler/linker search paths for NCCL: ${NCCL_LIBRARY}") + message( + STATUS + "Using default compiler/linker search paths for NCCL: ${NCCL_LIBRARY}") endif() if(NOT TARGET NCCL::NCCL) add_library(NCCL::NCCL IMPORTED INTERFACE) if(NCCL_INCLUDE_DIR) - set_target_properties(NCCL::NCCL PROPERTIES - INTERFACE_LINK_LIBRARIES "${NCCL_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${NCCL_INCLUDE_DIR}") + set_target_properties( + NCCL::NCCL + PROPERTIES INTERFACE_LINK_LIBRARIES "${NCCL_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${NCCL_INCLUDE_DIR}") else() - set_target_properties(NCCL::NCCL PROPERTIES - INTERFACE_LINK_LIBRARIES "${NCCL_LIBRARY}") + set_target_properties(NCCL::NCCL PROPERTIES INTERFACE_LINK_LIBRARIES + "${NCCL_LIBRARY}") endif() endif() diff --git a/python/pyabacus/CMakeLists.txt b/python/pyabacus/CMakeLists.txt index 5c3035ee408..713d0853bd8 100644 --- a/python/pyabacus/CMakeLists.txt +++ b/python/pyabacus/CMakeLists.txt @@ -17,18 +17,17 @@ set(NAO_PATH "${ABACUS_SOURCE_DIR}/source_basis/module_nao") set(HSOLVER_PATH "${ABACUS_SOURCE_DIR}/source_hsolver") set(PSI_PATH "${ABACUS_SOURCE_DIR}/source_psi") set(ENABLE_LCAO ON) -list(APPEND CMAKE_MODULE_PATH - "${PROJECT_SOURCE_DIR}/../../cmake" +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/../../cmake" "${PROJECT_SOURCE_DIR}/../../cmake/modules") # add math_libs if(DEFINED ENV{MKLROOT} AND NOT DEFINED MKLROOT) - set(MKLROOT "$ENV{MKLROOT}") + set(MKLROOT "$ENV{MKLROOT}") endif() if(MKLROOT) set(MKL_INTERFACE lp64) set(ENABLE_MPI ON) - if (ENABLE_MPI) + if(ENABLE_MPI) find_package(MPI REQUIRED) include_directories(${MPI_CXX_INCLUDE_PATH}) #add_compile_definitions(__MPI) @@ -37,15 +36,15 @@ if(MKLROOT) set(ENABLE_OPENMP ON) if(ENABLE_OPENMP) find_package(OpenMP REQUIRED) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") add_link_options(${OpenMP_CXX_LIBRARIES}) endif() find_package(MKL REQUIRED) add_definitions(-D__MKL) include_directories(${MKL_INCLUDE} ${MKL_INCLUDE}/fftw) -# Since libtorch will find its own MKL, the fftw part conflicts with the original one. -# When enable deepks, mkl will be linked within ${TORCH_LIBRARIES}. + # Since libtorch will find its own MKL, the fftw part conflicts with the original one. + # When enable deepks, mkl will be linked within ${TORCH_LIBRARIES}. if(NOT ENABLE_MLALGO) list(APPEND math_libs IntelMKL::MKL) endif() @@ -54,12 +53,12 @@ if(MKLROOT) list(APPEND math_libs -lifcore) endif() else() - find_package(FFTW3 REQUIRED) - add_compile_definitions(__FFTW3) - find_package(LAPACK REQUIRED) - include_directories(${FFTW3_INCLUDE_DIRS}) - message(STATUS "FFTW3_INCLUDE_DIRS: ${FFTW3_INCLUDE_DIRS}") - list(APPEND math_libs FFTW3::FFTW3 LAPACK::LAPACK) + find_package(FFTW3 REQUIRED) + add_compile_definitions(__FFTW3) + find_package(LAPACK REQUIRED) + include_directories(${FFTW3_INCLUDE_DIRS}) + message(STATUS "FFTW3_INCLUDE_DIRS: ${FFTW3_INCLUDE_DIRS}") + list(APPEND math_libs FFTW3::FFTW3 LAPACK::LAPACK) if(ENABLE_LCAO) find_package(ScaLAPACK REQUIRED) @@ -68,11 +67,8 @@ else() endif() # add include directories -include_directories( - ${BASE_PATH} - ${ABACUS_SOURCE_DIR} - ${ABACUS_SOURCE_DIR}/source_base/module_container - ) +include_directories(${BASE_PATH} ${ABACUS_SOURCE_DIR} + ${ABACUS_SOURCE_DIR}/source_base/module_container) # add basic libraries set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -81,7 +77,8 @@ set(BASE_BINARY_DIR "${PROJECT_SOURCE_DIR}/build/base") add_subdirectory(${ABACUS_SOURCE_DIR}/source_base ${BASE_BINARY_DIR}) # add parameter set(PARAMETER_BINARY_DIR "${PROJECT_SOURCE_DIR}/build/parameter") -add_subdirectory(${ABACUS_SOURCE_DIR}/source_io/module_parameter ${PARAMETER_BINARY_DIR}) +add_subdirectory(${ABACUS_SOURCE_DIR}/source_io/module_parameter + ${PARAMETER_BINARY_DIR}) # add orb set(ORB_BINARY_DIR "${PROJECT_SOURCE_DIR}/build/orb") add_subdirectory(${ABACUS_SOURCE_DIR}/source_basis/module_ao ${ORB_BINARY_DIR}) @@ -89,10 +86,11 @@ add_subdirectory(${ABACUS_SOURCE_DIR}/source_basis/module_ao ${ORB_BINARY_DIR}) # set RPATH execute_process( - COMMAND "${PYTHON_EXECUTABLE}" -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" + COMMAND + "${PYTHON_EXECUTABLE}" -c + "from distutils.sysconfig import get_python_lib; print(get_python_lib())" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES - OUTPUT_STRIP_TRAILING_WHITESPACE -) + OUTPUT_STRIP_TRAILING_WHITESPACE) # set package name to pyabacus set(TARGET_PACK pyabacus) @@ -109,7 +107,6 @@ add_subdirectory(${PROJECT_SOURCE_DIR}/src/ModuleESolver) # Conditionally add driver module if(BUILD_PYABACUS_DRIVER) - message(STATUS "Building PyABACUS driver module") - add_subdirectory(${PROJECT_SOURCE_DIR}/src/ModuleDriver) + message(STATUS "Building PyABACUS driver module") + add_subdirectory(${PROJECT_SOURCE_DIR}/src/ModuleDriver) endif() - diff --git a/python/pyabacus/src/ModuleBase/CMakeLists.txt b/python/pyabacus/src/ModuleBase/CMakeLists.txt index 8d1ea32942f..bc685beca28 100644 --- a/python/pyabacus/src/ModuleBase/CMakeLists.txt +++ b/python/pyabacus/src/ModuleBase/CMakeLists.txt @@ -1,29 +1,29 @@ -list(APPEND pymodule_base - ${PROJECT_SOURCE_DIR}/src/ModuleBase/py_base_math.cpp - ${BASE_PATH}/kernels/math_ylm_op.cpp - ${BASE_PATH}/kernels/math_kernel_op.cpp - ${BASE_PATH}/kernels/math_kernel_op_vec.cpp - ${BASE_PATH}/module_device/memory_op.cpp - ${BASE_PATH}/module_device/device.cpp - ${BASE_PATH}/module_device/device_helpers.cpp - ) +list( + APPEND + pymodule_base + ${PROJECT_SOURCE_DIR}/src/ModuleBase/py_base_math.cpp + ${BASE_PATH}/kernels/math_ylm_op.cpp + ${BASE_PATH}/kernels/math_kernel_op.cpp + ${BASE_PATH}/kernels/math_kernel_op_vec.cpp + ${BASE_PATH}/module_device/memory_op.cpp + ${BASE_PATH}/module_device/device.cpp + ${BASE_PATH}/module_device/device_helpers.cpp) pybind11_add_module(_base_pack MODULE ${pymodule_base}) -target_link_libraries(_base_pack - PRIVATE - base - parameter - container - orb - ${math_libs} - ${OpenBLAS_LIBRARIES} - ${LAPACK_LIBRARIES} - ) +target_link_libraries( + _base_pack + PRIVATE base + parameter + container + orb + ${math_libs} + ${OpenBLAS_LIBRARIES} + ${LAPACK_LIBRARIES}) target_link_libraries(_base_pack PRIVATE pybind11::headers) target_compile_definitions(_base_pack PRIVATE VERSION_INFO=${PROJECT_VERSION}) set_target_properties(_base_pack PROPERTIES INSTALL_RPATH "$ORIGIN") -install(TARGETS _base_pack DESTINATION ${TARGET_PACK}/ModuleBase) \ No newline at end of file +install(TARGETS _base_pack DESTINATION ${TARGET_PACK}/ModuleBase) diff --git a/python/pyabacus/src/ModuleDriver/CMakeLists.txt b/python/pyabacus/src/ModuleDriver/CMakeLists.txt index 9eb8f764e0b..3fc108b5e71 100644 --- a/python/pyabacus/src/ModuleDriver/CMakeLists.txt +++ b/python/pyabacus/src/ModuleDriver/CMakeLists.txt @@ -11,11 +11,15 @@ # For now, this module is disabled and the Python-side implementation # uses subprocess to call the abacus executable. -message(STATUS "PyABACUS driver module: C++ bindings require ABACUS to be built as a shared library") -message(STATUS "PyABACUS driver module: Using subprocess-based fallback implementation instead") +message( + STATUS + "PyABACUS driver module: C++ bindings require ABACUS to be built as a shared library" +) +message( + STATUS + "PyABACUS driver module: Using subprocess-based fallback implementation instead" +) message(STATUS "PyABACUS driver module: Skipping C++ driver build") # The driver module is not built - Python fallback is used instead return() - - diff --git a/python/pyabacus/src/ModuleESolver/CMakeLists.txt b/python/pyabacus/src/ModuleESolver/CMakeLists.txt index b0c5ff86c7d..0ba4a85bd42 100644 --- a/python/pyabacus/src/ModuleESolver/CMakeLists.txt +++ b/python/pyabacus/src/ModuleESolver/CMakeLists.txt @@ -13,38 +13,36 @@ set(IO_PATH "${ABACUS_SOURCE_DIR}/source_io") # Python module source files - only the binding code list(APPEND pymodule_esolver - ${PROJECT_SOURCE_DIR}/src/ModuleESolver/py_esolver_lcao.cpp -) + ${PROJECT_SOURCE_DIR}/src/ModuleESolver/py_esolver_lcao.cpp) # Create pybind11 module pybind11_add_module(_esolver_pack MODULE ${pymodule_esolver}) -target_include_directories(_esolver_pack PRIVATE - ${ABACUS_SOURCE_DIR} - ${ESOLVER_PATH} - ${ESTATE_PATH} - ${ESTATE_PATH}/module_charge - ${ESTATE_PATH}/module_dm - ${ESTATE_PATH}/potentials - ${LCAO_PATH} - ${HAMILT_PATH}/module_hcontainer - ${HAMILT_PATH} - ${CELL_PATH} - ${PSI_PATH} - ${BASIS_PATH} - ${BASIS_PATH}/module_ao - ${BASIS_PATH}/module_nao - ${IO_PATH} - ${IO_PATH}/module_parameter -) +target_include_directories( + _esolver_pack + PRIVATE ${ABACUS_SOURCE_DIR} + ${ESOLVER_PATH} + ${ESTATE_PATH} + ${ESTATE_PATH}/module_charge + ${ESTATE_PATH}/module_dm + ${ESTATE_PATH}/potentials + ${LCAO_PATH} + ${HAMILT_PATH}/module_hcontainer + ${HAMILT_PATH} + ${CELL_PATH} + ${PSI_PATH} + ${BASIS_PATH} + ${BASIS_PATH}/module_ao + ${BASIS_PATH}/module_nao + ${IO_PATH} + ${IO_PATH}/module_parameter) # Only link pybind11 headers - the module uses placeholder implementations # that don't require actual ABACUS libraries -target_link_libraries(_esolver_pack PRIVATE - pybind11::headers -) +target_link_libraries(_esolver_pack PRIVATE pybind11::headers) -target_compile_definitions(_esolver_pack PRIVATE VERSION_INFO=${PROJECT_VERSION}) +target_compile_definitions(_esolver_pack + PRIVATE VERSION_INFO=${PROJECT_VERSION}) # Set RPATH for shared libraries set_target_properties(_esolver_pack PROPERTIES INSTALL_RPATH "$ORIGIN") diff --git a/python/pyabacus/src/ModuleNAO/CMakeLists.txt b/python/pyabacus/src/ModuleNAO/CMakeLists.txt index 0366d1c9122..af463a641ed 100644 --- a/python/pyabacus/src/ModuleNAO/CMakeLists.txt +++ b/python/pyabacus/src/ModuleNAO/CMakeLists.txt @@ -1,50 +1,38 @@ # add nao shared library -list(APPEND _naos - ${NAO_PATH}/atomic_radials.cpp - ${NAO_PATH}/beta_radials.cpp - ${NAO_PATH}/hydrogen_radials.cpp - ${NAO_PATH}/numerical_radial.cpp - ${NAO_PATH}/pswfc_radials.cpp - ${NAO_PATH}/radial_collection.cpp - ${NAO_PATH}/radial_set.cpp - ${NAO_PATH}/real_gaunt_table.cpp - ${NAO_PATH}/smoothgen.cpp - ${NAO_PATH}/sphbes_radials.cpp - ${NAO_PATH}/two_center_bundle.cpp - ${NAO_PATH}/two_center_integrator.cpp - ${NAO_PATH}/two_center_table.cpp - # dependency - ${ABACUS_SOURCE_DIR}/source_base/kernels/math_ylm_op.cpp - ${ABACUS_SOURCE_DIR}/source_base/kernels/math_kernel_op.cpp - ${ABACUS_SOURCE_DIR}/source_base/kernels/math_kernel_op_vec.cpp - # ${ABACUS_SOURCE_DIR}/source_psi/kernels/psi_memory_op.cpp - ${ABACUS_SOURCE_DIR}/source_base/module_device/memory_op.cpp - ${ABACUS_SOURCE_DIR}/source_base/module_device/device.cpp - ${ABACUS_SOURCE_DIR}/source_base/module_device/device_helpers.cpp -) -add_library(naopack SHARED - ${_naos} -) +list( + APPEND + _naos + ${NAO_PATH}/atomic_radials.cpp + ${NAO_PATH}/beta_radials.cpp + ${NAO_PATH}/hydrogen_radials.cpp + ${NAO_PATH}/numerical_radial.cpp + ${NAO_PATH}/pswfc_radials.cpp + ${NAO_PATH}/radial_collection.cpp + ${NAO_PATH}/radial_set.cpp + ${NAO_PATH}/real_gaunt_table.cpp + ${NAO_PATH}/smoothgen.cpp + ${NAO_PATH}/sphbes_radials.cpp + ${NAO_PATH}/two_center_bundle.cpp + ${NAO_PATH}/two_center_integrator.cpp + ${NAO_PATH}/two_center_table.cpp + # dependency + ${ABACUS_SOURCE_DIR}/source_base/kernels/math_ylm_op.cpp + ${ABACUS_SOURCE_DIR}/source_base/kernels/math_kernel_op.cpp + ${ABACUS_SOURCE_DIR}/source_base/kernels/math_kernel_op_vec.cpp + # ${ABACUS_SOURCE_DIR}/source_psi/kernels/psi_memory_op.cpp + ${ABACUS_SOURCE_DIR}/source_base/module_device/memory_op.cpp + ${ABACUS_SOURCE_DIR}/source_base/module_device/device.cpp + ${ABACUS_SOURCE_DIR}/source_base/module_device/device_helpers.cpp) +add_library(naopack SHARED ${_naos}) # link math_libs if(MKL_FOUND) - target_link_libraries(naopack - MPI::MPI_CXX - OpenMP::OpenMP_CXX - ) + target_link_libraries(naopack MPI::MPI_CXX OpenMP::OpenMP_CXX) endif() -target_link_libraries(naopack - base - parameter - container - orb - ${math_libs} -) +target_link_libraries(naopack base parameter container orb ${math_libs}) -list(APPEND pymodule_nao - ${PROJECT_SOURCE_DIR}/src/ModuleNAO/py_m_nao.cpp -) +list(APPEND pymodule_nao ${PROJECT_SOURCE_DIR}/src/ModuleNAO/py_m_nao.cpp) pybind11_add_module(_nao_pack MODULE ${pymodule_nao}) target_link_libraries(_nao_pack PRIVATE pybind11::headers naopack) diff --git a/python/pyabacus/src/hsolver/CMakeLists.txt b/python/pyabacus/src/hsolver/CMakeLists.txt index 764305098b0..30de5719888 100644 --- a/python/pyabacus/src/hsolver/CMakeLists.txt +++ b/python/pyabacus/src/hsolver/CMakeLists.txt @@ -1,48 +1,43 @@ # add diago shared library -list(APPEND _diago - ${HSOLVER_PATH}/diago_dav_subspace.cpp - ${HSOLVER_PATH}/diago_david.cpp - ${HSOLVER_PATH}/diago_cg.cpp - ${HSOLVER_PATH}/diag_const_nums.cpp - ${HSOLVER_PATH}/diago_iter_assist.cpp - ${HSOLVER_PATH}/diag_hs_para.cpp - ${HSOLVER_PATH}/diago_pxxxgvx.cpp +list( + APPEND + _diago + ${HSOLVER_PATH}/diago_dav_subspace.cpp + ${HSOLVER_PATH}/diago_david.cpp + ${HSOLVER_PATH}/diago_cg.cpp + ${HSOLVER_PATH}/diag_const_nums.cpp + ${HSOLVER_PATH}/diago_iter_assist.cpp + ${HSOLVER_PATH}/diag_hs_para.cpp + ${HSOLVER_PATH}/diago_pxxxgvx.cpp + ${HSOLVER_PATH}/kernels/hegvd_op.cpp + ${HSOLVER_PATH}/kernels/bpcg_kernel_op.cpp + # dependency + ${BASE_PATH}/kernels/math_kernel_op.cpp + ${BASE_PATH}/kernels/math_kernel_op_vec.cpp + ${BASE_PATH}/kernels/math_ylm_op.cpp + ${BASE_PATH}/module_device/device.cpp + ${BASE_PATH}/module_device/device_helpers.cpp + ${BASE_PATH}/module_device/memory_op.cpp + ${PSI_PATH}/psi.cpp) +add_library(diagopack SHARED ${_diago}) +target_link_libraries( + diagopack + base + parameter + container + orb + ${math_libs} + ${OpenBLAS_LIBRARIES} + ${LAPACK_LIBRARIES}) - - ${HSOLVER_PATH}/kernels/hegvd_op.cpp - ${HSOLVER_PATH}/kernels/bpcg_kernel_op.cpp - # dependency - ${BASE_PATH}/kernels/math_kernel_op.cpp - ${BASE_PATH}/kernels/math_kernel_op_vec.cpp - ${BASE_PATH}/kernels/math_ylm_op.cpp - ${BASE_PATH}/module_device/device.cpp - ${BASE_PATH}/module_device/device_helpers.cpp - ${BASE_PATH}/module_device/memory_op.cpp - - ${PSI_PATH}/psi.cpp - ) -add_library(diagopack SHARED - ${_diago} - ) -target_link_libraries(diagopack - base - parameter - container - orb - ${math_libs} - ${OpenBLAS_LIBRARIES} - ${LAPACK_LIBRARIES} - ) - -list(APPEND pymodule_hsolver - ${PROJECT_SOURCE_DIR}/src/hsolver/py_hsolver.cpp - ) +list(APPEND pymodule_hsolver ${PROJECT_SOURCE_DIR}/src/hsolver/py_hsolver.cpp) pybind11_add_module(_hsolver_pack MODULE ${pymodule_hsolver}) target_link_libraries(_hsolver_pack PRIVATE pybind11::headers diagopack) -target_compile_definitions(_hsolver_pack PRIVATE VERSION_INFO=${PROJECT_VERSION}) +target_compile_definitions(_hsolver_pack + PRIVATE VERSION_INFO=${PROJECT_VERSION}) set_target_properties(diagopack PROPERTIES INSTALL_RPATH "$ORIGIN") set_target_properties(_hsolver_pack PROPERTIES INSTALL_RPATH "$ORIGIN") -install(TARGETS _hsolver_pack diagopack DESTINATION ${TARGET_PACK}/hsolver) \ No newline at end of file +install(TARGETS _hsolver_pack diagopack DESTINATION ${TARGET_PACK}/hsolver) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index f613fbe3e01..d732beb23a5 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -30,52 +30,54 @@ add_library(abacus::compile_requirements ALIAS abacus_compile_requirements) include(CompilerConfiguration) set(_abacus_feature_definitions - __FFTW3 - $<$:__JSON> - $<$:__CUDA_ON_DCU> - $<$:__CUDA_MPI> - $<$:__ABACUS_LIBM> - $<$:_USE_MATH_DEFINES> - $<$:NOMINMAX> - $<$:_CRT_SECURE_NO_WARNINGS> - $<$:__LCAO> - $<$:__ELPA> - $<$:__FFT_TWO_CENTER> - $<$:__PEXSI> - $<$:__DEBUG> - $<$:__MPI> - $<$:__DSP> - $<$:__SW> - $<$:__KML> - $<$>,$>:__MKL> - $<$:__CUDA> - $<$:__UT_USE_CUDA> - $<$:__NCCL_PARALLEL_DEVICE> - $<$:__CUSOLVERMP> - $<$:__CUBLASMP> - $<$:__USE_CAL> - $<$:__ROCM> - $<$:__UT_USE_ROCM> - $<$:__HIP_PLATFORM_HCC__> - $<$:__FLOAT_FFTW> - $<$:__MLALGO> - $<$:__CNPY> - $<$:__EXX> - $<$:EXX_DM=3> - $<$:EXX_H_COMM=2> - $<$:TEST_EXX_LCAO=0> - $<$:TEST_EXX_RADIAL=1> - $<$:__LIBXC> - $<$:__DFTD4> - $<$:GATHER_INFO>) + __FFTW3 + $<$:__JSON> + $<$:__CUDA_ON_DCU> + $<$:__CUDA_MPI> + $<$:__ABACUS_LIBM> + $<$:_USE_MATH_DEFINES> + $<$:NOMINMAX> + $<$:_CRT_SECURE_NO_WARNINGS> + $<$:__LCAO> + $<$:__ELPA> + $<$:__FFT_TWO_CENTER> + $<$:__PEXSI> + $<$:__DEBUG> + $<$:__MPI> + $<$:__DSP> + $<$:__SW> + $<$:__KML> + $<$>,$>:__MKL> + $<$:__CUDA> + $<$:__UT_USE_CUDA> + $<$:__NCCL_PARALLEL_DEVICE> + $<$:__CUSOLVERMP> + $<$:__CUBLASMP> + $<$:__USE_CAL> + $<$:__ROCM> + $<$:__UT_USE_ROCM> + $<$:__HIP_PLATFORM_HCC__> + $<$:__FLOAT_FFTW> + $<$:__MLALGO> + $<$:__CNPY> + $<$:__EXX> + $<$:EXX_DM=3> + $<$:EXX_H_COMM=2> + $<$:TEST_EXX_LCAO=0> + $<$:TEST_EXX_RADIAL=1> + $<$:__LIBXC> + $<$:__DFTD4> + $<$:GATHER_INFO>) if(ABACUS_COMMIT_INFO_INCLUDE_DIR) list(APPEND _abacus_feature_definitions COMMIT_INFO) endif() if(DEFINED DeePMD_DIR) list(APPEND _abacus_feature_definitions __DPMD HIGH_PREC) - if(DEFINED DeePMD_INPUT_NLIST_COMM_ARGS AND DeePMD_INPUT_NLIST_COMM_ARGS GREATER 0) - list(APPEND _abacus_feature_definitions __DPMD_COMM_NLIST_ARGS=${DeePMD_INPUT_NLIST_COMM_ARGS}) + if(DEFINED DeePMD_INPUT_NLIST_COMM_ARGS AND DeePMD_INPUT_NLIST_COMM_ARGS + GREATER 0) + list(APPEND _abacus_feature_definitions + __DPMD_COMM_NLIST_ARGS=${DeePMD_INPUT_NLIST_COMM_ARGS}) endif() if(DeePMD_HAS_NLIST_MAPPING) list(APPEND _abacus_feature_definitions __DPMD_HAS_NLIST_MAPPING) @@ -88,13 +90,14 @@ if(DEFINED NEP_DIR AND NEP_FOUND) list(APPEND _abacus_feature_definitions __NEP) endif() -target_include_directories(abacus_compile_requirements INTERFACE - ${ABACUS_SOURCE_DIR} - ${ABACUS_SOURCE_DIR}/source_base/module_container) +target_include_directories( + abacus_compile_requirements + INTERFACE ${ABACUS_SOURCE_DIR} + ${ABACUS_SOURCE_DIR}/source_base/module_container) if(ABACUS_COMMIT_INFO_INCLUDE_DIR) - target_include_directories(abacus_compile_requirements INTERFACE - ${ABACUS_COMMIT_INFO_INCLUDE_DIR}) + target_include_directories(abacus_compile_requirements + INTERFACE ${ABACUS_COMMIT_INFO_INCLUDE_DIR}) endif() function(abacus_add_target_compile_requirements target) @@ -104,32 +107,34 @@ function(abacus_add_target_compile_requirements target) get_target_property(_include_dirs "${target}" INTERFACE_INCLUDE_DIRECTORIES) if(_include_dirs) - target_include_directories(abacus_compile_requirements INTERFACE - ${_include_dirs}) + target_include_directories(abacus_compile_requirements + INTERFACE ${_include_dirs}) endif() - get_target_property(_system_include_dirs "${target}" INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) + get_target_property(_system_include_dirs "${target}" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) if(_system_include_dirs) - target_include_directories(abacus_compile_requirements SYSTEM INTERFACE - ${_system_include_dirs}) + target_include_directories(abacus_compile_requirements SYSTEM + INTERFACE ${_system_include_dirs}) endif() - get_target_property(_compile_definitions "${target}" INTERFACE_COMPILE_DEFINITIONS) + get_target_property(_compile_definitions "${target}" + INTERFACE_COMPILE_DEFINITIONS) if(_compile_definitions) - target_compile_definitions(abacus_compile_requirements INTERFACE - ${_compile_definitions}) + target_compile_definitions(abacus_compile_requirements + INTERFACE ${_compile_definitions}) endif() get_target_property(_compile_options "${target}" INTERFACE_COMPILE_OPTIONS) if(_compile_options) - target_compile_options(abacus_compile_requirements INTERFACE - ${_compile_options}) + target_compile_options(abacus_compile_requirements + INTERFACE ${_compile_options}) endif() get_target_property(_compile_features "${target}" INTERFACE_COMPILE_FEATURES) if(_compile_features) - target_compile_features(abacus_compile_requirements INTERFACE - ${_compile_features}) + target_compile_features(abacus_compile_requirements + INTERFACE ${_compile_features}) endif() endfunction() @@ -142,9 +147,8 @@ add_library(abacus::feature_libs ALIAS abacus_feature_libs) add_library(abacus_link_libs INTERFACE) add_library(abacus::link_libs ALIAS abacus_link_libs) -target_link_libraries(abacus_link_libs INTERFACE - abacus::feature_libs - abacus::linalg_libs) +target_link_libraries(abacus_link_libs INTERFACE abacus::feature_libs + abacus::linalg_libs) # ------------------------------------------------------------------------------ # Ordered numerical backends and runtime closure @@ -155,14 +159,17 @@ set(_abacus_linalg_include_dirs) if(USE_DSP) if(NOT MT_CPACK_DIR) - message(FATAL_ERROR - "USE_DSP requires MT_CPACK_DIR to be set to the DSP C_PACK install prefix " - "(the directory containing lib/libc_pack.a).") + message( + FATAL_ERROR + "USE_DSP requires MT_CPACK_DIR to be set to the DSP C_PACK install prefix " + "(the directory containing lib/libc_pack.a).") endif() set(_abacus_cpack_library "${MT_CPACK_DIR}/lib/libc_pack.a") if(NOT EXISTS "${_abacus_cpack_library}") - message(FATAL_ERROR - "MT_CPACK_DIR is set to '${MT_CPACK_DIR}' but '${_abacus_cpack_library}' does not exist.") + message( + FATAL_ERROR + "MT_CPACK_DIR is set to '${MT_CPACK_DIR}' but '${_abacus_cpack_library}' does not exist." + ) endif() list(APPEND _abacus_linalg_libs ${_abacus_cpack_library}) endif() @@ -184,10 +191,10 @@ elseif(MKL_FOUND) list(APPEND _abacus_linalg_libs ifcore) endif() elseif(USE_SW) - list(APPEND _abacus_linalg_include_dirs - ${SW_MATH}/include - ${SW_FFT}/include) - list(APPEND _abacus_linalg_libs + list(APPEND _abacus_linalg_include_dirs ${SW_MATH}/include ${SW_FFT}/include) + list( + APPEND + _abacus_linalg_libs ${SW_FFT}/lib/libfftw3.a ${SW_MATH}/libswfft.a ${SW_MATH}/libswscalapack.a @@ -201,10 +208,7 @@ else() if(ENABLE_OPENMP) list(APPEND _abacus_linalg_libs FFTW3::FFTW3_OMP) endif() - list(APPEND _abacus_linalg_libs - FFTW3::FFTW3 - LAPACK::LAPACK - BLAS::BLAS) + list(APPEND _abacus_linalg_libs FFTW3::FFTW3 LAPACK::LAPACK BLAS::BLAS) list(APPEND _abacus_linalg_include_dirs ${FFTW3_INCLUDE_DIRS}) if(ENABLE_FLOAT_FFTW) list(APPEND _abacus_linalg_libs FFTW3::FFTW3_FLOAT) @@ -234,29 +238,30 @@ endif() # the standalone BLAS/LAPACK/ScaLAPACK above so that the linker resolves the # BLAS symbols from the standalone BLAS instead of the bundled copy. if(USE_DSP) - list(APPEND _abacus_linalg_libs - ${MTBLAS_FFT_DIR}/libmtblas/lib/libmtblas.a - ${MTBLAS_FFT_DIR}/libmtblas/lib/libmtblasdev.a - ${MTBLAS_FFT_DIR}/libmtblas/lib/libmtfft.a) + list(APPEND _abacus_linalg_libs ${MTBLAS_FFT_DIR}/libmtblas/lib/libmtblas.a + ${MTBLAS_FFT_DIR}/libmtblas/lib/libmtblasdev.a + ${MTBLAS_FFT_DIR}/libmtblas/lib/libmtfft.a) endif() target_link_libraries(abacus_linalg_libs INTERFACE ${_abacus_linalg_libs}) -target_include_directories(abacus_linalg_libs INTERFACE ${_abacus_linalg_include_dirs}) - -target_include_directories(abacus_compile_requirements INTERFACE - ${_abacus_linalg_include_dirs}) - -foreach(_abacus_linalg_target IN ITEMS - Threads::Threads - MPI::MPI_CXX - OpenMP::OpenMP_CXX - FFTW3::FFTW3 - FFTW3::FFTW3_OMP - FFTW3::FFTW3_FLOAT - KML::LAPACK - KML::ScaLAPACK - KML::FFTW3 - KML::FFTW3_FLOAT) +target_include_directories(abacus_linalg_libs + INTERFACE ${_abacus_linalg_include_dirs}) + +target_include_directories(abacus_compile_requirements + INTERFACE ${_abacus_linalg_include_dirs}) + +foreach( + _abacus_linalg_target IN + ITEMS Threads::Threads + MPI::MPI_CXX + OpenMP::OpenMP_CXX + FFTW3::FFTW3 + FFTW3::FFTW3_OMP + FFTW3::FFTW3_FLOAT + KML::LAPACK + KML::ScaLAPACK + KML::FFTW3 + KML::FFTW3_FLOAT) abacus_add_target_compile_requirements(${_abacus_linalg_target}) endforeach() @@ -269,14 +274,14 @@ endif() # ------------------------------------------------------------------------------ set(_abacus_feature_libs - $<$:nlohmann_json::nlohmann_json> - $<$:ELPA::ELPA> - $<$:PEXSI::PEXSI> - $<$:cnpy> - $<$:ZLIB::ZLIB> - $<$:cereal::cereal> - $<$:Libxc::xc> - $<$:PLUMED::plumed>) + $<$:nlohmann_json::nlohmann_json> + $<$:ELPA::ELPA> + $<$:PEXSI::PEXSI> + $<$:cnpy> + $<$:ZLIB::ZLIB> + $<$:cereal::cereal> + $<$:Libxc::xc> + $<$:PLUMED::plumed>) set(_abacus_feature_include_dirs) set(_abacus_feature_compile_options) @@ -308,9 +313,8 @@ if(ENABLE_CNPY) endif() if(ENABLE_LIBRI) - list(APPEND _abacus_feature_include_dirs - ${LIBRI_DIR}/include - ${LIBCOMM_DIR}/include) + list(APPEND _abacus_feature_include_dirs ${LIBRI_DIR}/include + ${LIBCOMM_DIR}/include) endif() if(DEFINED DeePMD_DIR) @@ -332,13 +336,11 @@ if(DEFINED TensorFlow_DIR AND TensorFlow_FOUND) endif() if(USE_DSP) - list(APPEND _abacus_feature_libs - ${OMPI_LIBRARY1} - ${MT_HOST_DIR}/hthreads/lib/libhthread_device.a - ${MT_HOST_DIR}/hthreads/lib/libhthread_host.a) - list(APPEND _abacus_feature_include_dirs - ${MTBLAS_FFT_DIR}/libmtblas/include - ${MT_HOST_DIR}/include) + list(APPEND _abacus_feature_libs ${OMPI_LIBRARY1} + ${MT_HOST_DIR}/hthreads/lib/libhthread_device.a + ${MT_HOST_DIR}/hthreads/lib/libhthread_host.a) + list(APPEND _abacus_feature_include_dirs ${MTBLAS_FFT_DIR}/libmtblas/include + ${MT_HOST_DIR}/include) endif() if(USE_CUDA) @@ -347,7 +349,8 @@ if(USE_CUDA) else() list(APPEND _abacus_feature_libs cudart nvToolsExt) endif() - list(APPEND _abacus_feature_include_dirs ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) + list(APPEND _abacus_feature_include_dirs + ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 13.0 AND EXISTS "${CUDAToolkit_ROOT}/include/cccl") list(APPEND _abacus_feature_include_dirs "${CUDAToolkit_ROOT}/include/cccl") @@ -369,7 +372,9 @@ if(USE_CUDA) endif() if(USE_ROCM) - list(APPEND _abacus_feature_libs + list( + APPEND + _abacus_feature_libs hip::host hip::device hip::hipfft @@ -384,36 +389,39 @@ endif() target_link_libraries(abacus_feature_libs INTERFACE ${_abacus_feature_libs}) -if(DEFINED DeePMD_DIR AND UNIX AND NOT APPLE) +if(DEFINED DeePMD_DIR + AND UNIX + AND NOT APPLE) target_link_options(abacus_feature_libs INTERFACE "LINKER:--no-as-needed") endif() -target_include_directories(abacus_compile_requirements INTERFACE - ${_abacus_feature_include_dirs}) -target_compile_options(abacus_compile_requirements INTERFACE - ${_abacus_feature_compile_options}) - -foreach(_abacus_feature_target IN ITEMS - nlohmann_json::nlohmann_json - cereal::cereal - ELPA::ELPA - Libxc::xc - dftd4::dftd4 - DeePMD::deepmd_c - DeePMD::deepmd_cc - NEP::nep - TensorFlow::tensorflow_cc - ZLIB::ZLIB - PEXSI::PEXSI - NCCL::NCCL - CAL::CAL - cusolverMp::cusolverMp - cublasMp::cublasMp - hip::host - hip::device - hip::hipfft - roc::hipblas - roc::hipsolver) +target_include_directories(abacus_compile_requirements + INTERFACE ${_abacus_feature_include_dirs}) +target_compile_options(abacus_compile_requirements + INTERFACE ${_abacus_feature_compile_options}) + +foreach( + _abacus_feature_target IN + ITEMS nlohmann_json::nlohmann_json + cereal::cereal + ELPA::ELPA + Libxc::xc + dftd4::dftd4 + DeePMD::deepmd_c + DeePMD::deepmd_cc + NEP::nep + TensorFlow::tensorflow_cc + ZLIB::ZLIB + PEXSI::PEXSI + NCCL::NCCL + CAL::CAL + cusolverMp::cusolverMp + cublasMp::cublasMp + hip::host + hip::device + hip::hipfft + roc::hipblas + roc::hipsolver) abacus_add_target_compile_requirements(${_abacus_feature_target}) endforeach() @@ -430,7 +438,9 @@ function(abacus_normalize_definitions out_var) list(APPEND _defs "${_def}") endif() endforeach() - set(${out_var} ${_defs} PARENT_SCOPE) + set(${out_var} + ${_defs} + PARENT_SCOPE) endfunction() define_property( @@ -438,34 +448,43 @@ define_property( PROPERTY ABACUS_DISABLED_FEATURE_DEFINITIONS INHERITED BRIEF_DOCS "ABACUS feature definitions disabled for targets in this directory" - FULL_DOCS "Feature definitions disabled for targets created in this directory.") + FULL_DOCS + "Feature definitions disabled for targets created in this directory.") define_property( DIRECTORY PROPERTY ABACUS_LOCAL_FEATURE_DEFINITIONS INHERITED - BRIEF_DOCS "Additional ABACUS feature definitions for targets in this directory" - FULL_DOCS "Additional feature definitions for targets created in this directory.") + BRIEF_DOCS + "Additional ABACUS feature definitions for targets in this directory" + FULL_DOCS + "Additional feature definitions for targets created in this directory.") define_property( TARGET PROPERTY ABACUS_KEPT_FEATURE_DEFINITIONS - BRIEF_DOCS "Feature definitions this target keeps despite a directory-level disable" - FULL_DOCS "Feature definitions that must not be stripped from this target even " + BRIEF_DOCS + "Feature definitions this target keeps despite a directory-level disable" + FULL_DOCS + "Feature definitions that must not be stripped from this target even " "when its source directory disables them via " "abacus_disable_feature_definitions(). Used by tests that genuinely need a " "feature (e.g. __MPI) inside a directory that otherwise disables it.") function(abacus_disable_feature_definitions) abacus_normalize_definitions(_defs ${ARGN}) - set_property(DIRECTORY APPEND PROPERTY - ABACUS_DISABLED_FEATURE_DEFINITIONS ${_defs}) + set_property( + DIRECTORY + APPEND + PROPERTY ABACUS_DISABLED_FEATURE_DEFINITIONS ${_defs}) endfunction() function(abacus_add_local_feature_definitions) abacus_normalize_definitions(_defs ${ARGN}) - set_property(DIRECTORY APPEND PROPERTY - ABACUS_LOCAL_FEATURE_DEFINITIONS ${_defs}) + set_property( + DIRECTORY + APPEND + PROPERTY ABACUS_LOCAL_FEATURE_DEFINITIONS ${_defs}) endfunction() function(abacus_apply_build_options target) @@ -485,8 +504,14 @@ function(abacus_apply_build_options target) get_target_property(_source_dir "${target}" SOURCE_DIR) set(_defs "${_abacus_feature_definitions}") - get_property(_disabled DIRECTORY "${_source_dir}" PROPERTY ABACUS_DISABLED_FEATURE_DEFINITIONS) - get_property(_local DIRECTORY "${_source_dir}" PROPERTY ABACUS_LOCAL_FEATURE_DEFINITIONS) + get_property( + _disabled + DIRECTORY "${_source_dir}" + PROPERTY ABACUS_DISABLED_FEATURE_DEFINITIONS) + get_property( + _local + DIRECTORY "${_source_dir}" + PROPERTY ABACUS_LOCAL_FEATURE_DEFINITIONS) get_target_property(_kept "${target}" ABACUS_KEPT_FEATURE_DEFINITIONS) if(_kept) @@ -502,8 +527,8 @@ function(abacus_apply_build_options target) list(APPEND _defs ${_local}) endif() if(_defs) - target_compile_definitions("${target}" PRIVATE - "$") + target_compile_definitions("${target}" + PRIVATE "$") endif() target_link_libraries("${target}" PRIVATE abacus::compile_requirements) @@ -519,12 +544,18 @@ function(abacus_apply_build_options_to_dir dir) return() endif() - get_property(_targets DIRECTORY "${dir}" PROPERTY BUILDSYSTEM_TARGETS) + get_property( + _targets + DIRECTORY "${dir}" + PROPERTY BUILDSYSTEM_TARGETS) foreach(_target IN LISTS _targets) abacus_apply_build_options("${_target}") endforeach() - get_property(_subdirs DIRECTORY "${dir}" PROPERTY SUBDIRECTORIES) + get_property( + _subdirs + DIRECTORY "${dir}" + PROPERTY SUBDIRECTORIES) foreach(_subdir IN LISTS _subdirs) abacus_apply_build_options_to_dir("${_subdir}") endforeach() @@ -538,15 +569,13 @@ set(ABACUS_TEST_DIR "${PROJECT_SOURCE_DIR}/tests") include(${PROJECT_SOURCE_DIR}/cmake/Testing.cmake) add_executable(${ABACUS_BIN_NAME} source_main/main.cpp) -set_target_properties( - ${ABACUS_BIN_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}") +set_target_properties(${ABACUS_BIN_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY + "${PROJECT_BINARY_DIR}") set(ABACUS_BIN_PATH ${PROJECT_BINARY_DIR}/${ABACUS_BIN_NAME}) if(USE_CUDA) - set_property(TARGET ${ABACUS_BIN_NAME} - PROPERTY CUDA_ARCHITECTURES ${CMAKE_CUDA_ARCHITECTURES}) + set_property(TARGET ${ABACUS_BIN_NAME} PROPERTY CUDA_ARCHITECTURES + ${CMAKE_CUDA_ARCHITECTURES}) endif() if(ENABLE_COVERAGE) @@ -577,11 +606,7 @@ add_subdirectory(source_io/module_parameter) add_subdirectory(source_lcao/module_lr) add_subdirectory(source_lcao/module_rdmft) # add by jghan -add_library( - driver - OBJECT - source_main/driver.cpp - source_main/driver_run.cpp) +add_library(driver OBJECT source_main/driver.cpp source_main/driver_run.cpp) # __USE_NVTX gates the NVTX code in source_base/timer.cpp (target base) and # source_main/driver.cpp (target driver), so it must be defined on those @@ -604,7 +629,9 @@ if(USE_CUDA) endif() endif() -list(APPEND device_srcs +list( + APPEND + device_srcs source_pw/module_pwdft/kernels/projector_gradient_op.cpp source_pw/module_pwdft/kernels/nonlocal_op.cpp source_pw/module_pwdft/kernels/veff_op.cpp @@ -616,14 +643,12 @@ list(APPEND device_srcs source_hsolver/kernels/bpcg_kernel_op.cpp source_hsolver/kernels/linear_op.cpp source_estate/kernels/elecstate_op.cpp - source_base/module_device/device.cpp source_base/module_device/device_helpers.cpp source_base/module_device/output_device.cpp source_base/module_device/memory_op.cpp source_base/kernels/math_kernel_op.cpp source_base/kernels/math_kernel_op_vec.cpp - source_pw/module_pwdft/kernels/force_op.cpp source_pw/module_pwdft/kernels/stress_op.cpp source_pw/module_pwdft/kernels/onsite_op.cpp @@ -637,7 +662,9 @@ list(APPEND device_srcs source_pw/module_pwdft/kernels/exx_cal_energy_op.cpp) if(USE_CUDA) - list(APPEND device_srcs + list( + APPEND + device_srcs source_pw/module_pwdft/kernels/cuda/projector_gradient_op.cu source_pw/module_pwdft/kernels/cuda/nonlocal_op.cu source_pw/module_pwdft/kernels/cuda/veff_op.cu @@ -667,15 +694,16 @@ if(USE_CUDA) source_pw/module_pwdft/kernels/cuda/exx_cal_energy_op.cu source_pw/module_pwdft/kernels/cuda/exx_batch_op.cu) if(USE_CUDA AND ENABLE_GPU_NEIGHBOR_LIST) - list(APPEND device_srcs - source_cell/kernels/cuda/gpu_neighlist_kernels.cu - source_cell/kernels/cuda/gpu_neighlist_host.cu - source_cell/kernels/cuda/gpu_neighlist_device.cu) + list(APPEND device_srcs source_cell/kernels/cuda/gpu_neighlist_kernels.cu + source_cell/kernels/cuda/gpu_neighlist_host.cu + source_cell/kernels/cuda/gpu_neighlist_device.cu) endif() endif() if(USE_ROCM) - hip_add_library(device_rocm STATIC + hip_add_library( + device_rocm + STATIC source_pw/module_pwdft/kernels/rocm/projector_gradient_op.hip.cu source_pw/module_pwdft/kernels/rocm/nonlocal_op.hip.cu source_pw/module_pwdft/kernels/rocm/veff_op.hip.cu @@ -700,8 +728,7 @@ if(USE_ROCM) endif() if(USE_DSP) - list(APPEND device_srcs - source_base/kernels/dsp/dsp_connector.cpp) + list(APPEND device_srcs source_base/kernels/dsp/dsp_connector.cpp) endif() add_library(device OBJECT ${device_srcs}) @@ -709,13 +736,8 @@ add_library(device OBJECT ${device_srcs}) if(USE_CUDA) target_link_libraries(device PRIVATE cusolver cublas cufft) elseif(USE_ROCM) - target_link_libraries(device PRIVATE - device_rocm - hip::host - hip::device - hip::hipfft - roc::hipblas - roc::hipsolver) + target_link_libraries(device PRIVATE device_rocm hip::host hip::device + hip::hipfft roc::hipblas roc::hipsolver) endif() # base uses symbols from device (memory_op and math_ylm_op). @@ -731,42 +753,41 @@ endif() target_link_libraries( ${ABACUS_BIN_NAME} - PRIVATE - # Internal ABACUS targets: consumers before providers. - driver - esolver - hsolver - hamilt_general - elecstate - module_pwdft - module_proj - nao_smoothgen - module_ofdft - module_stodft - module_dfpt - xc_ - vdw - relax - io_advanced - io_basic - io_input - surchem - neighbor_search - domain_decomposition - neighbor - md - module_plumed - planewave - symmetry - cell - parameter - psi_overall_init - psi_init - psi - deltaspin - container - device - base) + PRIVATE # Internal ABACUS targets: consumers before providers. + driver + esolver + hsolver + hamilt_general + elecstate + module_pwdft + module_proj + nao_smoothgen + module_ofdft + module_stodft + module_dfpt + xc_ + vdw + relax + io_advanced + io_basic + io_input + surchem + neighbor_search + domain_decomposition + neighbor + md + module_plumed + planewave + symmetry + cell + parameter + psi_overall_init + psi_init + psi + deltaspin + container + device + base) if(ENABLE_ELPA) target_link_libraries(${ABACUS_BIN_NAME} PRIVATE genelpa) @@ -775,16 +796,15 @@ endif() if(ENABLE_LCAO) target_link_libraries( ${ABACUS_BIN_NAME} - PRIVATE - hamilt_lcao - tddft - dftu - orb - gint - hcontainer - numerical_atomic_orbitals - lr - rdmft) + PRIVATE hamilt_lcao + tddft + dftu + orb + gint + hcontainer + numerical_atomic_orbitals + lr + rdmft) if(ENABLE_LIBRI) target_link_libraries(${ABACUS_BIN_NAME} PRIVATE bse) endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bcbc620a1a3..147daf67b94 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,5 +13,5 @@ add_subdirectory(11_PW_GPU) add_subdirectory(17_DS_DFTU) if(ENABLE_MLALGO) - add_subdirectory(09_DeePKS) + add_subdirectory(09_DeePKS) endif() From 8118371d8fc6bd12d602497ac9f0813d9c93639f Mon Sep 17 00:00:00 2001 From: SY Wang Date: Mon, 19 Oct 2026 12:50:58 +0800 Subject: [PATCH 2/2] Drop redundant CMake minumum requirement --- CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b04ceec1e06..54d6f4f5cd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) # Require out-of-source builds file(TO_CMAKE_PATH "${CMAKE_BINARY_DIR}/CMakeLists.txt" LOC_PATH) @@ -10,6 +10,8 @@ if(EXISTS "${LOC_PATH}") endif() include(CMakeDependentOption) +# TODO: Drop this warning; it shouldn't be there as cmake_dependent_option is a +# widely-used built-in feature message( WARNING "The build system now uses cmake_dependent_option extensively.\n" @@ -425,8 +427,6 @@ else() # CUDA not found endif() if(USE_CUDA) - cmake_minimum_required(VERSION 3.18) # required by `CUDA_ARCHITECTURES` below - # Always find CUDAToolkit to get CUDAToolkit_VERSION find_package(CUDAToolkit REQUIRED) @@ -514,7 +514,6 @@ if(USE_ROCM) message( DEPRECATION "Option USE_ROCM is deprecated and will be ignored in a future release. ") - cmake_minimum_required(VERSION 3.18) if(NOT DEFINED ROCM_PATH) set(ROCM_PATH "/opt/rocm"