1# Copyright (C) 2011, Antoine Bertin <diaoulael@gmail.com>
2# Copyright (C) 2011-2014, Martin Johansson <martin@fatbob.nu>
3#
4#  All rights reserved.
5#
6#  Redistribution and use in source and binary forms, with or without
7#  modification, are permitted provided that the following conditions
8#  are met:
9#
10#  - Redistributions of source code must retain the above copyright notice,
11#    this list of conditions and the following disclaimer.
12#  - Redistributions in binary form must reproduce the above copyright notice,
13#    this list of conditions and the following disclaimer in the documentation
14#    and/or other materials provided with the distribution.
15#  - Neither the name of the Developers nor the names of its contributors may
16#    be used to endorse or promote products derived from this software without
17#    specific prior written permission.
18#
19#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20#  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22#  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23#  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28#  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29#  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31# Process this file with autoconf to produce a configure script.
32AC_PREREQ([2.63])
33AC_INIT([umurmur], [0.2.16], [https://github.com/umurmur/umurmur/issues/new], [umurmur], [http://github.com/umurmur/umurmur])
34AC_CONFIG_SRCDIR([src/client.h])
35AC_CONFIG_HEADERS([src/config.h:config.h.in])
36AM_INIT_AUTOMAKE
37AC_CANONICAL_HOST
38AM_SILENT_RULES([yes])
39
40# Configure options.
41AC_ARG_WITH([ssl], [AC_HELP_STRING([--with-ssl=@<:@LIB@:>@], [SSL library (openssl|polarssl|gnutls|mbedtls) @<:@default=polarssl@:>@])], [], [with_ssl=polarssl])
42AC_ARG_ENABLE([shmapi], [AC_HELP_STRING([--enable-shmapi], [compile with Sharedmemory API support @<:@default=no@:>@])],[],[enable_shmapi=no] )
43AC_ARG_ENABLE(polarssl-test-cert, [  --enable-polarssl-test-cert  Link to PolarSSL test certificate and key @<:@default=no@:>@], [enable_polarssl_test_cert=yes])
44AC_ARG_ENABLE(polarssl-havege, [  --enable-polarssl-havege  Link to PolarSSL HAVEGE random generator key @<:@default=no@:>@ Default: /dev/urandom], [enable_polarssl_havege=yes])
45AC_ARG_ENABLE(mbedtls-test-cert, [  --enable-mbedtls-test-cert  Link to mbedTLS test certificate and key @<:@default=no@:>@], [enable_mbedtls_test_cert=yes])
46AC_ARG_ENABLE(mbedtls-havege, [  --enable-mbedtls-havege  Link to mbedTLS HAVEGE random generator key @<:@default=no@:>@ Default: /dev/urandom], [enable_mbedtls_havege=yes])
47
48# Checks for programs.
49AC_PROG_CC
50
51# Checks dependencies.
52AC_CHECK_HEADERS([google/protobuf-c/protobuf-c.h], [], [AC_MSG_ERROR([could not find google/protobuf-c/protobuf-c.h])])
53AC_CHECK_LIB([protobuf-c], [protobuf_c_message_init], [], [AC_MSG_ERROR([could not find protobuf-c library])])
54AC_CHECK_HEADERS([libconfig.h], [], [AC_MSG_ERROR([could not find libconfig.h])])
55AC_CHECK_LIB([config], [config_init], [], [AC_MSG_ERROR([could not find libconfig])])
56case $host_os in
57  darwin* )
58    AC_CHECK_FUNC([clock_get_time], [], [AC_MSG_ERROR([could not find clock_get_time()])])
59    CFLAGS+=" -Wno-deprecated-declarations"
60    ;;
61  * )
62    AC_CHECK_FUNC([clock_gettime], [], [AC_CHECK_LIB([rt], [clock_gettime], [], [AC_MSG_ERROR([could not find clock_gettime() in librt])])])
63    ;;
64esac
65AS_IF([test "x$with_ssl" = xpolarssl], [
66	AC_CHECK_HEADERS([polarssl/ssl.h], [], [AC_MSG_ERROR([could not find polarssl/ssl.h])])
67	AC_CHECK_HEADERS([polarssl/version.h], [], [AC_MSG_ERROR([could not find polarssl/version.h])])
68
69	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <polarssl/ssl.h>]],
70		[[#if defined(POLARSSL_ZLIB_SUPPORT)
71		int x;
72		#endif
73		x = 0;
74		return 0;]])],
75		[AC_CHECK_LIB([z], [deflate], [], [AC_MSG_ERROR([could not find zlib])])],
76		[])
77	AC_CHECK_LIB([polarssl], [ssl_init], [], [AC_MSG_ERROR([could not find libpolarssl])])
78	AC_DEFINE([USE_POLARSSL], [], [Use PolarSSL])
79    AS_IF([test "x$enable_polarssl_test_cert" = xyes], [
80	    AC_CHECK_LIB([polarssl], [test_srv_crt], [], [AC_MSG_ERROR([could not find test_srv_crt])])
81	    AC_DEFINE([USE_POLARSSL_TESTCERT], [], [Use PolarSSL test certificate])
82    ])
83    AS_IF([test "x$enable_polarssl_havege" = xyes], [
84	    AC_CHECK_LIB([polarssl], [havege_init], [], [AC_MSG_ERROR([could not find havege_init])])
85	    AC_DEFINE([USE_POLARSSL_HAVEGE], [], [Use PolarSSL HAVEGE random generator])
86    ])
87])
88AS_IF([test "x$with_ssl" = xmbedtls], [
89	AC_CHECK_HEADERS([mbedtls/ssl.h], [], [AC_MSG_ERROR([could not find mbedtls/ssl.h])])
90	AC_CHECK_HEADERS([mbedtls/version.h], [], [AC_MSG_ERROR([could not find mbedtls/version.h])])
91
92	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <mbedtls/ssl.h>]],
93		[[#if defined(MBEDTLS_ZLIB_SUPPORT)
94		int x;
95		#endif
96		x = 0;
97		return 0;]])],
98		[AC_CHECK_LIB([z], [deflate], [], [AC_MSG_ERROR([could not find zlib])])],
99		[])
100	AC_CHECK_LIB([mbedtls], [mbedtls_ssl_init], [], [AC_MSG_ERROR([could not find libmbedtls])], [-lmbedcrypto -lmbedx509])
101	AC_CHECK_LIB([mbedcrypto], [mbedtls_cipher_setup], [], [AC_MSG_ERROR([could not find libmbedcrypto])], [-lmbedtls -lmbedx509])
102	AC_CHECK_LIB([mbedx509], [mbedtls_x509_crt_init], [], [AC_MSG_ERROR([could not find libmbedx509])], [-lmbedcrypto -lmbedtls])
103	AC_DEFINE([USE_MBEDTLS], [], [Use mbedTLS])
104    AS_IF([test "x$enable_mbedtls_test_cert" = xyes], [
105	    AC_CHECK_LIB([mbedtls], [test_srv_crt], [], [AC_MSG_ERROR([could not find test_srv_crt])])
106	    AC_DEFINE([USE_MBEDTLS_TESTCERT], [], [Use mbedTLS test certificate])
107    ])
108    AS_IF([test "x$enable_mbedtls_havege" = xyes], [
109	    AC_CHECK_HEADERS([mbedtls/havege.h], [], [AC_MSG_ERROR([could not find mbedtls/havege.h])])
110	    AC_CHECK_LIB([mbedcrypto], [mbedtls_havege_init], [], [AC_MSG_ERROR([could not find mbedtls_havege_init])])
111	    AC_DEFINE([USE_MBEDTLS_HAVEGE], [], [Use mbedTLS HAVEGE random generator])
112    ])
113])
114AS_IF([test "x$with_ssl" = xopenssl], [
115	AC_CHECK_HEADERS([openssl/ssl.h], [], [AC_MSG_ERROR([could not find openssl/ssl.h])])
116	AC_CHECK_LIB([crypto], [CRYPTO_new_ex_data], [], [AC_MSG_ERROR([could not find libcrypto])])
117	AC_CHECK_LIB([ssl], [SSL_new], [], [AC_MSG_ERROR([could not find libssl])])
118])
119AS_IF([test "x$with_ssl" = xgnutls], [
120	AC_CHECK_HEADERS([gnutls/gnutls.h], [], [AC_MSG_ERROR([could not find gnutls/gnutls.h])])
121  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([@%:@include <gnutls/gnutls.h>],
122                    [ #ifdef GNUTLS_E_PREMATURE_TERMINATION
123                      #else
124                      #error Unsuitable version of GnuTLS
125                      #endif
126                      ])], [], [AC_MSG_ERROR([Unsuitable version of GnuTL, minimum required is 3.0])])
127	AC_CHECK_LIB([gnutls], [gnutls_priority_init], [], [AC_MSG_ERROR([could not find libgnutls])])
128	AC_CHECK_LIB([nettle], [_nettle_aes_decrypt], [], [AC_MSG_ERROR([could not find libnettle])])
129	AC_DEFINE([USE_GNUTLS], [], [Use GnuTLS])
130])
131
132AM_CONDITIONAL(USE_OPENSSL, test x$with_ssl = xopenssl)
133AM_CONDITIONAL(USE_GNUTLS, test x$with_ssl = xgnutls)
134AM_CONDITIONAL(USE_MBEDTLS, test x$with_ssl = xmbedtls)
135
136AS_IF([test "x$enable_shmapi" != xno],
137	[
138	AM_CONDITIONAL(USE_SHAREDMEMORY_API, true)
139	AC_DEFINE([USE_SHAREDMEMORY_API],[],[Use sharedmemory API])
140    AC_CHECK_FUNC([shm_open], [], [AC_CHECK_LIB([rt], [shm_open], [], [AC_MSG_ERROR([could not find shm_open() in librt])])])
141	], [
142	AM_CONDITIONAL(USE_SHAREDMEMORY_API, false)
143])
144
145AC_DEFINE([DEFAULT_CONFIG], ["/usr/local/etc/umurmur.conf"], [Default config])
146
147# Checks for header files.
148AC_FUNC_ALLOCA
149AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h limits.h netinet/tcp.h stddef.h stdint.h stdlib.h string.h sys/socket.h sys/time.h syslog.h unistd.h sys/poll.h], [], [AC_MSG_ERROR([missing a required header])])
150
151# Checks for typedefs, structures, and compiler characteristics.
152AC_HEADER_STDBOOL
153AC_TYPE_UID_T
154AC_C_INLINE
155AC_TYPE_INT32_T
156AC_TYPE_INT64_T
157AC_TYPE_SIZE_T
158AC_TYPE_UINT16_T
159AC_TYPE_UINT32_T
160AC_TYPE_UINT64_T
161AC_TYPE_UINT8_T
162
163# Checks for library functions.
164AC_CHECK_FUNCS([ftruncate gettimeofday inet_ntoa memchr memmove memset socket strdup strrchr uname poll], [], [AC_MSG_ERROR([missing a required func])])
165
166AC_CONFIG_FILES([Makefile src/Makefile])
167AC_OUTPUT
168