CMakeLists.txt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. set(TARGET QtProtobufWellKnownTypes)
  2. set(TARGET_EXPORT ${TARGET}Targets)
  3. set(TARGET_CONFIG ${TARGET}Config)
  4. set(TARGET_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/QtProtobuf/google/protobuf)
  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 Qml REQUIRED)
  11. find_package(Protobuf QUIET)
  12. if(NOT TARGET ${GENERATOR_TARGET})
  13. find_package(QtProtobufProject COMPONENTS Generator CONFIG REQUIRED)
  14. else()
  15. set(PROTO_PARSER ${QT_PROTOBUF_BINARY_DIR}/parsemessages.go)
  16. include(${QT_PROTOBUF_CMAKE_DIR}/QtProtobufGen.cmake)
  17. endif()
  18. set(CMAKE_POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE})
  19. set(CMAKE_CXX_STANDARD 14)
  20. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  21. include(${QT_PROTOBUF_CMAKE_DIR}/Coverage.cmake)
  22. include(${QT_PROTOBUF_CMAKE_DIR}/GenerateQtHeaders.cmake)
  23. file(GLOB SOURCES
  24. dummy.cpp)
  25. function(add_wellknowntype TYPENAME)
  26. list(APPEND LOOKUP_DIRS ${QT_PROTOBUF_SOURCE_DIR}/3rdparty/grpc/third_party/protobuf/src)
  27. list(APPEND LOOKUP_DIRS ${Protobuf_INCLUDE_DIRS})
  28. foreach(INCLUDE_DIR ${LOOKUP_DIRS})
  29. file(GLOB PROTO_FILE ${INCLUDE_DIR}/google/protobuf/${TYPENAME}.proto)
  30. if(NOT "${PROTO_FILE}" STREQUAL "")
  31. message(STATUS "Add well-known type ${PROTO_FILE}")
  32. qtprotobuf_generate(TARGET ${TARGET} GENERATED_TARGET ${TYPENAME}
  33. OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
  34. PROTO_FILES ${PROTO_FILE}
  35. PROTO_INCLUDES "-I\"${INCLUDE_DIR}\""
  36. QML FOLDER)
  37. target_include_directories(${TYPENAME} PRIVATE
  38. $<TARGET_PROPERTY:${QT_PROTOBUF_PROJECT}::QtProtobufWellKnownTypes,INTERFACE_INCLUDE_DIRECTORIES>)
  39. get_target_property(GENERATED_PUBLIC_HEADER_PRIVATE ${TYPENAME} PUBLIC_HEADER)
  40. set(GENERATED_PUBLIC_HEADER "${GENERATED_PUBLIC_HEADER};${GENERATED_PUBLIC_HEADER_PRIVATE}" PARENT_SCOPE)
  41. break()
  42. endif()
  43. endforeach()
  44. if(NOT TARGET ${TYPENAME})
  45. message(FATAL_ERROR "Unable to add well-know type ${TYPENAME}")
  46. endif()
  47. endfunction()
  48. add_library(${TARGET} ${SOURCES})
  49. add_wellknowntype(any)
  50. add_wellknowntype(duration)
  51. add_wellknowntype(empty)
  52. add_wellknowntype(field_mask)
  53. add_wellknowntype(source_context)
  54. add_wellknowntype(struct)
  55. add_wellknowntype(timestamp)
  56. add_wellknowntype(wrappers)
  57. add_wellknowntype(type)
  58. add_dependencies(type any source_context)
  59. add_wellknowntype(api)
  60. add_dependencies(api type source_context)
  61. target_compile_definitions(${TARGET} PRIVATE QT_BUILD_PROTOBUF_WELLKNOWNTYPES_LIB PUBLIC QT_PROTOBUF_VERSION_MAJOR=${PROJECT_VERSION_MAJOR}
  62. QT_PROTOBUF_VERSION_MINOR=${PROJECT_VERSION_MINOR})
  63. set_target_properties(${TARGET} PROPERTIES VERSION ${PROJECT_VERSION} PUBLIC_HEADER "${GENERATED_PUBLIC_HEADER}" OUTPUT_NAME ${TARGET}
  64. PROTO_INCLUDES "-I\"${QT_PROTOBUF_SOURCE_DIR}/3rdparty/grpc/third_party/protobuf/src\"")
  65. target_compile_features(${TARGET} PUBLIC cxx_std_14
  66. cxx_auto_type
  67. cxx_decltype
  68. cxx_final
  69. cxx_override
  70. cxx_nullptr
  71. cxx_lambdas
  72. cxx_func_identifier)
  73. target_include_directories(${TARGET} PUBLIC
  74. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  75. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/generated>
  76. $<BUILD_INTERFACE:${QT_PROTOBUF_BINARY_DIR}/include/${TARGET}>
  77. $<INSTALL_INTERFACE:${TARGET_INCLUDE_DIR}>
  78. )
  79. add_library(${QT_PROTOBUF_PROJECT}::${TARGET} ALIAS ${TARGET})
  80. target_link_libraries(${TARGET} PUBLIC Qt5::Core Qt5::Qml ${QT_PROTOBUF_PROJECT}::QtProtobuf)
  81. include(CMakePackageConfigHelpers)
  82. configure_package_config_file(
  83. "${TARGET_CONFIG}.cmake.in" "${QT_PROTOBUF_BINARY_DIR}/${TARGET_CONFIG}.cmake"
  84. INSTALL_DESTINATION "${TARGET_CMAKE_DIR}")
  85. if(QT_PROTOBUF_INSTALL)
  86. install(TARGETS ${TARGET}
  87. EXPORT ${TARGET_EXPORT} COMPONENT dev
  88. ARCHIVE DESTINATION ${TARGET_LIB_DIR} COMPONENT lib
  89. PUBLIC_HEADER DESTINATION ${TARGET_INCLUDE_DIR} COMPONENT dev
  90. LIBRARY DESTINATION ${TARGET_LIB_DIR} COMPONENT lib
  91. RUNTIME DESTINATION ${TARGET_BINDIR} COMPONENT lib)
  92. install(EXPORT ${TARGET_EXPORT} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake DESTINATION ${TARGET_CMAKE_DIR} COMPONENT dev)
  93. install(FILES "${QT_PROTOBUF_BINARY_DIR}/${TARGET_CONFIG}.cmake" DESTINATION "${TARGET_CMAKE_DIR}" COMPONENT dev)
  94. endif()
  95. export(TARGETS ${TARGET} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake)
  96. add_coverage_target(TARGET ${TARGET})