Browse Source

Migrate to whole-archive linking

- In case if TARGET is specified in qtprotobuf_generate cmake
  function call generated code is licked to target automatically
- User could specify GENERATED_TARGET name to avoid passing TARGET
  as parameter

Fixes: #57, #31
Alexey Edelev 5 years ago
parent
commit
335cdeb570

+ 3 - 1
README.md

@@ -190,7 +190,9 @@ Due to cmake restrictions it's required to specify resulting artifacts manually
 
 **Parameters:**
 
-*TARGET* - name of you target that will be base for generated target name
+*TARGET* - name of you target that generated code archive will be linked to
+
+*GENERATED_TARGET* - name that will be used for generated archive library target. It's usefull when you supposed to have multiple generated targets to be linked to single one.
 
 *OUT_DIR* - output directory that will contain generated artifacts. Usually subfolder in build directory should be used
 

+ 3 - 6
cmake/QtProtobufCommon.cmake

@@ -62,6 +62,7 @@ function(add_test_target)
         file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.proto)
     endif()
 
+    add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
     qtprotobuf_generate(TARGET ${add_test_target_TARGET}
         OUT_DIR ${GENERATED_SOURCES_DIR}
         PROTO_FILES ${PROTO_FILES}
@@ -71,17 +72,13 @@ function(add_test_target)
         QML ${add_test_target_QML}
         PROTO_INCLUDES ${add_test_target_PROTO_INCLUDES})
 
-    add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
-    qtprotobuf_link_archive(${add_test_target_TARGET} ${QtProtobuf_GENERATED})
-
     if(Qt5_POSITION_INDEPENDENT_CODE)
         set_target_properties(${add_test_target_TARGET} PROPERTIES POSITION_INDEPENDENT_CODE FALSE)
         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
     endif()
