From 6ce121ffbe820ca0cae23eee3497b11087935274 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 15:07:25 +0800 Subject: [PATCH 1/5] CMake: Find ELPA through pkg-config module --- cmake/modules/FindELPA.cmake | 92 +++++++----------------------------- 1 file changed, 18 insertions(+), 74 deletions(-) diff --git a/cmake/modules/FindELPA.cmake b/cmake/modules/FindELPA.cmake index 672543877d..9c651580cf 100644 --- a/cmake/modules/FindELPA.cmake +++ b/cmake/modules/FindELPA.cmake @@ -1,64 +1,19 @@ ############################################################################### # - Find ELPA -# Find the native ELPA headers and libraries. -# -# ELPA_FOUND - True if libelpa is found. -# ELPA_LIBRARIES - List of libraries when using libyaml -# ELPA_INCLUDE_DIR - Where to find ELPA headers. +# Find the native ELPA headers and libraries through pkg-config. # find_package(PkgConfig) -# Compatible layer towards old manual routines -if(DEFINED ELPA_INCLUDE_DIR) - set(ELPA_INCLUDE_DIRS ${ELPA_INCLUDE_DIR}) -endif() -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" - ) -# Fix #3589 -# First if judges if ELPA dir specified -if(ELPA_INCLUDE_DIRS MATCHES "^/usr/include/elpa/.*") - # Second if judges if global visible ELPA header found - if(DEFINED ELPA_DIR OR CMAKE_PREFIX_PATH MATCHES ".*elpa.*") - unset(ELPA_INCLUDE_DIRS) - endif() -endif() -if(ENABLE_OPENMP) - find_library(ELPA_LINK_LIBRARIES - NAMES elpa_openmp elpa - HINTS ${ELPA_DIR} - PATH_SUFFIXES "lib" - ) -else() - find_library(ELPA_LINK_LIBRARIES - NAMES elpa - HINTS ${ELPA_DIR} - PATH_SUFFIXES "lib" - ) -endif() - -# Incompatible with ELPA earlier than 2021.11.001 -# Before ELPA 2021.11.001, its pkg-config file -# is named like "elpa-2021.05.002.pc". -if(NOT ELPA_INCLUDE_DIRS AND PKG_CONFIG_FOUND) - if(DEFINED ELPA_DIR) - string(APPEND CMAKE_PREFIX_PATH ";${ELPA_DIR}") - endif() +if(PKG_CONFIG_FOUND) + # Find preferred library corresponding with ABACUS configuration first if(ENABLE_OPENMP) - pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa_openmp) + pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa_openmp elpa) else() - pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa) + pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa elpa_openmp) endif() -elseif(NOT PKG_CONFIG_FOUND) - message(STATUS - "ELPA : We need pkg-config to get all information about the elpa library") +else() + message(FATAL_ERROR "Pkg-config is needed to get all information about the ELPA library") endif() # Handle the QUIET and REQUIRED arguments and @@ -68,32 +23,21 @@ find_package_handle_standard_args(ELPA DEFAULT_MSG ELPA_LINK_LIBRARIES ELPA_INCL # Copy the results to the output variables and target. if(ELPA_FOUND) - list(GET ELPA_LINK_LIBRARIES 0 ELPA_LIBRARY) - set(ELPA_INCLUDE_DIR ${ELPA_INCLUDE_DIRS}) - - if(NOT TARGET ELPA::ELPA) - 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}") - endif() + list(GET ELPA_LINK_LIBRARIES 0 ELPA_LIBRARY) + set(ELPA_INCLUDE_DIR ${ELPA_INCLUDE_DIRS}) + if(NOT TARGET ELPA::ELPA) + 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}") + endif() endif() set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ELPA_INCLUDE_DIR}) -include(CheckCXXSourceCompiles) -check_cxx_source_compiles(" -#include -#if ELPA_API_VERSION < 20210430 -#error ELPA version is too old. -#endif -int main(){} -" -ELPA_VERSION_SATISFIES -) -if(NOT ELPA_VERSION_SATISFIES) - message(FATAL_ERROR "ELPA version is too old. We support version 2021 or higher.") +if(${ELPA_VERSION} VERSION_LESS "2021.05.001") + message(FATAL_ERROR "ELPA version >= 2021.05.001 is required.") endif() mark_as_advanced(ELPA_INCLUDE_DIR ELPA_LIBRARY) From 9662ff348be641e487a66397f4f9e45338e86f8a Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 15:12:29 +0800 Subject: [PATCH 2/5] Adjust document and toolchain scripts accordingly --- docs/quick_start/easy_install.md | 10 ++++++---- toolchain/build_abacus_aocc-aocl.sh | 2 -- toolchain/build_abacus_gcc-aocl.sh | 2 -- toolchain/build_abacus_gcc-mkl.sh | 2 -- toolchain/build_abacus_gnu.sh | 2 -- toolchain/build_abacus_intel.sh | 2 -- 6 files changed, 6 insertions(+), 14 deletions(-) diff --git a/docs/quick_start/easy_install.md b/docs/quick_start/easy_install.md index 9f2aa166ee..b8e62ec22e 100644 --- a/docs/quick_start/easy_install.md +++ b/docs/quick_start/easy_install.md @@ -158,9 +158,6 @@ Here, 'build' is the path for building ABACUS; and '-D' is used for setting up s - `MKLROOT`: If environment variable `MKLROOT` exists, `cmake` will take MKL as a preference, i.e. not using `LAPACK`, `ScaLAPACK` and `FFTW`. To disable MKL, unset environment variable `MKLROOT`, or pass `-DMKLROOT=OFF` to `cmake`. - `LAPACK_DIR`: Path to OpenBLAS library `libopenblas.so`(including BLAS and LAPACK) - `SCALAPACK_DIR`: Path to ScaLAPACK library `libscalapack.so` - - `ELPA_DIR`: Path to ELPA install directory; should be the folder containing 'include' and 'lib'. - > Note: In ABACUS v3.5.1 or earlier, if you install ELPA from source , please add a symlink to avoid the additional include file folder with version name: `ln -s elpa/include/elpa-2021.05.002/elpa elpa/include/elpa` to help the build system find ELPA headers. - - `FFTW3_DIR`: Path to FFTW3. - `LIBRI_DIR`: (Optional) Path to LibRI. - `LIBCOMM_DIR`: (Optional) Path to LibComm when `ENABLE_LIBRI=ON`. @@ -184,7 +181,12 @@ For some dependencies built with CMake, such as Libxc, dftd4, cereal, and RapidJ Here is an example: ```bash -CXX=mpiicpx cmake -B build -DCMAKE_INSTALL_PREFIX=~/abacus -DELPA_DIR=~/elpa-2025.01.001/build +CXX=mpiicpx cmake -B build \ + -DCMAKE_INSTALL_PREFIX=~/abacus \ + -DENABLE_MPI=ON \ + -DENABLE_LCAO=ON \ + -DENABLE_ELPA=ON \ + -DENABLE_LIBXC=ON ``` ### Build and Install diff --git a/toolchain/build_abacus_aocc-aocl.sh b/toolchain/build_abacus_aocc-aocl.sh index bec57f4742..c78b86b137 100755 --- a/toolchain/build_abacus_aocc-aocl.sh +++ b/toolchain/build_abacus_aocc-aocl.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_aocc_aocl rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} CEREAL=${CEREAL_ROOT}/include LAPACK=$AOCLhome/lib SCALAPACK=$AOCLhome/lib @@ -67,7 +66,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DLAPACK_DIR=$LAPACK \ -DSCALAPACK_DIR=$SCALAPACK \ -DFFTW3_DIR=$FFTW3 \ - -DELPA_DIR=$ELPA \ -DCEREAL_INCLUDE_DIR=$CEREAL \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ diff --git a/toolchain/build_abacus_gcc-aocl.sh b/toolchain/build_abacus_gcc-aocl.sh index ed707ca354..f2f96b1509 100755 --- a/toolchain/build_abacus_gcc-aocl.sh +++ b/toolchain/build_abacus_gcc-aocl.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_gcc_aocl rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} LAPACK=$AOCLhome/lib SCALAPACK=$AOCLhome/lib FFTW3=$AOCLhome @@ -64,7 +63,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DLAPACK_DIR=$LAPACK \ -DSCALAPACK_DIR=$SCALAPACK \ -DFFTW3_DIR=$FFTW3 \ - -DELPA_DIR=$ELPA \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ -DENABLE_OPENMP=ON \ diff --git a/toolchain/build_abacus_gcc-mkl.sh b/toolchain/build_abacus_gcc-mkl.sh index 9246c62906..db1a30e463 100755 --- a/toolchain/build_abacus_gcc-mkl.sh +++ b/toolchain/build_abacus_gcc-mkl.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_gcc_mkl rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} LIBRI=${LIBRI_ROOT} LIBCOMM=${LIBCOMM_ROOT} USE_CUDA=OFF # set ON to enable gpu-abacus @@ -60,7 +59,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DMPI_CXX_COMPILER=mpicxx \ -DMKLROOT=$MKLROOT \ -DENABLE_FLOAT_FFTW=ON \ - -DELPA_DIR=$ELPA \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ -DENABLE_OPENMP=ON \ diff --git a/toolchain/build_abacus_gnu.sh b/toolchain/build_abacus_gnu.sh index 79104c22f2..2a26780f3c 100755 --- a/toolchain/build_abacus_gnu.sh +++ b/toolchain/build_abacus_gnu.sh @@ -22,7 +22,6 @@ rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR LAPACK=${OPENBLAS_ROOT}/lib SCALAPACK=${SCALAPACK_ROOT}/lib -ELPA=${ELPA_ROOT} FFTW3=${FFTW_ROOT} LIBRI=${LIBRI_ROOT} LIBCOMM=${LIBCOMM_ROOT} @@ -61,7 +60,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DMPI_CXX_COMPILER=mpicxx \ -DLAPACK_DIR=$LAPACK \ -DSCALAPACK_DIR=$SCALAPACK \ - -DELPA_DIR=$ELPA \ -DFFTW3_DIR=$FFTW3 \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ diff --git a/toolchain/build_abacus_intel.sh b/toolchain/build_abacus_intel.sh index 43da9e32e3..da043fdc80 100755 --- a/toolchain/build_abacus_intel.sh +++ b/toolchain/build_abacus_intel.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_intel rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} LIBRI=${LIBRI_ROOT} LIBCOMM=${LIBCOMM_ROOT} USE_CUDA=OFF # set ON to enable gpu-abacus @@ -61,7 +60,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DMPI_CXX_COMPILER=mpiicpx \ -DMKLROOT=$MKLROOT \ -DENABLE_FLOAT_FFTW=ON \ - -DELPA_DIR=$ELPA \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ -DENABLE_OPENMP=ON \ From 4f8eed860af10ea24999f6f0d0bbf019fb98c8e5 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 15:14:27 +0800 Subject: [PATCH 3/5] Adjust cmake/CollectBuildInfoVars.cmake --- cmake/CollectBuildInfoVars.cmake | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cmake/CollectBuildInfoVars.cmake b/cmake/CollectBuildInfoVars.cmake index 61246e3a61..9d036b7ad0 100644 --- a/cmake/CollectBuildInfoVars.cmake +++ b/cmake/CollectBuildInfoVars.cmake @@ -146,21 +146,7 @@ endif() # Core Math Libraries if(ENABLE_LCAO AND ENABLE_ELPA) - set(ABACUS_ELPA_VERSION "yes (version unknown)") - if(ELPA_VERSION) set(ABACUS_ELPA_VERSION "yes (v${ELPA_VERSION})") - else() - find_program(ELPA_VERSION_EXE elpa2_print_version PATHS ${ELPA_DIR}/bin NO_DEFAULT_PATH) - if(ELPA_VERSION_EXE) - execute_process(COMMAND ${ELPA_VERSION_EXE} OUTPUT_VARIABLE ELPA_VER_RAW OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if(ELPA_VER_RAW) - set(ABACUS_ELPA_VERSION "yes (${ELPA_VER_RAW})") -endif() - endif() - endif() - if(ABACUS_ELPA_VERSION STREQUAL "yes (version unknown)" AND ELPA_DIR) - set(ABACUS_ELPA_VERSION "yes (path: ${ELPA_DIR})") - endif() else() set(ABACUS_ELPA_VERSION "no") endif() From e917d99f8ce872509b2c3e086a2363afa1317d34 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 15:23:10 +0800 Subject: [PATCH 4/5] Include pkg-config in GH workflow --- .github/workflows/ase_plugin_test.yml | 2 +- .github/workflows/build_test_cmake.yml | 2 +- .github/workflows/coverage.yml | 1 + .github/workflows/cuda.yml | 4 ++-- .github/workflows/dynamic.yml | 2 +- .github/workflows/test.yml | 1 + 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ase_plugin_test.yml b/.github/workflows/ase_plugin_test.yml index be902b7f59..2784e4fa36 100644 --- a/.github/workflows/ase_plugin_test.yml +++ b/.github/workflows/ase_plugin_test.yml @@ -39,7 +39,7 @@ jobs: - name: Install external tools from toolchain run: | - sudo apt update && sudo apt install -y xz-utils ninja-build + sudo apt update && sudo apt install -y xz-utils ninja-build pkg-config cd toolchain ./install_abacus_toolchain_new.sh --with-dftd4=install --dry-run -j8 ./scripts/stage4/install_stage4.sh diff --git a/.github/workflows/build_test_cmake.yml b/.github/workflows/build_test_cmake.yml index 56e324993d..262c36ef79 100644 --- a/.github/workflows/build_test_cmake.yml +++ b/.github/workflows/build_test_cmake.yml @@ -61,7 +61,7 @@ jobs: - name: Install external tools from toolchain run: | - sudo apt update && sudo apt install -y gfortran ninja-build xz-utils + sudo apt update && sudo apt install -y gfortran ninja-build pkg-config xz-utils cd toolchain ./install_abacus_toolchain_new.sh --with-dftd4=install --dry-run ${{matrix.external_toolchain_args}} ./scripts/stage4/install_stage4.sh diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 006c0e9d9c..a437a8b19e 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -31,6 +31,7 @@ jobs: python3-pip \ xz-utils \ ninja-build \ + pkg-config \ lcov \ perl-modules \ libcapture-tiny-perl \ diff --git a/.github/workflows/cuda.yml b/.github/workflows/cuda.yml index f5c113c892..6f3733b038 100644 --- a/.github/workflows/cuda.yml +++ b/.github/workflows/cuda.yml @@ -29,10 +29,10 @@ jobs: with: submodules: recursive - - name: Install Ccache + - name: Install CI tools run: | sudo apt-get update - sudo apt-get install -y ccache xz-utils ninja-build + sudo apt-get install -y ccache xz-utils ninja-build pkg-config - name: Install external tools from toolchain run: | diff --git a/.github/workflows/dynamic.yml b/.github/workflows/dynamic.yml index f00a0e9e6e..a9235d1cfd 100644 --- a/.github/workflows/dynamic.yml +++ b/.github/workflows/dynamic.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v7 - name: Install external tools from toolchain run: | - sudo apt update && sudo apt install -y xz-utils ninja-build + sudo apt update && sudo apt install -y xz-utils ninja-build pkg-config cd toolchain ./install_abacus_toolchain_new.sh --with-dftd4=install --dry-run -j8 ./scripts/stage4/install_stage4.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ee633a76ca..18b0b1a7a8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,6 +40,7 @@ jobs: gfortran \ ccache \ ca-certificates \ + pkg-config \ python-is-python3 \ python3-pip \ ninja-build \ From 9d340190bd92794e15eeec23c63dc28350494d91 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 14 Jul 2026 12:12:07 +0800 Subject: [PATCH 5/5] Keep ELPA_DIR but mark as deprecated --- cmake/modules/FindELPA.cmake | 73 ++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/cmake/modules/FindELPA.cmake b/cmake/modules/FindELPA.cmake index 9c651580cf..ce548b34c7 100644 --- a/cmake/modules/FindELPA.cmake +++ b/cmake/modules/FindELPA.cmake @@ -3,17 +3,64 @@ # Find the native ELPA headers and libraries through pkg-config. # -find_package(PkgConfig) +# ======================================================================== +# Deprecated (TODO: Remove this part) +# ======================================================================== -if(PKG_CONFIG_FOUND) +# Compatible layer towards old manual routines +if(DEFINED ELPA_DIR) + 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}) +endif() +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" + ) +# Fix #3589 +# First if judges if ELPA dir specified +if(ELPA_INCLUDE_DIRS MATCHES "^/usr/include/elpa/.*") + # Second if judges if global visible ELPA header found + if(DEFINED ELPA_DIR OR CMAKE_PREFIX_PATH MATCHES ".*elpa.*") + unset(ELPA_INCLUDE_DIRS) + endif() +endif() +if(ENABLE_OPENMP) + find_library(ELPA_LINK_LIBRARIES + NAMES elpa_openmp elpa + HINTS ${ELPA_DIR} + PATH_SUFFIXES "lib" + ) +else() + find_library(ELPA_LINK_LIBRARIES + NAMES elpa + HINTS ${ELPA_DIR} + PATH_SUFFIXES "lib" + ) +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") + endif() # Find preferred library corresponding with ABACUS configuration first if(ENABLE_OPENMP) pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa_openmp elpa) else() - pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa elpa_openmp) + pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa) + endif() + if(${ELPA_VERSION} VERSION_LESS "2021.05.001") + message(FATAL_ERROR "ELPA version >= 2021.05.001 is required.") endif() -else() - message(FATAL_ERROR "Pkg-config is needed to get all information about the ELPA library") endif() # Handle the QUIET and REQUIRED arguments and @@ -36,8 +83,20 @@ endif() set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ELPA_INCLUDE_DIR}) -if(${ELPA_VERSION} VERSION_LESS "2021.05.001") - message(FATAL_ERROR "ELPA version >= 2021.05.001 is required.") +# Compability workaround for ELPA_DIR +# TODO: Remove this check +include(CheckCXXSourceCompiles) +check_cxx_source_compiles(" +#include +#if ELPA_API_VERSION < 20210430 +#error ELPA version is too old. +#endif +int main(){} +" +ELPA_VERSION_SATISFIES +) +if(NOT ELPA_VERSION_SATISFIES) + message(FATAL_ERROR "ELPA version is too old. We support version 2021 or higher.") endif() mark_as_advanced(ELPA_INCLUDE_DIR ELPA_LIBRARY)