You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2017/08/10 23:55:39 UTC
[10/11] mesos git commit: Building gRPC with Autotools.
Building gRPC with Autotools.
This patch enables building gRPC through Autotools under Linux with
opetion `--enable-grpc`. Additionally, another option `--enable-grpc` is
added to let the user specify the path to a custom gRPC library. This
option depends on `--with-protobuf` to avoid using conflicting versions
of Protobuf libraries.
For OpenSSL and unbundled Protobuf, we introduce new variables
`<lib>_CPPFLAGS` and `<lib>_LINKERFLAGS` for building gRPC.
Review: https://reviews.apache.org/r/61159
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/90f7a7e1
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/90f7a7e1
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/90f7a7e1
Branch: refs/heads/master
Commit: 90f7a7e140d4dbee53a0edc2ab225a4ea83db3a5
Parents: fa0494e
Author: Chun-Hung Hsiao <ch...@mesosphere.io>
Authored: Tue May 23 10:49:00 2017 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Aug 10 16:55:06 2017 -0700
----------------------------------------------------------------------
3rdparty/Makefile.am | 50 +++++++++++++++++++
3rdparty/versions.am | 1 +
configure.ac | 123 ++++++++++++++++++++++++++++++++++++++++++++--
src/Makefile.am | 15 ++++++
4 files changed, 185 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/90f7a7e1/3rdparty/Makefile.am
----------------------------------------------------------------------
diff --git a/3rdparty/Makefile.am b/3rdparty/Makefile.am
index 742b8bf..2182837 100644
--- a/3rdparty/Makefile.am
+++ b/3rdparty/Makefile.am
@@ -38,6 +38,8 @@ CONFIGURE_ARGS = @CONFIGURE_ARGS@ --enable-shared=no --with-pic --srcdir=.
CONFIGURE_ARGS += --prefix=/
# Set up building flags for non-bundled libraries.
+SSL_INCLUDE_FLAGS = @SSL_CPPFLAGS@
+SSL_LINKER_FLAGS = @SSL_LINKERFLAGS@
ZLIB_INCLUDE_FLAGS = @ZLIB_CPPFLAGS@
ZLIB_LINKER_FLAGS = @ZLIB_LINKERFLAGS@
@@ -53,6 +55,7 @@ GLOG = glog-$(GLOG_VERSION)
GOOGLETEST = googletest-release-$(GOOGLETEST_VERSION)
GMOCK = $(GOOGLETEST)/googlemock
GPERFTOOLS = gperftools-$(GPERFTOOLS_VERSION)
+GRPC = grpc-$(GRPC_VERSION)
GTEST = $(GOOGLETEST)/googletest
HTTP_PARSER = http-parser-$(HTTP_PARSER_VERSION)
LEVELDB = leveldb-$(LEVELDB_VERSION)
@@ -72,6 +75,7 @@ EXTRA_DIST = \
$(GLOG).tar.gz \
$(GOOGLETEST).tar.gz \
$(GPERFTOOLS).tar.gz \
+ $(GRPC).tar.gz \
$(HTTP_PARSER).tar.gz \
$(LEVELDB).tar.gz \
$(LIBEV).tar.gz \
@@ -88,6 +92,10 @@ EXTRA_DIST = \
EXTRA_DIST += \
$(GLOG).patch
+# We patch grpc for CMake compilation issues.
+EXTRA_DIST += \
+ $(GRPC).patch
+
# We need to patch leveldb to prevent it from linking to snappy and
# tcmalloc; see MESOS-1054, MESOS-1624.
EXTRA_DIST += \
@@ -108,6 +116,7 @@ CLEAN_EXTRACTED = \
$(GLOG) \
$(GOOGLETEST) \
$(GPERFTOOLS) \
+ $(GRPC) \
$(HTTP_PARSER) \
$(LEVELDB) \
$(LIBEV) \
@@ -280,6 +289,47 @@ $(PROTOBUF)-build-stamp: $(PROTOBUF)-stamp
touch $@
ALL_LOCAL += $(PROTOBUF)/src/libprotobuf.la
ALL_LOCAL += $(PROTOBUF)/src/protoc
+
+PROTOBUF_INCLUDE_FLAGS = -I$(abs_builddir)/$(PROTOBUF)/src
+PROTOBUF_LINKER_FLAGS = -L$(abs_builddir)/$(PROTOBUF)/src/.libs
+PROTOC = $(abs_builddir)/$(PROTOBUF)/src/protoc
+else
+$(PROTOBUF)-build-stamp:
+ touch $@
+
+PROTOBUF_INCLUDE_FLAGS = @PROTOBUF_CPPFLAGS@
+PROTOBUF_LINKER_FLAGS = @PROTOBUF_LINKERFLAGS@
+PROTOC = @PROTOCOMPILER@
+endif
+
+if ENABLE_GRPC
+if WITH_BUNDLED_GRPC
+LIB_GRPC = $(GRPC)/libs/opt/libgrpc++.a \
+ $(GRPC)/libs/opt/libgrpc.a \
+ $(GRPC)/libs/opt/libgpr.a
+
+$(LIB_GRPC): $(GRPC)-build-stamp
+
+$(GRPC)-build-stamp: $(GRPC)-stamp \
+ $(PROTOBUF)-build-stamp
+ cd $(GRPC) && \
+ CPPFLAGS="$(PROTOBUF_INCLUDE_FLAGS) \
+ $(SSL_INCLUDE_FLAGS) \
+ $(ZLIB_INCLUDE_FLAGS)" \
+ LDFLAGS="$(PROTOBUF_LINKER_FLAGS) \
+ $(SSL_LINKER_FLAGS) \
+ $(ZLIB_LINKER_FLAGS)" \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ HAS_PKG_CONFIG=false \
+ NO_PROTOC=false \
+ PROTOC=$(PROTOC)
+ touch $@
+
+ALL_LOCAL += $(LIB_GRPC)
+else
+$(GRPC)-build-stamp:
+ touch $@
+endif
endif
# Convenience library for gmock/gtest.
http://git-wip-us.apache.org/repos/asf/mesos/blob/90f7a7e1/3rdparty/versions.am
----------------------------------------------------------------------
diff --git a/3rdparty/versions.am b/3rdparty/versions.am
index 0893572..82d66be 100644
--- a/3rdparty/versions.am
+++ b/3rdparty/versions.am
@@ -25,6 +25,7 @@ ELFIO_VERSION = 3.2
GLOG_VERSION = 0.3.3
GOOGLETEST_VERSION = 1.8.0
GPERFTOOLS_VERSION = 2.5
+GRPC_VERSION = 1.4.2
HTTP_PARSER_VERSION = 2.6.2
LEVELDB_VERSION = 1.19
LIBEV_VERSION = 4.22
http://git-wip-us.apache.org/repos/asf/mesos/blob/90f7a7e1/configure.ac
----------------------------------------------------------------------
diff --git a/configure.ac b/configure.ac
index b6a6deb..ee3818d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -205,6 +205,11 @@ AC_ARG_ENABLE([debug],
option won't change them]),
[], [enable_debug=no])
+AC_ARG_ENABLE([grpc],
+ AS_HELP_STRING([--enable-grpc],
+ [enable grpc support]),
+ [], [enable_grpc=no])
+
AC_ARG_ENABLE([port-mapping-isolator],
AS_HELP_STRING([--enable-port-mapping-isolator],
[enable port mapping network isolator]),
@@ -331,6 +336,13 @@ AC_ARG_WITH([gmock],
location prefixed by the given path]),
[without_bundled_gmock=yes], [])
+AC_ARG_WITH([grpc],
+ AS_HELP_STRING([--with-grpc@<:@=DIR@:>@],
+ [excludes building and using the bundled grpc
+ package in lieu of an installed version at a
+ location prefixed by the given path]),
+ [without_bundled_grpc=yes], [])
+
AC_ARG_WITH([http-parser],
AS_HELP_STRING([--with-http-parser@<:@=DIR@:>@],
[excludes building and using the bundled http-parser
@@ -1463,8 +1475,11 @@ AM_CONDITIONAL([WITH_BUNDLED_NVML],
# CPPFLAGS while extending it by /include and to LDFLAGS while
# extending it by /lib.
if test -n "`echo $with_protobuf`"; then
- CPPFLAGS="$CPPFLAGS -isystem ${with_protobuf}/include"
- LDFLAGS="$LDFLAGS -L${with_protobuf}/lib"
+ PROTOBUF_CPPFLAGS="-isystem ${with_protobuf}/include"
+ PROTOBUF_LINKERFLAGS="-L${with_protobuf}/lib"
+
+ CPPFLAGS="$PROTOBUF_CPPFLAGS $CPPFLAGS"
+ LDFLAGS="$PROTOBUF_LINKERFLAGS $LDFLAGS"
fi
# Check if user has asked us to use a preinstalled protobuf, or if
@@ -1541,9 +1556,12 @@ fi
AM_CONDITIONAL([WITH_BUNDLED_PROTOBUF],
[test "x$with_bundled_protobuf" = "xyes"])
+AC_SUBST([PROTOBUF_CPPFLAGS])
AC_SUBST([PROTOBUF_JAR])
+AC_SUBST([PROTOBUF_LINKERFLAGS])
AC_SUBST([PROTOCOMPILER])
+
if test -n "`echo $with_libev`"; then
CPPFLAGS="$CPPFLAGS -isystem ${with_libev}/include"
LDFLAGS="$LDFLAGS -L${with_libev}/lib"
@@ -1728,8 +1746,11 @@ if test -z "`echo $with_ssl`" &&
fi
if test -n "`echo $with_ssl`"; then
- CPPFLAGS="-isystem ${with_ssl}/include $CPPFLAGS"
- LDFLAGS="-L${with_ssl}/lib $LDFLAGS"
+ SSL_CPPFLAGS="-isystem ${with_ssl}/include"
+ SSL_LINKERFLAGS="-L${with_ssl}/lib"
+
+ CPPFLAGS="$SSL_CPPFLAGS $CPPFLAGS"
+ LDFLAGS="$SSL_LINKERFLAGS $LDFLAGS"
fi
AC_CHECK_LIB([crypto], [RAND_poll], [found_crypto=yes])
@@ -1783,6 +1804,9 @@ fi
AM_CONDITIONAL([ENABLE_SSL], [test x"$enable_ssl" = "xyes"])
+AC_SUBST([SSL_CPPFLAGS])
+AC_SUBST([SSL_LINKERFLAGS])
+
# Check if user has asked us to use a preinstalled stout, or if
# they asked us to ignore all bundled libraries while compiling and
@@ -1930,6 +1954,97 @@ AC_SUBST([ZLIB_CPPFLAGS])
AC_SUBST([ZLIB_LINKERFLAGS])
+# Check if grpc prefix path was supplied and if so, add it to the
+# CPPFLAGS and LDFLAGS with respective /include and /lib path suffixes.
+if test -n "`echo $with_grpc`"; then
+ if test "x$without_bundled_protobuf" != "xyes"; then
+ AC_MSG_ERROR([protobuf not specified
+-------------------------------------------------------------------
+You have requested the use of a non-bundled grpc without specifying
+the protobuf library it uses. This is prohibited to avoid using
+conflicting versions of protobuf libraries. Please specify the
+location of protobuf used by grpc by providing a prefix path via
+--with-protobuf=DIR.
+-------------------------------------------------------------------
+ ])
+ fi
+
+ CPPFLAGS="$CPPFLAGS -isystem ${with_grpc}/include"
+ LDFLAGS="$LDFLAGS -L${with_grpc}/lib"
+fi
+
+if test "x$enable_grpc" = "xyes"; then
+ # Check if user has asked us to use a preinstalled grpc, or if they
+ # asked us to ignore all bundled libraries while compiling and linking.
+ if test "x$without_bundled_grpc" = "xyes" || \
+ test "x$enable_bundled" != "xyes"; then
+ # Use the system default prefix if not specified.
+ if test -n "`echo $with_grpc`"; then
+ GRPCPREFIX="${with_grpc}"
+ elif test "x$enable_bundled" != "xyes"; then
+ GRPCPREFIX="/usr"
+ fi
+
+ # Check if headers and library were located.
+ saved_LIBS="$LIBS"
+ LIBS="-lgrpc++ -lgrpc -lgpr $LIBS"
+ AC_LANG_PUSH([C++])
+ AC_CHECK_HEADERS([grpc++/grpc++.h],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([#include <grpc++/grpc++.h>],
+ [grpc::Version();])],
+ [found_grpc=yes],
+ [found_grpc=no])],
+ [found_grpc=no])
+ AC_LANG_POP()
+ LIBS="$saved_LIBS"
+
+ if test "x$found_grpc" = "xyes"; then
+ with_bundled_grpc=no
+
+ AC_CHECK_TOOL([GRPC_CXX_PLUGIN_TEST],
+ [grpc_cpp_plugin],
+ [],
+ [$GRPCPREFIX/bin])
+
+ if test -z "`echo $GRPC_CXX_PLUGIN_TEST`"; then
+ AC_MSG_ERROR([grpc_cpp_plugin not found in PATH])
+ fi
+
+ GRPC_CXX_PLUGIN="$GRPCPREFIX/bin/grpc_cpp_plugin"
+
+ else
+ AC_MSG_ERROR([cannot find grpc
+-------------------------------------------------------------------
+You have requested the use of a non-bundled grpc but no suitable
+grpc could be found.
+
+You may want specify the location of grpc by providing a prefix
+path via --with-grpc=DIR, or check that the path you provided is
+correct if you are already doing this.
+-------------------------------------------------------------------
+ ])
+ fi
+ else
+ if test "x$found_ssl" != "xyes"; then
+ AC_MSG_ERROR([cannot find libssl
+-------------------------------------------------------------------
+libssl is required for gRPC to build.
+-------------------------------------------------------------------
+ ])
+ fi
+
+ with_bundled_grpc=yes
+ fi
+fi
+
+AM_CONDITIONAL([ENABLE_GRPC], [test "x$enable_grpc" = "xyes"])
+AM_CONDITIONAL([WITH_BUNDLED_GRPC],
+ [test "x$with_bundled_grpc" = "xyes"])
+
+AC_SUBST([GRPC_CXX_PLUGIN])
+
+
# Check if ZooKeeper prefix path was supplied and if so, add it to
# CPPFLAGS while extending it by /include/zookeeper and to LDFLAGS
# while extending it by /lib.
http://git-wip-us.apache.org/repos/asf/mesos/blob/90f7a7e1/src/Makefile.am
----------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index 4cf3535..68fff14 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -39,6 +39,7 @@ GLOG = 3rdparty/glog-$(GLOG_VERSION)
GOOGLETEST = 3rdparty/googletest-release-$(GOOGLETEST_VERSION)
GMOCK = $(GOOGLETEST)/googlemock
GTEST = $(GOOGLETEST)/googletest
+GRPC = 3rdparty/grpc-$(GRPC_VERSION)
PROTOBUF = 3rdparty/protobuf-$(PROTOBUF_VERSION)
PICOJSON = 3rdparty/picojson-$(PICOJSON_VERSION)
NVML = 3rdparty/nvml-$(NVML_VERSION)
@@ -173,6 +174,19 @@ LIB_GLOG = -lglog
LDADD += -lglog
endif
+if ENABLE_GRPC
+if WITH_BUNDLED_GRPC
+LIB_GRPC = ../$(GRPC)/libs/opt/libgrpc++.a \
+ ../$(GRPC)/libs/opt/libgrpc.a \
+ ../$(GRPC)/libs/opt/libgpr.a \
+ -lssl -lcrypto
+GRPC_CPP_PLUGIN = ../$(GRPC)/bins/opt/grpc_cpp_plugin
+else
+LIB_GRPC = -lgrpc++ -lgrpc -lgpr -lssl -lcrypto
+GRPC_CPP_PLUGIN = @GRPC_CXX_PLUGIN@
+endif
+endif
+
if WITH_BUNDLED_LEVELDB
MESOS_CPPFLAGS += -I../$(LEVELDB)/include
@@ -1509,6 +1523,7 @@ libmesos_la_LIBTOOLFLAGS = --tag=CXX
libmesos_la_LIBADD = \
libmesos_no_3rdparty.la \
$(LIB_GLOG) \
+ $(LIB_GRPC) \
$(LIB_LEVELDB) \
$(LIB_PROCESS) \
$(LIB_PROTOBUF) \