-    add_dependencies(${add_test_target_TARGET} ${QtProtobuf_GENERATED})
-    target_link_libraries(${add_test_target_TARGET} gtest_main gtest ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
+    target_link_libraries(${add_test_target_TARGET} PUBLIC gtest_main gtest ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
     if (${add_test_target_QML})
-        target_link_libraries(${add_test_target_TARGET} Qt5::Qml)
+        target_link_libraries(${add_test_target_TARGET} PUBLIC Qt5::Qml)
     endif()
 
 endfunction(add_test_target)

+ 35 - 29
cmake/QtProtobufGen.cmake

@@ -1,13 +1,36 @@
+function(qtprotobuf_link_archive TARGET GENERATED_TARGET)
+    set_target_properties(${qtprotobuf_generate_TARGET} PROPERTIES LINKER_LANGUAGE CXX)
+    set_target_properties(${TARGET} PROPERTIES LINK_DIRECTORIES "$<TARGET_FILE_DIR:${GENERATED_TARGET}>")
+    get_target_property(EXISTING_FLAGS ${TARGET} LINK_FLAGS)
+    if(WIN32)
+        if("${EXISTING_FLAGS}" STREQUAL "EXISTING_FLAGS-NOTFOUND")
+            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:${GENERATED_TARGET}")
+        else()
+            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${EXISTING_FLAGS} /WHOLEARCHIVE:${GENERATED_TARGET}")
+        endif()
+    else()
+        target_link_libraries(${TARGET} PRIVATE
+        -Wl,--whole-archive $<TARGET_FILE:${GENERATED_TARGET}> -Wl,--no-whole-archive)
+    endif()
+    target_include_directories(${TARGET} PRIVATE $<TARGET_PROPERTY:${GENERATED_TARGET},INCLUDE_DIRECTORIES>)
+    add_dependencies(${TARGET} ${GENERATED_TARGET})
+endfunction()
+
 function(qtprotobuf_generate)
     set(options)
-    set(oneValueArgs OUT_DIR TARGET MULTI QML GENERATED_HEADERS_VAR)
+    set(oneValueArgs OUT_DIR TARGET GENERATED_TARGET MULTI QML GENERATED_HEADERS_VAR)
     set(multiValueArgs GENERATED_HEADERS EXCLUDE_HEADERS PROTO_FILES PROTO_INCLUDES)
     cmake_parse_arguments(qtprotobuf_generate "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
-    set(QtProtobuf_GENERATED ${qtprotobuf_generate_TARGET}_qtprotobuf_gen PARENT_SCOPE)
-    set(QtProtobuf_GENERATED ${qtprotobuf_generate_TARGET}_qtprotobuf_gen)
+    if(DEFINED qtprotobuf_generate_GENERATED_TARGET)
+        set(GENERATED_TARGET_NAME ${qtprotobuf_generate_GENERATED_TARGET})
+    elseif(DEFINED qtprotobuf_generate_TARGET)
+        set(GENERATED_TARGET_NAME ${qtprotobuf_generate_TARGET}_qtprotobuf_gen)
+    else()
+        message(FATAL_ERROR "Either TARGET or GENERATED_TARGET must be specified")
+    endif()
 
-    set(GEN_TARGET ${qtprotobuf_generate_TARGET}_qtprotobuf_generate)
+    set(GEN_TARGET ${GENERATED_TARGET_NAME}_generate)
     set(GENERATED_HEADERS ${qtprotobuf_generate_GENERATED_HEADERS})
 
     if(NOT DEFINED QTPROTOBUF_EXECUTABLE)
@@ -23,7 +46,7 @@ function(qtprotobuf_generate)
 
     set(GENERATION_OPTIONS ${GENERATION_TYPE})
     if("${qtprotobuf_generate_QML}" STREQUAL "TRUE")
-        message(STATUS "Enabled QML generation for ${qtprotobuf_generate_TARGET}")
+        message(STATUS "Enabled QML generation for ${GENERATED_TARGET_NAME}")
         set(GENERATION_OPTIONS "${GENERATION_OPTIONS}:QML")
     endif()
 
@@ -88,7 +111,7 @@ function(qtprotobuf_generate)
                 ${qtprotobuf_generate_PROTO_FILES}
             WORKING_DIRECTORY ${OUT_DIR}
             DEPENDS ${qtprotobuf_generate_PROTO_FILES} ${QTPROTOBUF_EXECUTABLE}
-            COMMENT "Generating QtProtobuf ${qtprotobuf_generate_TARGET} sources..."
+            COMMENT "Generating QtProtobuf ${GENERATED_TARGET_NAME} sources..."
     )
 
     add_custom_target(${GEN_TARGET} DEPENDS ${QTPROTOBUF_GENERATED_SOURCES} ${QTPROTOBUF_GENERATED_HEADERS} ${qtprotobuf_generate_PROTO_FILES})
@@ -98,33 +121,16 @@ function(qtprotobuf_generate)
     qt5_wrap_cpp(MOC_SOURCES ${QTPROTOBUF_GENERATED_HEADERS})
     list(APPEND GENERATED_SOURCES ${MOC_SOURCES})
     set_source_files_properties(${QTPROTOBUF_GENERATED_SOURCES} PROPERTIES GENERATED TRUE)
-    add_library(${QtProtobuf_GENERATED} ${QTPROTOBUF_GENERATED_SOURCES} ${MOC_SOURCES})
-    add_dependencies(${QtProtobuf_GENERATED} ${GEN_TARGET})
-    target_include_directories(${QtProtobuf_GENERATED} PUBLIC ${OUT_DIR} PRIVATE ${Qt5Core_INCLUDE_DIRS}
+    add_library(${GENERATED_TARGET_NAME} ${QTPROTOBUF_GENERATED_SOURCES} ${MOC_SOURCES})
+    add_dependencies(${GENERATED_TARGET_NAME} ${GEN_TARGET})
+    target_include_directories(${GENERATED_TARGET_NAME} PUBLIC ${OUT_DIR} PRIVATE ${Qt5Core_INCLUDE_DIRS}
         $<TARGET_PROPERTY:${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf,INTERFACE_INCLUDE_DIRECTORIES>
         $<TARGET_PROPERTY:${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc,INTERFACE_INCLUDE_DIRECTORIES> ${OUT_DIR})
     if(NOT WIN32)
-        target_include_directories(${QtProtobuf_GENERATED} PRIVATE
+        target_include_directories(${GENERATED_TARGET_NAME} PRIVATE
             $<TARGET_PROPERTY:${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobufWellKnownTypes,INTERFACE_INCLUDE_DIRECTORIES>)
     endif()
-endfunction()
-
-function(qtprotobuf_link_archive TARGET GENERATED_TARGET)
-    set_target_properties(${TARGET} PROPERTIES LINK_DIRECTORIES "$<TARGET_FILE_DIR:${GENERATED_TARGET}>")
-    get_target_property(EXISTING_FLAGS ${TARGET} LINK_FLAGS)
-    if(WIN32)
-        if("${EXISTING_FLAGS}" STREQUAL "EXISTING_FLAGS-NOTFOUND")
-            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:${GENERATED_TARGET}")
-        else()
-            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${EXISTING_FLAGS} /WHOLEARCHIVE:${GENERATED_TARGET}")
-        endif()
-    else()
-        if("${EXISTING_FLAGS}" STREQUAL "EXISTING_FLAGS-NOTFOUND")
-            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "-Wl,--whole-archive -l${GENERATED_TARGET} -Wl,--no-whole-archive")
-        else()
-            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${EXISTING_FLAGS} -Wl,--whole-archive -l${GENERATED_TARGET} -Wl,--no-whole-archive")
-        endif()
+    if(DEFINED qtprotobuf_generate_TARGET)
+        qtprotobuf_link_archive(${qtprotobuf_generate_TARGET} ${GENERATED_TARGET_NAME})
     endif()
-    target_include_directories(${TARGET} PRIVATE $<TARGET_PROPERTY:${GENERATED_TARGET},INCLUDE_DIRECTORIES>)
-    add_dependencies(${TARGET} ${GENERATED_TARGET})
 endfunction()

+ 5 - 6
examples/addressbook/CMakeLists.txt

@@ -9,21 +9,20 @@ find_package(QtProtobufProject CONFIG REQUIRED COMPONENTS QtProtobuf QtGrpc)
 
 file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/addressbook.proto)
 
+file(GLOB SOURCES main.cpp
+    addressbookengine.cpp)
+
+add_executable(${TARGET} ${SOURCES} resources.qrc)
 qtprotobuf_generate(TARGET ${TARGET}
     OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
     PROTO_FILES ${PROTO_FILES}
     QML TRUE)
 
-file(GLOB SOURCES main.cpp
-    addressbookengine.cpp)
-
-add_executable(${TARGET} ${SOURCES} resources.qrc)
 add_target_windeployqt(TARGET ${TARGET} QML_DIR ${CMAKE_CURRENT_SOURCE_DIR}/qml)
 
 add_custom_command(TARGET ${TARGET}
     COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../addressbookserver/cert.pem $<TARGET_FILE_DIR:${TARGET}>)
 
-add_dependencies(${TARGET} ${QtProtobuf_GENERATED} examples_common)
-target_link_libraries(${TARGET} examples_common QtProtobufProject::QtProtobuf QtProtobufProject::QtGrpc ${QtProtobuf_GENERATED} Qt5::Quick Qt5::Qml)
+target_link_libraries(${TARGET} PRIVATE examples_common QtProtobufProject::QtProtobuf QtProtobufProject::QtGrpc Qt5::Quick Qt5::Qml)
 
 set(CLIENT_EXEC_PATH ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} PARENT_SCOPE)

+ 1 - 1
examples/addressbookserver/CMakeLists.txt

@@ -15,7 +15,7 @@ protobuf_generate_all(TARGET ${TARGET}
     GENERATED_SOURCES ${GENERATED_SOURCES}
     PROTO_FILES ${PROTO_FILES})
 
-target_link_libraries(${TARGET} protobuf::libprotobuf gRPC::grpc++ gRPC::grpc)
+target_link_libraries(${TARGET} PRIVATE protobuf::libprotobuf gRPC::grpc++ gRPC::grpc)
 if(MSVC)
    target_compile_definitions(${TARGET} PRIVATE _WIN32_WINNT=0x600 _SCL_SECURE_NO_WARNINGS _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)
 endif()

+ 6 - 7
examples/simplechat/CMakeLists.txt

@@ -9,11 +9,6 @@ find_package(QtProtobufProject CONFIG REQUIRED COMPONENTS QtProtobuf QtGrpc)
 
 file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/simplechat.proto)
 
-qtprotobuf_generate(TARGET ${TARGET}
-    OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
-    PROTO_FILES ${PROTO_FILES}
-    QML TRUE)
-
 file(GLOB SOURCES main.cpp
     simplechatengine.cpp
 )
@@ -21,9 +16,13 @@ file(GLOB SOURCES main.cpp
 file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/../simplechatserver/cert.pem DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
 
 add_executable(${TARGET} ${SOURCES} resources.qrc)
+qtprotobuf_generate(TARGET ${TARGET}
+    OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
+    PROTO_FILES ${PROTO_FILES}
+    QML TRUE)
+
 add_target_windeployqt(TARGET ${TARGET} QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 
-add_dependencies(${TARGET} ${QtProtobuf_GENERATED} examples_common)
-target_link_libraries(${TARGET} examples_common QtProtobufProject::QtProtobuf QtProtobufProject::QtGrpc ${QtProtobuf_GENERATED} Qt5::Quick Qt5::Qml)
+target_link_libraries(${TARGET} PRIVATE examples_common QtProtobufProject::QtProtobuf QtProtobufProject::QtGrpc Qt5::Quick Qt5::Qml)
 
 set(CLIENT_EXEC_PATH ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} PARENT_SCOPE)

+ 1 - 1
examples/simplechatserver/CMakeLists.txt

@@ -15,7 +15,7 @@ protobuf_generate_all(TARGET ${TARGET}
     GENERATED_SOURCES ${GENERATED_SOURCES}
     PROTO_FILES ${PROTO_FILES})
 
-target_link_libraries(${TARGET} protobuf::libprotobuf gRPC::grpc++ gRPC::grpc)
+target_link_libraries(${TARGET} PRIVATE protobuf::libprotobuf gRPC::grpc++ gRPC::grpc)
 if(MSVC)
    target_compile_definitions(${TARGET} PRIVATE _WIN32_WINNT=0x600 _SCL_SECURE_NO_WARNINGS _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)
 endif()

+ 15 - 29
src/wellknowntypes/CMakeLists.txt

@@ -29,14 +29,14 @@ file(GLOB HEADERS
 file(GLOB PUBLIC_HEADERS
     qtprotobufwellknowntypes_global.qbp.h)
 
-function(add_wellknowntype VARIABLE TYPENAME)
+function(add_wellknowntype TYPENAME)
     list(APPEND LOOKUP_DIRS ${QTPROTOBUF_SOURCE_DIR}/3rdparty/grpc/third_party/protobuf/src)
     list(APPEND LOOKUP_DIRS ${Protobuf_INCLUDE_DIRS})
     foreach(INCLUDE_DIR ${LOOKUP_DIRS})
         file(GLOB PROTO_FILE ${INCLUDE_DIR}/google/protobuf/${TYPENAME}.proto)
         if (NOT "${PROTO_FILE}" STREQUAL "")
             message(STATUS "Add well-known type ${PROTO_FILE}")
-            qtprotobuf_generate(TARGET ${TYPENAME}
+            qtprotobuf_generate(TARGET ${TARGET} GENERATED_TARGET ${TYPENAME}
                 OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated/google/protobuf
                 PROTO_FILES ${PROTO_FILE}
                 PROTO_INCLUDES -I${QTPROTOBUF_SOURCE_DIR}/3rdparty/grpc/third_party/protobuf/src
@@ -44,37 +44,23 @@ function(add_wellknowntype VARIABLE TYPENAME)
             break()
         endif()
     endforeach()
-    target_include_directories(${QtProtobuf_GENERATED} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/generated)
-    if(WIN32)
-        get_target_property(EXISTING_FLAGS ${TARGET} LINK_FLAGS)
-        set_target_properties(${QtProtobuf_GENERATED} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
-        set_target_properties(${TARGET} PROPERTIES LINK_DIRECTORIES "$<TARGET_FILE_DIR:${QtProtobuf_GENERATED}>")
-        if("${EXISTING_FLAGS}" STREQUAL "EXISTING_FLAGS-NOTFOUND")
-            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:${QtProtobuf_GENERATED}")
-        else()
-            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${EXISTING_FLAGS} /WHOLEARCHIVE:${QtProtobuf_GENERATED}")
-        endif()
-    else()
-        set(${VARIABLE} ${${VARIABLE}} -Wl,--whole-archive ${QtProtobuf_GENERATED} -Wl,--no-whole-archive PARENT_SCOPE)
-    endif()
-    add_dependencies(${TARGET} ${QtProtobuf_GENERATED})
 endfunction()
 
 add_library(${TARGET} SHARED ${SOURCES})
 
-add_wellknowntype(GENERATED_TARGETS any)
-add_wellknowntype(GENERATED_TARGETS duration)
-add_wellknowntype(GENERATED_TARGETS empty)
-add_wellknowntype(GENERATED_TARGETS field_mask)
-add_wellknowntype(GENERATED_TARGETS source_context)
-add_wellknowntype(GENERATED_TARGETS struct)
-add_wellknowntype(GENERATED_TARGETS timestamp)
-add_wellknowntype(GENERATED_TARGETS wrappers)
+add_wellknowntype(any)
+add_wellknowntype(duration)
+add_wellknowntype(empty)
+add_wellknowntype(field_mask)
+add_wellknowntype(source_context)
+add_wellknowntype(struct)
+add_wellknowntype(timestamp)
+add_wellknowntype(wrappers)
 
-add_wellknowntype(GENERATED_TARGETS type)
-add_dependencies(type_qtprotobuf_gen any_qtprotobuf_gen source_context_qtprotobuf_gen)
-add_wellknowntype(GENERATED_TARGETS api)
-add_dependencies(api_qtprotobuf_gen type_qtprotobuf_gen source_context_qtprotobuf_gen)
+add_wellknowntype(type)
+add_dependencies(type any source_context)
+add_wellknowntype(api)
+add_dependencies(api type source_context)
 
 
 protobuf_generate_qt_headers(PUBLIC_HEADERS ${PUBLIC_HEADERS} COMPONENT ${TARGET})
@@ -93,7 +79,7 @@ target_include_directories(${TARGET} PUBLIC
     $<INSTALL_INTERFACE:${TARGET_INCLUDE_DIR}>
     )
 
-target_link_libraries(${TARGET} PUBLIC Qt5::Core Qt5::Qml ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf PRIVATE ${GENERATED_TARGETS})
+target_link_libraries(${TARGET} PUBLIC Qt5::Core Qt5::Qml ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf)
 target_compile_features(${TARGET} PUBLIC cxx_std_14
     cxx_auto_type
     cxx_decltype

+ 1 - 1
tests/test_grpc/echoserver/CMakeLists.txt

@@ -8,7 +8,7 @@ set(GENERATED_SOURCES
 set_source_files_properties(${GENERATED_SOURCES} PROPERTIES GENERATED TRUE)
 
 add_executable(${TARGET} main.cpp ${GENERATED_SOURCES})
-target_link_libraries(${TARGET} gRPC::grpc++ protobuf::libprotobuf)
+target_link_libraries(${TARGET} PRIVATE gRPC::grpc++ protobuf::libprotobuf)
 target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 if(MSVC)
    target_compile_definitions(${TARGET} PRIVATE _WIN32_WINNT=0x600 _SCL_SECURE_NO_WARNINGS _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)

+ 1 - 1
tests/test_grpc/secureechoserver/CMakeLists.txt

@@ -8,7 +8,7 @@ set(GENERATED_SOURCES
 set_source_files_properties(${GENERATED_SOURCES} PROPERTIES GENERATED TRUE)
 
 add_executable(${TARGET} main.cpp ${GENERATED_SOURCES})
-target_link_libraries(${TARGET} gRPC::grpc++ protobuf::libprotobuf)
+target_link_libraries(${TARGET} PRIVATE gRPC::grpc++ protobuf::libprotobuf)
 target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 if(MSVC)
    target_compile_definitions(${TARGET} PRIVATE _WIN32_WINNT=0x600 _SCL_SECURE_NO_WARNINGS _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)

+ 1 - 1
tests/test_qml/CMakeLists.txt

@@ -9,7 +9,7 @@ file(GLOB SOURCES main.cpp)
 file(GLOB QML_FILES qml/tst_simple.qml)
 
 add_executable(${TARGET} ${SOURCES} ${QML_FILES})
-target_link_libraries(${TARGET} Qt5::Core Qt5::Qml Qt5::Network Qt5::Quick Qt5::Test Qt5::QuickTest QtProtobufProject::QtProtobuf)
+target_link_libraries(${TARGET} PRIVATE Qt5::Core Qt5::Qml Qt5::Network Qt5::Quick Qt5::Test Qt5::QuickTest QtProtobufProject::QtProtobuf)
 qtprotobuf_link_archive(${TARGET} qtprotobuf_test_qtprotobuf_gen)
 
 add_target_qml(TARGET ${TARGET} QML_FILES ${QML_FILES})

+ 2 - 1
tests/test_qprotobuf_serializer_plugin/CMakeLists.txt

@@ -16,7 +16,8 @@ set(CMAKE_CXX_STANDARD 14)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 add_executable(${TARGET} ${SOURCES})
-target_link_libraries(${TARGET} gtest_main gtest ${QtProtobuf_GENERATED} ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(${TARGET} PRIVATE gtest_main gtest ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
+qtprotobuf_link_archive(${TARGET} qtprotobuf_test_qtprotobuf_gen)
 add_target_windeployqt(TARGET ${TARGET}
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 

+ 1 - 1
tests/test_wellknowntypes/CMakeLists.txt

@@ -13,5 +13,5 @@ add_test_target(TARGET ${TARGET}
 add_target_windeployqt(TARGET ${TARGET}
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 
-target_link_libraries(${TARGET} ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobufWellKnownTypes)
+target_link_libraries(${TARGET} PRIVATE ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobufWellKnownTypes)
 add_test(NAME ${TARGET} COMMAND ${TARGET})