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