diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c6acfdee0..ee39d54a69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,9 +99,9 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY foreach(__var ROCM_ROOT CRAY_ROCM_ROOT ORNL_ROCM_ROOT CRAY_ROCM_PREFIX ROCM_PREFIX CRAY_ROCM_DIR) if($ENV{${__var}}) - list(APPEND CMAKE_PREFIX_PATH $ENV{__var}) + list(APPEND CMAKE_PREFIX_PATH $ENV{${__var}}) set(ROCM_PATH - $ENV{__var} + $ENV{${__var}} CACHE PATH "Path to ROCm installation") endif() endforeach() @@ -397,14 +397,10 @@ if(NOT Python_EXECUTABLE) REQUIRED) endif() -# get the git hash Get the latest abbreviated commit hash of the working branch -# As a fall back, e.g. in a container, try reading a file named "REVISION". -execute_process( - COMMAND bash -c "git log -1 --format=%h || cat REVISION" - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - ERROR_QUIET - OUTPUT_VARIABLE CP2K_GIT_HASH - OUTPUT_STRIP_TRAILING_WHITESPACE) +# The git hash (__COMPILE_REVISION) is refreshed at *build* time rather than +# here at configure time, see the cp2k_build_info target in src/CMakeLists.txt +# and cmake/GenerateCp2kBuildInfo.cmake, so that "git commit; ninja" embeds the +# new hash without requiring a re-run of cmake. execute_process( COMMAND hostnamectl --transient @@ -412,15 +408,6 @@ execute_process( OUTPUT_VARIABLE CP2K_HOST_NAME OUTPUT_STRIP_TRAILING_WHITESPACE) -add_custom_target( - AlwaysCheckGit - COMMAND - ${CMAKE_COMMAND} -DRUN_CHECK_GIT_VERSION=1 - -Dpre_configure_dir=${pre_configure_dir} - -Dpost_configure_file=${post_configure_dir} - -DGIT_HASH_CACHE=${GIT_HASH_CACHE} -P ${CURRENT_LIST_DIR}/CheckGit.cmake - BYPRODUCTS ${post_configure_file}) - # MPI if(CP2K_USE_MPI) get_property(REQUIRED_MPI_COMPONENTS GLOBAL PROPERTY ENABLED_LANGUAGES) @@ -589,7 +576,7 @@ if(CP2K_USE_ACCEL MATCHES "CUDA") message(STATUS "GPU architecture number: ${CMAKE_CUDA_ARCHITECTURES}") message(STATUS "GPU profiling enabled: ${CP2K_WITH_GPU_PROFILING}") - if(WITH_CUDA_PROFILING) + if(CP2K_WITH_GPU_PROFILING) find_library( CUDA_NVTOOLSEXT nvToolsExt PATHS ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES} @@ -836,8 +823,7 @@ if(CP2K_USE_LIBINT2) find_file( CP2K_LIBINT2_MOD_FILE NAMES libint_f.mod - PATHS ${_libint2_include_dirs} "/usr/lib64/gfortran/modules" - NO_DEFAULT_PATH) + PATHS ${_libint2_include_dirs} "/usr/lib64/gfortran/modules") if(NOT CP2K_LIBINT2_MOD_FILE) message( FATAL_ERROR "Libint2 was found, but its Fortran interface is missing") @@ -871,18 +857,18 @@ if(CP2K_USE_SPLA) INTERFACE_INCLUDE_DIRECTORIES) get_target_property(CP2K_SPLA_LINK_LIBRARIES SPLA::spla INTERFACE_LINK_LIBRARIES) - if(NOT SPLA_GPU_BACKEND AND CP2K_USE_GEMM_OFFLOADING) - set(CP2K_USE_GEMM_OFFLOADING OFF) + if(NOT SPLA_GPU_BACKEND AND CP2K_USE_SPLA_GEMM_OFFLOADING) message( FATAL_ERROR - "SpLA should be compiled with GPU support if the gemm offloading is requested. Use -DCP2K_USE_GEMM_OFFLOADING=OFF otherwise" + "SpLA should be compiled with GPU support if the gemm offloading is requested. Use -DCP2K_USE_SPLA_GEMM_OFFLOADING=OFF otherwise" ) endif() endif() -if(CP2K_USE_DFTD4) - find_package(dftd4 REQUIRED) - # Detect dftd4_VERSION from dftd4-config-version.cmake +# Sets CP2K_USE_DFTD4_V3 / CP2K_USE_DFTD4_V4_2 from dftd4_VERSION, which is +# populated by dftd4-config-version.cmake either directly via +# find_package(dftd4) or transitively via find_package(tblite). +macro(cp2k_detect_dftd4_api) if(dftd4_VERSION VERSION_LESS "4.0.0") message(STATUS "DFTD4: found version ${dftd4_VERSION}, using v3.x API") set(CP2K_USE_DFTD4_V3 ON) @@ -895,6 +881,11 @@ if(CP2K_USE_DFTD4) else() set(CP2K_USE_DFTD4_V4_2 OFF) endif() +endmacro() + +if(CP2K_USE_DFTD4) + find_package(dftd4 REQUIRED) + cp2k_detect_dftd4_api() endif() if(CP2K_USE_DEEPMD) @@ -923,19 +914,7 @@ if(CP2K_USE_TBLITE) target_link_libraries( cp2k::tblite INTERFACE tblite::tblite mctc-lib::mctc-lib dftd4::dftd4 toml-f::toml-f s-dftd3::s-dftd3) - # Detect dftd4_VERSION from dftd4-config-version.cmake - if(dftd4_VERSION VERSION_LESS "4.0.0") - message(STATUS "DFTD4: found version ${dftd4_VERSION}, using v3.x API") - set(CP2K_USE_DFTD4_V3 ON) - else() - set(CP2K_USE_DFTD4_V3 OFF) - endif() - if(dftd4_VERSION VERSION_GREATER_EQUAL "4.2.0") - message(STATUS "DFTD4: found version ${dftd4_VERSION}, using v4.2+ API") - set(CP2K_USE_DFTD4_V4_2 ON) - else() - set(CP2K_USE_DFTD4_V4_2 OFF) - endif() + cp2k_detect_dftd4_api() endif() # SIRIUS diff --git a/cmake/GenerateCp2kBuildInfo.cmake b/cmake/GenerateCp2kBuildInfo.cmake index dca67d5813..854f55149a 100644 --- a/cmake/GenerateCp2kBuildInfo.cmake +++ b/cmake/GenerateCp2kBuildInfo.cmake @@ -9,10 +9,29 @@ if(NOT DEFINED OUTPUT_FILE) message(FATAL_ERROR "OUTPUT_FILE is not defined") endif() +if(NOT DEFINED SOURCE_DIR) + set(SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/..") +endif() + string(TIMESTAMP CP2K_BUILD_TIMESTAMP "%Y-%m-%d %H:%M:%S") +# Get the latest abbreviated commit hash of the working branch. As a fall back, +# e.g. in a container without a .git directory, try reading a file named +# "REVISION". Running this here (rather than once at configure time) means a new +# commit is picked up on the next build, without having to re-run cmake. +execute_process( + COMMAND bash -c "git log -1 --format=%h || cat REVISION" + WORKING_DIRECTORY "${SOURCE_DIR}" + ERROR_QUIET + OUTPUT_VARIABLE CP2K_GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(NOT CP2K_GIT_HASH) + set(CP2K_GIT_HASH "unknown") +endif() + set(CP2K_BUILD_INFO_CONTENT - "#define __COMPILE_DATE \"${CP2K_BUILD_TIMESTAMP}\"\n") + "#define __COMPILE_DATE \"${CP2K_BUILD_TIMESTAMP}\"\n#define __COMPILE_REVISION \"${CP2K_GIT_HASH}\"\n" +) if(EXISTS "${OUTPUT_FILE}") file(READ "${OUTPUT_FILE}" CP2K_OLD_BUILD_INFO_CONTENT) diff --git a/cmake/modules/FindArmpl.cmake b/cmake/modules/FindArmpl.cmake index 760826595d..b01d7a54a5 100644 --- a/cmake/modules/FindArmpl.cmake +++ b/cmake/modules/FindArmpl.cmake @@ -53,7 +53,7 @@ find_package_handle_standard_args( CP2K_ARMPL_ILP64_MP_LINK_LIBRARIES) # add target to link against -if(NOT TARGET Armpl::armpl) +if(NOT TARGET cp2k::BLAS::Armpl::armpl) add_library(cp2k::BLAS::Armpl::armpl INTERFACE IMPORTED) # now define an alias to the target library add_library(cp2k::BLAS::Armpl::blas ALIAS cp2k::BLAS::Armpl::armpl) diff --git a/cmake/modules/FindAtlas.cmake b/cmake/modules/FindAtlas.cmake index e97fc912e8..56fb210e64 100644 --- a/cmake/modules/FindAtlas.cmake +++ b/cmake/modules/FindAtlas.cmake @@ -15,13 +15,13 @@ include(cp2k_utils) cp2k_set_default_paths(ATLAS "Atlas") cp2k_find_libraries(ATLAS "atlas") -cp2k_include_dirs(FFTW3 "cblas.h atlas/cblas.h") +cp2k_include_dirs(ATLAS "cblas.h atlas/cblas.h") # check if found find_package_handle_standard_args(Atlas REQUIRED_VARS CP2K_ATLAS_INCLUDE_DIRS CP2K_ATLAS_LINK_LIBRARIES) # add target to link against -if(CP2K_ATLAS_FOUND AND NOT TARGET CP2K_ATLAS::atlas) +if(CP2K_ATLAS_FOUND) if(NOT TARGET cp2k::BLAS::ATLAS::atlas) add_library(cp2k::BLAS::ATLAS::atlas INTERFACE IMPORTED) endif() diff --git a/cmake/modules/FindBlis.cmake b/cmake/modules/FindBlis.cmake index 8228aaa733..817b7d491e 100644 --- a/cmake/modules/FindBlis.cmake +++ b/cmake/modules/FindBlis.cmake @@ -16,7 +16,7 @@ include(cp2k_utils) cp2k_set_default_paths(BLIS "BLIS") if(DEFINED AOCL_ROOT) - list(CP2K_BLIS_ROOT "${AOCL_ROOT}" "$ENV{AOCL_ROOT}") + list(APPEND CP2K_BLIS_ROOT "${AOCL_ROOT}" "$ENV{AOCL_ROOT}") endif() # one day blis will have a pkg-config file @@ -46,7 +46,7 @@ endif() if(CP2K_BLIS_FOUND) if(NOT TARGET cp2k::BLAS::Blis::blis) add_library(cp2k::BLAS::Blis::blis INTERFACE IMPORTED) - add_library(cp2k::BLAS::Blis::blas alias cp2k::BLAS::Blis::blis) + add_library(cp2k::BLAS::Blis::blas ALIAS cp2k::BLAS::Blis::blis) endif() set_property(TARGET cp2k::BLAS::Blis::blis diff --git a/cmake/modules/FindCal.cmake b/cmake/modules/FindCal.cmake index cd0bb32fec..059bbb9f4e 100644 --- a/cmake/modules/FindCal.cmake +++ b/cmake/modules/FindCal.cmake @@ -20,14 +20,16 @@ cp2k_include_dirs(CAL "cal.h") find_package_handle_standard_args(Cal DEFAULT_MSG CP2K_CAL_LINK_LIBRARIES CP2K_CAL_INCLUDE_DIRS) -if(CP2K_CAL_FOUND AND NOT TARGET cp2k::CAL::cal) +if(NOT CP2K_CAL_FOUND) + message(FATAL_ERROR "Cal required by CuSolverMP") +endif() + +if(NOT TARGET cp2k::CAL::cal) add_library(cp2k::CAL::cal INTERFACE IMPORTED) set_target_properties(cp2k::CAL::cal PROPERTIES INTERFACE_LINK_LIBRARIES "${CP2K_CAL_LINK_LIBRARIES}") set_target_properties(cp2k::CAL::cal PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CP2K_CAL_INCLUDE_DIRS}") -else() - message(FATAL_ERROR "Cal required by CuSolverMP") endif() mark_as_advanced(CP2K_CAL_LINK_LIBRARIES) diff --git a/cmake/modules/FindCuSolverMP.cmake b/cmake/modules/FindCuSolverMP.cmake index ce6b3c13ff..4090c34311 100644 --- a/cmake/modules/FindCuSolverMP.cmake +++ b/cmake/modules/FindCuSolverMP.cmake @@ -54,7 +54,11 @@ find_package_handle_standard_args( CuSolverMP DEFAULT_MSG CP2K_CUSOLVER_MP_LINK_LIBRARIES CP2K_CUSOLVER_MP_INCLUDE_DIRS) -if(CP2K_CUSOLVER_MP_FOUND AND NOT TARGET cp2k::CUSOLVER_MP::cusolver_mp) +if(NOT CP2K_CUSOLVER_MP_FOUND) + message(FATAL_ERROR "CuSolverMP requested, but not found") +endif() + +if(NOT TARGET cp2k::CUSOLVER_MP::cusolver_mp) add_library(cp2k::CUSOLVER_MP::cusolver_mp INTERFACE IMPORTED) if(CP2K_CUSOLVERMP_USE_NCCL) @@ -70,8 +74,6 @@ if(CP2K_CUSOLVER_MP_FOUND AND NOT TARGET cp2k::CUSOLVER_MP::cusolver_mp) set_target_properties( cp2k::CUSOLVER_MP::cusolver_mp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CP2K_CUSOLVER_MP_INCLUDE_DIRS}") -else() - message(FATAL_ERROR "CuSolverMP requested, but not found") endif() mark_as_advanced(CP2K_CUSOLVER_MP_LINK_LIBRARIES) diff --git a/cmake/modules/FindFftw.cmake b/cmake/modules/FindFftw.cmake index e8c6911614..36d99a0c9e 100644 --- a/cmake/modules/FindFftw.cmake +++ b/cmake/modules/FindFftw.cmake @@ -91,7 +91,7 @@ foreach(lib_name "fftw3" "fftw3l" "fftw3q" "fftw3f") endif() endforeach() -set(CP2K_FFTW3_FOUND ON) +set(CP2K_FFTW3_FOUND ${Fftw_FOUND}) mark_as_advanced( CP2K_FFTW3_FOUND CP2K_FFTW3_ROOT diff --git a/cmake/modules/FindFlexiBLAS.cmake b/cmake/modules/FindFlexiBLAS.cmake index b9f84b4be0..0d3b4fc6ff 100644 --- a/cmake/modules/FindFlexiBLAS.cmake +++ b/cmake/modules/FindFlexiBLAS.cmake @@ -35,10 +35,6 @@ find_package_handle_standard_args( FlexiBLAS DEFAULT_MSG CP2K_FLEXIBLAS_INCLUDE_DIRS CP2K_FLEXIBLAS_LINK_LIBRARIES) -if(NOT CP2K_FLEXIBLAS_FOUND) - set(CP2K_BLAS_VENDOR "FlexiBLAS") -endif() - if(CP2K_FLEXIBLAS_FOUND) if(NOT TARGET cp2k::BLAS::FlexiBLAS::flexiblas) add_library(cp2k::BLAS::FlexiBLAS::flexiblas INTERFACE IMPORTED) diff --git a/cmake/modules/FindLapack.cmake b/cmake/modules/FindLapack.cmake index 8d3e6502a7..f581b2109c 100644 --- a/cmake/modules/FindLapack.cmake +++ b/cmake/modules/FindLapack.cmake @@ -42,8 +42,7 @@ if(NOT CP2K_CONFIG_PACKAGE) CP2K_LAPACK_LINK_LIBRARIES NAMES "lapack" "lapack64" PATH_SUFFIXES "openblas" "openblas64" "openblas-pthread" - "openblas-openmp" "lib" "lib64" - NO_DEFAULT_PATH) + "openblas-openmp" "lib" "lib64") endif() endif() endif() diff --git a/cmake/modules/FindLibVORI.cmake b/cmake/modules/FindLibVORI.cmake index d18fedd6be..5ced61e2ed 100644 --- a/cmake/modules/FindLibVORI.cmake +++ b/cmake/modules/FindLibVORI.cmake @@ -23,15 +23,17 @@ else() CP2K_LIBVORI_LINK_LIBRARIES) endif() -if(NOT TARGET cp2k::VORI::vori) - add_library(cp2k::VORI::vori INTERFACE IMPORTED) - set_target_properties( - cp2k::VORI::vori PROPERTIES INTERFACE_LINK_LIBRARIES - "${CP2K_LIBVORI_LINK_LIBRARIES}") - if(CP2K_LIBVORI_INCLUDE_DIRS) +if(CP2K_LIBVORI_FOUND) + if(NOT TARGET cp2k::VORI::vori) + add_library(cp2k::VORI::vori INTERFACE IMPORTED) set_target_properties( - cp2k::VORI::vori PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${CP2K_LIBVORI_INCLUDE_DIRS}") + cp2k::VORI::vori PROPERTIES INTERFACE_LINK_LIBRARIES + "${CP2K_LIBVORI_LINK_LIBRARIES}") + if(CP2K_LIBVORI_INCLUDE_DIRS) + set_target_properties( + cp2k::VORI::vori PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${CP2K_LIBVORI_INCLUDE_DIRS}") + endif() endif() endif() diff --git a/cmake/modules/FindMKL.cmake b/cmake/modules/FindMKL.cmake index 296f81cff6..91624238fe 100644 --- a/cmake/modules/FindMKL.cmake +++ b/cmake/modules/FindMKL.cmake @@ -321,8 +321,6 @@ foreach(_libtype "ST" "DYN") TOLOWER "${_mpi_impl}_${_iface}_${_bits}_${_threading}_${_libtype}" _tgt_config) - set(_scalapack_tgt cp2k::BLAS::MKL::scalapack_${_tgt_config}) - if(_mkl_blacs_lib AND TARGET ${_mkl_tgt} AND TARGET MPI::MPI_CXX @@ -348,7 +346,10 @@ foreach(_libtype "ST" "DYN") if(_mkl_scalapack_lib AND NOT TARGET cp2k::BLAS::MKL::scalapack_${_tgt_config}) - set(_scalapack_libs "${_mkl_scalapack_lib}" "${_blacs_tgt}") + set(_scalapack_libs "${_mkl_scalapack_lib}") + if(TARGET cp2k::BLAS::MKL::blacs_${_tgt_config}) + list(APPEND _scalapack_libs cp2k::BLAS::MKL::blacs_${_tgt_config}) + endif() add_library(cp2k::BLAS::MKL::scalapack_${_tgt_config} INTERFACE IMPORTED) set_target_properties( diff --git a/cmake/modules/FindMiMiC.cmake b/cmake/modules/FindMiMiC.cmake index 71b5a0c1eb..fd063f2714 100644 --- a/cmake/modules/FindMiMiC.cmake +++ b/cmake/modules/FindMiMiC.cmake @@ -25,7 +25,9 @@ endif() if(NOT CP2K_MIMIC_FOUND) find_library(CP2K_MIMIC_LIBRARIES mclf PATH_SUFFIXES MiMiC) find_library(CP2K_MIMICc_LIBRARIES mcl PATH_SUFFIXES MiMiC) - set(CP2K_MIMIC_FOUND True) + if(CP2K_MIMIC_LIBRARIES AND CP2K_MIMICc_LIBRARIES) + set(CP2K_MIMIC_FOUND True) + endif() endif() if(CP2K_MIMIC_FOUND) diff --git a/cmake/modules/FindNVHPCBlas.cmake b/cmake/modules/FindNVHPCBlas.cmake index 0d9db65ac5..5a783a9b3e 100644 --- a/cmake/modules/FindNVHPCBlas.cmake +++ b/cmake/modules/FindNVHPCBlas.cmake @@ -12,7 +12,7 @@ include(FindPackageHandleStandardArgs) include(cp2k_utils) -cp2k_set_default_paths(CP2K_NVHPC "NVHPC") +cp2k_set_default_paths(NVHPC "NVHPC") find_library( CP2K_NVHPC_BLAS_LP64 @@ -55,36 +55,39 @@ find_path( find_package_handle_standard_args( NVHPCBlas DEFAULT_MSG - CP2K_NVHPC_INCLUDE_DIRS_ipl64 + CP2K_NVHPC_BLAS_INCLUDE_DIRS_ilp64 CP2K_NVHPC_BLAS_INCLUDE_DIRS_lp64 CP2K_NVHPC_BLAS_ILP64 CP2K_NVHPC_BLAS_LP64 CP2K_NVHPC_LAPACK_ILP64 CP2K_NVHPC_LAPACK_LP64) -set(CP2K_BLAS_VENDOR "NVHPCBlas") -set(CP2K_NVHPCBLAS_FOUND "ON") +set(CP2K_NVHPCBLAS_FOUND ${NVHPCBlas_FOUND}) -if(NOT TARGET cp2k::BLAS::NVHPCBlas::nvhpcblas) - add_library(cp2k::BLAS::NVHPCBlas::nvhpcblas INTERFACE IMPORTED) - add_library(cp2k::BLAS::NVHPCBlas::blas ALIAS - cp2k::BLAS::NVHPCBlas::nvhpcblas) +if(CP2K_NVHPCBLAS_FOUND) + set(CP2K_BLAS_VENDOR "NVHPCBlas") + + if(NOT TARGET cp2k::BLAS::NVHPCBlas::nvhpcblas) + add_library(cp2k::BLAS::NVHPCBlas::nvhpcblas INTERFACE IMPORTED) + add_library(cp2k::BLAS::NVHPCBlas::blas ALIAS + cp2k::BLAS::NVHPCBlas::nvhpcblas) + endif() + + if(CP2K_BLAS_INTERFACE MATCHES "64bits") + set(CP2K_NVHPC_BLAS_LINK_LIBRARIES + "${CP2K_NVHPC_LAPACK_ILP64};${CP2K_NVHPC_BLAS_ILP64}") + set(CP2K_NVHPC_BLAS_INCLUDE_DIRS "${CP2K_NVHPC_BLAS_INCLUDE_DIRS_ilp64}") + else() + set(CP2K_NVHPC_BLAS_LINK_LIBRARIES + "${CP2K_NVHPC_LAPACK_LP64};${CP2K_NVHPC_BLAS_LP64}") + set(CP2K_NVHPC_BLAS_INCLUDE_DIRS "${CP2K_NVHPC_BLAS_INCLUDE_DIRS_lp64}") + endif() + + set_target_properties( + cp2k::BLAS::NVHPCBlas::nvhpcblas + PROPERTIES INTERFACE_LINK_LIBRARIES "${CP2K_NVHPC_BLAS_LINK_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${CP2K_NVHPC_BLAS_INCLUDE_DIRS}") endif() -if(CP2K_BLAS_INTERFACE MATCHES "64bits") - set(CP2K_NVHPC_BLAS_LINK_LIBRARIES - "${CP2K_NVHPC_LAPACK_ILP64} ${CP2K_NVHPC_BLAS_ILP64}") - set(CP2K_NVHPC_BLAS_INCLUDE_DIRS "${CP2K_NVHPC_INCLUDE_DIRS_ipl64}") -else() - set(CP2K_NVHPC_BLAS_LINK_LIBRARIES "${CP2K_NVHPC_LAPACK_LP64} - ${CP2K_NVHPC_BLAS_LP64}") - set(CP2K_NVHPC_BLAS_INCLUDE_DIRS "${CP2K_NVHPC_INCLUDE_DIRS_pl64}") -endif() - -set_target_properties( - cp2k::BLAS::NVHPCBlas::nvhpcblas - PROPERTIES INTERFACE_LINK_LIBRARIES "${CP2K_NVHPC_BLAS_LINK_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${CP2K_NVHPC_BLAS_INCLUDE_DIRS}") - mark_as_advanced(CP2K_NVHPCBLAS_FOUND CP2K_NVHPC_BLAS_INCLUDE_DIRS CP2K_NVHPC_BLAS_LINK_LIBRARIES CP2K_BLAS_VENDOR) diff --git a/cmake/modules/FindOpenBLAS.cmake b/cmake/modules/FindOpenBLAS.cmake index d075afc67a..53ee38f789 100644 --- a/cmake/modules/FindOpenBLAS.cmake +++ b/cmake/modules/FindOpenBLAS.cmake @@ -25,7 +25,7 @@ endif() if(NOT CP2K_OPENBLAS_FOUND) set(CP2K_OPENBLAS64_ROOT ${CP2K_OPENBLAS_ROOT}) - set(CP2K_OPENBLA_THREADS_ROOT ${CP2K_OPENBLAS_ROOT}) + set(CP2K_OPENBLAS_THREADS_ROOT ${CP2K_OPENBLAS_ROOT}) cp2k_find_libraries(OPENBLAS "openblas") cp2k_find_libraries(OPENBLAS64 "openblas64") cp2k_find_libraries(OPENBLAS_THREADS "openblas_threads;openblas_omp") diff --git a/cmake/modules/Findlibsmeagol.cmake b/cmake/modules/Findlibsmeagol.cmake index e84a880bdb..5c121cb85e 100644 --- a/cmake/modules/Findlibsmeagol.cmake +++ b/cmake/modules/Findlibsmeagol.cmake @@ -24,15 +24,17 @@ else() CP2K_LIBSMEAGOL_LINK_LIBRARIES) endif() -if(NOT TARGET cp2k::libsmeagol::smeagol) - add_library(cp2k::libsmeagol::smeagol INTERFACE IMPORTED) - set_target_properties( - cp2k::libsmeagol::smeagol PROPERTIES INTERFACE_LINK_LIBRARIES - "${CP2K_LIBSMEAGOL_LINK_LIBRARIES}") - if(CP2K_LIBSMEAGOL_INCLUDE_DIRS) +if(CP2K_LIBSMEAGOL_FOUND) + if(NOT TARGET cp2k::libsmeagol::smeagol) + add_library(cp2k::libsmeagol::smeagol INTERFACE IMPORTED) set_target_properties( - cp2k::libsmeagol::smeagol PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${CP2K_LIBSMEAGOL_INCLUDE_DIRS}") + cp2k::libsmeagol::smeagol PROPERTIES INTERFACE_LINK_LIBRARIES + "${CP2K_LIBSMEAGOL_LINK_LIBRARIES}") + if(CP2K_LIBSMEAGOL_INCLUDE_DIRS) + set_target_properties( + cp2k::libsmeagol::smeagol PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${CP2K_LIBSMEAGOL_INCLUDE_DIRS}") + endif() endif() endif() diff --git a/cmake/modules/Finducc.cmake b/cmake/modules/Finducc.cmake index ea73d478da..6519b2a06a 100644 --- a/cmake/modules/Finducc.cmake +++ b/cmake/modules/Finducc.cmake @@ -24,23 +24,27 @@ find_package_handle_standard_args( ucc DEFAULT_MSG CP2K_UCC_INCLUDE_DIRS CP2K_UCC_LINK_LIBRARIES CP2K_UCX_LINK_LIBRARIES) -if(CP2K_UCX_FOUND AND NOT TARGET cp2k::UCC::ucx) - add_library(cp2k::UCC::ucx INTERFACE IMPORTED) - set_target_properties(cp2k::UCC::ucx PROPERTIES INTERFACE_LINK_LIBRARIES - "${CP2K_UCX_LINK_LIBRARIES}") -else() +if(NOT CP2K_UCX_FOUND) message(FATAL_ERROR "ucx required by CuSolverMP") endif() -if(CP2K_UCC_FOUND AND NOT TARGET cp2k::UCC::ucc) +if(NOT TARGET cp2k::UCC::ucx) + add_library(cp2k::UCC::ucx INTERFACE IMPORTED) + set_target_properties(cp2k::UCC::ucx PROPERTIES INTERFACE_LINK_LIBRARIES + "${CP2K_UCX_LINK_LIBRARIES}") +endif() + +if(NOT CP2K_UCC_FOUND) + message(FATAL_ERROR "ucc required by CuSolverMP") +endif() + +if(NOT TARGET cp2k::UCC::ucc) add_library(cp2k::UCC::ucc INTERFACE IMPORTED) set_target_properties( cp2k::UCC::ucc PROPERTIES INTERFACE_LINK_LIBRARIES "${CP2K_UCC_LINK_LIBRARIES};cp2k::UCC::ucx") set_target_properties(cp2k::UCC::ucc PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CP2K_UCC_INCLUDE_DIRS}") -else() - message(FATAL_ERROR "ucc required by CuSolverMP") endif() mark_as_advanced(CP2K_UCX_LINK_LIBRARIES) diff --git a/cmake/modules/cp2k_utils.cmake b/cmake/modules/cp2k_utils.cmake index 25c54d953b..a2faf10e37 100644 --- a/cmake/modules/cp2k_utils.cmake +++ b/cmake/modules/cp2k_utils.cmake @@ -79,7 +79,7 @@ function(cp2k_include_dirs _package_name _library_include_file) NAMES ${_library_include_file} PATHS "${CP2K_${_package_name}_ROOT}" HINTS "${CP2K_${_package_name}_ROOT}" - PATH_SUFFIXES "include" "include/${_pacakge_name}" "${_package_name}") + PATH_SUFFIXES "include" "include/${_package_name}" "${_package_name}") set(CP2K_${_package_name}_INCLUDE_DIRS "${CP2K_${_package_name}_INCLUDE_DIRS_TMP}" @@ -126,6 +126,7 @@ function(cp2k_compare_src_with_list _list_files _extension _exclude_list) set(found_list_size_ 0) endfunction() +# cmake-lint: disable=R0912,R0915 macro(cp2k_FindPackage name) #[===[.md # cp2k_FindPackage @@ -217,7 +218,7 @@ macro(cp2k_FindPackage name) list(APPEND ARGS_PKG_MODULE_SPECS "${_pkg_name}>=${${name}_FIND_VERSION_MIN}") endforeach() - elseif({${name}_FIND_VERSION_EXACT) + elseif(${name}_FIND_VERSION_EXACT) # Requesting exact version foreach(_pkg_name IN LISTS ARGS_PKG_MODULE_NAMES) list(APPEND ARGS_PKG_MODULE_SPECS diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e0e028ba77..e15cd5c8b8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1554,6 +1554,7 @@ if(CP2K_USE_CUDA set(CP2K_DBM_OPENCL_KERNEL dbm/dbm_multiply_opencl.cl) set(CP2K_DBM_OPENCL_GENHDR "${CMAKE_CURRENT_BINARY_DIR}/${CP2K_DBM_OPENCL_KERNEL}.h") + # cmake-lint: disable=E1126 add_custom_command( COMMAND ${CP2K_OPENCL_SCRIPT} -b 6 -p \"\" -I "${CP2K_OPENCL_BACKEND}" @@ -1806,13 +1807,18 @@ target_link_libraries( $<$,$>:gcov>) set(CP2K_BUILD_INFO_FILE "${CMAKE_CURRENT_BINARY_DIR}/cp2k_build_info.h") -file(WRITE "${CP2K_BUILD_INFO_FILE}" "#define __COMPILE_DATE \"unknown\"\n") +file( + WRITE "${CP2K_BUILD_INFO_FILE}" + "#define __COMPILE_DATE \"unknown\"\n#define __COMPILE_REVISION \"unknown\"\n" +) add_custom_target( cp2k_build_info - COMMAND ${CMAKE_COMMAND} -DOUTPUT_FILE=${CP2K_BUILD_INFO_FILE} -P - ${PROJECT_SOURCE_DIR}/cmake/GenerateCp2kBuildInfo.cmake + COMMAND + ${CMAKE_COMMAND} -DOUTPUT_FILE=${CP2K_BUILD_INFO_FILE} + -DSOURCE_DIR=${PROJECT_SOURCE_DIR} -P + ${PROJECT_SOURCE_DIR}/cmake/GenerateCp2kBuildInfo.cmake BYPRODUCTS ${CP2K_BUILD_INFO_FILE} - COMMENT "Updating CP2K build timestamp" + COMMENT "Updating CP2K build timestamp and git revision" VERBATIM) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/cp2k_info.F PROPERTIES OBJECT_DEPENDS "${CP2K_BUILD_INFO_FILE}") @@ -1828,7 +1834,6 @@ target_compile_definitions( $<$:__parallel> $<$:__MPI_F08> __COMPILE_HOST=\"${CP2K_HOST_NAME}\" - __COMPILE_REVISION=\"${CP2K_GIT_HASH}\" __DATA_DIR=\"${CP2K_DATA_DIR}\" __COMPILE_ARCH=\"${CMAKE_SYSTEM_PROCESSOR}\" $<$:__PLUMED2> diff --git a/tools/precommit/check_file_properties.py b/tools/precommit/check_file_properties.py index 9de9048880..3fe53667ff 100755 --- a/tools/precommit/check_file_properties.py +++ b/tools/precommit/check_file_properties.py @@ -93,6 +93,7 @@ FLAG_EXCEPTIONS_RE = re.compile(r"|".join(FLAG_EXCEPTIONS)) PORTABLE_FILENAME_RE = re.compile(r"^[a-zA-Z0-9._/#~=+-]*$") OP_RE = re.compile(r"[\\|()!&><=*/+-]") NUM_RE = re.compile(r"[0-9]+[ulUL]*") +NO_DEFAULT_PATH_RE = re.compile(r"\bNO_DEFAULT_PATH\b") CP2K_FLAGS_RE = re.compile( r"FUNCTION cp2k_flags\(\)(.*)END FUNCTION cp2k_flags", re.DOTALL ) @@ -309,6 +310,14 @@ def check_file(path: pathlib.Path) -> List[str]: f"{path}: CMake option {opt} not mentioned in docs/technologies section nor build-from-source.md" ] + # NO_DEFAULT_PATH disables searching CMAKE_PREFIX_PATH and other default + # locations, which breaks Spack, system-package, and HPC-module installs + # unless every possible layout is hand-enumerated in PATHS/HINTS - don't use it. + if ( + fn_ext == ".cmake" or path.name == "CMakeLists.txt" + ) and NO_DEFAULT_PATH_RE.search(content): + warnings += [f"{path}: Found NO_DEFAULT_PATH, please remove it"] + # Check for DOIs that could be a bibliography reference. if re.match(r"docs/[^/]+/.*\.md", str(path)) and "docs/CP2K_INPUT" not in str(path): for line in content.splitlines(): diff --git a/tools/precommit/cmake-lint.yaml b/tools/precommit/cmake-lint.yaml new file mode 100644 index 0000000000..b5f5d0e558 --- /dev/null +++ b/tools/precommit/cmake-lint.yaml @@ -0,0 +1,27 @@ +lint: + disabled_codes: + # Missing docstring on function/macro declaration - not CP2K's convention. + - C0111 + # Line too long - false positive on the "#!"-style license banner that + # every .cmake/CMakeLists.txt file starts with; cmake-format deliberately + # does not rewrap "#!" comment lines, so they stay at their original width. + - C0301 + # Invalid variable/argument/macro name - CP2K's convention is to prefix + # local/private names with one or more underscores (e.g. "_package_name", + # "__var") and to use snake_case for macros, neither of which matches + # cmake-lint's default naming patterns. This also fires spuriously on + # dynamically composed variable names like "CP2K_${_varname}_ROOT", which + # no static naming pattern can ever match. + - C0103 + # Missing COMMENT in add_custom_command()/add_custom_target() - stylistic, + # not required by this codebase. + - C0113 + # Bad indentation on wrapped multi-line arguments - cmake-lint's + # indentation heuristic disagrees with cmake-format's own line-wrapping + # in several already-formatted, correct files; not a reliable signal here. + - C0307 + # "String looks like a variable reference missing an open tag" - false + # positive on deliberately-escaped "\${VAR}" references inside + # install(CODE "...") scripts, where the escaping defers expansion to + # install time on purpose. + - W0106 diff --git a/tools/precommit/precommit.py b/tools/precommit/precommit.py index 173bfcb0c8..fbf3b87e31 100755 --- a/tools/precommit/precommit.py +++ b/tools/precommit/precommit.py @@ -256,6 +256,7 @@ def process_file(fn: str, allow_modifications: bool) -> None: if re.match(r"(.*/CMakeLists.txt)|(.*\.cmake)$", fn): run_remote_tool("cmakeformat", fn) + run_remote_tool("cmakelint", fn) if re.match(r"./data/.*POTENTIALS?$", fn): check_data_files() diff --git a/tools/precommit/precommit_server.py b/tools/precommit/precommit_server.py index ad7a67b2fc..d3f81467c2 100644 --- a/tools/precommit/precommit_server.py +++ b/tools/precommit/precommit_server.py @@ -67,6 +67,18 @@ def cmakeformat(): return run_tool(["cmake-format", "-i"], timeout=30) +# ====================================================================================== +@app.route("/cmakelint", methods=["POST"]) +def cmakelint(): + # Note: the config path must be passed as a single "--flag=value" token. + # cmake-lint's "-c"/"--config-files" option is nargs="+", so passing it as + # two separate argv tokens ("-c", path) would greedily swallow the target + # filename that run_tool() appends as another config file, and silently + # scan zero files instead. + config = f"--config-files={os.getcwd()}/cmake-lint.yaml" + return run_tool(["cmake-lint", config], timeout=30) + + # ====================================================================================== @app.route("/fortitude", methods=["POST"]) def fortitude(): diff --git a/tools/precommit/requirements.txt b/tools/precommit/requirements.txt index 7039e65c9a..efef9f6b05 100644 --- a/tools/precommit/requirements.txt +++ b/tools/precommit/requirements.txt @@ -23,6 +23,7 @@ mypy_extensions==1.1.0 packaging==26.0 pathspec==1.0.4 platformdirs==4.9.2 +pyyaml==6.0.3 pytokens==0.4.1 ruamel.yaml==0.19.1 six==1.17.0