123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- cmake_minimum_required(VERSION 3.10)
- project(devGrpcClient VERSION 1.0.0 LANGUAGES CXX)
- # 设置编译选项
- set(CMAKE_CXX_STANDARD 17)
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
- add_compile_options(-fPIC -g -Wall -march=armv8-a)
- # 目标目录
- set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
- get_filename_component(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" ABSOLUTE)
- file(MAKE_DIRECTORY "${DELIVER_DIR}/lib" "${DELIVER_DIR}/include")
- # ========== 静态依赖 gRPC 1.30.2 相关库 ==========
- # 1. 库路径(指定编译的静态库)
- set(GRPC_ROOT "/usr/local/grpc-1.30.2")
- set(ABSEIL_ROOT "/usr/local/abseil-20210324.2")
- # 2. 头文件目录
- include_directories(
- ${GRPC_ROOT}/include # gRPC头文件
- ${ABSEIL_ROOT}/include # Abseil头文件
- ${CMAKE_CURRENT_SOURCE_DIR}/src
- ${CMAKE_CURRENT_BINARY_DIR}
- )
- # 3. 库文件目录
- link_directories(
- ${GRPC_ROOT}/lib # gRPC库文件
- ${ABSEIL_ROOT}/lib # Abseil库文件
- )
- # 4. gRPC静态库列表(.a文件)
- set(GRPC_STATIC_LIBS
- grpc++_reflection
- grpc++
- grpc
- gpr
- address_sorting
- )
- # 5. Abseil静态库列表(.a文件)
- set(ABSEIL_STATIC_LIBS
- absl_base
- absl_strings
- absl_synchronization
- absl_time
- absl_bad_optional_access
- absl_str_format_internal
- absl_int128
- absl_raw_logging_internal
- absl_spinlock_wait
- absl_throw_delegate
- absl_malloc_internal
- )
- # ========== gRPC代码生成器(1.30.2版本的编译器) ==========
- set(_GRPC_CPP_PLUGIN_EXECUTABLE "${GRPC_ROOT}/bin/grpc_cpp_plugin")
- if(NOT EXISTS "${_GRPC_CPP_PLUGIN_EXECUTABLE}")
- message(FATAL_ERROR "未找到gRPC 1.30.2编译器: ${_GRPC_CPP_PLUGIN_EXECUTABLE}")
- else()
- message(STATUS "找到gRPC 1.30.2编译器: ${_GRPC_CPP_PLUGIN_EXECUTABLE}")
- endif()
- # ========== Protobuf配置(系统静态库) ==========
- find_package(Protobuf REQUIRED)
- message(STATUS "使用系统Protobuf版本: ${Protobuf_VERSION}")
- # ========== 编译Proto文件(与1.30.2版本保持兼容) ==========
- get_filename_component(DEV_PROTO "${CMAKE_CURRENT_SOURCE_DIR}/protos/device-sm.proto" ABSOLUTE)
- get_filename_component(DEV_PROTO_DIR "${DEV_PROTO}" PATH)
- set(DEV_PROTO_SRC "${CMAKE_CURRENT_BINARY_DIR}/device-sm.pb.cc")
- set(DEV_PROTO_HDR "${CMAKE_CURRENT_BINARY_DIR}/device-sm.pb.h")
- set(DEV_GRPC_SRC "${CMAKE_CURRENT_BINARY_DIR}/device-sm.grpc.pb.cc")
- set(DEV_GRPC_HDR "${CMAKE_CURRENT_BINARY_DIR}/device-sm.grpc.pb.h")
- add_custom_command(
- OUTPUT "${DEV_PROTO_SRC}" "${DEV_PROTO_HDR}" "${DEV_GRPC_SRC}" "${DEV_GRPC_HDR}"
- COMMAND $<TARGET_FILE:protobuf::protoc>
- ARGS
- --grpc_out="${CMAKE_CURRENT_BINARY_DIR}"
- --cpp_out="${CMAKE_CURRENT_BINARY_DIR}"
- -I "${DEV_PROTO_DIR}"
- --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
- "${DEV_PROTO}"
- DEPENDS "${DEV_PROTO}"
- COMMENT "生成基于gRPC 1.30.2的proto代码"
- )
- add_custom_target(GenerateProto ALL
- DEPENDS "${DEV_PROTO_SRC}" "${DEV_PROTO_HDR}" "${DEV_GRPC_SRC}" "${DEV_GRPC_HDR}"
- )
- # ========== 编译动态库(依赖静态gRPC和Abseil) ==========
- set(SRC_FILES
- ${CMAKE_CURRENT_SOURCE_DIR}/src/devGrpcClient.cpp
- ${DEV_PROTO_SRC}
- ${DEV_GRPC_SRC}
- )
- add_library(devGrpcClient SHARED ${SRC_FILES})
- add_dependencies(devGrpcClient GenerateProto)
- set_target_properties(devGrpcClient PROPERTIES
- VERSION ${PROJECT_VERSION}
- SOVERSION 1
- OUTPUT_NAME "devGrpcClient"
- )
- # 链接依赖库(静态库+系统库)
- target_link_libraries(devGrpcClient PRIVATE
- ${GRPC_STATIC_LIBS}
- ${ABSEIL_STATIC_LIBS}
- protobuf::libprotobuf # 系统Protobuf静态库
- pthread dl z ssl crypto # 系统基础库
- )
- # ========== 输出到交付目录 ==========
- add_custom_command(TARGET devGrpcClient POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:devGrpcClient>" "${DELIVER_DIR}/lib/"
- COMMAND ${CMAKE_COMMAND} -E create_symlink "$<TARGET_FILE_NAME:devGrpcClient>" "${DELIVER_DIR}/lib/$<TARGET_SONAME_FILE_NAME:devGrpcClient>"
- COMMAND ${CMAKE_COMMAND} -E create_symlink "$<TARGET_SONAME_FILE_NAME:devGrpcClient>" "${DELIVER_DIR}/lib/$<TARGET_LINKER_FILE_NAME:devGrpcClient>"
- COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/src/devGrpcClient.h" "${DELIVER_DIR}/include/"
- )
|