1268896Sbaptm4_define([maj_ver], [0])
2268896Sbaptm4_define([med_ver], [4])
3268896Sbaptm4_define([min_ver], [1])
4268896Sbaptm4_define([so_version], [1:0:0])
5268896Sbaptm4_define([ucl_version], [maj_ver.med_ver.min_ver])
6268896Sbapt
7268896SbaptAC_INIT([libucl],[ucl_version],[https://github.com/vstakhov/libucl],[libucl])
8268896SbaptAC_CONFIG_SRCDIR([configure.ac])
9268896SbaptAM_INIT_AUTOMAKE([1.11 foreign silent-rules -Wall -Wportability no-dist-gzip dist-xz])
10268896Sbapt
11268896SbaptUCL_VERSION=ucl_version
12268896SbaptSO_VERSION=so_version
13268896Sbapt
14268896SbaptAC_SUBST(UCL_VERSION)
15268896SbaptAC_SUBST(SO_VERSION)
16268896Sbapt
17268896SbaptAC_PROG_CC_C99
18268896SbaptAM_PROG_CC_C_O
19268896SbaptAM_PROG_AR
20268896SbaptLT_INIT
21268896SbaptAC_CONFIG_MACRO_DIR([m4])
22268896SbaptAC_CONFIG_HEADERS([config.h])
23268896Sbapt
24268896SbaptAC_C_CONST
25268896SbaptAC_TYPE_SIZE_T
26268896Sbapt
27268896SbaptAC_CHECK_HEADERS_ONCE([fcntl.h unistd.h])
28268896SbaptAC_TYPE_OFF_T
29268896SbaptAC_FUNC_MMAP
30268896SbaptAC_CHECK_HEADERS_ONCE([fcntl.h])
31268896SbaptAC_CHECK_HEADERS_ONCE([sys/types.h])
32268896SbaptAC_CHECK_HEADERS_ONCE([sys/stat.h])
33268896SbaptAC_CHECK_HEADERS_ONCE([sys/param.h])
34268896SbaptAC_CHECK_HEADERS_ONCE([sys/mman.h])
35268896SbaptAC_CHECK_HEADERS_ONCE([stdlib.h])
36268896SbaptAC_CHECK_HEADERS_ONCE([stddef.h])
37268896SbaptAC_CHECK_HEADERS_ONCE([stdarg.h])
38268896SbaptAC_CHECK_HEADERS_ONCE([stdbool.h])
39268896SbaptAC_CHECK_HEADERS_ONCE([stdint.h])
40268896SbaptAC_CHECK_HEADERS_ONCE([string.h])
41268896SbaptAC_CHECK_HEADERS_ONCE([unistd.h])
42268896SbaptAC_CHECK_HEADERS_ONCE([ctype.h])
43268896SbaptAC_CHECK_HEADERS_ONCE([errno.h])
44268896SbaptAC_CHECK_HEADERS_ONCE([limits.h])
45268896SbaptAC_CHECK_HEADERS_ONCE([libgen.h])
46268896SbaptAC_CHECK_HEADERS_ONCE([stdio.h])
47268896SbaptAC_CHECK_HEADERS_ONCE([float.h])
48268896SbaptAC_CHECK_HEADERS_ONCE([math.h])
49268896Sbapt
50268896Sbaptdnl Example of default-disabled feature
51268896SbaptAC_ARG_ENABLE([urls], AS_HELP_STRING([--enable-urls], 
52268896Sbapt	[Enable URLs fetch (requires libfetch or libcurl) @<:@default=no@:>@]), [],
53268896Sbapt	[enable_urls=no])
54268896SbaptAC_ARG_ENABLE([regex], AS_HELP_STRING([--enable-regex], 
55268896Sbapt	[Enable regex checking for schema @<:@default=yes@:>@]), [],
56268896Sbapt	[enable_regex=yes])
57268896SbaptAC_ARG_ENABLE([signatures], AS_HELP_STRING([--enable-signatures],
58268896Sbapt	[Enable signatures check (requires openssl) @<:@default=no@:>@]), [],
59268896Sbapt	[enable_signatures=no])
60268896SbaptAC_ARG_ENABLE([utils],
61268896Sbapt	AS_HELP_STRING([--enable-utils], [Build and install utils @<:@default=no@:>@]),
62268896Sbapt	[case "${enableval}" in
63268896Sbapt  		yes) utils=true ;;
64268896Sbapt  		no)  utils=false ;;
65268896Sbapt  		*) AC_MSG_ERROR([bad value ${enableval} for --enable-utils]) ;;
66268896Sbapt	esac],[utils=false])
67268896SbaptAM_CONDITIONAL([UTILS], [test x$utils = xtrue])
68268896Sbapt
69268896SbaptAS_IF([test "x$enable_signatures" = "xyes"], [
70268896Sbapt	AC_SEARCH_LIBS([EVP_MD_CTX_create], [crypto], [
71268896Sbapt		AC_DEFINE(HAVE_OPENSSL, 1, [Define to 1 if you have the 'crypto' library (-lcrypto).])
72268896Sbapt		LIBCRYPTO_LIB="-lcrypto"
73268896Sbapt		LIBS_EXTRA="${LIBS_EXTRA} -lcrypto"
74268896Sbapt		], [AC_MSG_ERROR([unable to find the EVP_MD_CTX_create() function])])
75268896Sbapt])
76268896SbaptAC_SUBST(LIBCRYPTO_LIB)
77268896SbaptAC_PATH_PROG(PANDOC, pandoc, [/non/existent])
78268896Sbapt
79268896SbaptAC_SEARCH_LIBS([clock_gettime], [rt], [], [
80268896Sbapt	AC_CHECK_HEADER([mach/mach_time.h], [
81268896Sbapt		AC_DEFINE(HAVE_MACH_MACH_TIME_H, 1, [Define to 1 on Darwin])
82268896Sbapt	], [AC_MSG_ERROR([unable to find clock_gettime or mach_absolute_time])])
83268896Sbapt])
84268896SbaptAC_SEARCH_LIBS([remainder], [m], [], [AC_MSG_ERROR([unable to find remainder() function])])
85268896Sbapt
86268896SbaptAS_IF([test "x$enable_regex" = "xyes"], [
87268896Sbapt	AC_CHECK_HEADER([regex.h], [
88268896Sbapt		AC_DEFINE(HAVE_REGEX_H, 1, [Define to 1 if you have the <regex.h> header file.])
89268896Sbapt		AC_SEARCH_LIBS([regexec], [regex], [
90268896Sbapt			AS_IF([test "x$ac_cv_search_regexec" = "x-lregex"], [
91268896Sbapt				LIBREGEX_LIB="-lregex"
92268896Sbapt				LIBS_EXTRA="${LIBS_EXTRA} -lregex"
93268896Sbapt				]
94268896Sbapt			)], 
95268896Sbapt			[AC_MSG_ERROR([unable to find the regexec() function])])],
96268896Sbapt			[AC_MSG_ERROR([unable to find the regex.h header])
97268896Sbapt		],
98268896Sbapt		[#include <sys/types.h>])
99268896Sbapt])
100268896SbaptAC_SUBST(LIBREGEX_LIB)
101268896Sbapt
102268896SbaptAS_IF([test "x$enable_urls" = "xyes"], [
103268896Sbapt	AC_CHECK_HEADER([fetch.h], [
104268896Sbapt		AC_DEFINE(HAVE_FETCH_H, 1, [Define to 1 if you have the <fetch.h> header file.])
105268896Sbapt		AC_CHECK_LIB(fetch, fetchXGet, [
106268896Sbapt			AC_DEFINE(HAVE_LIBFETCH, 1, [Define to 1 if you have the 'fetch' library (-lfetch).])
107268896Sbapt			LIBFETCH_LIBS="-lfetch"
108268896Sbapt			have_libfetch="yes"
109268896Sbapt			LIBS_EXTRA="${LIBS_EXTRA} -lfetch"
110268896Sbapt		])
111268896Sbapt	], [],[
112268896Sbapt	#include <stdio.h>
113268896Sbapt	#ifdef HAVE_SYS_PARAM_H
114268896Sbapt	#include <sys/param.h>
115268896Sbapt	#endif
116268896Sbapt	])
117268896Sbapt	AC_SUBST(LIBFETCH_LIBS)
118268896Sbapt
119268896Sbapt	AS_IF([ test "x$have_libfetch" != "xyes"], [
120268896Sbapt		dnl Fallback to libcurl
121268896Sbapt		PKG_CHECK_MODULES([CURL], [libcurl], [
122268896Sbapt			AC_DEFINE(CURL_FOUND, 1, [Use libcurl])
123268896Sbapt			LIBS_EXTRA="${LIBS_EXTRA} -lcurl"],
124268896Sbapt		[AC_MSG_ERROR([unable to find neither libfetch nor libcurl])])
125268896Sbapt	])
126268896Sbapt	AC_SUBST(CURL_FOUND)
127268896Sbapt	AC_SUBST(CURL_LIBS)
128268896Sbapt	AC_SUBST(CURL_CFLAGS)
129268896Sbapt])
130268896Sbapt
131268896SbaptAC_SUBST(LIBS_EXTRA)
132268896Sbapt
133268896SbaptAC_MSG_CHECKING(for GCC atomic builtins)
134268896SbaptAC_LINK_IFELSE([
135268896Sbapt	AC_LANG_SOURCE([[
136268896Sbapt		int main() {
137268896Sbapt			volatile unsigned long val = 1;
138268896Sbapt			__sync_synchronize();
139268896Sbapt			__sync_val_compare_and_swap(&val, 1, 0);
140268896Sbapt			__sync_add_and_fetch(&val, 1);
141268896Sbapt			__sync_sub_and_fetch(&val, 1);
142268896Sbapt			return 0;
143268896Sbapt		}
144268896Sbapt	]])
145268896Sbapt],
146268896Sbapt[
147268896Sbapt	AC_MSG_RESULT([yes])
148268896Sbapt	AC_DEFINE([HAVE_ATOMIC_BUILTINS], [1], [Has gcc/MSVC atomic intrinsics])
149268896Sbapt],
150268896Sbapt[
151268896Sbapt	AC_MSG_RESULT([no])
152268896Sbapt	AC_DEFINE([HAVE_ATOMIC_BUILTINS], [0], [Has gcc/MSVC atomic intrinsics])
153268896Sbapt	AC_MSG_WARN([Libucl references could be thread-unsafe because atomic builtins are missing])
154268896Sbapt])
155268896Sbapt
156268896SbaptAC_CONFIG_FILES(Makefile \
157268896Sbapt	src/Makefile \
158268896Sbapt	tests/Makefile \
159268896Sbapt	utils/Makefile \
160268896Sbapt	doc/Makefile \
161268896Sbapt	libucl.pc)
162268896SbaptAC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
163268896SbaptAC_OUTPUT
164