CMakeLists.txt 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # Proto compilation for smartbotic-database
  2. # Get the protobuf compiler and gRPC plugin
  3. find_program(PROTOC protoc REQUIRED)
  4. find_program(GRPC_CPP_PLUGIN grpc_cpp_plugin REQUIRED)
  5. # Get the include directory for well-known types
  6. get_target_property(PROTOBUF_INCLUDE_DIR protobuf::libprotobuf INTERFACE_INCLUDE_DIRECTORIES)
  7. if(NOT PROTOBUF_INCLUDE_DIR)
  8. # Fallback for system protobuf
  9. set(PROTOBUF_INCLUDE_DIR "/usr/include")
  10. endif()
  11. # Create output directory
  12. set(PROTO_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
  13. file(MAKE_DIRECTORY ${PROTO_OUTPUT_DIR})
  14. # Proto file
  15. set(PROTO_FILE "${CMAKE_CURRENT_SOURCE_DIR}/database.proto")
  16. # Generated files
  17. set(PROTO_SRCS "${PROTO_OUTPUT_DIR}/database.pb.cc")
  18. set(PROTO_HDRS "${PROTO_OUTPUT_DIR}/database.pb.h")
  19. set(GRPC_SRCS "${PROTO_OUTPUT_DIR}/database.grpc.pb.cc")
  20. set(GRPC_HDRS "${PROTO_OUTPUT_DIR}/database.grpc.pb.h")
  21. # Generate proto and gRPC files
  22. add_custom_command(
  23. OUTPUT ${PROTO_SRCS} ${PROTO_HDRS} ${GRPC_SRCS} ${GRPC_HDRS}
  24. COMMAND ${PROTOC}
  25. --proto_path=${CMAKE_CURRENT_SOURCE_DIR}
  26. --proto_path=${PROTOBUF_INCLUDE_DIR}
  27. --cpp_out=${PROTO_OUTPUT_DIR}
  28. --grpc_out=${PROTO_OUTPUT_DIR}
  29. --plugin=protoc-gen-grpc=${GRPC_CPP_PLUGIN}
  30. ${PROTO_FILE}
  31. DEPENDS ${PROTO_FILE}
  32. COMMENT "Generating protobuf/gRPC code for database.proto"
  33. VERBATIM
  34. )
  35. # Create proto library
  36. if(BUILD_SHARED_LIBS)
  37. add_library(smartbotic_db_proto OBJECT ${PROTO_SRCS} ${GRPC_SRCS})
  38. set_target_properties(smartbotic_db_proto PROPERTIES POSITION_INDEPENDENT_CODE ON)
  39. else()
  40. add_library(smartbotic_db_proto STATIC ${PROTO_SRCS} ${GRPC_SRCS})
  41. endif()
  42. target_include_directories(smartbotic_db_proto PUBLIC
  43. $<BUILD_INTERFACE:${PROTO_OUTPUT_DIR}>
  44. $<INSTALL_INTERFACE:include>
  45. )
  46. # Suppress warnings in generated code
  47. target_compile_options(smartbotic_db_proto PRIVATE
  48. -Wno-unused-parameter
  49. -Wno-array-bounds
  50. )
  51. # Link dependencies
  52. if(TARGET gRPC::grpc++)
  53. target_link_libraries(smartbotic_db_proto PUBLIC
  54. protobuf::libprotobuf
  55. gRPC::grpc++
  56. absl::log_internal_check_op
  57. )
  58. else()
  59. target_link_libraries(smartbotic_db_proto PUBLIC
  60. protobuf
  61. ${GRPC_LIBRARIES}
  62. )
  63. target_include_directories(smartbotic_db_proto PUBLIC ${GRPC_INCLUDE_DIRS})
  64. endif()
  65. # Export for other targets
  66. add_library(smartbotic::db_proto ALIAS smartbotic_db_proto)