Building gRPC with CMake.

This patch adds an `ENABLE_GRPC` option and builds the bundled gRPC
3rdparty library in CMake.

Review: https://reviews.apache.org/r/61096/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/a2ee950f
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/a2ee950f
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/a2ee950f

Branch: refs/heads/master
Commit: a2ee950fc605c67085360f1d28a9a0373b34d067
Parents: e06f3ec
Author: Chun-Hung Hsiao <chhs...@apache.org>
Authored: Fri Apr 20 18:17:48 2018 -0700
Committer: Chun-Hung Hsiao <chhs...@mesosphere.io>
Committed: Fri Apr 20 18:17:48 2018 -0700

----------------------------------------------------------------------
 3rdparty/CMakeLists.txt          | 135 ++++++++++++++++++++++++++++++++++
 3rdparty/cmake/Versions.cmake    |   2 +
 cmake/CompilationConfigure.cmake |   5 ++
 src/cmake/MesosProtobuf.cmake    |  18 +++--
 4 files changed, 154 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/a2ee950f/3rdparty/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt
index 2f768b3..b7362d2 100644
--- a/3rdparty/CMakeLists.txt
+++ b/3rdparty/CMakeLists.txt
@@ -29,6 +29,7 @@ set(CSI_URL             
${FETCH_URL}/csi-${CSI_VERSION}.tar.gz)
 set(ELFIO_URL           ${FETCH_URL}/elfio-${ELFIO_VERSION}.tar.gz)
 set(GLOG_URL            ${FETCH_URL}/glog-${GLOG_VERSION}.tar.gz)
 set(GOOGLETEST_URL      
${FETCH_URL}/googletest-release-${GOOGLETEST_VERSION}.tar.gz)
+set(GRPC_URL            ${FETCH_URL}/grpc-${GRPC_VERSION}.tar.gz)
 set(HTTP_PARSER_URL     ${FETCH_URL}/http-parser-${HTTP_PARSER_VERSION}.tar.gz)
 set(JEMALLOC_URL        ${FETCH_URL}/jemalloc-${JEMALLOC_VERSION}.tar.gz)
 set(PICOJSON_URL        ${FETCH_URL}/picojson-${PICOJSON_VERSION}.tar.gz)
@@ -991,6 +992,140 @@ ExternalProject_Add(
   URL_HASH          ${PROTOBUF_HASH})
 
 
