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