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