QtProtobufCommon.cmake 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. find_package(QtProtobufProject COMPONENTS QtProtobuf QtGrpc REQUIRED)
  2. function(protobuf_generate_all)
  3. set(options)
  4. set(oneValueArgs OUT_DIR TARGET)
  5. set(multiValueArgs GENERATED_SOURCES PROTO_FILES)
  6. cmake_parse_arguments(protobuf_generate_all "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  7. set(GEN_TARGET "${protobuf_generate_all_TARGET}_generate")
  8. add_custom_target(${GEN_TARGET})
  9. foreach(PROTO_FILE IN LISTS protobuf_generate_all_PROTO_FILES)
  10. get_filename_component(BASE_DIR ${PROTO_FILE} DIRECTORY)
  11. set(PROTO_INCLUDES -I"${BASE_DIR}" ${PROTO_INCUDES})
  12. endforeach()
  13. if(NOT DEFINED protobuf_generate_all_OUT_DIR)
  14. set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
  15. else()
  16. set(OUT_DIR ${protobuf_generate_all_OUT_DIR})
  17. endif()
  18. file(MAKE_DIRECTORY ${OUT_DIR})
  19. if(NOT TARGET gRPC::grpc_cpp_plugin)
  20. message(FATAL_ERROR "gRPC plugin is not found")
  21. endif()
  22. add_custom_command(
  23. TARGET ${GEN_TARGET}
  24. COMMAND $<TARGET_FILE:protobuf::protoc>
  25. ARGS --grpc_out="${OUT_DIR}"
  26. --cpp_out="${OUT_DIR}"
  27. ${PROTO_INCLUDES}
  28. --plugin=protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin>
  29. ${protobuf_generate_all_PROTO_FILES}
  30. DEPENDS ${protobuf_generate_all_PROTO_FILES})
  31. add_dependencies(${protobuf_generate_all_TARGET} ${GEN_TARGET})
  32. endfunction(protobuf_generate_all)
  33. function(add_test_target)
  34. set(options)
  35. set(oneValueArgs TARGET)
  36. set(multiValueArgs SOURCES GENERATED_HEADERS)
  37. cmake_parse_arguments(add_test_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  38. ## test sources build
  39. # policy enables automoc for generated files
  40. if(${CMAKE_VERSION} VERSION_GREATER "3.10.0")
  41. cmake_policy(SET CMP0071 NEW)
  42. endif()
  43. set(GENERATED_SOURCES_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
  44. file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.proto)
  45. generate_qtprotobuf(TARGET ${add_test_target_TARGET}
  46. OUT_DIR ${GENERATED_SOURCES_DIR}
  47. PROTO_FILES ${PROTO_FILES}
  48. GENERATED_HEADERS ${add_test_target_GENERATED_HEADERS})
  49. add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
  50. if(Qt5_POSITION_INDEPENDENT_CODE)
  51. set_target_properties(${add_test_target_TARGET} PROPERTIES POSITION_INDEPENDENT_CODE FALSE)
  52. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
  53. endif()
  54. add_dependencies(${add_test_target_TARGET} ${QtProtobuf_GENERATED})
  55. target_link_libraries(${add_test_target_TARGET} gtest_main gtest ${QtProtobuf_GENERATED} ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Qml Qt5::Network)
  56. target_include_directories(${add_test_target_TARGET} PRIVATE ${GENERATED_SOURCES_DIR})
  57. endfunction(add_test_target)