+if (ENABLE_GRPC)
+  # gRPC: Google's high performance, open-source universal RPC framework.
+  # https://grpc.io/
+  #######################################################################
+  EXTERNAL(grpc ${GRPC_VERSION} ${CMAKE_CURRENT_BINARY_DIR})
+
+  add_library(libgpr ${LIBRARY_LINKAGE} IMPORTED)
+  add_dependencies(libgpr ${GRPC_TARGET})
+  add_library(libgrpc ${LIBRARY_LINKAGE} IMPORTED)
+  add_dependencies(libgrpc ${GRPC_TARGET})
+  add_library(libgrpc++ ${LIBRARY_LINKAGE} IMPORTED)
+  add_dependencies(libgrpc++ ${GRPC_TARGET})
+
+  add_library(grpc INTERFACE)
+  target_link_libraries(grpc INTERFACE libgpr libgrpc libgrpc++)
+
+  # TODO(chhsiao): Move grpc so these don't have to be GLOBAL.
+  add_executable(grpc_cpp_plugin IMPORTED GLOBAL)
+  add_dependencies(grpc_cpp_plugin ${GRPC_TARGET})
+
+  set(GRPC_CMAKE_ARGS
+    ${CMAKE_C_FORWARD_ARGS}
+    ${CMAKE_CXX_FORWARD_ARGS}
+    -DCMAKE_PREFIX_PATH=${PROTOBUF_ROOT}-build
+    -DgRPC_PROTOBUF_PROVIDER=package
+    -DgRPC_PROTOBUF_PACKAGE_TYPE=CONFIG
+    -DgRPC_ZLIB_PROVIDER=package)
+
+  if (ENABLE_SSL)
+    list(APPEND GRPC_CMAKE_ARGS -DgRPC_SSL_PROVIDER=package 
${CMAKE_SSL_FORWARD_ARGS})
+  else ()
+    set(GRPC_UNSECURE _unsecure)
+    list(APPEND GRPC_CMAKE_ARGS -DgRPC_SSL_PROVIDER=none)
+  endif ()
+
+  set(GRPC_BUILD_CMD
+    ${CMAKE_COMMAND} --build . --target gpr &&
+    ${CMAKE_COMMAND} --build . --target grpc${GRPC_UNSECURE} &&
+    ${CMAKE_COMMAND} --build . --target grpc++${GRPC_UNSECURE} &&
+    ${CMAKE_COMMAND} --build . --target grpc_cpp_plugin)
+
+  set_target_properties(
+    grpc PROPERTIES
+    INTERFACE_INCLUDE_DIRECTORIES ${GRPC_ROOT}/include)
+
+  if (WIN32)
+    PATCH_CMD(GRPC_PATCH_CMD grpc-${GRPC_VERSION}.patch)
+
+    list(APPEND GRPC_CMAKE_ARGS -DZLIB_ROOT=${ZLIB_ROOT}-lib)
+
+    if (CMAKE_GENERATOR MATCHES "Visual Studio")
+      set_target_properties(
+        libgpr PROPERTIES
+        IMPORTED_LOCATION_DEBUG ${GRPC_ROOT}-build/Debug/gpr${LIBRARY_SUFFIX}
+        IMPORTED_LOCATION_RELEASE 
${GRPC_ROOT}-build/Release/gpr${LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB_DEBUG 
${GRPC_ROOT}-build/Debug/gpr${CMAKE_IMPORT_LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB_RELEASE 
${GRPC_ROOT}-build/Release/gpr${CMAKE_IMPORT_LIBRARY_SUFFIX})
+
+      set_target_properties(
+        libgrpc PROPERTIES
+        IMPORTED_LOCATION_DEBUG 
${GRPC_ROOT}-build/Debug/grpc${GRPC_UNSECURE}${LIBRARY_SUFFIX}
+        IMPORTED_LOCATION_RELEASE 
${GRPC_ROOT}-build/Release/grpc${GRPC_UNSECURE}${LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB_DEBUG 
${GRPC_ROOT}-build/Debug/grpc${GRPC_UNSECURE}${CMAKE_IMPORT_LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB_RELEASE 
${GRPC_ROOT}-build/Release/grpc${GRPC_UNSECURE}${CMAKE_IMPORT_LIBRARY_SUFFIX})
+
+      set_target_properties(
+        libgrpc++ PROPERTIES
+        IMPORTED_LOCATION_DEBUG 
${GRPC_ROOT}-build/Debug/grpc++${GRPC_UNSECURE}${LIBRARY_SUFFIX}
+        IMPORTED_LOCATION_RELEASE 
${GRPC_ROOT}-build/Release/grpc++${GRPC_UNSECURE}${LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB_DEBUG 
${GRPC_ROOT}-build/Debug/grpc++${GRPC_UNSECURE}${CMAKE_IMPORT_LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB_RELEASE 
${GRPC_ROOT}-build/Release/grpc++${GRPC_UNSECURE}${CMAKE_IMPORT_LIBRARY_SUFFIX})
+
+      set_target_properties(
+        grpc_cpp_plugin PROPERTIES
+        IMPORTED_LOCATION_DEBUG ${GRPC_ROOT}-build/Debug/grpc_cpp_plugin.exe
+        IMPORTED_LOCATION_RELEASE 
${GRPC_ROOT}-build/Release/grpc_cpp_plugin.exe)
+    else ()
+      set_target_properties(
+        libgpr PROPERTIES
+        IMPORTED_LOCATION ${GRPC_ROOT}-build/gpr${LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB ${GRPC_ROOT}-build/gpr${CMAKE_IMPORT_LIBRARY_SUFFIX})
+
+      set_target_properties(
+        libgrpc PROPERTIES
+        IMPORTED_LOCATION 
${GRPC_ROOT}-build/grpc${GRPC_UNSECURE}${LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB 
${GRPC_ROOT}-build/grpc${GRPC_UNSECURE}${CMAKE_IMPORT_LIBRARY_SUFFIX})
+
+      set_target_properties(
+        libgrpc++ PROPERTIES
+        IMPORTED_LOCATION 
${GRPC_ROOT}-build/grpc++${GRPC_UNSECURE}${LIBRARY_SUFFIX}
+        IMPORTED_IMPLIB 
${GRPC_ROOT}-build/grpc++${GRPC_UNSECURE}${CMAKE_IMPORT_LIBRARY_SUFFIX})
+
+      set_target_properties(
+        grpc_cpp_plugin PROPERTIES
+        IMPORTED_LOCATION ${GRPC_ROOT}-build/grpc_cpp_plugin.exe)
+    endif()
+  else ()
+    set_target_properties(
+      libgpr PROPERTIES
+      IMPORTED_LOCATION ${GRPC_ROOT}-build/libgpr${LIBRARY_SUFFIX})
+
+    set_target_properties(
+      libgrpc PROPERTIES
+      IMPORTED_LOCATION 
${GRPC_ROOT}-build/libgrpc${GRPC_UNSECURE}${LIBRARY_SUFFIX})
+
+    set_target_properties(
+      libgrpc++ PROPERTIES
+      IMPORTED_LOCATION 
${GRPC_ROOT}-build/libgrpc++${GRPC_UNSECURE}${LIBRARY_SUFFIX})
+
+    set_target_properties(
+      grpc_cpp_plugin PROPERTIES
+      IMPORTED_LOCATION ${GRPC_ROOT}-build/grpc_cpp_plugin)
+  endif ()
+
+  MAKE_INCLUDE_DIR(grpc)
+  GET_BYPRODUCTS(libgpr)
+  GET_BYPRODUCTS(libgrpc)
+  GET_BYPRODUCTS(libgrpc++)
+  GET_BYPRODUCTS(grpc_cpp_plugin)
+
+  ExternalProject_Add(
+    ${GRPC_TARGET}
+    DEPENDS          protobuf protoc zlib
+    PREFIX           ${GRPC_CMAKE_ROOT}
+    PATCH_COMMAND    ${GRPC_PATCH_CMD}
+    BUILD_BYPRODUCTS 
${LIBGPR_BYPRODUCTS};${LIBGRPC_BYPRODUCTS};${LIBGRPC++_BYPRODUCTS};${GRPC_CPP_PLUGIN_BYPRODUCTS}
+    CMAKE_ARGS       ${GRPC_CMAKE_ARGS}
+    BUILD_COMMAND    ${GRPC_BUILD_CMD}
+    INSTALL_COMMAND  ${CMAKE_NOOP}
+    URL              ${GRPC_URL}
+    URL_HASH         ${GRPC_HASH})
+endif ()
+
+
 # Jemalloc: General-purpose malloc implementation.
 # http://jemalloc.net
 ##################################################

http://git-wip-us.apache.org/repos/asf/mesos/blob/a2ee950f/3rdparty/cmake/Versions.cmake
----------------------------------------------------------------------
diff --git a/3rdparty/cmake/Versions.cmake b/3rdparty/cmake/Versions.cmake
index 33577cc..2828acd 100644
--- a/3rdparty/cmake/Versions.cmake
+++ b/3rdparty/cmake/Versions.cmake
@@ -10,6 +10,8 @@ set(ELFIO_VERSION           "3.2")
 set(ELFIO_HASH              
"SHA256=964BE1D401F98FA7A1242BCF048DF32B7D56DBAAAE5D02834900499073AC2E95")
 set(GOOGLETEST_VERSION      "1.8.0")
 set(GOOGLETEST_HASH         
"SHA256=58A6F4277CA2BC8565222B3BBD58A177609E9C488E8A72649359BA51450DB7D8")
+set(GRPC_VERSION            "1.10.0")
+set(GRPC_HASH               
"SHA256=F52F979FA8EB8D4F74E192D32C97915D124D6531B6D1300A158CDFBABBACA04A")
 set(HTTP_PARSER_VERSION     "2.6.2")
 set(HTTP_PARSER_HASH        
"SHA256=80FFFC3B64EF6968CECDD4B299A96986007DFF4BD12AE6C58CBCB506959B90AD")
 set(JEMALLOC_VERSION        "5.0.1")

http://git-wip-us.apache.org/repos/asf/mesos/blob/a2ee950f/cmake/CompilationConfigure.cmake
----------------------------------------------------------------------
diff --git a/cmake/CompilationConfigure.cmake b/cmake/CompilationConfigure.cmake
index 173089a..6a218e2 100644
--- a/cmake/CompilationConfigure.cmake
+++ b/cmake/CompilationConfigure.cmake
@@ -75,6 +75,11 @@ option(
   TRUE)
 
 option(
+  ENABLE_GRPC
+  "Build libprocess with gRPC support."
+  FALSE)
+
+option(
   ENABLE_LIBEVENT
   "Use libevent instead of libev as the core event loop implementation."
   FALSE)

http://git-wip-us.apache.org/repos/asf/mesos/blob/a2ee950f/src/cmake/MesosProtobuf.cmake
----------------------------------------------------------------------
diff --git a/src/cmake/MesosProtobuf.cmake b/src/cmake/MesosProtobuf.cmake
index dde034f..9fadc9f 100644
--- a/src/cmake/MesosProtobuf.cmake
+++ b/src/cmake/MesosProtobuf.cmake
@@ -127,20 +127,22 @@ function(PROTOC_GENERATE)
     list(APPEND PROTOC_OPTIONS -I${INTERNAL_PROTO_PATH})
   endif ()
 
-  if (PROTOC_GRPC AND HAS_GRPC)
-    # TODO(chhsiao): Add the gRPC plugin.
-    list(APPEND PROTOC_OPTIONS --grpc_out=${CPP_OUT})
+  if (PROTOC_GRPC AND ENABLE_GRPC)
+    list(APPEND PROTOC_OPTIONS
+      --grpc_out=${CPP_OUT}
+      --plugin=protoc-gen-grpc=$<TARGET_FILE:grpc_cpp_plugin>)
   endif ()
 
   if (JAVA_OUT)
-    list(APPEND PROTOC_OPTIONS --java_out=${JAVA_OUT})
+    list(APPEND PROTOC_OPTIONS
+      --java_out=${JAVA_OUT})
   endif ()
 
   # Fully qualified paths for the output .pb.h and .pb.cc files.
   set(CC ${CPP_OUT}/${PROTOC_TARGET}.pb.cc)
   set(H ${CPP_OUT}/${PROTOC_TARGET}.pb.h)
 
-  if (PROTOC_GRPC AND HAS_GRPC)
+  if (PROTOC_GRPC AND ENABLE_GRPC)
     set(GRPC_CC ${CPP_OUT}/${PROTOC_TARGET}.grpc.pb.cc)
     set(GRPC_H ${CPP_OUT}/${PROTOC_TARGET}.grpc.pb.h)
   endif ()
@@ -208,8 +210,12 @@ function(PROTOC_GENERATE)
     endif ()
   endif ()
 
+  # Make sure that the gRPC plugin is built.
+  if (PROTOC_GRPC AND ENABLE_GRPC)
+    list(APPEND PROTOC_DEPENDS grpc_cpp_plugin)
+  endif ()
+
   # Compile the .proto file.
-  # TODO(chhsiao): Add a gRPC dependency.
   add_custom_command(
     OUTPUT ${CC} ${H} ${GRPC_CC} ${GRPC_H} ${JAVA}
     COMMAND protoc ${PROTOC_OPTIONS} ${PROTO}

Reply via email to