From d51431a1c39d3740b9c91a827187ec09515b836f Mon Sep 17 00:00:00 2001 From: Alexander Nesterov Date: Wed, 2 Jul 2025 18:46:03 +0200 Subject: [PATCH 1/3] refactor CMake scripts: centralize target linking functionality --- CMakeLists.txt | 1 + cmake/gtest.cmake | 12 +++++++ cmake/json.cmake | 11 +++++++ cmake/libenvpp.cmake | 18 ++++++++++ cmake/mpi.cmake | 17 +++++++++- cmake/onetbb.cmake | 14 ++++++++ cmake/openmp.cmake | 10 ++++++ cmake/stb.cmake | 5 +++ modules/core/CMakeLists.txt | 65 +++++-------------------------------- 9 files changed, 95 insertions(+), 58 deletions(-) create mode 100644 cmake/stb.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 88f343287..1a0982a27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ include(cmake/modes.cmake) include(cmake/sanitizers.cmake) include(cmake/json.cmake) include(cmake/libenvpp.cmake) +include(cmake/stb.cmake) ################# Parallel programming technologies ################# diff --git a/cmake/gtest.cmake b/cmake/gtest.cmake index a9bdd6f13..eb41a7cd3 100644 --- a/cmake/gtest.cmake +++ b/cmake/gtest.cmake @@ -24,3 +24,15 @@ ExternalProject_Add( "${CMAKE_COMMAND}" --install "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/install") + +function(ppc_link_gtest exec_func_lib) + # Add external project include directories + target_include_directories( + ${exec_func_lib} + PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/googletest/googletest/include) + + add_dependencies(${exec_func_lib} ppc_googletest) + target_link_directories(${exec_func_lib} PUBLIC + "${CMAKE_BINARY_DIR}/ppc_googletest/install/lib") + target_link_libraries(${exec_func_lib} PUBLIC gtest gtest_main) +endfunction() diff --git a/cmake/json.cmake b/cmake/json.cmake index 89070d4b7..882553058 100644 --- a/cmake/json.cmake +++ b/cmake/json.cmake @@ -19,3 +19,14 @@ ExternalProject_Add( INSTALL_COMMAND "${CMAKE_COMMAND}" --install "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/build" --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/install") + +function(ppc_link_json exec_func_lib) + # Add external project include directories + target_include_directories( + ${exec_func_lib} + PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/json/include) + + add_dependencies(${exec_func_lib} ppc_json) + target_link_directories(${exec_func_lib} INTERFACE + "${CMAKE_BINARY_DIR}/ppc_json/install/include") +endfunction() \ No newline at end of file diff --git a/cmake/libenvpp.cmake b/cmake/libenvpp.cmake index 564a7d488..e150de19b 100644 --- a/cmake/libenvpp.cmake +++ b/cmake/libenvpp.cmake @@ -38,3 +38,21 @@ if(WIN32) else() set(PPC_ENVPP_LIB_NAME envpp) endif() + +function(ppc_link_envpp exec_func_lib) + # Add external project include directories + target_include_directories( + ${exec_func_lib} + PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/libenvpp/include) + target_include_directories( + ${exec_func_lib} SYSTEM + PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/libenvpp/external/fmt/include) + + add_dependencies(${exec_func_lib} ppc_libenvpp) + target_link_directories(${exec_func_lib} PUBLIC + "${CMAKE_BINARY_DIR}/ppc_libenvpp/install/lib") + target_link_directories(${exec_func_lib} PUBLIC + "${CMAKE_BINARY_DIR}/ppc_libenvpp/build") + target_link_libraries(${exec_func_lib} PUBLIC ${PPC_ENVPP_LIB_NAME}) + target_link_libraries(${exec_func_lib} PUBLIC ${PPC_FMT_LIB_NAME}) +endfunction() diff --git a/cmake/mpi.cmake b/cmake/mpi.cmake index 8b307ccdd..9394ff932 100644 --- a/cmake/mpi.cmake +++ b/cmake/mpi.cmake @@ -1,4 +1,19 @@ find_package(MPI REQUIRED) if(NOT MPI_FOUND) message(FATAL_ERROR "MPI NOT FOUND") -endif(MPI_FOUND) +endif() + +function(ppc_link_mpi exec_func_lib) + find_package(MPI REQUIRED) + if(MPI_COMPILE_FLAGS) + set_target_properties(${exec_func_lib} PROPERTIES COMPILE_FLAGS + "${MPI_COMPILE_FLAGS}") + endif(MPI_COMPILE_FLAGS) + + if(MPI_LINK_FLAGS) + set_target_properties(${exec_func_lib} PROPERTIES LINK_FLAGS + "${MPI_LINK_FLAGS}") + endif(MPI_LINK_FLAGS) + target_include_directories(${exec_func_lib} PUBLIC ${MPI_INCLUDE_PATH}) + target_link_libraries(${exec_func_lib} PUBLIC ${MPI_LIBRARIES}) +endfunction() diff --git a/cmake/onetbb.cmake b/cmake/onetbb.cmake index df89aa354..b14b2ed0e 100644 --- a/cmake/onetbb.cmake +++ b/cmake/onetbb.cmake @@ -42,3 +42,17 @@ if(cmake_build_type_lower STREQUAL "debug") else() set(PPC_TBB_LIB_NAME tbb) endif() + +function(ppc_link_tbb exec_func_lib) + # Add external project include directories + target_include_directories( + ${exec_func_lib} + PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/onetbb/include) + + add_dependencies(${exec_func_lib} ppc_onetbb) + target_link_directories(${exec_func_lib} PUBLIC + ${CMAKE_BINARY_DIR}/ppc_onetbb/install/lib) + if(NOT MSVC) + target_link_libraries(${exec_func_lib} PUBLIC ${PPC_TBB_LIB_NAME}) + endif() +endfunction() diff --git a/cmake/openmp.cmake b/cmake/openmp.cmake index 445815153..33b56e339 100644 --- a/cmake/openmp.cmake +++ b/cmake/openmp.cmake @@ -23,3 +23,13 @@ if(OpenMP_FOUND) else(OpenMP_FOUND) message(FATAL_ERROR "OpenMP NOT FOUND") endif(OpenMP_FOUND) + +function(ppc_link_threads exec_func_lib) + target_link_libraries(${exec_func_lib} PUBLIC Threads::Threads) +endfunction() + +function(ppc_link_openmp exec_func_lib) + find_package(OpenMP REQUIRED) + target_link_libraries(${exec_func_lib} PUBLIC ${OpenMP_libomp_LIBRARY} + OpenMP::OpenMP_CXX) +endfunction() diff --git a/cmake/stb.cmake b/cmake/stb.cmake new file mode 100644 index 000000000..2770d4440 --- /dev/null +++ b/cmake/stb.cmake @@ -0,0 +1,5 @@ +function(ppc_link_stb exec_func_lib) + add_library(stb_image STATIC ${CMAKE_SOURCE_DIR}/3rdparty/stb_image_wrapper.cpp) + target_include_directories(stb_image PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/stb) + target_link_libraries(${exec_func_lib} PUBLIC stb_image) +endfunction() \ No newline at end of file diff --git a/modules/core/CMakeLists.txt b/modules/core/CMakeLists.txt index 318572711..487b2c9f5 100644 --- a/modules/core/CMakeLists.txt +++ b/modules/core/CMakeLists.txt @@ -29,63 +29,14 @@ target_include_directories( ${exec_func_lib} PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty ${CMAKE_SOURCE_DIR}/modules ${CMAKE_SOURCE_DIR}/tasks) -# Add external project include directories -target_include_directories( - ${exec_func_lib} - PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/onetbb/include - ${CMAKE_SOURCE_DIR}/3rdparty/json/include - ${CMAKE_SOURCE_DIR}/3rdparty/googletest/googletest/include - ${CMAKE_SOURCE_DIR}/3rdparty/libenvpp/include) -target_include_directories( - ${exec_func_lib} SYSTEM - PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/libenvpp/external/fmt/include) - -add_dependencies(${exec_func_lib} ppc_libenvpp) -target_link_directories(${exec_func_lib} PUBLIC - "${CMAKE_BINARY_DIR}/ppc_libenvpp/install/lib") -target_link_directories(${exec_func_lib} PUBLIC - "${CMAKE_BINARY_DIR}/ppc_libenvpp/build") -target_link_libraries(${exec_func_lib} PUBLIC ${PPC_ENVPP_LIB_NAME}) -target_link_libraries(${exec_func_lib} PUBLIC ${PPC_FMT_LIB_NAME}) - -add_dependencies(${exec_func_lib} ppc_json) -target_link_directories(${exec_func_lib} INTERFACE - "${CMAKE_BINARY_DIR}/ppc_json/install/include") - -add_dependencies(${exec_func_lib} ppc_googletest) -target_link_directories(${exec_func_lib} PUBLIC - "${CMAKE_BINARY_DIR}/ppc_googletest/install/lib") -target_link_libraries(${exec_func_lib} PUBLIC gtest gtest_main) - -target_link_libraries(${exec_func_lib} PUBLIC Threads::Threads) - -find_package(OpenMP REQUIRED) -target_link_libraries(${exec_func_lib} PUBLIC ${OpenMP_libomp_LIBRARY} - OpenMP::OpenMP_CXX) - -add_dependencies(${exec_func_lib} ppc_onetbb) -target_link_directories(${exec_func_lib} PUBLIC - ${CMAKE_BINARY_DIR}/ppc_onetbb/install/lib) -if(NOT MSVC) - target_link_libraries(${exec_func_lib} PUBLIC ${PPC_TBB_LIB_NAME}) -endif() - -find_package(MPI REQUIRED) -if(MPI_COMPILE_FLAGS) - set_target_properties(${exec_func_lib} PROPERTIES COMPILE_FLAGS - "${MPI_COMPILE_FLAGS}") -endif(MPI_COMPILE_FLAGS) - -if(MPI_LINK_FLAGS) - set_target_properties(${exec_func_lib} PROPERTIES LINK_FLAGS - "${MPI_LINK_FLAGS}") -endif(MPI_LINK_FLAGS) -target_include_directories(${exec_func_lib} PUBLIC ${MPI_INCLUDE_PATH}) -target_link_libraries(${exec_func_lib} PUBLIC ${MPI_LIBRARIES}) - -add_library(stb_image STATIC ${CMAKE_SOURCE_DIR}/3rdparty/stb_image_wrapper.cpp) -target_include_directories(stb_image PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/stb) -target_link_libraries(${exec_func_lib} PUBLIC stb_image) +ppc_link_envpp(${exec_func_lib}) +ppc_link_json(${exec_func_lib}) +ppc_link_gtest(${exec_func_lib}) +ppc_link_threads(${exec_func_lib}) +ppc_link_openmp(${exec_func_lib}) +ppc_link_tbb(${exec_func_lib}) +ppc_link_mpi(${exec_func_lib}) +ppc_link_stb(${exec_func_lib}) add_executable(${exec_func_tests} ${FUNC_TESTS_SOURCE_FILES}) From 66b0556bc8fc24ddc5b417fe109d46150263c0c9 Mon Sep 17 00:00:00 2001 From: Alexander Nesterov Date: Thu, 30 Oct 2025 15:49:04 +0100 Subject: [PATCH 2/3] refactor CMake scripts: replace `${CMAKE_BUILD_TYPE}` with `$` for improved configurability and adjust target linking logic --- cmake/gtest.cmake | 4 ++-- cmake/json.cmake | 4 ++-- cmake/libenvpp.cmake | 8 +++++--- cmake/onetbb.cmake | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/cmake/gtest.cmake b/cmake/gtest.cmake index aa5624985..046849321 100644 --- a/cmake/gtest.cmake +++ b/cmake/gtest.cmake @@ -20,10 +20,10 @@ ExternalProject_Add( BUILD_COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config - ${CMAKE_BUILD_TYPE} --parallel + $ --parallel INSTALL_COMMAND "${CMAKE_COMMAND}" --install - "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --prefix + "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config $ --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/install") function(ppc_link_gtest exec_func_lib) diff --git a/cmake/json.cmake b/cmake/json.cmake index e7cb80c17..30706b156 100644 --- a/cmake/json.cmake +++ b/cmake/json.cmake @@ -16,10 +16,10 @@ ExternalProject_Add( -DJSON_BuildTests=OFF BUILD_COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/build" - --config ${CMAKE_BUILD_TYPE} --parallel + --config $ --parallel INSTALL_COMMAND "${CMAKE_COMMAND}" --install "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/build" - --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/install") + --config $ --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/install") function(ppc_link_json exec_func_lib) # Add external project include directories diff --git a/cmake/libenvpp.cmake b/cmake/libenvpp.cmake index 0d3adc23b..cf84de447 100644 --- a/cmake/libenvpp.cmake +++ b/cmake/libenvpp.cmake @@ -15,10 +15,10 @@ ExternalProject_Add( -DLIBENVPP_EXAMPLES=OFF BUILD_COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build" - --config ${CMAKE_BUILD_TYPE} --parallel + --config $ --parallel INSTALL_COMMAND "${CMAKE_COMMAND}" --install - "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build" --prefix + "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build" --config $ --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/install") string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower) @@ -48,5 +48,7 @@ function(ppc_link_envpp exec_func_lib) target_link_directories(${exec_func_lib} PUBLIC "${CMAKE_BINARY_DIR}/ppc_libenvpp/build") target_link_libraries(${exec_func_lib} PUBLIC ${PPC_ENVPP_LIB_NAME}) - target_link_libraries(${exec_func_lib} PUBLIC ${PPC_FMT_LIB_NAME}) + target_link_libraries(${exec_func_lib} PUBLIC + $<$:fmtd> + $<$>:fmt>) endfunction() diff --git a/cmake/onetbb.cmake b/cmake/onetbb.cmake index c8b1a1a67..08ef716c9 100644 --- a/cmake/onetbb.cmake +++ b/cmake/onetbb.cmake @@ -29,10 +29,10 @@ if(NOT ENABLE_SYSTEM_TBB) -DTBB_TEST=OFF BUILD_COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/build" - --config ${CMAKE_BUILD_TYPE} --parallel + --config $ --parallel INSTALL_COMMAND "${CMAKE_COMMAND}" --install - "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/build" --prefix + "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/build" --config $ --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/install" TEST_COMMAND ${ppc_onetbb_TEST_COMMAND}) From 324d1597a2faac253853999f2265304193864196 Mon Sep 17 00:00:00 2001 From: Alexander Nesterov Date: Thu, 30 Oct 2025 15:58:15 +0100 Subject: [PATCH 3/3] refactor CMake scripts: streamline INSTALL_COMMAND formatting and adjust target linking --- cmake/gtest.cmake | 8 ++++---- cmake/libenvpp.cmake | 9 ++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/cmake/gtest.cmake b/cmake/gtest.cmake index 046849321..7f0f7d441 100644 --- a/cmake/gtest.cmake +++ b/cmake/gtest.cmake @@ -19,12 +19,12 @@ ExternalProject_Add( $<$:-Dgtest_force_shared_crt=ON> BUILD_COMMAND "${CMAKE_COMMAND}" --build - "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config - $ --parallel + "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config $ + --parallel INSTALL_COMMAND "${CMAKE_COMMAND}" --install - "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config $ --prefix - "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/install") + "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config $ + --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/install") function(ppc_link_gtest exec_func_lib) # Add external project include directories diff --git a/cmake/libenvpp.cmake b/cmake/libenvpp.cmake index cf84de447..c7217a847 100644 --- a/cmake/libenvpp.cmake +++ b/cmake/libenvpp.cmake @@ -18,8 +18,8 @@ ExternalProject_Add( --config $ --parallel INSTALL_COMMAND "${CMAKE_COMMAND}" --install - "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build" --config $ --prefix - "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/install") + "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build" --config $ + --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/install") string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower) if(cmake_build_type_lower STREQUAL "debug") @@ -48,7 +48,6 @@ function(ppc_link_envpp exec_func_lib) target_link_directories(${exec_func_lib} PUBLIC "${CMAKE_BINARY_DIR}/ppc_libenvpp/build") target_link_libraries(${exec_func_lib} PUBLIC ${PPC_ENVPP_LIB_NAME}) - target_link_libraries(${exec_func_lib} PUBLIC - $<$:fmtd> - $<$>:fmt>) + target_link_libraries(${exec_func_lib} PUBLIC $<$:fmtd> + $<$>:fmt>) endfunction()