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}