From 50abb164306251bbc1b0c298a0f6a4c39cdbede0 Mon Sep 17 00:00:00 2001 From: "Yu-Hsiang M. Tsai" Date: Wed, 29 May 2024 18:40:39 +0200 Subject: [PATCH] make ginkgo be the major library --- cmake/create_test.cmake | 3 --- core/CMakeLists.txt | 59 ++++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/cmake/create_test.cmake b/cmake/create_test.cmake index 31ffc7a4a2a..7fdbe7d4e53 100644 --- a/cmake/create_test.cmake +++ b/cmake/create_test.cmake @@ -41,9 +41,6 @@ function(ginkgo_set_test_target_properties test_target_name test_library_suffix) set_target_properties(${test_target_name} PROPERTIES CUDA_STANDARD 14) target_include_directories(${test_target_name} PRIVATE ${Ginkgo_BINARY_DIR} ${set_properties_ADDITIONAL_INCLUDES}) target_link_libraries(${test_target_name} PRIVATE ginkgo GTest::GTest ${set_properties_ADDITIONAL_LIBRARIES}) - if(MSVC AND BUILD_SHARED_LIBS) - target_link_libraries(${test_target_name} PRIVATE ginkgo_config) - endif() endfunction() function(ginkgo_add_resource_requirement test_name) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 9e6e13bf26e..2d5efec027d 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -1,6 +1,5 @@ add_subdirectory(device_hooks) # placeholders for disabled modules -add_library(ginkgo "") set(config_source config/factorization_config.cpp config/multigrid_config.cpp @@ -8,7 +7,16 @@ set(config_source config/registry.cpp config/solver_config.cpp ) -target_sources(ginkgo +# MSVC: To solve LNK1189, we separate the library as a workaround +# To make ginkgo still be the major library, we make the original to ginkgo_core in MSVC/shared +# TODO: should think another way to solve it like dllexport or def file +set(ginkgo_core "ginkgo") +if(MSVC AND BUILD_SHARED_LIBS) + set(ginkgo_core "ginkgo_core") +endif() + +add_library(${ginkgo_core} "") +target_sources(${ginkgo_core} PRIVATE base/array.cpp base/batch_multi_vector.cpp @@ -110,15 +118,15 @@ target_sources(ginkgo ) if(GINKGO_HAVE_PAPI_SDE) - target_sources(ginkgo PRIVATE log/papi.cpp) + target_sources(${ginkgo_core} PRIVATE log/papi.cpp) endif() if(GINKGO_HAVE_METIS) - target_sources(ginkgo PRIVATE reorder/nested_dissection.cpp) + target_sources(${ginkgo_core} PRIVATE reorder/nested_dissection.cpp) endif() if(GINKGO_BUILD_MPI) - target_sources(ginkgo + target_sources(${ginkgo_core} PRIVATE mpi/exception.cpp distributed/matrix.cpp @@ -127,54 +135,55 @@ if(GINKGO_BUILD_MPI) distributed/preconditioner/schwarz.cpp) endif() +# MSVC/shared: make ginkgo be the major library if(MSVC AND BUILD_SHARED_LIBS) - add_library(ginkgo_config "") - target_sources(ginkgo_config PRIVATE ${config_source}) - ginkgo_compile_features(ginkgo_config) - ginkgo_default_includes(ginkgo_config) - ginkgo_install_library(ginkgo_config) + add_library(ginkgo "") + target_sources(ginkgo PRIVATE ${config_source}) + ginkgo_compile_features(ginkgo) + ginkgo_default_includes(ginkgo) + ginkgo_install_library(ginkgo) if(GINKGO_CHECK_CIRCULAR_DEPS) - ginkgo_check_headers(ginkgo_config "") + ginkgo_check_headers(ginkgo "") endif() else() - target_sources(ginkgo PRIVATE ${config_source}) + target_sources(${ginkgo_core} PRIVATE ${config_source}) endif() -ginkgo_compile_features(ginkgo) +ginkgo_compile_features(${ginkgo_core}) # add a namespace alias so Ginkgo can always be included as Ginkgo::ginkgo # regardless of whether it is installed or added as a subdirectory add_library(Ginkgo::ginkgo ALIAS ginkgo) -target_link_libraries(ginkgo - PUBLIC ginkgo_device ginkgo_omp ginkgo_cuda ginkgo_reference ginkgo_hip ginkgo_dpcpp) if(MSVC AND BUILD_SHARED_LIBS) - target_link_libraries(ginkgo_config PUBLIC ginkgo) + target_link_libraries(ginkgo PUBLIC ${ginkgo_core}) endif() +target_link_libraries(ginkgo + PUBLIC ginkgo_device ginkgo_omp ginkgo_cuda ginkgo_reference ginkgo_hip ginkgo_dpcpp) if(GINKGO_HAVE_PAPI_SDE) - target_link_libraries(ginkgo PUBLIC PAPI::PAPI_SDE) + target_link_libraries(${ginkgo_core} PUBLIC PAPI::PAPI_SDE) endif() if(GINKGO_HAVE_TAU) - target_link_libraries(ginkgo PRIVATE perfstubs) + target_link_libraries(${ginkgo_core} PRIVATE perfstubs) endif() if(GINKGO_HAVE_VTUNE) - target_link_libraries(ginkgo PRIVATE VTune::ITT) + target_link_libraries(${ginkgo_core} PRIVATE VTune::ITT) endif() if(GINKGO_HAVE_METIS) - target_link_libraries(ginkgo PRIVATE METIS::METIS) + target_link_libraries(${ginkgo_core} PRIVATE METIS::METIS) endif() if(GINKGO_BUILD_MPI) - target_link_libraries(ginkgo PUBLIC MPI::MPI_CXX) + target_link_libraries(${ginkgo_core} PUBLIC MPI::MPI_CXX) endif() -ginkgo_default_includes(ginkgo) -ginkgo_install_library(ginkgo) +ginkgo_default_includes(${ginkgo_core}) +ginkgo_install_library(${ginkgo_core}) if(GINKGO_CHECK_CIRCULAR_DEPS) - ginkgo_check_headers(ginkgo "") + ginkgo_check_headers(${ginkgo_core} "") endif() if(GINKGO_BUILD_TESTS) @@ -183,7 +192,7 @@ endif() if(GINKGO_DEVEL_TOOLS AND CMAKE_SYSTEM_NAME STREQUAL "Linux" AND BUILD_SHARED_LIBS) # Copy pretty-printer next to library - add_custom_command(TARGET ginkgo POST_BUILD + add_custom_command(TARGET ${ginkgo_core} POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy "${Ginkgo_SOURCE_DIR}/dev_tools/scripts/gdb-ginkgo.py" "$-gdb.py"