gRPCBuild.cmake 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. include(cmake/DownloadProject.cmake)
  2. download_project(PROJ gRPCDownload
  3. GIT_REPOSITORY https://github.com/grpc/grpc.git
  4. GIT_TAG v1.20.x
  5. )
  6. set(gRPCDownload_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR})
  7. include(ExternalProject)
  8. # Builds c-ares project from the git submodule.
  9. # Note: For all external projects, instead of using checked-out code, one could
  10. # specify GIT_REPOSITORY and GIT_TAG to have cmake download the dependency directly,
  11. # without needing to add a submodule to your project.
  12. ExternalProject_Add(c-ares
  13. PREFIX c-ares
  14. SOURCE_DIR "${gRPCDownload_SOURCE_DIR}/third_party/cares/cares"
  15. CMAKE_CACHE_ARGS
  16. -DCARES_SHARED:BOOL=OFF
  17. -DCARES_STATIC:BOOL=ON
  18. -DCARES_STATIC_PIC:BOOL=ON
  19. -DCMAKE_INSTALL_PREFIX:PATH=${gRPCDownload_INSTALL_DIR}/c-ares
  20. )
  21. # Builds protobuf project from the git submodule.
  22. ExternalProject_Add(protobuf
  23. PREFIX protobuf
  24. SOURCE_DIR "${gRPCDownload_SOURCE_DIR}/third_party/protobuf/cmake"
  25. CMAKE_CACHE_ARGS
  26. -Dprotobuf_BUILD_TESTS:BOOL=OFF
  27. -Dprotobuf_WITH_ZLIB:BOOL=OFF
  28. -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF
  29. -DCMAKE_INSTALL_PREFIX:PATH=${gRPCDownload_INSTALL_DIR}/protobuf
  30. )
  31. # Setup libprotobuf as a target
  32. set(LIBPROTOC_PREFIX_PATH "${gRPCDownload_INSTALL_DIR}/protobuf")
  33. set(LIBPROTOC_BINARY_PATH "${LIBPROTOC_PREFIX_PATH}/lib")
  34. set(LIBPROTOC_LIB_INCLUDE "${LIBPROTOC_PREFIX_PATH}/include")
  35. # Hack to make it work, otherwise INTERFACE_INCLUDE_DIRECTORIES will not be propagated
  36. file(MAKE_DIRECTORY ${LIBPROTOC_LIB_INCLUDE})
  37. add_library(libprotoc IMPORTED STATIC GLOBAL)
  38. add_library(libprotobuf IMPORTED STATIC GLOBAL)
  39. add_executable(protoc IMPORTED GLOBAL)
  40. add_dependencies(libprotoc protobuf)
  41. set_target_properties(protoc PROPERTIES
  42. "IMPORTED_LOCATION" "${LIBPROTOC_PREFIX_PATH}/bin/protoc"
  43. )
  44. set_target_properties(libprotoc PROPERTIES
  45. "IMPORTED_LOCATION" "${LIBPROTOC_BINARY_PATH}/libprotoc.a"
  46. "INTERFACE_INCLUDE_DIRECTORIES" "${LIBPROTOC_LIB_INCLUDE}"
  47. )
  48. set_target_properties(libprotobuf PROPERTIES
  49. "IMPORTED_LOCATION" "${LIBPROTOC_BINARY_PATH}/libprotobuf.a"
  50. "INTERFACE_INCLUDE_DIRECTORIES" "${LIBPROTOC_LIB_INCLUDE}"
  51. )
  52. # Builds zlib project from the git submodule.
  53. ExternalProject_Add(zlib
  54. PREFIX zlib
  55. SOURCE_DIR "${gRPCDownload_SOURCE_DIR}/third_party/zlib"
  56. CMAKE_CACHE_ARGS
  57. -DCMAKE_INSTALL_PREFIX:PATH=${gRPCDownload_INSTALL_DIR}/zlib
  58. )
  59. # the location where protobuf-config.cmake will be installed varies by platform
  60. if (WIN32)
  61. set(_FINDPACKAGE_PROTOBUF_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf/cmake")
  62. else()
  63. set(_FINDPACKAGE_PROTOBUF_CONFIG_DIR "${gRPCDownload_INSTALL_DIR}/protobuf/lib/cmake/protobuf")
  64. endif()
  65. # if OPENSSL_ROOT_DIR is set, propagate that hint path to the external projects with OpenSSL dependency.
  66. set(_CMAKE_ARGS_OPENSSL_ROOT_DIR "")
  67. if (OPENSSL_ROOT_DIR)
  68. set(_CMAKE_ARGS_OPENSSL_ROOT_DIR "-DOPENSSL_ROOT_DIR:PATH=${OPENSSL_ROOT_DIR}")
  69. endif()
  70. # Builds gRPC based on locally checked-out sources and set arguments so that all the dependencies
  71. # are correctly located.
  72. ExternalProject_Add(grpc
  73. PREFIX grpc
  74. SOURCE_DIR "${gRPCDownload_SOURCE_DIR}"
  75. CMAKE_CACHE_ARGS
  76. -DgRPC_INSTALL:BOOL=ON
  77. -DgRPC_BUILD_TESTS:BOOL=OFF
  78. -DgRPC_PROTOBUF_PROVIDER:STRING=package
  79. -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG
  80. -DProtobuf_DIR:PATH=${_FINDPACKAGE_PROTOBUF_CONFIG_DIR}
  81. -DgRPC_ZLIB_PROVIDER:STRING=package
  82. -DZLIB_ROOT:STRING=${gRPCDownload_INSTALL_DIR}/zlib
  83. -DgRPC_CARES_PROVIDER:STRING=package
  84. -Dc-ares_DIR:PATH=${gRPCDownload_INSTALL_DIR}/c-ares/lib/cmake/c-ares
  85. -DgRPC_SSL_PROVIDER:STRING=package
  86. ${_CMAKE_ARGS_OPENSSL_ROOT_DIR}
  87. -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/grpc
  88. DEPENDS c-ares protobuf zlib
  89. )
  90. set(LIBGRPC_PREFIX_PATH "${gRPCDownload_INSTALL_DIR}/grpc")
  91. add_executable(grpc_cpp_plugin IMPORTED GLOBAL)
  92. set_target_properties(grpc_cpp_plugin PROPERTIES
  93. "IMPORTED_LOCATION" "${LIBGRPC_PREFIX_PATH}/bin/grpc_cpp_plugin"
  94. )
  95. add_library(grpc++ IMPORTED STATIC GLOBAL)
  96. set_target_properties(grpc++ PROPERTIES
  97. IMPORTED_LOCATION "${LIBGRPC_PREFIX_PATH}/lib/libgrpc++_unsecure.a"
  98. INTERFACE_INCLUDE_DIRECTORIES "${LIBGRPC_PREFIX_PATH}/include"
  99. IMPORTED_LINK_INTERFACE_LIBRARIES "${LIBGRPC_PREFIX_PATH}/lib/libgrpc.a;${LIBGRPC_PREFIX_PATH}/lib/libgpr.a;${LIBGRPC_PREFIX_PATH}/lib/libaddress_sorting.a;${gRPCDownload_INSTALL_DIR}/c-ares/lib/libcares.a;${gRPCDownload_INSTALL_DIR}/zlib/lib/libz.a;pthread"
  100. )