From 22b8194b05108b5dd29690f6e57b14b6cb99da68 Mon Sep 17 00:00:00 2001 From: Shaochen Shi Date: Thu, 10 Jun 2021 20:21:27 +0800 Subject: [PATCH 1/2] Find cereal, ELPA, FFTW3, ScaLAPACK in CMake. --- ABACUS.develop/cmake/CMakeLists.txt | 73 +++++++------------ ABACUS.develop/cmake/modules/FindCereal.cmake | 22 ++++++ ABACUS.develop/cmake/modules/FindELPA.cmake | 33 +++++++++ ABACUS.develop/cmake/modules/FindFFTW3.cmake | 32 ++++++++ .../cmake/modules/FindScaLAPACK.cmake | 28 +++++++ 5 files changed, 143 insertions(+), 45 deletions(-) create mode 100644 ABACUS.develop/cmake/modules/FindCereal.cmake create mode 100644 ABACUS.develop/cmake/modules/FindELPA.cmake create mode 100644 ABACUS.develop/cmake/modules/FindFFTW3.cmake create mode 100644 ABACUS.develop/cmake/modules/FindScaLAPACK.cmake diff --git a/ABACUS.develop/cmake/CMakeLists.txt b/ABACUS.develop/cmake/CMakeLists.txt index 1d033601e39..09ddf993416 100644 --- a/ABACUS.develop/cmake/CMakeLists.txt +++ b/ABACUS.develop/cmake/CMakeLists.txt @@ -13,52 +13,36 @@ project(ABACUS set(ABACUS_BIN_NAME ${PROJECT_NAME}-${PROJECT_VERSION}) set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") +add_compile_options(-O2 -g) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules) get_filename_component(ABACUS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. ABSOLUTE) set(ABACUS_SOURCE_DIR ${ABACUS_DIR}/source) +include_directories(${ABACUS_SOURCE_DIR}) -set(CEREAL_DIR /usr/local) -include_directories(${CEREAL_DIR}/include) - -set(ELPA_DIR /usr/local) -include_directories(${ELPA_DIR}/include) - -set(FFTW_DIR /usr/local) -include_directories(${FFTW_DIR}/include) - -set(SCALAPACK_DIR /usr/local) -include_directories(${SCALAPACK_DIR}/include) +# We only use headers +find_package(Boost REQUIRED) +find_package(Cereal REQUIRED) -# OpenBlas is required by ScaLAPACK +# We only use libraries while headers are customed in project: +# - "blas_connector.h" +# - "lapack_connect.h" +# - "my_elpa.h" +# - "scalapack_connector.h" find_package(BLAS REQUIRED) +find_package(ELPA REQUIRED) +find_package(ScaLAPACK REQUIRED) -# We only use the header-only part of Boost -find_package(Boost REQUIRED) -include_directories(${Boost_INCLUDE_DIRS}) - +# Both header and library are needed +find_package(FFTW3 REQUIRED) find_package(MPI REQUIRED) -include_directories(${MPI_CXX_INCLUDE_PATH}) -add_compile_options(${MPI_CXX_COMPILE_FLAGS}) +include_directories(${MPI_CXX_INCLUDE_PATH} ${FFTW3_INCLUDE_DIRS}) -# Look for pthread or equivalent +# No header needed find_package(Threads REQUIRED) find_package(OpenMP REQUIRED) -set(EXTERNAL_LIB_NAMES - -lgfortran - -lm - -lelpa - -lfftw3 - ${SCALAPACK_DIR}/lib/libscalapack.a -) - -set(EXTERNAL_LIB_DIRS - ${LAPACK_DIR}/lib - ${FFTW_DIR}/lib - ${ELPA_DIR}/lib -) - add_definitions( -D__EXX -D__FFTW3 @@ -453,12 +437,10 @@ add_library(abacusTools OBJECT ${CODE_TOOLS}) add_library(abacusCodePdiag OBJECT ${CODE_PDIAG}) add_library(abacusCodePdiagMr OBJECT ${CODE_PDIAG_MR}) -target_include_directories(abacusCommon PUBLIC ${ABACUS_SOURCE_DIR}) -target_include_directories(abacusFirstPrinciple PUBLIC ${ABACUS_SOURCE_DIR}) -target_include_directories(abacusParallel PUBLIC ${ABACUS_SOURCE_DIR}) -target_include_directories(abacusTools PUBLIC ${ABACUS_SOURCE_DIR}) -target_include_directories(abacusCodePdiag PUBLIC ${ABACUS_SOURCE_DIR}) -target_include_directories(abacusCodePdiagMr PUBLIC ${ABACUS_SOURCE_DIR}) +target_include_directories(abacusFirstPrinciple PUBLIC + ${Cereal_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS} +) add_executable(${ABACUS_BIN_NAME} ${ABACUS_SOURCE_DIR}/main.cpp @@ -470,13 +452,14 @@ add_executable(${ABACUS_BIN_NAME} $ ) target_link_libraries(${ABACUS_BIN_NAME} - ${EXTERNAL_LIB_NAMES} + -lgfortran + -lm + ELPA::ELPA + FFTW3::FFTW3 + ScaLAPACK::ScaLAPACK + BLAS::BLAS MPI::MPI_CXX OpenMP::OpenMP_CXX - BLAS::BLAS Threads::Threads ) -target_link_directories(${ABACUS_BIN_NAME} - PUBLIC ${EXTERNAL_LIB_DIRS} -) diff --git a/ABACUS.develop/cmake/modules/FindCereal.cmake b/ABACUS.develop/cmake/modules/FindCereal.cmake new file mode 100644 index 00000000000..f2713c7b271 --- /dev/null +++ b/ABACUS.develop/cmake/modules/FindCereal.cmake @@ -0,0 +1,22 @@ +############################################################################### +# - Find cereal +# Find the native cereal headers. +# +# CEREAL_FOUND - True if cereal is found. +# CEREAL_INCLUDE_DIRS - Where to find cereal headers. +# + +find_path(Cereal_INCLUDE_DIR cereal/cereal.hpp) + +# Handle the QUIET and REQUIRED arguments and +# set Cereal_FOUND to TRUE if all variables are non-zero. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Cereal DEFAULT_MSG Cereal_INCLUDE_DIR) + +# Copy the results to the output variables and target. +if(Cereal_FOUND) + set(Cereal_INCLUDE_DIRS ${Cereal_INCLUDE_DIR}) +endif() + +mark_as_advanced(Cereal_INCLUDE_DIR) + diff --git a/ABACUS.develop/cmake/modules/FindELPA.cmake b/ABACUS.develop/cmake/modules/FindELPA.cmake new file mode 100644 index 00000000000..892fb33d7f4 --- /dev/null +++ b/ABACUS.develop/cmake/modules/FindELPA.cmake @@ -0,0 +1,33 @@ +############################################################################### +# - 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_DIRS - Where to find ELPA headers. +# + +find_path(ELPA_INCLUDE_DIR elpa/elpa.h) +find_library(ELPA_LIBRARY NAMES elpa) + +# 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_LIBRARY ELPA_INCLUDE_DIR) + +# Copy the results to the output variables and target. +if(ELPA_FOUND) + set(ELPA_LIBRARIES ${ELPA_LIBRARY}) + set(ELPA_INCLUDE_DIRS ${ELPA_INCLUDE_DIR}) + + 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() + +mark_as_advanced(ELPA_INCLUDE_DIR ELPA_LIBRARY) + diff --git a/ABACUS.develop/cmake/modules/FindFFTW3.cmake b/ABACUS.develop/cmake/modules/FindFFTW3.cmake new file mode 100644 index 00000000000..046aff7b870 --- /dev/null +++ b/ABACUS.develop/cmake/modules/FindFFTW3.cmake @@ -0,0 +1,32 @@ +# - Find FFTW3 +# Find the native double precision FFTW3 headers and libraries. +# +# FFTW3_INCLUDE_DIRS - Where to find FFTW3 headers. +# FFTW3_LIBRARIES - List of libraries when using FFTW3. +# FFTW3_FOUND - True if FFTW3 is found. +# + +find_path(FFTW3_INCLUDE_DIR fftw3.h) +find_library(FFTW3_LIBRARY NAMES fftw3) + +# Handle the QUIET and REQUIRED arguments and +# set FFTW3_FOUND to TRUE if all variables are non-zero. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(FFTW3 DEFAULT_MSG FFTW3_LIBRARY FFTW3_INCLUDE_DIR) + +# Copy the results to the output variables and target. +if(FFTW3_FOUND) + set(FFTW3_LIBRARIES ${FFTW3_LIBRARY}) + set(FFTW3_INCLUDE_DIRS ${FFTW3_INCLUDE_DIR}) + + 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() +endif() + +mark_as_advanced(FFTW3_INCLUDE_DIR FFTW3_LIBRARY) + diff --git a/ABACUS.develop/cmake/modules/FindScaLAPACK.cmake b/ABACUS.develop/cmake/modules/FindScaLAPACK.cmake new file mode 100644 index 00000000000..fa57f2b8add --- /dev/null +++ b/ABACUS.develop/cmake/modules/FindScaLAPACK.cmake @@ -0,0 +1,28 @@ +# - Find ScaLAPACK +# Find the native double precision ScaLAPACK headers and libraries. +# +# ScaLAPACK_LIBRARIES - List of libraries when using ScaLAPACK. +# ScaLAPACK_FOUND - True if ScaLAPACK is found. +# + +find_library(ScaLAPACK_LIBRARY NAMES scalapack) + +# 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 DEFAULT_MSG ScaLAPACK_LIBRARY) + +# Copy the results to the output variables and target. +if(ScaLAPACK_FOUND) + set(ScaLAPACK_LIBRARIES ${ScaLAPACK_LIBRARY}) + + if(NOT TARGET ScaLAPACK::ScaLAPACK) + add_library(ScaLAPACK::ScaLAPACK UNKNOWN IMPORTED) + set_target_properties(ScaLAPACK::ScaLAPACK PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${ScaLAPACK_LIBRARY}") + endif() +endif() + +mark_as_advanced(ScaLAPACK_LIBRARY) + From a4118b5523cf87ad7adf9ebd9d560eb48b3ad071 Mon Sep 17 00:00:00 2001 From: Shaochen Shi Date: Thu, 10 Jun 2021 20:28:29 +0800 Subject: [PATCH 2/2] Update README for CMake. --- ABACUS.develop/cmake/README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ABACUS.develop/cmake/README.md b/ABACUS.develop/cmake/README.md index a57608b4894..939a998bd93 100644 --- a/ABACUS.develop/cmake/README.md +++ b/ABACUS.develop/cmake/README.md @@ -9,14 +9,6 @@ mkdir build cd build cmake ../cmake - -# Or specifying installation paths of dependencies: -# cmake ../cmake \ -# -DCEREAL_DIR=${CEREAL_DIR} \ -# -DELPA_DIR=${FFTW_DIR} \ -# -DFFTW_DIR=${ELPA_DIR} \ -# -DSCALAPACK_DIR=${SCALAPACK_DIR} - make -j 16 ```