CMakeLists.txt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. cmake_minimum_required(VERSION 3.10)
  2. project(devGrpcClient VERSION 1.0.0 LANGUAGES CXX)
  3. # 设置编译选项
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. add_compile_options(-fPIC -g -Wall -march=armv8-a)
  7. # 目标目录
  8. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  9. get_filename_component(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" ABSOLUTE)
  10. file(MAKE_DIRECTORY "${DELIVER_DIR}/lib" "${DELIVER_DIR}/include")
  11. # ========== 静态依赖 gRPC 1.30.2 相关库 ==========
  12. # 1. 库路径(指定编译的静态库)
  13. set(GRPC_ROOT "/usr/local/grpc-1.30.2")
  14. set(ABSEIL_ROOT "/usr/local/abseil-20210324.2")
  15. # 2. 头文件目录
  16. include_directories(
  17. ${GRPC_ROOT}/include # gRPC头文件
  18. ${ABSEIL_ROOT}/include # Abseil头文件
  19. ${CMAKE_CURRENT_SOURCE_DIR}/src
  20. ${CMAKE_CURRENT_BINARY_DIR}
  21. )
  22. # 3. 库文件目录
  23. link_directories(
  24. ${GRPC_ROOT}/lib # gRPC库文件
  25. ${ABSEIL_ROOT}/lib # Abseil库文件
  26. )
  27. # 4. gRPC静态库列表(.a文件)
  28. set(GRPC_STATIC_LIBS
  29. grpc++_reflection
  30. grpc++
  31. grpc
  32. gpr
  33. address_sorting
  34. )
  35. # 5. Abseil静态库列表(.a文件)
  36. set(ABSEIL_STATIC_LIBS
  37. absl_base
  38. absl_strings
  39. absl_synchronization
  40. absl_time
  41. absl_bad_optional_access
  42. absl_str_format_internal
  43. absl_int128
  44. absl_raw_logging_internal
  45. absl_spinlock_wait
  46. absl_throw_delegate
  47. absl_malloc_internal
  48. )
  49. # ========== gRPC代码生成器(1.30.2版本的编译器) ==========
  50. set(_GRPC_CPP_PLUGIN_EXECUTABLE "${GRPC_ROOT}/bin/grpc_cpp_plugin")
  51. if(NOT EXISTS "${_GRPC_CPP_PLUGIN_EXECUTABLE}")
  52. message(FATAL_ERROR "未找到gRPC 1.30.2编译器: ${_GRPC_CPP_PLUGIN_EXECUTABLE}")
  53. else()
  54. message(STATUS "找到gRPC 1.30.2编译器: ${_GRPC_CPP_PLUGIN_EXECUTABLE}")
  55. endif()
  56. # ========== Protobuf配置(系统静态库) ==========
  57. find_package(Protobuf REQUIRED)
  58. message(STATUS "使用系统Protobuf版本: ${Protobuf_VERSION}")
  59. # ========== 编译Proto文件(与1.30.2版本保持兼容) ==========
  60. get_filename_component(DEV_PROTO "${CMAKE_CURRENT_SOURCE_DIR}/protos/device-sm.proto" ABSOLUTE)
  61. get_filename_component(DEV_PROTO_DIR "${DEV_PROTO}" PATH)
  62. set(DEV_PROTO_SRC "${CMAKE_CURRENT_BINARY_DIR}/device-sm.pb.cc")
  63. set(DEV_PROTO_HDR "${CMAKE_CURRENT_BINARY_DIR}/device-sm.pb.h")
  64. set(DEV_GRPC_SRC "${CMAKE_CURRENT_BINARY_DIR}/device-sm.grpc.pb.cc")
  65. set(DEV_GRPC_HDR "${CMAKE_CURRENT_BINARY_DIR}/device-sm.grpc.pb.h")
  66. add_custom_command(
  67. OUTPUT "${DEV_PROTO_SRC}" "${DEV_PROTO_HDR}" "${DEV_GRPC_SRC}" "${DEV_GRPC_HDR}"
  68. COMMAND $<TARGET_FILE:protobuf::protoc>
  69. ARGS
  70. --grpc_out="${CMAKE_CURRENT_BINARY_DIR}"
  71. --cpp_out="${CMAKE_CURRENT_BINARY_DIR}"
  72. -I "${DEV_PROTO_DIR}"
  73. --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
  74. "${DEV_PROTO}"
  75. DEPENDS "${DEV_PROTO}"
  76. COMMENT "生成基于gRPC 1.30.2的proto代码"
  77. )
  78. add_custom_target(GenerateProto ALL
  79. DEPENDS "${DEV_PROTO_SRC}" "${DEV_PROTO_HDR}" "${DEV_GRPC_SRC}" "${DEV_GRPC_HDR}"
  80. )
  81. # ========== 编译动态库(依赖静态gRPC和Abseil) ==========
  82. set(SRC_FILES
  83. ${CMAKE_CURRENT_SOURCE_DIR}/src/devGrpcClient.cpp
  84. ${DEV_PROTO_SRC}
  85. ${DEV_GRPC_SRC}
  86. )
  87. add_library(devGrpcClient SHARED ${SRC_FILES})
  88. add_dependencies(devGrpcClient GenerateProto)
  89. set_target_properties(devGrpcClient PROPERTIES
  90. VERSION ${PROJECT_VERSION}
  91. SOVERSION 1
  92. OUTPUT_NAME "devGrpcClient"
  93. )
  94. # 链接依赖库(静态库+系统库)
  95. target_link_libraries(devGrpcClient PRIVATE
  96. ${GRPC_STATIC_LIBS}
  97. ${ABSEIL_STATIC_LIBS}
  98. protobuf::libprotobuf # 系统Protobuf静态库
  99. pthread dl z ssl crypto # 系统基础库
  100. )
  101. # ========== 输出到交付目录 ==========
  102. add_custom_command(TARGET devGrpcClient POST_BUILD
  103. COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:devGrpcClient>" "${DELIVER_DIR}/lib/"
  104. COMMAND ${CMAKE_COMMAND} -E create_symlink "$<TARGET_FILE_NAME:devGrpcClient>" "${DELIVER_DIR}/lib/$<TARGET_SONAME_FILE_NAME:devGrpcClient>"
  105. COMMAND ${CMAKE_COMMAND} -E create_symlink "$<TARGET_SONAME_FILE_NAME:devGrpcClient>" "${DELIVER_DIR}/lib/$<TARGET_LINKER_FILE_NAME:devGrpcClient>"
  106. COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/src/devGrpcClient.h" "${DELIVER_DIR}/include/"
  107. )