Browse Source

Add deploy of libs for Windows

Tatyana Borisova 5 years ago
parent
commit
5a61d08f53

+ 11 - 5
CMakeLists.txt

@@ -6,13 +6,19 @@ project(QtProtobufProject VERSION ${QTPROTOBUF_PROJECT_VERSION} LANGUAGES CXX)
 include(GNUInstallDirs)
 
 find_package(Qt5 COMPONENTS Core Network Qml REQUIRED)
-if(Qt5Core_VERSION VERSION_LESS "5.12.3")
+if (Qt5Core_VERSION VERSION_LESS "5.12.3")
     # grpc target requires QT version not less than 5.12.3
     # earlier versions Http2DirectAttribute is broken: https://doc.qt.io/qt-5/whatsnew511.html
     #                                                  https://bugreports.qt.io/browse/QTBUG-74765
     message(FATAL_ERROR "Required Qt version is 5.12.3+")
 endif()
 
+if(WIN32)
+    if(CMAKE_CL_64)
+        message(FATAL_ERROR "WIN64 build is unsupported yet")
+    endif()
+endif()
+
 if(EXISTS "${CMAKE_SOURCE_DIR}/3rdparty/grpc/CMakeLists.txt")
     message(STATUS "Found local gRPC sources directory. Perform all-in-one build")
     set(gRPC_BUILD_TESTS FALSE)
@@ -37,11 +43,11 @@ set(QTPROTOBUF_EXECUTABLE $<TARGET_FILE:${GENERATOR_TARGET}>)
 
 if(UNIX)
     if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
-      # using Clang
-      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wno-pessimizing-move -Wno-mismatched-tags -Wno-unused-private-field")
+        # using Clang
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wno-pessimizing-move -Wno-mismatched-tags -Wno-unused-private-field")
     elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
-      # using GCC
-      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wno-error=deprecated-declarations")
+        # using GCC
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wno-error=deprecated-declarations")
     endif()
 elseif(WIN32)
     if(${CMAKE_CXX_COMPILER_ID} MATCHES "MSVC")

+ 22 - 1
cmake/QtProtobufCommon.cmake

@@ -42,7 +42,7 @@ endfunction(protobuf_generate_all)
 
 function(add_test_target)
     set(options)
-    set(oneValueArgs TARGET)
+    set(oneValueArgs QML_DIR TARGET)
     set(multiValueArgs SOURCES GENERATED_HEADERS PROTO_FILES)
     cmake_parse_arguments(add_test_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
@@ -66,6 +66,7 @@ function(add_test_target)
         GENERATED_HEADERS ${add_test_target_GENERATED_HEADERS})
 
     add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
+
     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")
@@ -91,3 +92,23 @@ function(add_target_qml)
     endif()
     add_dependencies(${add_target_qml_TARGET} ${add_target_qml_TARGET}_qml)
 endfunction()
+
+function(add_target_windeployqt)
+if(WIN32)
+    set(options)
+    set(oneValueArgs QML_DIR TARGET)
+    set(multiValueArgs)
+    cmake_parse_arguments(add_target_windeployqt "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+    find_program(WINDEPLOYQT_EXECUTABLE "windeployqt" PATHS ${PATH})
+    if(WINDEPLOYQT_EXECUTABLE STREQUAL WINDEPLOYQT_EXECUTABLE-NOTFOUND)
+        message(WARNING "windeployqt is not found in specified PATH! Please, copy dependencies manually")
+    else()
+        if(DEFINED add_target_windeployqt_QML_DIR)
+            set(QML_DIR --qmldir ${add_target_windeployqt_QML_DIR})
+        endif()
+        add_custom_command(TARGET ${add_target_windeployqt_TARGET} POST_BUILD
+            COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:QtProtobuf> $<TARGET_FILE_DIR:${add_target_windeployqt_TARGET}>
+            COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:QtGrpc> $<TARGET_FILE_DIR:${add_target_windeployqt_TARGET}>
+            COMMAND ${WINDEPLOYQT_EXECUTABLE} ${QML_DIR} $<TARGET_FILE_DIR:${add_target_windeployqt_TARGET}>)
+endif()
+endfunction()

+ 5 - 2
examples/addressbook/CMakeLists.txt

@@ -29,9 +29,12 @@ generate_qtprotobuf(TARGET ${TARGET}
 file(GLOB SOURCES main.cpp
     addressbookengine.cpp)
 
-file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/../addressbookserver/cert.pem DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
-
 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)
 

+ 2 - 1
examples/addressbookserver/CMakeLists.txt

@@ -19,5 +19,6 @@ target_link_libraries(${TARGET} 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()
-file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cert.pem ${CMAKE_CURRENT_SOURCE_DIR}/key.pem DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+add_custom_command(TARGET ${TARGET}
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/cert.pem ${CMAKE_CURRENT_SOURCE_DIR}/key.pem $<TARGET_FILE_DIR:${TARGET}>)
 set(SERVER_EXEC_PATH ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} PARENT_SCOPE)

+ 2 - 0
examples/simplechat/CMakeLists.txt

@@ -29,6 +29,8 @@ 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)
+add_target_windeployqt(TARGET ${TARGET})
+
 add_dependencies(${TARGET} ${QtProtobuf_GENERATED} examples_common)
 target_link_libraries(${TARGET} examples_common QtProtobufProject::QtProtobuf QtProtobufProject::QtGrpc ${QtProtobuf_GENERATED} Qt5::Quick Qt5::Qml)
 

+ 1 - 0
tests/test_qml/CMakeLists.txt

@@ -12,5 +12,6 @@ add_executable(${TARGET} ${SOURCES} ${QML_FILES})
 target_link_libraries(${TARGET} Qt5::Core Qt5::Qml Qt5::Network Qt5::Quick Qt5::Test Qt5::QuickTest QtProtobufProject::QtProtobuf qtprotobuf_test_qtprotobuf_gen)
 
 add_target_qml(TARGET ${TARGET} QML_FILES ${QML_FILES})
+add_target_windeployqt(TARGET ${TARGET} QML_DIR ${CMAKE_CURRENT_SOURCE_DIR}/qml)
 
 add_test(NAME ${TARGET} COMMAND ${TARGET})