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