configure.ac: Delay checking the assembler until we know the target CPU.
[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 Define language support for assembler.
51 dnl
52 dnl This is stolen from https://gitlab.crest.iu.edu/jsfiroz/hpx/commit/
53 dnl 84be4345db6eec3797a57b8e53483cb43f4733bf
54
55 AC_LANG_DEFINE([CPPAS], [cppas], [CPPAS], [CCAS], [C],
56 [ac_ext=S ac_cpp='$CPP $CPPFLAGS'
57 ac_compile='$CCAS -c $CCASFLAGS $CPPFLAGS dnl
58 conftest.$ac_ext >&AS_MESSAGE_LOG_FD'
59 ac_link='$CCAS -oconftest$ac_exeext $CCASFLAGS $CPPFLAGS $LDFLAGS dnl
60 conftest.$ac_ext $LIBS >&AS_MESSAGE_LOG_FD'])
61
62 AC_DEFUN([AC_LANG_PREPROC(CPPAS)], [AC_REQUIRE([AC_PROG_CPP])])
63 AC_DEFUN([AC_LANG_COMPILER(CPPAS)], [AC_REQUIRE([AM_PROG_AS])])
64 AC_DEFUN([AC_LANG_CONFTEST(CPPAS)],
65 [cat confdefs.h - <<_ACEOF >conftest.$ac_ext
66 /* end confdefs.h. */
67 $1
68 _ACEOF])
69
70 dnl--------------------------------------------------------------------------
71 dnl Host-specific configuration.
72
73 dnl The table of CPU families and ABIs which we might support. Support is
74 dnl not uniform: each dispatched function might or might not have an
75 dnl implementation for any particular CPU/ABI combination.
76 AC_DEFUN([catacomb_CPU_FAMILIES],
77 [$1([i[[3-6]]86,cygwin], [x86], [win])
78 $1([i[[3-6]]86,*], [x86], [sysv])
79 $1([x86_64,cygwin], [amd64], [win])
80 $1([x86_64,*], [amd64], [sysv])
81 $1([arm,*-gnueabi | arm,*-gnueabihf | dnl
82 armv*,*-gnueabi | armv*,*-gnueabihf], [armel], [gnueabi])])
83
84 dnl A utility to clear the `seen' flags, used so as to process each CPU or
85 dnl ABI once.
86 m4_define([catacomb_CLEAR_FLAGS],
87 [m4_ifdef([catacomb_seen_cpu/$2],
88 [m4_undefine([catacomb_seen_cpu/$2])])dnl
89 m4_ifdef([catacomb_seen_abi/$3],
90 [m4_undefine([catacomb_seen_abi/$3])])])
91
92 dnl Identify the current host.
93 case $host_cpu,$host_os in
94 m4_define([catacomb_CPU_CASE],
95 [$1) CPUFAM=$2 ABI=$3 ;;
96 ])
97 catacomb_CPU_FAMILIES([catacomb_CPU_CASE])
98 *) CPUFAM=nil ABI=nil ;;
99 esac
100
101 dnl Now check the assembler. We may have target-specific requirements here,
102 dnl so we couldn't do this any earlier.
103 AC_CACHE_CHECK(
104 [whether the assembler is likely to work], [mdw_cv_gnuish_as],
105 [AC_LANG_PUSH([CPPAS])
106 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
107 .text
108 .L\$_test = 23
109 .macro mymac
110 .L\$_test = .L\$_test + 1
111 .endm
112 .globl foo
113 .extern bar
114 mymac]])],
115 [mdw_cv_gnuish_as=yes], [mdw_cv_gnuish_as=no])
116 AC_LANG_POP([CPPAS])])
117 AM_CONDITIONAL([GNUISH_AS], [test $mdw_cv_gnuish_as = yes])
118 if test $mdw_cv_gnuish_as = no; then CPUFAM=nil ABI=nil; fi
119
120 dnl A hairy macro used to set the `CPUFAM_...' and `ABI_...' variables. We
121 dnl basically need to do the same thing for the family and ABI, so it's worth
122 dnl some effort to hide the ugliness.
123 m4_define([catacomb_DEFINE_CPU_OR_ABI],
124 [case $$1 in
125 m4_define([_def],
126 [m4_ifdef([catacomb_seen_$3/$$2], [],
127 [$$2)
128 AC_DEFINE([$4]m4_translit([$$2], [a-z], [A-Z]), [1], [$5])
129 ;;m4_define([catacomb_seen_$3/$$2], [t])])])
130 catacomb_CPU_FAMILIES([_def])
131 nil) ;;
132 *) AC_MSG_ERROR([BUG: unexpected $1 \`$1']) ;;
133 esac])
134
135 dnl Now that's out the way, we can explain what we're doing.
136 AC_MSG_CHECKING([CPU family and ABI])
137
138 dnl Figure out the target CPU family and ABI.
139 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
140 catacomb_DEFINE_CPU_OR_ABI([CPUFAM], [2], [cpu],
141 [CPUFAM_], [Define if target CPU is \`$][2\'.])
142 catacomb_DEFINE_CPU_OR_ABI([ABI], [3], [abi],
143 [ABI_], [Define if target ABI is \`$][3\'.])
144
145 dnl Establish Automake conditions for things.
146 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
147 m4_define([catacomb_COND_CPU],
148 [m4_define([_CPU], m4_translit([$2], [a-z], [A-Z]))
149 m4_define([_ABI], m4_translit([$3], [a-z], [A-Z]))
150 AM_CONDITIONAL([CPUABI_]_CPU[_]_ABI, [test x$CPUFAM/$ABI = x$2/$3])
151 m4_ifdef([catacomb_seen_cpu/$2], [],
152 [AM_CONDITIONAL([CPUFAM_]_CPU, [test x$CPUFAM = x$2])dnl
153 m4_define([catacomb_seen_cpu/$2], [t])])
154 m4_ifdef([catacomb_seen_abi/$3], [],
155 [AM_CONDITIONAL([ABI_]_ABI, [test x$ABI = x$3])dnl
156 m4_define([catacomb_seen_abi/$3], [t])])])
157 catacomb_CPU_FAMILIES([catacomb_COND_CPU])
158 AM_CONDITIONAL([KNOWN_CPUFAM], [test x$CPUFAM != xnil])
159
160 dnl Report on what we found.
161 case $CPUFAM in
162 nil) AC_MSG_RESULT([not supported]) ;;
163 *) AC_MSG_RESULT([$CPUFAM/$ABI]) ;;
164 esac
165
166 dnl--------------------------------------------------------------------------
167 dnl CPU-specific assembler features.
168
169 AC_LANG([CPPAS])
170
171 case $CPUFAM in
172 armel)
173 AC_CACHE_CHECK(
174 [whether the assembler understands ARMv8 crypto extensions],
175 [mdw_cv_as_armv8_crypto],
176 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
177 .arch armv8-a
178 .fpu crypto-neon-fp-armv8
179
180 .text
181 .globl foo
182 foo:
183 vldmia r0, {d0-d3}
184 aese.8 q0, q1
185 aesmc.8 q0, q0
186 vstmia r0, {d0, d1}
187 bx r14]])],
188 [mdw_cv_as_armv8_crypto=yes],
189 [mdw_cv_as_armv8_crypto=no])])
190 ;;
191 esac
192
193 : ${mdw_cv_as_armv8_crypto=no}
194 AM_CONDITIONAL([HAVE_AS_ARMV8_CRYPTO], [test $mdw_cv_as_armv8_crypto = yes])
195 if test $mdw_cv_as_armv8_crypto = yes; then
196 AC_DEFINE([HAVE_AS_ARMV8_CRYPTO], [1],
197 [Define to 1 if your ARM assembler supports the ARMv8 crypto instructions.])
198 fi
199
200 dnl--------------------------------------------------------------------------
201 dnl C programming environment.
202
203 AC_LANG([C])
204
205 CATACOMB_LIBS=
206
207 dnl Find out if we're cross-compiling.
208 AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
209
210 dnl Various standard types.
211 AC_CHECK_TYPE([pid_t], [],
212 [AC_DEFINE([pid_t], [int],
213 [Define to `int' if <sys/types.h> does not define])])
214 AC_TYPE_UID_T
215 AC_CHECK_TYPE([ssize_t], [],
216 [AC_DEFINE([ssize_t], [int],
217 [Define to `int' if <sys/types.h> does not define])])
218 AC_CHECK_TYPE([socklen_t], [],
219 [AC_DEFINE([socklen_t], [int],
220 [Define to `int' if <sys/socket.h> does not define])],
221 [AC_INCLUDES_DEFAULT
222 #include <sys/socket.h>
223 ])
224
225 dnl The maths library.
226 mdw_ORIG_LIBS=$LIBS LIBS=
227 AC_SEARCH_LIBS([log], [m])
228 AC_SEARCH_LIBS([sqrt], [m])
229 AC_SUBST([MATHLIBS], [$LIBS])
230 LIBS=$mdw_ORIG_LIBS
231
232 dnl Find out whether very long integer types are available.
233 AC_CHECK_HEADERS([stdint.h])
234 AC_SUBST([have_stdint_h])
235 AX_C_LONG_LONG
236
237 dnl Some equipment wanted for checking CPU features at runtime.
238 AC_CHECK_HEADERS([asm/hwcap.h])
239 AC_CHECK_HEADERS([sys/auxv.h])
240 AC_CHECK_HEADERS([linux/auxvec.h])
241 AC_CHECK_FUNCS([getauxval])
242
243 dnl Find the bit lengths of the obvious integer types. This will be useful
244 dnl when deciding on a representation for multiprecision integers.
245 type_bits="" type_bits_sep=""
246 AC_DEFUN([catacomb_UINT_BITS],
247 [mdw_UINT_BITS([$2], [$1])
248 type_bits="$type_bits$type_bits_sep('$1', $[]$1_bits)"
249 type_bits_sep=", "])
250 catacomb_UINT_BITS([uchar], [unsigned char])
251 catacomb_UINT_BITS([ushort], [unsigned short])
252 catacomb_UINT_BITS([uint], [unsigned int])
253 catacomb_UINT_BITS([ulong], [unsigned long])
254 if test "$ac_cv_c_long_long" = "yes"; then
255 catacomb_UINT_BITS([ullong], [unsigned long long])
256 fi
257 if test "$ac_cv_header_stdint_h" = "yes"; then
258 catacomb_UINT_BITS([uintmax], [uintmax_t])
259 fi
260 AC_SUBST([type_bits])
261
262 dnl Determine the limits of common C integer types.
263 limits="" limits_sep=""
264 AC_DEFUN([catacomb_COMPILE_TIME_CONSTANT],
265 [case "$2" in
266 =*)
267 $1="$2"; $1=${$1#=}
268 ;;
269 *)
270 AC_CACHE_CHECK([compile-time value of $2], [mdw_cv_constant_$3],
271 [mdw_PROBE_CONSTANT([mdw_cv_constant_$3], [$2], [$4])])
272 $1=$mdw_cv_constant_$3
273 ;;
274 esac])
275 AC_DEFUN([catacomb_LIMIT],
276 [catacomb_COMPILE_TIME_CONSTANT([lo], [$2], [$1_min],
277 [#include <limits.h>
278 #include <stddef.h>])
279 catacomb_COMPILE_TIME_CONSTANT([hi], [$3], [$1_max],
280 [#include <limits.h>
281 #include <stddef.h>])
282 limits="$limits$limits_sep('$1', $lo, $hi)" limits_sep=", "])
283 catacomb_LIMIT([SCHAR], [SCHAR_MIN], [SCHAR_MAX])
284 catacomb_LIMIT([CHAR], [CHAR_MIN], [CHAR_MAX])
285 catacomb_LIMIT([UCHAR], [=0], [UCHAR_MAX])
286 catacomb_LIMIT([UINT8], [=0], [=0xff])
287 catacomb_LIMIT([SHRT], [SHRT_MIN], [SHRT_MAX])
288 catacomb_LIMIT([USHRT], [=0], [USHRT_MAX])
289 catacomb_LIMIT([UINT16], [=0], [=0xffff])
290 catacomb_LIMIT([INT], [INT_MIN], [INT_MAX])
291 catacomb_LIMIT([UINT], [=0], [UINT_MAX])
292 catacomb_LIMIT([LONG], [LONG_MIN], [LONG_MAX])
293 catacomb_LIMIT([ULONG], [=0], [ULONG_MAX])
294 catacomb_LIMIT([UINT32], [=0], [=0xffffffff])
295 if test "$ac_cv_c_long_long" = "yes"; then
296 catacomb_LIMIT([LLONG], [LLONG_MIN], [LLONG_MAX])
297 catacomb_LIMIT([ULLONG], [=0], [ULLONG_MAX])
298 fi
299 catacomb_LIMIT([SIZET], [=0], [~(size_t)0])
300 AC_SUBST([limits])
301
302 dnl Figure out other aspects of the implementation's arithmetic.
303 AC_CACHE_CHECK([whether negative numbers use two's complement],
304 [catacomb_cv_neg_twoc],
305 [AC_TRY_COMPILE(
306 [#include <limits.h>],
307 [int check[2*!!(-INT_MAX == INT_MIN + 1) - 1];],
308 [catacomb_cv_neg_twoc=yes],
309 [catacomb_cv_neg_twoc=no])])
310 case $catacomb_cv_neg_twoc in
311 yes)
312 AC_DEFINE([NEG_TWOC], [1],
313 [Define if signed numbers are represented in two's complement.])
314 ;;
315 esac
316
317 dnl Functions used for noise-gathering.
318 AC_CHECK_FUNCS([setgroups])
319 AC_CHECK_HEADERS([linux/random.h])
320 mdw_ORIG_LIBS=$LIBS LIBS=$CATACOMB_LIBS
321 AC_SEARCH_LIBS([clock_gettime], [rt])
322 CATACOMB_LIBS=$LIBS LIBS=$mdw_ORIG_LIBS
323 if test "$ac_cv_search_clock_gettime" != no; then
324 AC_DEFINE([HAVE_CLOCK_GETTIME], [1],
325 [Define if you have the \`clock_gettime' function.])
326 fi
327 AC_CHECK_FUNCS([getentropy])
328 AC_CACHE_CHECK([whether the freewheel noise generator will work],
329 [catacomb_cv_freewheel],
330 [AC_TRY_LINK(
331 [#include <setjmp.h>
332 #include <sys/time.h>],
333 [struct itimerval itv = { { 0, 0 }, { 0, 5000 } };
334 jmp_buf j;
335 setitimer(ITIMER_REAL, &itv, 0);
336 sigsetjmp(j, 1);],
337 [catacomb_cv_freewheel=yes],
338 [catacomb_cv_freewheel=no])])
339 case $catacomb_cv_freewheel in
340 yes)
341 AC_DEFINE([USE_FREEWHEEL], [1],
342 [Define if you want to use the freewheel noise generator.])
343 ;;
344 esac
345
346 dnl Support for the passphrase pixie.
347 mdw_ORIG_LIBS=$LIBS
348 AC_SEARCH_LIBS([socket], [socket])
349 AC_SUBST([PIXIE_LIBS], [$LIBS])
350 LIBS=$mdw_ORIG_LIBS
351
352 dnl Memory locking support.
353 AC_CHECK_FUNCS([mlock])
354
355 dnl Set the master libraries we need.
356 AC_SUBST([CATACOMB_LIBS])
357
358 dnl Necessary support libraries.
359 PKG_CHECK_MODULES([mLib], [mLib >= 2.2.2.1])
360 AM_CFLAGS="$AM_CFLAGS $mLib_CFLAGS"
361
362 dnl--------------------------------------------------------------------------
363 dnl Python.
364
365 dnl Make sure we have a suitable version.
366 AM_PATH_PYTHON([2.5])
367
368 dnl--------------------------------------------------------------------------
369 dnl Special debugging options.
370
371 AC_ARG_ENABLE([mpw],
372 [AS_HELP_STRING([--enable-mpw], [force small-width mp digits])],
373 [case "$enableval" in
374 y*|t*|short)
375 AC_DEFINE([FORCE_MPW_SHORT], [1],
376 [Define to force small-width mp digits.])
377 ;;
378 cussid)
379 AC_DEFINE([FORCE_MPW_CUSSID], [1],
380 [Define to force strange-width mp digits.])
381 ;;
382 esac])
383
384 dnl--------------------------------------------------------------------------
385 dnl Produce output.
386
387 AC_CONFIG_HEADER([config/config.h])
388
389 AC_CONFIG_FILES(
390 [Makefile]
391 [base/Makefile]
392 [key/Makefile]
393 [math/Makefile]
394 [misc/Makefile]
395 [pub/Makefile]
396 [rand/Makefile]
397 [symm/Makefile]
398 [progs/Makefile])
399 AC_OUTPUT
400
401 dnl----- That's all, folks --------------------------------------------------