Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/catacomb
[catacomb] / configure.ac
1 dnl -*-autoconf-*-
2 dnl
3 dnl Configuration script for Catacomb
4 dnl
5 dnl (c) 2013 Straylight/Edgeware
6 dnl
7
8 dnl----- Licensing notice ---------------------------------------------------
9 dnl
10 dnl This file is part of Catacomb.
11 dnl
12 dnl Catacomb is free software; you can redistribute it and/or modify
13 dnl it under the terms of the GNU Library General Public License as
14 dnl published by the Free Software Foundation; either version 2 of the
15 dnl License, or (at your option) any later version.
16 dnl
17 dnl Catacomb is distributed in the hope that it will be useful,
18 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
19 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 dnl GNU Library General Public License for more details.
21 dnl
22 dnl You should have received a copy of the GNU Library General Public
23 dnl License along with Catacomb; if not, write to the Free
24 dnl Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 dnl MA 02111-1307, USA.
26
27 dnl--------------------------------------------------------------------------
28 dnl Initialization.
29
30 mdw_AUTO_VERSION
31 AC_INIT([catacomb], AUTO_VERSION, [mdw@distorted.org.uk])
32 AC_CONFIG_SRCDIR([catacomb.pc.in])
33 AC_CONFIG_AUX_DIR([config])
34 AM_INIT_AUTOMAKE([foreign parallel-tests color-tests subdir-objects])
35 AC_CANONICAL_HOST
36 mdw_SILENT_RULES
37
38 AC_PROG_CC
39 AX_CFLAGS_WARN_ALL
40 AM_PROG_LIBTOOL
41 mdw_LIBTOOL_VERSION_INFO
42
43 AM_PROG_AS
44
45 AC_PROG_YACC
46
47 AC_SUBST(AM_CFLAGS)
48
49 dnl--------------------------------------------------------------------------
50 dnl Host-specific configuration.
51
52 AC_MSG_CHECKING([CPU family and ABI])
53
54 dnl The table of CPU families and ABIs which we might support. Support is
55 dnl not uniform: each dispatched function might or might not have an
56 dnl implementation for any particular CPU/ABI combination.
57 AC_DEFUN([catacomb_CPU_FAMILIES],
58 [$1([i[[3-6]]86,cygwin], [x86], [win])
59 $1([i[[3-6]]86,*], [x86], [sysv])
60 $1([x86_64,cygwin], [amd64], [win])
61 $1([x86_64,*], [amd64], [sysv])
62 $1([arm,*-gnueabi | arm,*-gnueabihf | dnl
63 armv*,*-gnueabi | armv*,*-gnueabihf], [armel], [gnueabi])])
64
65 dnl A utility to clear the `seen' flags, used so as to process each CPU or
66 dnl ABI once.
67 m4_define([catacomb_CLEAR_FLAGS],
68 [m4_ifdef([catacomb_seen_cpu/$2],
69 [m4_undefine([catacomb_seen_cpu/$2])])dnl
70 m4_ifdef([catacomb_seen_abi/$3],
71 [m4_undefine([catacomb_seen_abi/$3])])])
72
73 dnl Identify the current host.
74 case $host_cpu,$host_os in
75 m4_define([catacomb_CPU_CASE],
76 [$1) CPUFAM=$2 ABI=$3 ;;
77 ])
78 catacomb_CPU_FAMILIES([catacomb_CPU_CASE])
79 *) CPUFAM=nil ABI=nil ;;
80 esac
81
82 dnl Figure out the current CPU.
83 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
84 case $CPUFAM in
85 m4_define([catacomb_DEFINE_CPU],
86 [m4_ifdef([catacomb_seen_cpu/$2], [],
87 [$2)
88 AC_DEFINE([CPUFAM_]m4_translit([$2], [a-z], [A-Z]), [1],
89 [Define if host CPU family is \`$2\'.])
90 ;;m4_define([catacomb_seen_cpu/$2], [t])])])
91 catacomb_CPU_FAMILIES([catacomb_DEFINE_CPU])
92 nil) ;;
93 *) AC_MSG_ERROR([BUG: unexpected cpufam \`$CPUFAM']) ;;
94 esac
95 AC_SUBST([CPUFAM])
96
97 dnl Figure out the current ABI.
98 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
99 case $ABI in
100 m4_define([catacomb_DEFINE_ABI],
101 [m4_ifdef([catacomb_seen_abi/$3], [],
102 [$3)
103 AC_DEFINE([ABI_]m4_translit([$3], [a-z], [A-Z]), [1],
104 [Define if host ABI variant is \`$3\'.])
105 ;;m4_define([catacomb_seen_abi/$3], [t])])])
106 catacomb_CPU_FAMILIES([catacomb_DEFINE_ABI])
107 nil) ;;
108 *) AC_MSG_ERROR([BUG: unexpected ABI \`$ABI']) ;;
109 esac
110 AC_SUBST([ABI])
111
112 dnl Establish Automake conditions for things.
113 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
114 m4_define([catacomb_COND_CPU],
115 [m4_define([_CPU], m4_translit([$2], [a-z], [A-Z]))
116 m4_define([_ABI], m4_translit([$3], [a-z], [A-Z]))
117 AM_CONDITIONAL([CPUABI_]_CPU[_]_ABI, [test x$CPUFAM/$ABI = x$2/$3])
118 m4_ifdef([catacomb_seen_cpu/$2], [],
119 [AM_CONDITIONAL([CPUFAM_]_CPU, [test x$CPUFAM = x$2])dnl
120 m4_define([catacomb_seen_cpu/$2], [t])])
121 m4_ifdef([catacomb_seen_abi/$3], [],
122 [AM_CONDITIONAL([ABI_]_ABI, [test x$ABI = x$3])dnl
123 m4_define([catacomb_seen_abi/$3], [t])])])
124 catacomb_CPU_FAMILIES([catacomb_COND_CPU])
125 AM_CONDITIONAL([KNOWN_CPUFAM], [test x$CPUFAM != xnil])
126
127 dnl Report on what we found.
128 case $CPUFAM in
129 nil) AC_MSG_RESULT([not supported]) ;;
130 *) AC_MSG_RESULT([$CPUFAM/$ABI]) ;;
131 esac
132
133 dnl Some equipment wanted for checking CPU features at runtime.
134 AC_CHECK_HEADERS([asm/hwcap.h])
135 AC_CHECK_HEADERS([sys/auxv.h])
136 AC_CHECK_HEADERS([linux/auxvec.h])
137 AC_CHECK_FUNCS([getauxval])
138
139 dnl--------------------------------------------------------------------------
140 dnl C programming environment.
141
142 CATACOMB_LIBS=
143
144 dnl Find out if we're cross-compiling.
145 AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
146
147 dnl Various standard types.
148 AC_CHECK_TYPE([pid_t], [int])
149 AC_TYPE_UID_T
150 AC_CHECK_TYPE([ssize_t], [int])
151 AC_CHECK_TYPE([socklen_t], [int])
152
153 dnl The maths library.
154 mdw_ORIG_LIBS=$LIBS LIBS=
155 AC_SEARCH_LIBS([log], [m])
156 AC_SEARCH_LIBS([sqrt], [m])
157 AC_SUBST([MATHLIBS], [$LIBS])
158 LIBS=$mdw_ORIG_LIBS
159
160 dnl Find out whether very long integer types are available.
161 AC_CHECK_HEADERS([stdint.h])
162 AC_SUBST([have_stdint_h])
163 AC_C_LONG_LONG
164
165 dnl Find the bit lengths of the obvious integer types. This will be useful
166 dnl when deciding on a representation for multiprecision integers.
167 type_bits="" type_bits_sep=""
168 AC_DEFUN([catacomb_UINT_BITS],
169 [mdw_UINT_BITS([$2], [$1])
170 type_bits="$type_bits$type_bits_sep('$1', $[]$1_bits)"
171 type_bits_sep=", "])
172 catacomb_UINT_BITS([uchar], [unsigned char])
173 catacomb_UINT_BITS([ushort], [unsigned short])
174 catacomb_UINT_BITS([uint], [unsigned int])
175 catacomb_UINT_BITS([ulong], [unsigned long])
176 if test "$ac_cv_c_long_long" = "yes"; then
177 catacomb_UINT_BITS([ullong], [unsigned long long])
178 fi
179 if test "$ac_cv_header_stdint_h" = "yes"; then
180 catacomb_UINT_BITS([uintmax], [uintmax_t])
181 fi
182 AC_SUBST([type_bits])
183
184 dnl Determine the limits of common C integer types.
185 limits="" limits_sep=""
186 AC_DEFUN([catacomb_COMPILE_TIME_CONSTANT],
187 [case "$2" in
188 =*)
189 $1="$2"; $1=${$1#=}
190 ;;
191 *)
192 AC_CACHE_CHECK([compile-time value of $2], [mdw_cv_constant_$3],
193 [mdw_PROBE_CONSTANT([mdw_cv_constant_$3], [$2], [$4])])
194 $1=$mdw_cv_constant_$3
195 ;;
196 esac])
197 AC_DEFUN([catacomb_LIMIT],
198 [catacomb_COMPILE_TIME_CONSTANT([lo], [$2], [$1_min],
199 [#include <limits.h>
200 #include <stddef.h>])
201 catacomb_COMPILE_TIME_CONSTANT([hi], [$3], [$1_max],
202 [#include <limits.h>
203 #include <stddef.h>])
204 limits="$limits$limits_sep('$1', $lo, $hi)" limits_sep=", "])
205 catacomb_LIMIT([SCHAR], [SCHAR_MIN], [SCHAR_MAX])
206 catacomb_LIMIT([CHAR], [CHAR_MIN], [CHAR_MAX])
207 catacomb_LIMIT([UCHAR], [=0], [UCHAR_MAX])
208 catacomb_LIMIT([UINT8], [=0], [=0xff])
209 catacomb_LIMIT([SHRT], [SHRT_MIN], [SHRT_MAX])
210 catacomb_LIMIT([USHRT], [=0], [USHRT_MAX])
211 catacomb_LIMIT([UINT16], [=0], [=0xffff])
212 catacomb_LIMIT([INT], [INT_MIN], [INT_MAX])
213 catacomb_LIMIT([UINT], [=0], [UINT_MAX])
214 catacomb_LIMIT([LONG], [LONG_MIN], [LONG_MAX])
215 catacomb_LIMIT([ULONG], [=0], [ULONG_MAX])
216 catacomb_LIMIT([UINT32], [=0], [=0xffffffff])
217 if test "$ac_cv_c_long_long" = "yes"; then
218 catacomb_LIMIT([LLONG], [LLONG_MIN], [LLONG_MAX])
219 catacomb_LIMIT([ULLONG], [=0], [ULLONG_MAX])
220 fi
221 catacomb_LIMIT([SIZET], [=0], [~(size_t)0])
222 AC_SUBST([limits])
223
224 dnl Functions used for noise-gathering.
225 AC_CHECK_FUNCS([setgroups])
226 AC_CHECK_HEADERS([linux/random.h])
227 mdw_ORIG_LIBS=$LIBS LIBS=$CATACOMB_LIBS
228 AC_SEARCH_LIBS([clock_gettime], [rt])
229 CATACOMB_LIBS=$LIBS LIBS=$mdw_ORIG_LIBS
230 if test $ac_cv_search_clock_gettime != no; then
231 AC_DEFINE([HAVE_CLOCK_GETTIME], [1],
232 [Define if you have the \`clock_gettime' function.])
233 fi
234 AC_CHECK_FUNCS([getentropy])
235 AC_CACHE_CHECK([whether the freewheel noise generator will work],
236 [catacomb_cv_freewheel],
237 [AC_TRY_LINK(
238 [#include <setjmp.h>
239 #include <sys/time.h>],
240 [struct itimerval itv = { { 0, 0 }, { 0, 5000 } };
241 jmp_buf j;
242 setitimer(ITIMER_REAL, &itv, 0);
243 sigsetjmp(j, 1);],
244 [catacomb_cv_freewheel=yes],
245 [catacomb_cv_freewheel=no])])
246 case $catacomb_cv_freewheel in
247 yes)
248 AC_DEFINE([USE_FREEWHEEL], [1],
249 [Define if you want to use the freewheel noise generator.])
250 ;;
251 esac
252
253 dnl Support for the passphrase pixie.
254 mdw_ORIG_LIBS=$LIBS
255 AC_SEARCH_LIBS([socket], [socket])
256 AC_SUBST([PIXIE_LIBS], [$LIBS])
257 LIBS=$mdw_ORIG_LIBS
258
259 dnl Memory locking support.
260 AC_CHECK_FUNCS([mlock])
261
262 dnl Set the master libraries we need.
263 AC_SUBST([CATACOMB_LIBS])
264
265 dnl Necessary support libraries.
266 PKG_CHECK_MODULES([mLib], [mLib >= 2.2.2.1])
267 AM_CFLAGS="$AM_CFLAGS $mLib_CFLAGS"
268
269 dnl--------------------------------------------------------------------------
270 dnl Python.
271
272 dnl Make sure we have a suitable version.
273 AM_PATH_PYTHON([2.5])
274
275 dnl--------------------------------------------------------------------------
276 dnl Special debugging options.
277
278 AC_ARG_ENABLE([mpw],
279 [AS_HELP_STRING([--enable-mpw], [force small-width mp digits])],
280 [case "$enableval" in
281 y*|t*|short)
282 AC_DEFINE([FORCE_MPW_SHORT], [1],
283 [Define to force small-width mp digits.])
284 ;;
285 cussid)
286 AC_DEFINE([FORCE_MPW_CUSSID], [1],
287 [Define to force strange-width mp digits.])
288 ;;
289 esac])
290
291 dnl--------------------------------------------------------------------------
292 dnl Produce output.
293
294 AC_CONFIG_HEADER([config/config.h])
295
296 AC_CONFIG_FILES(
297 [Makefile]
298 [base/Makefile]
299 [key/Makefile]
300 [math/Makefile]
301 [misc/Makefile]
302 [pub/Makefile]
303 [rand/Makefile]
304 [symm/Makefile]
305 [progs/Makefile])
306 AC_OUTPUT
307
308 dnl----- That's all, folks --------------------------------------------------