CMakeLists.txt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. set(TARGET QtGrpc)
  2. set(TARGET_EXPORT ${TARGET}Targets)
  3. set(TARGET_CONFIG ${TARGET}Config)
  4. set(TARGET_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/${TARGET})
  5. set(TARGET_LIB_DIR ${CMAKE_INSTALL_LIBDIR})
  6. set(TARGET_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
  7. set(TARGET_BINDIR ${CMAKE_INSTALL_BINDIR})
  8. set(CMAKE_AUTOMOC ON)
  9. set(CMAKE_AUTORCC ON)
  10. find_package(Qt5 COMPONENTS Core Network Qml CONFIG REQUIRED)
  11. if(QT_PROTOBUF_NATIVE_GRPC_CHANNEL)
  12. find_package(Threads REQUIRED)
  13. endif()
  14. if(Qt5Core_VERSION VERSION_LESS "5.12.4")
  15. # grpc target requires QT version not less than 5.12.4
  16. # earlier versions Http2DirectAttribute is broken: https://doc.qt.io/qt-5/whatsnew511.html
  17. # https://bugreports.qt.io/browse/QTBUG-74765
  18. message(FATAL_ERROR "Required Qt version is 5.12.4+")
  19. endif()
  20. set(CMAKE_POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE})
  21. set(CMAKE_CXX_STANDARD 14)
  22. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  23. include(${QT_PROTOBUF_CMAKE_DIR}/Coverage.cmake)
  24. include(${QT_PROTOBUF_CMAKE_DIR}/GenerateQtHeaders.cmake)
  25. include(${QT_PROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
  26. set(QT_PROTOBUF_NATIVE_GRPC_CHANNEL OFF CACHE BOOL "Enable native gRPC channel implementation")
  27. file(GLOB SOURCES qgrpcasyncoperationbase.cpp
  28. qgrpcasyncreply.cpp
  29. qgrpcsubscription.cpp
  30. qgrpcstatus.cpp
  31. qabstractgrpcchannel.cpp
  32. qgrpchttp2channel.cpp
  33. qabstractgrpcclient.cpp
  34. qgrpccredentials.cpp
  35. qgrpcsslcredentials.cpp
  36. qgrpcinsecurecredentials.cpp
  37. qgrpcuserpasswordcredentials.cpp
  38. )
  39. file(GLOB HEADERS qgrpcasyncoperationbase_p.h
  40. qgrpcasyncreply.h
  41. qgrpcsubscription.h
  42. qgrpcstatus.h
  43. qabstractgrpcchannel.h
  44. qgrpchttp2channel.h
  45. qabstractgrpcclient.h
  46. qabstractgrpccredentials.h
  47. qgrpccredentials.h
  48. qgrpcsslcredentials.h
  49. qgrpcinsecurecredentials.h
  50. qgrpcuserpasswordcredentials.h
  51. qtgrpcglobal.h)
  52. if(QT_PROTOBUF_NATIVE_GRPC_CHANNEL)
  53. list(APPEND SOURCES qgrpcchannel.cpp)
  54. list(APPEND HEADERS qgrpcchannel.h qgrpcchannel_p.h)
  55. endif()
  56. protobuf_generate_qt_headers(PUBLIC_HEADER ${HEADERS} COMPONENT ${TARGET})
  57. add_library(${TARGET} ${SOURCES})
  58. if(NOT BUILD_SHARED_LIBS)
  59. if(WIN32)
  60. message(WARNING "Static version of QtGrpc is not fully tested on Win32 platforms")
  61. endif()
  62. target_compile_definitions(${TARGET} PRIVATE QT_PROTOBUF_STATIC)
  63. set(QT_PROTOBUF_EXTRA_CONFIG "staticlib") #extra config for .pri file in case if static build enabled
  64. endif()
  65. extract_qt_variable(QT_HOST_DATA)
  66. target_compile_definitions(${TARGET} PRIVATE QT_BUILD_GRPC_LIB)
  67. set_target_properties(${TARGET} PROPERTIES VERSION ${PROJECT_VERSION} PUBLIC_HEADER "${HEADERS};${GENERATED_PUBLIC_HEADER}" OUTPUT_NAME ${TARGET})
  68. target_include_directories(${TARGET} PUBLIC
  69. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  70. $<BUILD_INTERFACE:${QT_PROTOBUF_BINARY_DIR}/include/${TARGET}>
  71. $<INSTALL_INTERFACE:${TARGET_INCLUDE_DIR}>
  72. )
  73. target_link_libraries(${TARGET} PUBLIC ${QT_PROTOBUF_PROJECT}::QtProtobuf Qt5::Core Qt5::Network)
  74. if(QT_PROTOBUF_NATIVE_GRPC_CHANNEL)
  75. target_compile_definitions(${TARGET} PUBLIC QT_PROTOBUF_NATIVE_GRPC_CHANNEL)
  76. target_link_libraries(${TARGET} PUBLIC gRPC::grpc++ ${CMAKE_THREAD_LIBS_INIT})
  77. endif()
  78. target_compile_features(${TARGET} PUBLIC cxx_std_14
  79. cxx_auto_type
  80. cxx_decltype
  81. cxx_final
  82. cxx_override
  83. cxx_nullptr
  84. cxx_lambdas
  85. cxx_func_identifier)
  86. add_library(${QT_PROTOBUF_PROJECT}::${TARGET} ALIAS ${TARGET})
  87. include(CMakePackageConfigHelpers)
  88. configure_package_config_file(
  89. "${TARGET_CONFIG}.cmake.in" "${QT_PROTOBUF_BINARY_DIR}/${TARGET_CONFIG}.cmake"
  90. INSTALL_DESTINATION "${TARGET_CMAKE_DIR}")
  91. configure_file("${QT_PROTOBUF_CMAKE_DIR}/gRPCLookup.cmake" "${QT_PROTOBUF_BINARY_DIR}/gRPCLookup.cmake" COPYONLY)
  92. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/qt_lib_grpc.pri.in" "${QT_PROTOBUF_BINARY_DIR}/qt_lib_grpc.pri" @ONLY)
  93. if(QT_PROTOBUF_INSTALL)
  94. install(TARGETS ${TARGET}
  95. EXPORT ${TARGET_EXPORT} COMPONENT dev
  96. ARCHIVE DESTINATION ${TARGET_LIB_DIR} COMPONENT lib
  97. PUBLIC_HEADER DESTINATION ${TARGET_INCLUDE_DIR} COMPONENT dev
  98. LIBRARY DESTINATION ${TARGET_LIB_DIR} COMPONENT lib
  99. RUNTIME DESTINATION ${TARGET_BINDIR} COMPONENT lib)
  100. install(EXPORT ${TARGET_EXPORT} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake DESTINATION ${TARGET_CMAKE_DIR} COMPONENT dev)
  101. install(FILES "${QT_PROTOBUF_BINARY_DIR}/${TARGET_CONFIG}.cmake"
  102. "${QT_PROTOBUF_BINARY_DIR}/gRPCLookup.cmake"
  103. DESTINATION "${TARGET_CMAKE_DIR}" COMPONENT dev)
  104. install(FILES "${QT_PROTOBUF_BINARY_DIR}/qt_lib_grpc.pri" DESTINATION "${QT_HOST_DATA}/mkspecs/modules" COMPONENT dev)
  105. endif()
  106. export(TARGETS ${TARGET} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake)
  107. add_subdirectory("quick")
  108. add_coverage_target(TARGET ${TARGET})