configure.ac: Detect plain `arm' as an ARM CPU identifier.
[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 dnl Find out if we're cross-compiling.
143 AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
144
145 dnl Various standard types.
146 AC_CHECK_TYPE([pid_t], [int])
147 AC_TYPE_UID_T
148 AC_CHECK_TYPE([ssize_t], [int])
149 AC_CHECK_TYPE([socklen_t], [int])
150
151 dnl The maths library.
152 mdw_ORIG_LIBS=$LIBS LIBS=
153 AC_SEARCH_LIBS([log], [m])
154 AC_SEARCH_LIBS([sqrt], [m])
155 AC_SUBST([MATHLIBS], [$LIBS])
156 LIBS=$mdw_ORIG_LIBS
157
158 dnl Find out whether very long integer types are available.
159 AC_CHECK_HEADERS([stdint.h])
160 AC_SUBST([have_stdint_h])
161 AC_C_LONG_LONG
162
163 dnl Find the bit lengths of the obvious integer types. This will be useful
164 dnl when deciding on a representation for multiprecision integers.
165 type_bits="" type_bits_sep=""
166 AC_DEFUN([catacomb_UINT_BITS],
167 [mdw_UINT_BITS([$2], [$1])
168 type_bits="$type_bits$type_bits_sep('$1', $[]$1_bits)"
169 type_bits_sep=", "])
170 catacomb_UINT_BITS([uchar], [unsigned char])
171 catacomb_UINT_BITS([ushort], [unsigned short])
172 catacomb_UINT_BITS([uint], [unsigned int])
173 catacomb_UINT_BITS([ulong], [unsigned long])
174 if test "$ac_cv_c_long_long" = "yes"; then
175 catacomb_UINT_BITS([ullong], [unsigned long long])
176 fi
177 if test "$ac_cv_header_stdint_h" = "yes"; then
178 catacomb_UINT_BITS([uintmax], [uintmax_t])
179 fi
180 AC_SUBST([type_bits])
181
182 dnl Determine the limits of common C integer types.
183 limits="" limits_sep=""
184 AC_DEFUN([catacomb_COMPILE_TIME_CONSTANT],
185 [case "$2" in
186 =*)
187 $1="$2"; $1=${$1#=}
188 ;;
189 *)
190 AC_CACHE_CHECK([compile-time value of $2], [mdw_cv_constant_$3],
191 [mdw_PROBE_CONSTANT([mdw_cv_constant_$3], [$2], [$4])])
192 $1=$mdw_cv_constant_$3
193 ;;
194 esac])
195 AC_DEFUN([catacomb_LIMIT],
196 [catacomb_COMPILE_TIME_CONSTANT([lo], [$2], [$1_min],
197 [#include <limits.h>
198 #include <stddef.h>])
199 catacomb_COMPILE_TIME_CONSTANT([hi], [$3], [$1_max],
200 [#include <limits.h>
201 #include <stddef.h>])
202 limits="$limits$limits_sep('$1', $lo, $hi)" limits_sep=", "])
203 catacomb_LIMIT([SCHAR], [SCHAR_MIN], [SCHAR_MAX])
204 catacomb_LIMIT([CHAR], [CHAR_MIN], [CHAR_MAX])
205 catacomb_LIMIT([UCHAR], [=0], [UCHAR_MAX])
206 catacomb_LIMIT([UINT8], [=0], [=0xff])
207 catacomb_LIMIT([SHRT], [SHRT_MIN], [SHRT_MAX])
208 catacomb_LIMIT([USHRT], [=0], [USHRT_MAX])
209 catacomb_LIMIT([UINT16], [=0], [=0xffff])
210 catacomb_LIMIT([INT], [INT_MIN], [INT_MAX])
211 catacomb_LIMIT([UINT], [=0], [UINT_MAX])
212 catacomb_LIMIT([LONG], [LONG_MIN], [LONG_MAX])
213 catacomb_LIMIT([ULONG], [=0], [ULONG_MAX])
214 catacomb_LIMIT([UINT32], [=0], [=0xffffffff])
215 if test "$ac_cv_c_long_long" = "yes"; then
216 catacomb_LIMIT([LLONG], [LLONG_MIN], [LLONG_MAX])
217 catacomb_LIMIT([ULLONG], [=0], [ULLONG_MAX])
218 fi
219 catacomb_LIMIT([SIZET], [=0], [~(size_t)0])
220 AC_SUBST([limits])
221
222 dnl Functions used for noise-gathering.
223 AC_CHECK_FUNCS([setgroups])
224 AC_CACHE_CHECK([whether the freewheel noise generator will work],
225 [catacomb_cv_freewheel],
226 [AC_TRY_LINK(
227 [#include <setjmp.h>
228 #include <sys/time.h>],
229 [struct itimerval itv = { { 0, 0 }, { 0, 5000 } };
230 jmp_buf j;
231 setitimer(ITIMER_REAL, &itv, 0);
232 sigsetjmp(j, 1);],
233 [catacomb_cv_freewheel=yes],
234 [catacomb_cv_freewheel=no])])
235 case $catacomb_cv_freewheel in
236 yes)
237 AC_DEFINE([USE_FREEWHEEL], [1],
238 [Define if you want to use the freewheel noise generator.])
239 ;;
240 esac
241
242 dnl Support for the passphrase pixie.
243 mdw_ORIG_LIBS=$LIBS
244 AC_SEARCH_LIBS([socket], [socket])
245 AC_SUBST([PIXIE_LIBS], [$LIBS])
246 LIBS=$mdw_ORIG_LIBS
247
248 dnl Memory locking support.
249 AC_CHECK_FUNCS([mlock])
250
251 dnl Necessary support libraries.
252 PKG_CHECK_MODULES([mLib], [mLib >= 2.2.2.1])
253 AM_CFLAGS="$AM_CFLAGS $mLib_CFLAGS"
254
255 dnl--------------------------------------------------------------------------
256 dnl Python.
257
258 dnl Make sure we have a suitable version.
259 AM_PATH_PYTHON([2.5])
260
261 dnl--------------------------------------------------------------------------
262 dnl Special debugging options.
263
264 AC_ARG_ENABLE([mpw],
265 [AS_HELP_STRING([--enable-mpw], [force small-width mp digits])],
266 [case "$enableval" in
267 y*|t*|short)
268 AC_DEFINE([FORCE_MPW_SHORT], [1],
269 [Define to force small-width mp digits.])
270 ;;
271 cussid)
272 AC_DEFINE([FORCE_MPW_CUSSID], [1],
273 [Define to force strange-width mp digits.])
274 ;;
275 esac])
276
277 dnl--------------------------------------------------------------------------
278 dnl Produce output.
279
280 AC_CONFIG_HEADER([config/config.h])
281
282 AC_CONFIG_FILES(
283 [Makefile]
284 [base/Makefile]
285 [key/Makefile]
286 [math/Makefile]
287 [misc/Makefile]
288 [pub/Makefile]
289 [rand/Makefile]
290 [symm/Makefile]
291 [progs/Makefile])
292 AC_OUTPUT
293
294 dnl----- That's all, folks --------------------------------------------------