You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ti...@apache.org on 2018/09/26 13:23:15 UTC
[mesos] 01/02: Added version check and bundling of libevent to
autotools.
This is an automated email from the ASF dual-hosted git repository.
tillt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 88af8fa693047a49ccd866b901520248775c7ec5
Author: Till Toenshoff <to...@me.com>
AuthorDate: Wed Sep 26 15:21:04 2018 +0200
Added version check and bundling of libevent to autotools.
Bundles libevent 2.0.22 to ensure functional SSL builds accross all
supported platforms. Namely macOS and Ubuntu have shown problems when
using more recent libevent versions. The underlying problem has been
under investigation for a longer period of time - so far without a
solution. The bundled libevent includes a patch to make it libssl
version > 1.0.x compatible. That patch has been extracted from the
Fedora source package libevent-2.0.22-6.fc27. The resulting libevent
builds against both, libssl 1.0.x as well as libssl 1.1.x.
For unbundled builds a version detection of known problematic
distributions vs. provided libevent is included.
Review: https://reviews.apache.org/r/68640/
---
3rdparty/Makefile.am | 22 +++
3rdparty/libevent-2.0.22-stable.patch | 298 +++++++++++++++++++++++++++++++++
3rdparty/libevent-2.0.22-stable.tar.gz | Bin 0 -> 854987 bytes
3rdparty/versions.am | 1 +
configure.ac | 81 ++++-----
m4/libevent.m4 | 103 ++++++++++++
6 files changed, 455 insertions(+), 50 deletions(-)
diff --git a/3rdparty/Makefile.am b/3rdparty/Makefile.am
index d43593e..c69eebe 100644
--- a/3rdparty/Makefile.am
+++ b/3rdparty/Makefile.am
@@ -63,6 +63,7 @@ JEMALLOC = jemalloc-$(JEMALLOC_VERSION)
LEVELDB = leveldb-$(LEVELDB_VERSION)
LIBARCHIVE = libarchive-$(LIBARCHIVE_VERSION)
LIBEV = libev-$(LIBEV_VERSION)
+LIBEVENT = libevent-$(LIBEVENT_VERSION)
NVML = nvml-$(NVML_VERSION)
PIP = pip-$(PIP_VERSION)
PICOJSON = picojson-$(PICOJSON_VERSION)
@@ -86,6 +87,7 @@ EXTRA_DIST = \
$(LEVELDB).tar.gz \
$(LIBARCHIVE).tar.gz \
$(LIBEV).tar.gz \
+ $(LIBEVENT).tar.gz \
$(NVML).tar.gz \
$(PIP).tar.gz \
$(PROTOBUF).tar.gz \
@@ -109,6 +111,10 @@ EXTRA_DIST += \
EXTRA_DIST += \
$(ZOOKEEPER).patch
+# We need to patch libevent 2.0.22 for added compatibilty towards openssl 1.1.x.
+EXTRA_DIST += \
+ $(LIBEVENT).patch
+
CLEAN_EXTRACTED = \
$(BOOST) \
$(CONCURRENTQUEUE) \
@@ -123,6 +129,7 @@ CLEAN_EXTRACTED = \
$(LEVELDB) \
$(LIBARCHIVE) \
$(LIBEV) \
+ $(LIBEVENT) \
$(NVML) \
$(PIP) \
$(PICOJSON) \
@@ -304,6 +311,21 @@ $(LIBEV)-build-stamp: $(LIBEV)-stamp
ALL_LOCAL += $(LIBEV)-build-stamp
endif
+if WITH_BUNDLED_LIBEVENT
+$(LIBEVENT)/libevent.la: $(LIBEVENT)-build-stamp
+$(LIBEVENT)-build-stamp: $(LIBEVENT)-stamp
+ cd $(LIBEVENT) && \
+ CPPFLAGS=$(SSL_INCLUDE_FLAGS) \
+ LDFLAGS=$(SSL_LINKER_FLAGS) \
+ ./configure $(CONFIGURE_ARGS) \
+ --disable-dependency-tracking \
+ --disable-debug-mode \
+ --disable-samples && \
+ $(MAKE) $(AM_MAKEFLAGS)
+ touch $@
+ALL_LOCAL += $(LIBEVENT)-build-stamp
+endif
+
if WITH_BUNDLED_NVML
$(NVML)/nvidia/gdk/nvml.h: $(NVML)-stamp
ALL_LOCAL += $(NVML)-stamp
diff --git a/3rdparty/libevent-2.0.22-stable.patch b/3rdparty/libevent-2.0.22-stable.patch
new file mode 100644
index 0000000..7aa40c4
--- /dev/null
+++ b/3rdparty/libevent-2.0.22-stable.patch
@@ -0,0 +1,298 @@
+diff -up libevent-2.0.22-stable/bufferevent_openssl.c.openssl11 libevent-2.0.22-stable/bufferevent_openssl.c
+--- libevent-2.0.22-stable/bufferevent_openssl.c.openssl11 2014-02-09 19:34:43.000000000 +0100
++++ libevent-2.0.22-stable/bufferevent_openssl.c 2017-03-27 16:00:34.442978756 +0200
+@@ -60,6 +60,7 @@
+ #include <openssl/bio.h>
+ #include <openssl/ssl.h>
+ #include <openssl/err.h>
++#include "openssl-compat.h"
+
+ /*
+ * Define an OpenSSL bio that targets a bufferevent.
+@@ -103,10 +104,8 @@ print_err(int val)
+ static int
+ bio_bufferevent_new(BIO *b)
+ {
+- b->init = 0;
+- b->num = -1;
+- b->ptr = NULL; /* We'll be putting the bufferevent in this field.*/
+- b->flags = 0;
++ BIO_set_init(b, 0);
++ BIO_set_data(b, NULL); /* We'll be putting the bufferevent in this field.*/
+ return 1;
+ }
+
+@@ -116,12 +115,10 @@ bio_bufferevent_free(BIO *b)
+ {
+ if (!b)
+ return 0;
+- if (b->shutdown) {
+- if (b->init && b->ptr)
+- bufferevent_free(b->ptr);
+- b->init = 0;
+- b->flags = 0;
+- b->ptr = NULL;
++ if (BIO_get_shutdown(b)) {
++ if (BIO_get_init(b) && BIO_get_data(b))
++ bufferevent_free(BIO_get_data(b));
++ BIO_free(b);
+ }
+ return 1;
+ }
+@@ -137,10 +134,10 @@ bio_bufferevent_read(BIO *b, char *out,
+
+ if (!out)
+ return 0;
+- if (!b->ptr)
++ if (!BIO_get_data(b))
+ return -1;
+
+- input = bufferevent_get_input(b->ptr);
++ input = bufferevent_get_input(BIO_get_data(b));
+ if (evbuffer_get_length(input) == 0) {
+ /* If there's no data to read, say so. */
+ BIO_set_retry_read(b);
+@@ -156,13 +153,13 @@ bio_bufferevent_read(BIO *b, char *out,
+ static int
+ bio_bufferevent_write(BIO *b, const char *in, int inlen)
+ {
+- struct bufferevent *bufev = b->ptr;
++ struct bufferevent *bufev = BIO_get_data(b);
+ struct evbuffer *output;
+ size_t outlen;
+
+ BIO_clear_retry_flags(b);
+
+- if (!b->ptr)
++ if (!BIO_get_data(b))
+ return -1;
+
+ output = bufferevent_get_output(bufev);
+@@ -188,15 +185,15 @@ bio_bufferevent_write(BIO *b, const char
+ static long
+ bio_bufferevent_ctrl(BIO *b, int cmd, long num, void *ptr)
+ {
+- struct bufferevent *bufev = b->ptr;
++ struct bufferevent *bufev = BIO_get_data(b);
+ long ret = 1;
+
+ switch (cmd) {
+ case BIO_CTRL_GET_CLOSE:
+- ret = b->shutdown;
++ ret = BIO_get_shutdown(b);
+ break;
+ case BIO_CTRL_SET_CLOSE:
+- b->shutdown = (int)num;
++ BIO_set_shutdown(b, (int)num);
+ break;
+ case BIO_CTRL_PENDING:
+ ret = evbuffer_get_length(bufferevent_get_input(bufev)) != 0;
+@@ -225,23 +222,24 @@ bio_bufferevent_puts(BIO *b, const char
+ }
+
+ /* Method table for the bufferevent BIO */
+-static BIO_METHOD methods_bufferevent = {
+- BIO_TYPE_LIBEVENT, "bufferevent",
+- bio_bufferevent_write,
+- bio_bufferevent_read,
+- bio_bufferevent_puts,
+- NULL /* bio_bufferevent_gets */,
+- bio_bufferevent_ctrl,
+- bio_bufferevent_new,
+- bio_bufferevent_free,
+- NULL /* callback_ctrl */,
+-};
++static BIO_METHOD *methods_bufferevent;
+
+ /* Return the method table for the bufferevents BIO */
+ static BIO_METHOD *
+ BIO_s_bufferevent(void)
+ {
+- return &methods_bufferevent;
++ if (methods_bufferevent == NULL) {
++ methods_bufferevent = BIO_meth_new(BIO_TYPE_LIBEVENT, "bufferevent");
++ if (methods_bufferevent == NULL)
++ return NULL;
++ BIO_meth_set_write(methods_bufferevent, bio_bufferevent_write);
++ BIO_meth_set_read(methods_bufferevent, bio_bufferevent_read);
++ BIO_meth_set_puts(methods_bufferevent, bio_bufferevent_puts);
++ BIO_meth_set_ctrl(methods_bufferevent, bio_bufferevent_ctrl);
++ BIO_meth_set_create(methods_bufferevent, bio_bufferevent_new);
++ BIO_meth_set_destroy(methods_bufferevent, bio_bufferevent_free);
++ }
++ return methods_bufferevent;
+ }
+
+ /* Create a new BIO to wrap communication around a bufferevent. If close_flag
+@@ -254,9 +252,9 @@ BIO_new_bufferevent(struct bufferevent *
+ return NULL;
+ if (!(result = BIO_new(BIO_s_bufferevent())))
+ return NULL;
+- result->init = 1;
+- result->ptr = bufferevent;
+- result->shutdown = close_flag ? 1 : 0;
++ BIO_set_init(result, 1);
++ BIO_set_data(result, bufferevent);
++ BIO_set_shutdown(result, close_flag ? 1 : 0);
+ return result;
+ }
+
+@@ -498,7 +496,7 @@ conn_closed(struct bufferevent_openssl *
+ break;
+ case SSL_ERROR_SYSCALL:
+ /* IO error; possibly a dirty shutdown. */
+- if (ret == 0 && ERR_peek_error() == 0)
++ if ((ret == 0 || ret == -1) && ERR_peek_error() == 0)
+ dirty_shutdown = 1;
+ break;
+ case SSL_ERROR_SSL:
+diff -up libevent-2.0.22-stable/openssl-compat.h.openssl11 libevent-2.0.22-stable/openssl-compat.h
+--- libevent-2.0.22-stable/openssl-compat.h.openssl11 2017-03-27 16:00:34.442978756 +0200
++++ libevent-2.0.22-stable/openssl-compat.h 2017-03-27 16:00:34.442978756 +0200
+@@ -0,0 +1,35 @@
++#ifndef OPENSSL_COMPAT_H
++#define OPENSSL_COMPAT_H
++
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
++
++static inline BIO_METHOD *BIO_meth_new(int type, const char *name)
++{
++ BIO_METHOD *biom = calloc(1, sizeof(BIO_METHOD));
++
++ if (biom != NULL) {
++ biom->type = type;
++ biom->name = name;
++ }
++ return biom;
++}
++
++#define BIO_meth_set_write(b, f) (b)->bwrite = (f)
++#define BIO_meth_set_read(b, f) (b)->bread = (f)
++#define BIO_meth_set_puts(b, f) (b)->bputs = (f)
++#define BIO_meth_set_ctrl(b, f) (b)->ctrl = (f)
++#define BIO_meth_set_create(b, f) (b)->create = (f)
++#define BIO_meth_set_destroy(b, f) (b)->destroy = (f)
++
++#define BIO_set_init(b, val) (b)->init = (val)
++#define BIO_set_data(b, val) (b)->ptr = (val)
++#define BIO_set_shutdown(b, val) (b)->shutdown = (val)
++#define BIO_get_init(b) (b)->init
++#define BIO_get_data(b) (b)->ptr
++#define BIO_get_shutdown(b) (b)->shutdown
++
++#define TLS_method SSLv23_method
++
++#endif /* OPENSSL_VERSION_NUMBER < 0x10100000L */
++
++#endif /* OPENSSL_COMPAT_H */
+diff -up libevent-2.0.22-stable/sample/le-proxy.c.openssl11 libevent-2.0.22-stable/sample/le-proxy.c
+--- libevent-2.0.22-stable/sample/le-proxy.c.openssl11 2012-02-10 23:17:14.000000000 +0100
++++ libevent-2.0.22-stable/sample/le-proxy.c 2017-03-27 16:00:34.442978756 +0200
+@@ -28,6 +28,7 @@
+ #include <openssl/ssl.h>
+ #include <openssl/err.h>
+ #include <openssl/rand.h>
++#include "openssl-compat.h"
+
+ static struct event_base *base;
+ static struct sockaddr_storage listen_on_addr;
+@@ -253,16 +254,18 @@ main(int argc, char **argv)
+
+ if (use_ssl) {
+ int r;
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ SSL_library_init();
+ ERR_load_crypto_strings();
+ SSL_load_error_strings();
+ OpenSSL_add_all_algorithms();
++#endif
+ r = RAND_poll();
+ if (r == 0) {
+ fprintf(stderr, "RAND_poll() failed.\n");
+ return 1;
+ }
+- ssl_ctx = SSL_CTX_new(SSLv23_method());
++ ssl_ctx = SSL_CTX_new(TLS_method());
+ }
+
+ listener = evconnlistener_new_bind(base, accept_cb, NULL,
+diff -up libevent-2.0.22-stable/test/regress_ssl.c.openssl11 libevent-2.0.22-stable/test/regress_ssl.c
+--- libevent-2.0.22-stable/test/regress_ssl.c.openssl11 2013-02-05 21:00:51.000000000 +0100
++++ libevent-2.0.22-stable/test/regress_ssl.c 2017-03-27 16:44:26.814402266 +0200
+@@ -49,22 +49,40 @@
+ #include <openssl/bio.h>
+ #include <openssl/err.h>
+ #include <openssl/pem.h>
++#include "openssl-compat.h"
+
+ #include <string.h>
+
+-/* A short pre-generated key, to save the cost of doing an RSA key generation
+- * step during the unit tests. It's only 512 bits long, and it is published
+- * in this file, so you would have to be very foolish to consider using it in
+- * your own code. */
++/* A pre-generated key, to save the cost of doing an RSA key generation step
++ * during the unit tests. It is published in this file, so you would have to
++ * be very foolish to consider using it in your own code. */
+ static const char KEY[] =
+ "-----BEGIN RSA PRIVATE KEY-----\n"
+- "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\n"
+ "-----END RSA PRIVATE KEY-----\n";
+
+ static EVP_PKEY *
+@@ -137,7 +155,7 @@ get_ssl_ctx(void)
+ {
+ if (the_ssl_ctx)
+ return the_ssl_ctx;
+- the_ssl_ctx = SSL_CTX_new(SSLv23_method());
++ the_ssl_ctx = SSL_CTX_new(TLS_method());
+ if (!the_ssl_ctx)
+ return NULL;
+ if (disable_tls_11_and_12) {
+@@ -154,6 +172,7 @@ get_ssl_ctx(void)
+ static void
+ init_ssl(void)
+ {
++#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER)
+ SSL_library_init();
+ ERR_load_crypto_strings();
+ SSL_load_error_strings();
+@@ -161,6 +180,7 @@ init_ssl(void)
+ if (SSLeay() != OPENSSL_VERSION_NUMBER) {
+ TT_DECLARE("WARN", ("Version mismatch for openssl: compiled with %lx but running with %lx", (unsigned long)OPENSSL_VERSION_NUMBER, (unsigned long)SSLeay()));
+ }
++#endif
+ }
+
+ /* ====================
diff --git a/3rdparty/libevent-2.0.22-stable.tar.gz b/3rdparty/libevent-2.0.22-stable.tar.gz
new file mode 100644
index 0000000..db88cad
Binary files /dev/null and b/3rdparty/libevent-2.0.22-stable.tar.gz differ
diff --git a/3rdparty/versions.am b/3rdparty/versions.am
index 8fd8bd4..99ef920 100644
--- a/3rdparty/versions.am
+++ b/3rdparty/versions.am
@@ -32,6 +32,7 @@ JEMALLOC_VERSION = 5.0.1
LEVELDB_VERSION = 1.19
LIBARCHIVE_VERSION = 3.3.2
LIBEV_VERSION = 4.22
+LIBEVENT_VERSION = 2.0.22-stable
NVML_VERSION = 352.79
PICOJSON_VERSION = 1.3.0
PIP_VERSION = 7.1.2
diff --git a/configure.ac b/configure.ac
index 472e110..505201a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -460,7 +460,7 @@ AC_ARG_WITH([libev],
AC_ARG_WITH([libevent],
AS_HELP_STRING([--with-libevent=@<:@=DIR@:>@],
[specify where to locate the libevent library]),
- [], [])
+ [without_bundled_libevent=yes], [])
AC_ARG_WITH([libarchive],
AS_HELP_STRING([--with-libarchive=@<:@=DIR@:>@],
@@ -1485,38 +1485,28 @@ if test -n "`echo $with_libevent`"; then
fi
if test "x$enable_libevent" = "xyes"; then
- AC_CHECK_HEADERS([event2/event.h],
- [AC_CHECK_LIB([event],
- [event_base_new],
- [],
- [AC_MSG_ERROR([cannot find libevent
--------------------------------------------------------------------
-libevent version 2+ is required for libprocess to build.
--------------------------------------------------------------------
- ])])],
- [AC_MSG_ERROR([cannot find libevent headers
--------------------------------------------------------------------
-libevent version 2+ headers are required for libprocess to build.
+ # Check if user has asked us to use a preinstalled libevent, or if they
+ # asked us to ignore all bundled libraries while compiling and
+ # linking.
+ if test "x$without_bundled_libevent" = "xyes" || \
+ test "x$enable_bundled" != "xyes"; then
+ MESOS_HAVE_LIBEVENT([2.0.22], [], [
+ AC_MSG_ERROR([libevent version is incompatible
-------------------------------------------------------------------
- ])])
+libevent version 2.0.22 is the most recent we currently support.
- AC_CHECK_HEADERS([event2/thread.h],
- [AC_CHECK_LIB([event_pthreads],
- [evthread_use_pthreads],
- [],
- [AC_MSG_ERROR([cannot find libevent_pthreads
--------------------------------------------------------------------
-libevent_pthreads version 2+ is required for libprocess to build.
--------------------------------------------------------------------
- ])])],
- [AC_MSG_ERROR([cannot find libevent_pthreads headers
--------------------------------------------------------------------
-libevent_pthreads version 2+ headers are required for libprocess to build.
--------------------------------------------------------------------
- ])])
+You may want to install an older version of libevent on your system
+and point this build system to it via --with-libevent=DIR.
+-------------------------------------------------------------------])])
+ else
+ with_bundled_libevent=yes
+ fi
fi
-AM_CONDITIONAL([ENABLE_LIBEVENT], [test x"$enable_libevent" = "xyes"])
+AM_CONDITIONAL([ENABLE_LIBEVENT],
+ [test "x$enable_libevent" = "xyes"])
+AM_CONDITIONAL([WITH_BUNDLED_LIBEVENT],
+ [test "x$with_bundled_libevent" = "xyes"])
# Check if user has asked us to use a preinstalled libarchive, or if
@@ -1554,7 +1544,6 @@ fi
AM_CONDITIONAL([WITH_BUNDLED_LIBARCHIVE], [test "x$with_bundled_libarchive" = "xyes"])
-
# Check if user has asked us to use a preinstalled libprocess, or if
# they asked us to ignore all bundled libraries while compiling and
# linking.
@@ -1788,17 +1777,6 @@ fi
AM_CONDITIONAL([WITH_BUNDLED_LIBEV], [test "x$with_bundled_libev" = "xyes"])
-# Check if libevent prefix path was provided, and if so, add it to
-# the CPPFLAGS and LDFLAGS with respective /include and /lib path
-# suffixes.
-if test -z "`echo $with_libevent`" &&
- test "$OS_NAME" = "darwin" &&
- test -n "`command -v brew`" &&
- test -n "`brew list --versions libevent`"; then
- with_libevent=`brew --prefix libevent`
-fi
-
-
if test -n "`echo $with_picojson`"; then
CPPFLAGS="$CPPFLAGS -I${with_picojson}/include"
fi
@@ -1999,27 +1977,30 @@ libcrypto is required for an SSL-enabled build.
LIBS="-lssl -lcrypto $LIBS"
if test "x$enable_libevent" = "xyes"; then
- AC_CHECK_HEADERS([event2/bufferevent_ssl.h],
- [AC_CHECK_LIB([event_openssl],
- [bufferevent_openssl_get_ssl],
- [],
- [AC_MSG_ERROR([cannot find libevent_openssl
+ if test "x$with_bundled_libevent" != "xyes"; then
+ AC_CHECK_HEADERS([event2/bufferevent_ssl.h],
+ [AC_CHECK_LIB([event_openssl],
+ [bufferevent_openssl_get_ssl],
+ [],
+ [AC_MSG_ERROR([cannot find libevent_openssl
-------------------------------------------------------------------
libevent_openssl version 2+ is required for an SSL-enabled build.
-------------------------------------------------------------------
- ])])],
- [AC_MSG_ERROR([cannot find libevent_openssl headers
+ ])])],
+ [AC_MSG_ERROR([cannot find libevent_openssl headers
-------------------------------------------------------------------
libevent_openssl version 2+ headers are required for an SSL-enabled build.
-------------------------------------------------------------------
- ])])
+ ])])
+ fi
else
AC_MSG_ERROR([SSL is currently only supported with libevent])
fi
AC_DEFINE([USE_SSL_SOCKET], [1])
fi
-AM_CONDITIONAL([ENABLE_SSL], [test x"$enable_ssl" = "xyes"])
+AM_CONDITIONAL([ENABLE_SSL],
+ [test "x$enable_ssl" = "xyes"])
AC_SUBST([SSL_CPPFLAGS])
AC_SUBST([SSL_LINKERFLAGS])
diff --git a/m4/libevent.m4 b/m4/libevent.m4
new file mode 100644
index 0000000..b8462f8
--- /dev/null
+++ b/m4/libevent.m4
@@ -0,0 +1,103 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# SYNOPSIS
+#
+# MESOS_HAVE_LIBEVENT(MINIMAL_VERSION, action-if-true, action-if-false)
+#
+# DESCRIPTION
+#
+# Validates if we have a usable libevent.
+#
+
+AC_DEFUN([MESOS_HAVE_LIBEVENT],[
+ AC_CHECK_HEADERS([event2/event.h], [], [
+ AC_MSG_ERROR([cannot find libevent headers
+-------------------------------------------------------------------
+libevent version 2+ headers are required for libprocess to build.
+-------------------------------------------------------------------
+ ])])
+
+ AC_CHECK_LIB([event], [event_base_new], [], [
+ AC_MSG_ERROR([cannot find libevent
+-------------------------------------------------------------------
+libevent version 2+ is required for libprocess to build.
+-------------------------------------------------------------------
+ ])])
+
+ AC_CHECK_HEADERS([event2/thread.h], [], [
+ AC_MSG_ERROR([cannot find libevent_pthreads headers
+-------------------------------------------------------------------
+libevent_pthreads version 2+ headers are required for libprocess to build.
+-------------------------------------------------------------------
+ ])])
+
+ AC_CHECK_LIB([event_pthreads], [evthread_use_pthreads], [], [
+ AC_MSG_ERROR([cannot find libevent_pthreads
+-------------------------------------------------------------------
+libevent_pthreads version 2+ is required for libprocess to build.
+-------------------------------------------------------------------
+ ])])
+
+ AC_MSG_CHECKING([for libevent version])
+
+ # Save our flags.
+ saved_CFLAGS="$CFLAGS"
+ saved_LIBS="$LIBS"
+
+ # Required flags for libevent.
+ LIBS="-levent"
+ CFLAGS=""
+
+ # Compile and run C program that gets the libevent version numnber into
+ # "conftest.out" which gets cleaned up by AC_RUN_IFELSE itself.
+ AC_LANG_PUSH([C])
+ AC_RUN_IFELSE([
+ AC_LANG_SOURCE([[
+ #include <event.h>
+ #include <stdio.h>
+
+ int main(int argc, char** argv)
+ {
+ FILE* fp = fopen("conftest.out", "w");
+ fprintf(fp, "%s", event_get_version());
+ fclose(fp);
+ return 0;
+ }
+ ]])],
+ [libevent_version=`cat conftest.out`])
+ AC_LANG_POP([C])
+
+ # Restore flags.
+ CFLAGS="$saved_CFLAGS"
+ LIBS="$saved_LIBS"
+
+ AC_MSG_RESULT([$libevent_version])
+
+ AS_IF([test "x${libevent_version}" = "x"], [], [
+ AX_COMPARE_VERSION([$libevent_version],
+ [le], [$1],
+ [is_libevent_usable=yes])
+ ])
+
+ AS_IF([test "x$is_libevent_usable" = "xyes"], [
+ $2
+ ], [
+ $3
+ ])
+])