Merge branch 'mdw/cpu-dispatch'
[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([armv*,*-gnueabi | armv*,*-gnueabihf], [armel], [gnueabi])])
63
64 dnl A utility to clear the `seen' flags, used so as to process each CPU or
65 dnl ABI once.
66 m4_define([catacomb_CLEAR_FLAGS],
67 [m4_ifdef([catacomb_seen_cpu/$2],
68 [m4_undefine([catacomb_seen_cpu/$2])])dnl
69 m4_ifdef([catacomb_seen_abi/$3],
70 [m4_undefine([catacomb_seen_abi/$3])])])
71
72 dnl Identify the current host.
73 case $host_cpu,$host_os in
74 m4_define([catacomb_CPU_CASE],
75 [$1) CPUFAM=$2 ABI=$3 ;;
76 ])
77 catacomb_CPU_FAMILIES([catacomb_CPU_CASE])
78 *) CPUFAM=nil ABI=nil ;;
79 esac
80
81 dnl Figure out the current CPU.
82 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
83 case $CPUFAM in
84 m4_define([catacomb_DEFINE_CPU],
85 [m4_ifdef([catacomb_seen_cpu/$2], [],
86 [$2)
87 AC_DEFINE([CPUFAM_]m4_translit([$2], [a-z], [A-Z]), [1],
88 [Define if host CPU family is \`$2\'.])
89 ;;m4_define([catacomb_seen_cpu/$2], [t])])])
90 catacomb_CPU_FAMILIES([catacomb_DEFINE_CPU])
91 nil) ;;
92 *) AC_MSG_ERROR([BUG: unexpected cpufam \`$CPUFAM']) ;;
93 esac
94 AC_SUBST([CPUFAM])
95
96 dnl Figure out the current ABI.
97 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
98 case $ABI in
99 m4_define([catacomb_DEFINE_ABI],
100 [m4_ifdef([catacomb_seen_abi/$3], [],
101 [$3)
102 AC_DEFINE([ABI_]m4_translit([$3], [a-z], [A-Z]), [1],
103 [Define if host ABI variant is \`$3\'.])
104 ;;m4_define([catacomb_seen_abi/$3], [t])])])
105 catacomb_CPU_FAMILIES([catacomb_DEFINE_ABI])
106 nil) ;;
107 *) AC_MSG_ERROR([BUG: unexpected ABI \`$ABI']) ;;
108 esac
109 AC_SUBST([ABI])
110
111 dnl Establish Automake conditions for things.
112 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
113 m4_define([catacomb_COND_CPU],
114 [m4_define([_CPU], m4_translit([$2], [a-z], [A-Z]))
115 m4_define([_ABI], m4_translit([$3], [a-z], [A-Z]))
116 AM_CONDITIONAL([CPUABI_]_CPU[_]_ABI, [test x$CPUFAM/$ABI = x$2/$3])
117 m4_ifdef([catacomb_seen_cpu/$2], [],
118 [AM_CONDITIONAL([CPUFAM_]_CPU, [test x$CPUFAM = x$2])dnl
119 m4_define([catacomb_seen_cpu/$2], [t])])
120 m4_ifdef([catacomb_seen_abi/$3], [],
121 [AM_CONDITIONAL([ABI_]_ABI, [test x$ABI = x$3])dnl
122 m4_define([catacomb_seen_abi/$3], [t])])])
123 catacomb_CPU_FAMILIES([catacomb_COND_CPU])
124 AM_CONDITIONAL([KNOWN_CPUFAM], [test x$CPUFAM != xnil])
125
126 dnl Report on what we found.
127 case $CPUFAM in
128 nil) AC_MSG_RESULT([not supported]) ;;
129 *) AC_MSG_RESULT([$CPUFAM/$ABI]) ;;
130 esac
131
132 dnl Some equipment wanted for checking CPU features at runtime.
133 AC_CHECK_HEADERS([asm/hwcap.h])
134 AC_CHECK_HEADERS([sys/auxv.h])
135 AC_CHECK_HEADERS([linux/auxvec.h])
136 AC_CHECK_FUNCS([getauxval])
137
138 dnl--------------------------------------------------------------------------
139 dnl C programming environment.
140
141 dnl Find out if we're cross-compiling.
142 AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
143
144 dnl Various standard types.
145 AC_CHECK_TYPE([pid_t], [int])
146 AC_TYPE_UID_T
147 AC_CHECK_TYPE([ssize_t], [int])
148 AC_CHECK_TYPE([socklen_t], [int])
149
150 dnl The maths library.
151 mdw_ORIG_LIBS=$LIBS LIBS=
152 AC_SEARCH_LIBS([log], [m])
153 AC_SEARCH_LIBS([sqrt], [m])
154 AC_SUBST([MATHLIBS], [$LIBS])
155 LIBS=$mdw_ORIG_LIBS
156
157 dnl Find out whether very long integer types are available.
158 AC_CHECK_HEADERS([stdint.h])
159 AC_SUBST([have_stdint_h])
160 AC_C_LONG_LONG
161
162 dnl Find the bit lengths of the obvious integer types. This will be useful
163 dnl when deciding on a representation for multiprecision integers.
164 type_bits="" type_bits_sep=""
165 AC_DEFUN([catacomb_UINT_BITS],
166 [mdw_UINT_BITS([$2], [$1])
167 type_bits="$type_bits$type_bits_sep('$1', $[]$1_bits)"
168 type_bits_sep=", "])
169 catacomb_UINT_BITS([uchar], [unsigned char])
170 catacomb_UINT_BITS([ushort], [unsigned short])
171 catacomb_UINT_BITS([uint], [unsigned int])
172 catacomb_UINT_BITS([ulong], [unsigned long])
173 if test "$ac_cv_c_long_long" = "yes"; then
174 catacomb_UINT_BITS([ullong], [unsigned long long])
175 fi
176 if test "$ac_cv_header_stdint_h" = "yes"; then
177 catacomb_UINT_BITS([uintmax], [uintmax_t])
178 fi
179 AC_SUBST([type_bits])
180
181 dnl Determine the limits of common C integer types.
182 limits="" limits_sep=""
183 AC_DEFUN([catacomb_COMPILE_TIME_CONSTANT],
184 [case "$2" in
185 =*)
186 $1="$2"; $1=${$1#=}
187 ;;
188 *)
189 AC_CACHE_CHECK([compile-time value of $2], [mdw_cv_constant_$3],
190 [mdw_PROBE_CONSTANT([mdw_cv_constant_$3], [$2], [$4])])
191 $1=$mdw_cv_constant_$3
192 ;;
193 esac])
194 AC_DEFUN([catacomb_LIMIT],
195 [catacomb_COMPILE_TIME_CONSTANT([lo], [$2], [$1_min],
196 [#include <limits.h>
197 #include <stddef.h>])
198 catacomb_COMPILE_TIME_CONSTANT([hi], [$3], [$1_max],
199 [#include <limits.h>
200 #include <stddef.h>])
201 limits="$limits$limits_sep('$1', $lo, $hi)" limits_sep=", "])
202 catacomb_LIMIT([SCHAR], [SCHAR_MIN], [SCHAR_MAX])
203 catacomb_LIMIT([CHAR], [CHAR_MIN], [CHAR_MAX])
204 catacomb_LIMIT([UCHAR], [=0], [UCHAR_MAX])
205 catacomb_LIMIT([UINT8], [=0], [=0xff])
206 catacomb_LIMIT([SHRT], [SHRT_MIN], [SHRT_MAX])
207 catacomb_LIMIT([USHRT], [=0], [USHRT_MAX])
208 catacomb_LIMIT([UINT16], [=0], [=0xffff])
209 catacomb_LIMIT([INT], [INT_MIN], [INT_MAX])
210 catacomb_LIMIT([UINT], [=0], [UINT_MAX])
211 catacomb_LIMIT([LONG], [LONG_MIN], [LONG_MAX])
212 catacomb_LIMIT([ULONG], [=0], [ULONG_MAX])
213 catacomb_LIMIT([UINT32], [=0], [=0xffffffff])
214 if test "$ac_cv_c_long_long" = "yes"; then
215 catacomb_LIMIT([LLONG], [LLONG_MIN], [LLONG_MAX])
216 catacomb_LIMIT([ULLONG], [=0], [ULLONG_MAX])
217 fi
218 catacomb_LIMIT([SIZET], [=0], [~(size_t)0])
219 AC_SUBST([limits])
220
221 dnl Functions used for noise-gathering.
222 AC_CHECK_FUNCS([setgroups])
223 AC_CACHE_CHECK([whether the freewheel noise generator will work],
224 [catacomb_cv_freewheel],
225 [AC_TRY_LINK(
226 [#include <setjmp.h>
227 #include <sys/time.h>],
228 [struct itimerval itv = { { 0, 0 }, { 0, 5000 } };
229 jmp_buf j;
230 setitimer(ITIMER_REAL, &itv, 0);
231 sigsetjmp(j, 1);],
232 [catacomb_cv_freewheel=yes],
233 [catacomb_cv_freewheel=no])])
234 case $catacomb_cv_freewheel in
235 yes)
236 AC_DEFINE([USE_FREEWHEEL], [1],
237 [Define if you want to use the freewheel noise generator.])
238 ;;
239 esac
240
241 dnl Support for the passphrase pixie.
242 mdw_ORIG_LIBS=$LIBS
243 AC_SEARCH_LIBS([socket], [socket])
244 AC_SUBST([PIXIE_LIBS], [$LIBS])
245 LIBS=$mdw_ORIG_LIBS
246
247 dnl Memory locking support.
248 AC_CHECK_FUNCS([mlock])
249
250 dnl Necessary support libraries.
251 PKG_CHECK_MODULES([mLib], [mLib >= 2.2.2.1])
252 AM_CFLAGS="$AM_CFLAGS $mLib_CFLAGS"
253
254 dnl--------------------------------------------------------------------------
255 dnl Python.
256
257 dnl Make sure we have a suitable version.
258 AM_PATH_PYTHON([2.5])
259
260 dnl--------------------------------------------------------------------------
261 dnl Special debugging options.
262
263 AC_ARG_ENABLE([mpw],
264 [AS_HELP_STRING([--enable-mpw], [force small-width mp digits])],
265 [case "$enableval" in
266 y*|t*|short)
267 AC_DEFINE([FORCE_MPW_SHORT], [1],
268 [Define to force small-width mp digits.])
269 ;;
270 cussid)
271 AC_DEFINE([FORCE_MPW_CUSSID], [1],
272 [Define to force strange-width mp digits.])
273 ;;
274 esac])
275
276 dnl--------------------------------------------------------------------------
277 dnl Produce output.
278
279 AC_CONFIG_HEADER([config/config.h])
280
281 AC_CONFIG_FILES(
282 [Makefile]
283 [base/Makefile]
284 [key/Makefile]
285 [math/Makefile]
286 [misc/Makefile]
287 [pub/Makefile]
288 [rand/Makefile]
289 [symm/Makefile]
290 [progs/Makefile])
291 AC_OUTPUT
292
293 dnl----- That's all, folks --------------------------------------------------