CMakeLists.txt 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. cmake_minimum_required(VERSION 3.4.1)
  2. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  3. # https://github.com/abseil/abseil-cpp/issues/626
  4. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DABSL_NO_XRAY_ATTRIBUTES=1")
  5. set(helloworld_PROTOBUF_PROTOC_EXECUTABLE "/usr/local/bin/protoc" CACHE STRING "Protoc binary on host")
  6. set(helloworld_GRPC_CPP_PLUGIN_EXECUTABLE "/usr/local/bin/grpc_cpp_plugin" CACHE STRING "gRPC CPP plugin binary on host")
  7. set(GRPC_SRC_DIR ../../../../)
  8. set(GRPC_BUILD_DIR ../grpc/outputs/${ANDROID_ABI})
  9. file(MAKE_DIRECTORY ${GRPC_BUILD_DIR})
  10. add_subdirectory(${GRPC_SRC_DIR} ${GRPC_BUILD_DIR})
  11. set(GRPC_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens)
  12. file(MAKE_DIRECTORY ${GRPC_PROTO_GENS_DIR})
  13. include_directories(${GRPC_PROTO_GENS_DIR})
  14. function(android_protobuf_grpc_generate_cpp SRC_FILES HDR_FILES INCLUDE_ROOT)
  15. if(NOT ARGN)
  16. message(SEND_ERROR "Error: android_protobuf_grpc_generate_cpp() called without any proto files")
  17. return()
  18. endif()
  19. set(${SRC_FILES})
  20. set(${HDR_FILES})
  21. set(PROTOBUF_INCLUDE_PATH -I ${INCLUDE_ROOT})
  22. foreach(FIL ${ARGN})
  23. get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
  24. get_filename_component(FIL_WE ${FIL} NAME_WE)
  25. file(RELATIVE_PATH REL_FIL ${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_ROOT} ${ABS_FIL})
  26. get_filename_component(REL_DIR ${REL_FIL} DIRECTORY)
  27. set(RELFIL_WE "${REL_DIR}/${FIL_WE}")
  28. list(APPEND ${SRC_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc")
  29. list(APPEND ${HDR_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h")
  30. list(APPEND ${SRC_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc")
  31. list(APPEND ${HDR_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h")
  32. add_custom_command(
  33. OUTPUT "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"
  34. "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"
  35. "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"
  36. "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"
  37. COMMAND ${helloworld_PROTOBUF_PROTOC_EXECUTABLE}
  38. ARGS --grpc_out=${GRPC_PROTO_GENS_DIR}
  39. --cpp_out=${GRPC_PROTO_GENS_DIR}
  40. --plugin=protoc-gen-grpc=${helloworld_GRPC_CPP_PLUGIN_EXECUTABLE}
  41. ${PROTOBUF_INCLUDE_PATH}
  42. ${REL_FIL}
  43. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  44. DEPENDS ${helloworld_PROTOBUF_PROTOC_EXECUTABLE} ${helloworld_GRPC_CPP_PLUGIN_EXECUTABLE} ${ABS_FIL} )
  45. endforeach()
  46. set_source_files_properties(${${SRC_FILES}} ${${HDR_FILES}} PROPERTIES GENERATED TRUE)
  47. set(${SRC_FILES} ${${SRC_FILES}} PARENT_SCOPE)
  48. set(${HDR_FILES} ${${HDR_FILES}} PARENT_SCOPE)
  49. endfunction()
  50. set(PROTO_BASE_DIR ${GRPC_SRC_DIR}/examples/protos)
  51. android_protobuf_grpc_generate_cpp(
  52. HELLOWORLD_PROTO_SRCS HELLOWORLD_PROTO_HDRS ${PROTO_BASE_DIR} ${PROTO_BASE_DIR}/helloworld.proto)
  53. add_library(helloworld_proto_lib
  54. SHARED ${HELLOWORLD_PROTO_HDRS} ${HELLOWORLD_PROTO_SRCS})
  55. target_link_libraries(helloworld_proto_lib
  56. grpc++
  57. libprotobuf
  58. android
  59. log)
  60. find_library(log-lib
  61. log)
  62. add_library(grpc-helloworld
  63. SHARED src/main/cpp/grpc-helloworld.cc)
  64. target_include_directories(grpc-helloworld
  65. PRIVATE ${HELLOWORLD_PROTO_HEADERS})
  66. target_link_libraries(grpc-helloworld
  67. helloworld_proto_lib
  68. android
  69. ${log-lib})