diff --git a/CMakeLists.txt b/CMakeLists.txt index 6fade4d59f21e68559cc68a92fdaaea908f8996d..45b7e87b407306acecb1209736852bf0c4369079 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -271,7 +271,16 @@ if (PUGS_ENABLE_HDF5 MATCHES "^(AUTO|ON)$") set(HIGHFIVE_UNIT_TESTS OFF) # no unit tests set(HIGHFIVE_EXAMPLES OFF) # no examples add_subdirectory(${PUGS_SOURCE_DIR}/packages/HighFive/) - set(HIGHFIVE_TARGET HighFive) + set(HIGHFIVE_TARGET HighFive::HighFive) + + add_library(PkgConfig::HDF5 STATIC IMPORTED) + set_property(TARGET PkgConfig::HDF5 PROPERTY + IMPORTED_LOCATION "${HDF5_LIBRARIES}") + + set_property(TARGET PkgConfig::HDF5 PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${HDF5_INCLUDE_DIRS}") + + set(HDF5_TARGET PkgConfig::HDF5) endif() else() message(STATUS "HDF5 support is deactivated since pugs will not be build with MPI support") @@ -280,6 +289,7 @@ if (PUGS_ENABLE_HDF5 MATCHES "^(AUTO|ON)$") set(PUGS_HAS_HDF5 ${HDF5_FOUND}) else() unset(HIGHFIVE_TARGET) + unset(HDF5_TARGET PkgConfig::HDF5) unset(PUGS_HAS_HDF5) endif() @@ -410,6 +420,10 @@ endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PUGS_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${PUGS_CXX_FLAGS}") + +message(STATUS "CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}") + + # Add debug mode for Standard C++ library (not for AppleClang since it is broken) if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG -D_LIBCPP_DEBUG=1") @@ -682,6 +696,7 @@ target_link_libraries( ) target_include_directories(pugs PUBLIC ${PETSC_INCLUDE_DIRS}) +target_include_directories(pugs PUBLIC ${HDF5_INCLUDE_DIRS}) # Checkpoint management tool add_executable( @@ -899,3 +914,14 @@ endif() message("================================") message("") + +configure_file( + ${PUGS_SOURCE_DIR}/cmake/PugsCompileFlags.cmake.in + ${PUGS_BINARY_DIR}/cmake/PugsCompileFlags.cmake + @ONLY +) + +install( + FILES ${PUGS_BINARY_DIR}/cmake/PugsCompileFlags.cmake + DESTINATION lib/cmake/pugs +) diff --git a/cmake/PugsCompileFlags.cmake.in b/cmake/PugsCompileFlags.cmake.in new file mode 100644 index 0000000000000000000000000000000000000000..83ecd3e6036a82c3e8696d2b75de2f35d724051c --- /dev/null +++ b/cmake/PugsCompileFlags.cmake.in @@ -0,0 +1,10 @@ +@PACKAGE_INIT@ + +set(PUGS_CMAKE_CXX_FLAGS "@CMAKE_CXX_FLAGS@") +set(PUGS_CMAKE_CXX_STANDARD "@CMAKE_CXX_STANDARD@") + +set(PUGS_CMAKE_BUILD_TYPE "@CMAKE_BUILD_TYPE@") +set(PUGS_CMAKE_CXX_COMPILER "@CMAKE_CXX_COMPILER@") +set(PUGS_CMAKE_C_COMPILER "@CMAKE_C_COMPILER@") + +set(PUGS_HAS_MPI "@PUGS_HAS_MPI@") diff --git a/src/utils/checkpointing/CMakeLists.txt b/src/utils/checkpointing/CMakeLists.txt index b051975e8538df40a2b9b8a8d7f0486874cda938..06d34a349ab63a6e0de206908e50a82d418a857a 100644 --- a/src/utils/checkpointing/CMakeLists.txt +++ b/src/utils/checkpointing/CMakeLists.txt @@ -66,4 +66,8 @@ add_dependencies(PugsCheckpointing target_link_libraries( PugsCheckpointing ${HIGHFIVE_TARGET} +# ${HDF5_TARGET} ) + +#target_include_directories(PugsCheckpointing PUBLIC ${HDF5_INCLUDE_DIRS}) +#target_include_directories(PugsAlgebra PUBLIC ${SLEPC_INCLUDE_DIRS}) diff --git a/tools/generate-plugin.sh b/tools/generate-plugin.sh index a99f6976013582125f678a705a7a337dc5c3ac2d..275d1795f79753fbd259a2079119d977c89b7d82 100755 --- a/tools/generate-plugin.sh +++ b/tools/generate-plugin.sh @@ -61,18 +61,32 @@ then exit 1 fi +function substitute() +{ + sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g +} -mkdir "${PLUGIN_LOW}" -mkdir "${PLUGIN_LOW}/cmake" +mkdir -p "${PLUGIN_LOW}/cmake" +mkdir -p "${PLUGIN_LOW}/tests" + +cp "${PUGS_DIR}"/tests/MeshDataBaseForTests.hpp "${PLUGIN_LOW}"/tests/ +cp "${PUGS_DIR}"/tests/MeshDataBaseForTests.cpp "${PLUGIN_LOW}"/tests/ +cp "${PUGS_DIR}"/tests/ParallelCheckerTester.hpp "${PLUGIN_LOW}"/tests/ +cp "${PUGS_DIR}"/tests/ParallelCheckerTester.cpp "${PLUGIN_LOW}"/tests/ +cp "${PUGS_DIR}"/tests/test_main.cpp "${PLUGIN_LOW}"/tests/ +cp "${PUGS_DIR}"/tests/mpi_test_main.cpp "${PLUGIN_LOW}"/tests/ cp "${PUGS_DIR}"/cmake/CheckNotInSources.cmake "${PLUGIN_LOW}"/cmake/ cp "${PUGS_DIR}"/tools/plugin-template/FindPugs.cmake "${PLUGIN_LOW}"/cmake/ cp "${PUGS_DIR}"/.gitignore "${PLUGIN_LOW}" cp "${PUGS_DIR}"/.clang-format "${PLUGIN_LOW}" -cat "${PUGS_DIR}"/tools/plugin-template/CMakeLists.txt-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/CMakeLists.txt -cat "${PUGS_DIR}"/tools/plugin-template/Module.hpp-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.hpp -cat "${PUGS_DIR}"/tools/plugin-template/Module.cpp-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.cpp -cat "${PUGS_DIR}"/tools/plugin-template/README.md-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/README.md + +cat "${PUGS_DIR}"/tools/plugin-template/CMakeLists.txt-template | substitute > "${PLUGIN_LOW}"/CMakeLists.txt +cat "${PUGS_DIR}"/tools/plugin-template/Module.hpp-template | substitute > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.hpp +cat "${PUGS_DIR}"/tools/plugin-template/Module.cpp-template | substitute > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.cpp +cat "${PUGS_DIR}"/tools/plugin-template/README.md-template | substitute > "${PLUGIN_LOW}"/README.md + +cat "${PUGS_DIR}"/tools/plugin-template/tests-CMakeLists.txt-template | substitute > "${PLUGIN_LOW}"/tests/CMakeLists.txt (cd "${PLUGIN_LOW}"; git init -q) (cd "${PLUGIN_LOW}"; git add .) diff --git a/tools/plugin-template/CMakeLists.txt-template b/tools/plugin-template/CMakeLists.txt-template index ae56000c37ed40cf18def1262e67554e0f5ee302..0cafe6d469c220d8dd091c9bdaf03ed4580378f5 100644 --- a/tools/plugin-template/CMakeLists.txt-template +++ b/tools/plugin-template/CMakeLists.txt-template @@ -2,6 +2,14 @@ cmake_minimum_required (VERSION 3.19) project("_PLUGIN_LOW_") +if (NOT PUGS_PREFIX_PATH) + if (DEFINED ENV{PUGS_INSTALL_DIR}) + message(STATUS "Looking for pugs in ${PUGS_INSTALL_DIR}") + else() + message(FATAL_ERROR "you must set PUGS_INSTALL_DIR environment variable") + endif() +endif() + # CMake utils list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") @@ -12,6 +20,21 @@ include(CheckNotInSources) find_package(PkgConfig REQUIRED) find_package(Pugs REQUIRED) +list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/Kokkos") +include(KokkosConfig) + +list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/HighFive") +include(HighFiveConfig) + +list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/pugs") +include(PugsTargets) +include(PugsCompileFlags) + +#------------------------------------------------------ + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PUGS_CMAKE_CXX_FLAGS}") +set(CMAKE_CXX_STANDARD "${PUGS_CMAKE_CXX_STANDARD}") + # ----------------------------------------------------- # dynamic libraries @@ -21,59 +44,25 @@ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") #------------------------------------------------------ -set(CMAKE_CONFIGURATION_TYPES "Release;Debug;Coverage" CACHE STRING INTERNAL FORCE ) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) #------------------------------------------------------ -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(_PLUGIN_UP__SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +set(_PLUGIN_UP__BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}") #------------------------------------------------------ +# use pugs compilation settings -set(PUGS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") -set(PUGS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}") - -# Add new build types -set(CMAKE_CXX_FLAGS_COVERAGE - "-g -O0 --coverage" - CACHE STRING "Flags used by the C++ compiler during coverage builds." - FORCE ) -set(CMAKE_C_FLAGS_COVERAGE - "-g -O0 --coverage" - CACHE STRING "Flags used by the C compiler during coverage builds." - FORCE ) -set(CMAKE_EXE_LINKER_FLAGS_COVERAGE - "--coverage" - CACHE STRING "Flags used for linking binaries during coverage builds." - FORCE ) -set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE - "--coverage" - CACHE STRING "Flags used by the shared libraries linker during coverage builds." - FORCE ) -mark_as_advanced( - CMAKE_CXX_FLAGS_COVERAGE - CMAKE_C_FLAGS_COVERAGE - CMAKE_EXE_LINKER_FLAGS_COVERAGE - CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) - -if(CMAKE_BUILD_TYPE) - string(REGEX MATCH "^(Release|Debug|Coverage)$" VALID_BUILD_TYPE "${CMAKE_BUILD_TYPE}") - if(NOT VALID_BUILD_TYPE) - message(FATAL_ERROR "Invalid CMAKE_BUILD_TYPE: '${CMAKE_BUILD_TYPE}'") - endif() -endif() +set(CMAKE_BUILD_TYPE "${PUGS_CMAKE_BUILD_TYPE}" CACHE STRING "" FORCE) +set(CMAKE_CXX_COMPILER "${PUGS_CMAKE_CXX_COMPILER}" CACHE STRING "" FORCE) +set(CMAKE_C_COMPILER "${PUGS_CMAKE_C_COMPILER}" CACHE STRING "" FORCE) -# Default build type is Release -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING - "Choose the type of build: Release Debug Coverage." - FORCE) -endif() +mark_as_advanced(CMAKE_BUILD_TYPE CMAKE_CXX_COMPILER CMAKE_C_COMPILER) #------------------------------------------------------ # default build shared libraries -if (NOT BUILD_SHARED_LIBS) - set(BUILD_SHARED_LIBS ON CACHE STRING "" FORCE) -endif() +set(BUILD_SHARED_LIBS ON CACHE STRING "" FORCE) #------------------------------------------------------ @@ -82,14 +71,81 @@ set(GNU_CXX_MIN_VERSION "10.0.0") set(CLANG_CXX_MIN_VERSION "11.0.0") #------------------------------------------------------ -# Change Kokkos namespace to avoid conflicts -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DKokkos=InlineKokkos") include_directories("${CMAKE_CURRENT_SOURCE_DIR}") include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include") include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include/kokkos") include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include/tao/") +include_directories(SYSTEM "${MPI_CXX_INCLUDE_DIRS}") + +get_target_property(_prop Pugs::PugsAlgebra INTERFACE_INCLUDE_DIRECTORIES) +set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}") +get_target_property(_prop Pugs::PugsUtils INTERFACE_INCLUDE_DIRECTORIES) +set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}") +get_target_property(_prop Pugs::pugs INTERFACE_INCLUDE_DIRECTORIES) +set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}") + +include_directories(SYSTEM ${PUGS_INC_DIR}) +link_directories(${PUGS_PREFIX_PATH}/lib) + +#------------------------------------------------------ + +if(${PUGS_HAS_MPI}) + set(MPIEXEC_OPTION_FLAGS --oversubscribe) + if (NOT "$ENV{GITLAB_CI}" STREQUAL "") + set(MPIEXEC_OPTION_FLAGS ${MPIEXEC_OPTION_FLAGS} --allow-run-as-root) + endif() + set(MPIEXEC_NUMPROC 3) + set(MPIEXEC_PATH_FLAG --path) + set(MPI_LAUNCHER ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_NUMPROC} ${MPIEXEC_OPTION_FLAGS}) +endif() + +add_custom_target(all_unit_tests + DEPENDS unit_tests mpi_unit_tests +) + +add_custom_target(check + DEPENDS test + ) + +add_custom_target(test + DEPENDS run_all_unit_tests + ) + +add_custom_target(run_all_unit_tests + DEPENDS run_mpi_unit_tests + ) + +if(PUGS_HAS_MPI) + set(RUN_MPI_UNIT_TESTS_COMMENT "Running mpi_unit_tests [using ${MPIEXEC_NUMPROC} procs]") +else() + set(RUN_MPI_UNIT_TESTS_COMMENT "Running mpi_unit_tests [sequentially]") +endif() + +add_custom_target(run_mpi_unit_tests + COMMAND ${MPI_LAUNCHER} "${_PLUGIN_UP__BINARY_DIR}/mpi_unit_tests" --allow-running-no-tests + WORKING_DIRECTORY ${_PLUGIN_UP__BINARY_DIR} + DEPENDS run_unit_tests + COMMENT ${RUN_MPI_UNIT_TESTS_COMMENT} + ) + +add_custom_target(run_unit_tests + COMMAND "${_PLUGIN_UP__BINARY_DIR}/unit_tests" --allow-running-no-tests + DEPENDS all_unit_tests + COMMENT "Running unit_tests" + ) + +#------------------------------------------------------ add_library(_PLUGIN_NAME_ _PLUGIN_NAME_Module.cpp + # add cpp sources files here ) + +#------------------------------------------------------ + +add_subdirectory(tests) + +#------------------------------------------------------ + +install(TARGETS _PLUGIN_NAME_) diff --git a/tools/plugin-template/tests-CMakeLists.txt-template b/tools/plugin-template/tests-CMakeLists.txt-template new file mode 100644 index 0000000000000000000000000000000000000000..026ff2c2962ed988d35e2680b8b97919801c7a4b --- /dev/null +++ b/tools/plugin-template/tests-CMakeLists.txt-template @@ -0,0 +1,95 @@ +set(EXECUTABLE_OUTPUT_PATH ${_PLUGIN_UP__BINARY_DIR}) + +include_directories(${_PLUGIN_UP__SOURCE_DIR}/tests) + +add_executable (unit_tests + test_main.cpp + + # add unit tests here + ) + + set(_PLUGIN_UP__checkpointing_TESTS + ) + +if(PUGS_HAS_HDF5) + list(APPEND _PLUGIN_UP__checkpointing_TESTS + ) +endif(PUGS_HAS_HDF5) + +add_executable (mpi_unit_tests + mpi_test_main.cpp + ${_PLUGIN_UP__checkpointing_TESTS} + + # add mpi unit tests here +) + +add_library(test_MeshDataBase + MeshDataBaseForTests.cpp) + +add_library(test_ParallelCheckerTester + ParallelCheckerTester.cpp) + +target_link_libraries (test_ParallelCheckerTester + ${HIGHFIVE_TARGET}) + +target_link_libraries (unit_tests + test_MeshDataBase + test_ParallelCheckerTester + PugsAlgebra + PugsAnalysis + PugsUtils + PugsLanguage + PugsLanguageAST + PugsLanguageModules + PugsMesh + PugsAlgebra + PugsUtils + PugsLanguageUtils + PugsScheme + PugsOutput + PugsUtils + PugsCheckpointing + PugsDev + PugsAlgebra + PugsMesh + Kokkos::kokkos + ${PARMETIS_LIBRARIES} + ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES} + ${PETSC_LIBRARIES} + Catch2 + ${PUGS_STD_LINK_FLAGS} + ${HIGHFIVE_TARGET} + ${SLURM_LIBRARY} + stdc++fs + ) + +target_link_libraries (mpi_unit_tests + test_MeshDataBase + test_ParallelCheckerTester + PugsAlgebra + PugsAnalysis + PugsUtils + PugsLanguage + PugsLanguageAST + PugsLanguageModules + PugsMesh + PugsAlgebra + PugsUtils + PugsLanguageUtils + PugsScheme + PugsOutput + PugsUtils + PugsCheckpointing + PugsDev + PugsAlgebra + PugsMesh + Kokkos::kokkos + ${PARMETIS_LIBRARIES} + ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES} + ${PETSC_LIBRARIES} + Catch2 + ${PUGS_STD_LINK_FLAGS} + ${HIGHFIVE_TARGET} + ${SLURM_LIBRARY} + stdc++fs + )