From 322cb653fa365ef9e39d2fcfe01cdc2a08c58e3f Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Wed, 2 Apr 2025 11:57:41 +0200 Subject: [PATCH 1/3] Modernize the Config.cmake export Signed-off-by: Cristian Le --- CMAKE/scalapack-config-build.cmake.in | 1 - CMAKE/scalapack-config-install.cmake.in | 2 - CMAKE/scalapack-config-version.cmake.in | 8 ---- CMAKE/scalapackConfig.cmake.in | 21 +++++++++ CMakeLists.txt | 57 ++++++++++++++----------- TESTING/CMakeLists.txt | 18 ++++---- TESTING/traditional/CMakeLists.txt | 2 +- 7 files changed, 62 insertions(+), 47 deletions(-) delete mode 100644 CMAKE/scalapack-config-build.cmake.in delete mode 100644 CMAKE/scalapack-config-install.cmake.in delete mode 100644 CMAKE/scalapack-config-version.cmake.in create mode 100644 CMAKE/scalapackConfig.cmake.in diff --git a/CMAKE/scalapack-config-build.cmake.in b/CMAKE/scalapack-config-build.cmake.in deleted file mode 100644 index 4afc2731..00000000 --- a/CMAKE/scalapack-config-build.cmake.in +++ /dev/null @@ -1 +0,0 @@ -include("@SCALAPACK_BINARY_DIR@/scalapack-targets.cmake") diff --git a/CMAKE/scalapack-config-install.cmake.in b/CMAKE/scalapack-config-install.cmake.in deleted file mode 100644 index 560cf624..00000000 --- a/CMAKE/scalapack-config-install.cmake.in +++ /dev/null @@ -1,2 +0,0 @@ -get_filename_component(_SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -include(${_SELF_DIR}/scalapack-targets.cmake) diff --git a/CMAKE/scalapack-config-version.cmake.in b/CMAKE/scalapack-config-version.cmake.in deleted file mode 100644 index afba17ee..00000000 --- a/CMAKE/scalapack-config-version.cmake.in +++ /dev/null @@ -1,8 +0,0 @@ -set(PACKAGE_VERSION "@SCALAPACK_VERSION@") -if(NOT ${PACKAGE_FIND_VERSION} VERSION_GREATER ${PACKAGE_VERSION}) - set(PACKAGE_VERSION_COMPATIBLE 1) - if(${PACKAGE_FIND_VERSION} VERSION_EQUAL ${PACKAGE_VERSION}) - set(PACKAGE_VERSION_EXACT 1) - endif() -endif() - diff --git a/CMAKE/scalapackConfig.cmake.in b/CMAKE/scalapackConfig.cmake.in new file mode 100644 index 00000000..34ac2613 --- /dev/null +++ b/CMAKE/scalapackConfig.cmake.in @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.17...4.0) + +@PACKAGE_INIT@ + +include(${CMAKE_CURRENT_LIST_DIR}/scalapackTargets.cmake) + +# Deprecated compatibility shims +if(TARGET scalapack::scalapack) + add_library(scalapack INTERFACE IMPORTED) + target_link_libraries(scalapack INTERFACE scalapack::scalapack) + set_target_properties(scalapack PROPERTIES + DEPRECATION "Target scalapack is deprecated, use scalapack::scalapack instead." + ) +endif() +if(TARGET scalapack::scalapack-F) + add_library(scalapack-F INTERFACE IMPORTED) + target_link_libraries(scalapack-F INTERFACE scalapack::scalapack-F) + set_target_properties(scalapack-F PROPERTIES + DEPRECATION "Target scalapack-F is deprecated, use scalapack::scalapack-F instead." + ) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 47ccc9ab..90d2e75f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,10 +72,11 @@ if (UNIX) endif () endif () +# TODO: Remove this macro macro(SCALAPACK_install_library lib) - install(TARGETS ${lib} EXPORT scalapack-targets - RUNTIME DESTINATION Testing - ) +install(TARGETS ${lib} + EXPORT scalapackTargets +) endmacro() # -------------------------------------------------- @@ -227,6 +228,7 @@ append_subdir_files(src-C "SRC") if (NOT MSVC) set_source_files_properties(TOOLS/SL_gridreshape.c PROPERTIES COMPILE_OPTIONS "-Wno-error=implicit-function-declaration") add_library(scalapack ${blacs} ${tools} ${tools-C} ${extra_lapack} ${pblas} ${pblas-F} ${ptzblas} ${ptools} ${pbblas} ${redist} ${src} ${src-C}) + add_library(scalapack::scalapack ALIAS scalapack) set_target_properties(scalapack PROPERTIES VERSION ${SCALAPACK_VERSION} SOVERSION ${SCALAPACK_VERSION_MAJOR}.${SCALAPACK_VERSION_MINOR}) @@ -235,11 +237,13 @@ if (NOT MSVC) else () # Need to separate Fortran and C Code OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON ) add_library(scalapack ${blacs} ${tools-C} ${pblas} ${ptools} ${redist} ${src-C}) + add_library(scalapack::scalapack ALIAS scalapack) set_target_properties(scalapack PROPERTIES VERSION ${SCALAPACK_VERSION} SOVERSION ${SCALAPACK_VERSION_MAJOR}.${SCALAPACK_VERSION_MINOR}) target_link_libraries( scalapack ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} MPI::MPI_C) add_library(scalapack-F ${pblas-F} ${pbblas} ${ptzblas} ${tools} ${src} ${extra_lapack} ) + add_library(scalapack::scalapack-F ALIAS scalapack-F) set_target_properties(scalapack-F PROPERTIES VERSION ${SCALAPACK_VERSION} SOVERSION ${SCALAPACK_VERSION_MAJOR}.${SCALAPACK_VERSION_MINOR}) @@ -289,8 +293,6 @@ INCLUDE(CPack) # -------------------------------------------------- -export(TARGETS scalapack FILE scalapack-targets.cmake) - if( NOT LAPACK_FOUND ) install(FILES ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} @@ -298,24 +300,29 @@ if( NOT LAPACK_FOUND ) ) endif( NOT LAPACK_FOUND ) -configure_file(${SCALAPACK_SOURCE_DIR}/CMAKE/scalapack-config-version.cmake.in - ${SCALAPACK_BINARY_DIR}/scalapack-config-version.cmake @ONLY) -configure_file(${SCALAPACK_SOURCE_DIR}/CMAKE/scalapack-config-build.cmake.in - ${SCALAPACK_BINARY_DIR}/scalapack-config.cmake @ONLY) - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scalapack.pc.in ${CMAKE_CURRENT_BINARY_DIR}/scalapack.pc) - install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/scalapack.pc - DESTINATION ${PKG_CONFIG_DIR} - ) - -configure_file(${SCALAPACK_SOURCE_DIR}/CMAKE/scalapack-config-install.cmake.in - ${SCALAPACK_BINARY_DIR}/CMakeFiles/scalapack-config.cmake @ONLY) +include(CMakePackageConfigHelpers) +configure_package_config_file( + CMAKE/scalapackConfig.cmake.in + scalapackConfig.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapack +) +write_basic_package_version_file( + scalapackConfigVersion.cmake + COMPATIBILITY SameMajorVersion +) + +install(EXPORT scalapackTargets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapack + NAMESPACE scalapack +) + +configure_file(scalapack.pc.in scalapack.pc @ONLY) install(FILES - ${SCALAPACK_BINARY_DIR}/CMakeFiles/scalapack-config.cmake - ${SCALAPACK_BINARY_DIR}/scalapack-config-version.cmake - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapack-${SCALAPACK_VERSION} - ) - -install(EXPORT scalapack-targets - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapack-${SCALAPACK_VERSION}) + ${CMAKE_CURRENT_BINARY_DIR}/scalapack.pc + DESTINATION ${PKG_CONFIG_DIR} +) +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/scalapackConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/scalapackConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/scalapack +) diff --git a/TESTING/CMakeLists.txt b/TESTING/CMakeLists.txt index 9242ddd3..d21e0c54 100644 --- a/TESTING/CMakeLists.txt +++ b/TESTING/CMakeLists.txt @@ -1,16 +1,14 @@ cmake_minimum_required(VERSION 3.26...4.0) -## Old test-suite to be modernized -# include only if this is included via `add_subdirectory` - -if(DEFINED SCALAPACK_SOURCE_DIR) - add_subdirectory(traditional) -endif() - -## Modern test-suite is an independent project - -# TODO: Add the implementations project(scalapack-tests LANGUAGES C Fortran ) + +if(NOT TARGET scalapack::scalapack) + find_package(scalapack REQUIRED CONFIG) +endif() + enable_testing() + +# Old test-suite +add_subdirectory(traditional) diff --git a/TESTING/traditional/CMakeLists.txt b/TESTING/traditional/CMakeLists.txt index f78e8953..d8cb7575 100644 --- a/TESTING/traditional/CMakeLists.txt +++ b/TESTING/traditional/CMakeLists.txt @@ -40,7 +40,7 @@ set(genex_gfortran_10 function(setup_test_target) foreach(target IN LISTS ARGN) target_link_libraries(${target} PRIVATE - scalapack + scalapack::scalapack ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} MPI::MPI_Fortran From a26596c1e7103ff04c89d488be77068c51180b72 Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Wed, 2 Apr 2025 13:14:03 +0200 Subject: [PATCH 2/3] Add test-framework for CMake projects Signed-off-by: Cristian Le --- CMakeLists.txt | 10 +++ TESTING/CMakeLists.txt | 3 + TESTING/cmake/scalapack_tests_helpers.cmake | 77 +++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 TESTING/cmake/scalapack_tests_helpers.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 90d2e75f..fdfd4e65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -259,6 +259,16 @@ endif() option(SCALAPACK_BUILD_TESTS "Build all tests of the ScaLAPACK library" ON) if(${SCALAPACK_BUILD_TESTS}) add_subdirectory(TESTING) + # Make sure that the build artifacts are exported for the test-suite + foreach(target IN ITEMS scalapack scalapack-F) + if(TARGET ${target}) + export(TARGETS ${target} + FILE scalapackTargets.cmake + NAMESPACE scalapack:: + APPEND + ) + endif() + endforeach() endif() # -------------------------------------------------- diff --git a/TESTING/CMakeLists.txt b/TESTING/CMakeLists.txt index d21e0c54..5e6d0ecf 100644 --- a/TESTING/CMakeLists.txt +++ b/TESTING/CMakeLists.txt @@ -8,6 +8,9 @@ if(NOT TARGET scalapack::scalapack) find_package(scalapack REQUIRED CONFIG) endif() +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +include(scalapack_tests_helpers) + enable_testing() # Old test-suite diff --git a/TESTING/cmake/scalapack_tests_helpers.cmake b/TESTING/cmake/scalapack_tests_helpers.cmake new file mode 100644 index 00000000..6a7d83b3 --- /dev/null +++ b/TESTING/cmake/scalapack_tests_helpers.cmake @@ -0,0 +1,77 @@ +cmake_minimum_required(VERSION 3.26...4.0) +include_guard() + +function(scalapack_add_test test) + #[===[.md + # scalapack_add_test + + Internal helper for adding functional tests of entire CMake projects + + ## Synopsis + ```cmake + scalapack_add_test( + [TEST_NAME ] + [CMAKE_ARGS ...] + [LABELS ...] + ) + ``` + + ## Options + + `` + : Test project to be configured + + This is a subfolder relative to `${CMAKE_CURRENT_SOURCE_DIR}` containing the + test project with `CMakeLists.txt` + + `TEST_NAME` [Default: ``] + : Unique name of the ctest test name being created + + `CMAKE_ARGS` + : Additional CMake args passed to the configure step + ]===] + + set(ARGS_Options) + set(ARGS_OneValue + TEST_NAME + ) + set(ARGS_MultiValue + CMAKE_ARGS + LABELS + ) + cmake_parse_arguments(PARSE_ARGV 1 ARGS "${ARGS_Options}" "${ARGS_OneValue}" "${ARGS_MultiValue}") + # Check required/optional arguments + if(NOT DEFINED ARGS_TEST_NAME) + set(ARGS_TEST_NAME ${test}) + endif() + + if(SCALAPACK_SOURCE_DIR) + # If scalapack is built as part of the same project, use the build artifacts + list(APPEND ARGS_CMAKE_ARGS + -Dscalapack_ROOT=${SCALAPACK_BINARY_DIR} + ) + else() + # Otherwise use `scalapack_DIR` which is created after the `find_package` + list(APPEND ARGS_CMAKE_ARGS + -Dscalapack_ROOT=${scalapack_DIR} + ) + endif() + # Propagate the compilers used + list(APPEND ARGS_CMAKE_ARGS + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} + ) + + add_test(NAME ${ARGS_TEST_NAME} + COMMAND ${CMAKE_CTEST_COMMAND} --build-and-test ${CMAKE_CURRENT_SOURCE_DIR}/${test} + ${CMAKE_CURRENT_BINARY_DIR}/${test} + # Use the same build environment as the current runner + --build-generator "${CMAKE_GENERATOR}" + --build-options + ${ARGS_CMAKE_ARGS} + --test-command ${CMAKE_CTEST_COMMAND} + --test-dir ${CMAKE_CURRENT_BINARY_DIR}/${test} + --no-tests=ignore + --output-on-failure + ) +endfunction() From 3af8f08dddca17f5b311c29d9af3788994c961bb Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Wed, 2 Apr 2025 13:35:05 +0200 Subject: [PATCH 3/3] Add CMake packaging tests Signed-off-by: Cristian Le --- TESTING/CMakeLists.txt | 3 +++ TESTING/package/CMakeLists.txt | 2 ++ TESTING/package/deprecated_targets/CMakeLists.txt | 14 ++++++++++++++ TESTING/package/find_package/CMakeLists.txt | 14 ++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 TESTING/package/CMakeLists.txt create mode 100644 TESTING/package/deprecated_targets/CMakeLists.txt create mode 100644 TESTING/package/find_package/CMakeLists.txt diff --git a/TESTING/CMakeLists.txt b/TESTING/CMakeLists.txt index 5e6d0ecf..a76b13ab 100644 --- a/TESTING/CMakeLists.txt +++ b/TESTING/CMakeLists.txt @@ -15,3 +15,6 @@ enable_testing() # Old test-suite add_subdirectory(traditional) + +# Packaging tests +add_subdirectory(package) diff --git a/TESTING/package/CMakeLists.txt b/TESTING/package/CMakeLists.txt new file mode 100644 index 00000000..bef1d17b --- /dev/null +++ b/TESTING/package/CMakeLists.txt @@ -0,0 +1,2 @@ +scalapack_add_test(find_package) +scalapack_add_test(deprecated_targets) diff --git a/TESTING/package/deprecated_targets/CMakeLists.txt b/TESTING/package/deprecated_targets/CMakeLists.txt new file mode 100644 index 00000000..ad6f30a5 --- /dev/null +++ b/TESTING/package/deprecated_targets/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.26...4.0) + +project(test_find_package + LANGUAGES C Fortran +) + +find_package(scalapack REQUIRED CONFIG) + +# TODO: Add a proper smoke test +if(NOT TARGET scalapack) + message(FATAL_ERROR "scalapack target not present") +endif() + +enable_testing() diff --git a/TESTING/package/find_package/CMakeLists.txt b/TESTING/package/find_package/CMakeLists.txt new file mode 100644 index 00000000..a035b0cd --- /dev/null +++ b/TESTING/package/find_package/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.26...4.0) + +project(test_find_package + LANGUAGES C Fortran +) + +find_package(scalapack REQUIRED CONFIG) + +# TODO: Add a proper smoke test +if(NOT TARGET scalapack::scalapack) + message(FATAL_ERROR "scalapack::scalapack target not present") +endif() + +enable_testing()