X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/16efb197c59c4b4cfaef7b2f23bd39f70176dd9e..HEAD:/configure.ac diff --git a/configure.ac b/configure.ac index acee1b52..88d2ec51 100644 --- a/configure.ac +++ b/configure.ac @@ -31,41 +31,283 @@ mdw_AUTO_VERSION AC_INIT([catacomb], AUTO_VERSION, [mdw@distorted.org.uk]) AC_CONFIG_SRCDIR([catacomb.pc.in]) AC_CONFIG_AUX_DIR([config]) -AM_INIT_AUTOMAKE([foreign parallel-tests]) +AM_INIT_AUTOMAKE([foreign parallel-tests color-tests subdir-objects]) +AC_CANONICAL_HOST mdw_SILENT_RULES AC_PROG_CC AX_CFLAGS_WARN_ALL -AM_PROG_LIBTOOL +LT_INIT mdw_LIBTOOL_VERSION_INFO +case $host_os in + cygwin* | mingw* | pw32* | os2* | darwin* | cegcc*) + TEST_LDFLAGS=-no-fast-install ;; + *) + TEST_LDFLAGS=-no-install ;; +esac +AC_SUBST([TEST_LDFLAGS]) + +AM_PROG_AS AC_PROG_YACC AC_SUBST(AM_CFLAGS) dnl-------------------------------------------------------------------------- +dnl Define language support for assembler. +dnl +dnl This is stolen from https://gitlab.crest.iu.edu/jsfiroz/hpx/commit/ +dnl 84be4345db6eec3797a57b8e53483cb43f4733bf + +AC_LANG_DEFINE([CPPAS], [cppas], [CPPAS], [CCAS], [C], + [ac_ext=S ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CCAS -c $CCASFLAGS $CPPFLAGS dnl + conftest.$ac_ext >&AS_MESSAGE_LOG_FD' + ac_link='$CCAS -oconftest$ac_exeext $CCASFLAGS $CPPFLAGS $LDFLAGS dnl + conftest.$ac_ext $LIBS >&AS_MESSAGE_LOG_FD']) + +AC_DEFUN([AC_LANG_PREPROC(CPPAS)], [AC_REQUIRE([AC_PROG_CPP])]) +AC_DEFUN([AC_LANG_COMPILER(CPPAS)], [AC_REQUIRE([AM_PROG_AS])]) +AC_DEFUN([AC_LANG_CONFTEST(CPPAS)], + [cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$1 +_ACEOF]) + +dnl-------------------------------------------------------------------------- +dnl Host-specific configuration. + +dnl The table of CPU families and ABIs which we might support. Support is +dnl not uniform: each dispatched function might or might not have an +dnl implementation for any particular CPU/ABI combination. +AC_DEFUN([catacomb_CPU_FAMILIES], + [$1([i[[3-6]]86,cygwin], [x86], [win]) + $1([i[[3-6]]86,*], [x86], [sysv]) + $1([x86_64,cygwin], [amd64], [win]) + $1([x86_64,*], [amd64], [sysv]) + $1([arm,* | armv*,*], [armel], [std]) + $1([aarch64,*], [arm64], [std])]) + +dnl A utility to clear the `seen' flags, used so as to process each CPU or +dnl ABI once. +m4_define([catacomb_CLEAR_FLAGS], +[m4_ifdef([catacomb_seen_cpu/$2], + [m4_undefine([catacomb_seen_cpu/$2])])dnl +m4_ifdef([catacomb_seen_abi/$3], + [m4_undefine([catacomb_seen_abi/$3])])]) + +dnl Identify the current host. +case $host_cpu,$host_os in + m4_define([catacomb_CPU_CASE], + [$1) CPUFAM=$2 ABI=$3 ;; +]) + catacomb_CPU_FAMILIES([catacomb_CPU_CASE]) + *) CPUFAM=nil ABI=nil ;; +esac + +dnl Now check the assembler. We have target-specific requirements here, so +dnl we couldn't do this any earlier. +AC_CACHE_CHECK( + [whether the assembler is likely to work], [mdw_cv_gnuish_as], + [AC_LANG_PUSH([CPPAS]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + .text + .L\$_test = 23 +.macro mymac + .L\$_test = .L\$_test + 1 +.endm + .globl foo + .extern bar + mymac]])], + [mdw_cv_gnuish_as=yes], [mdw_cv_gnuish_as=no]) + case $CPUFAM in + x86 | amd64) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + .text + .arch pentium4 + .intel_syntax noprefix + .globl foo +foo: + adc dword ptr var, 0 + ret + .data +var: .long 1 + ]])], + [:], [mdw_cv_gnuish_as=no]) + ;; + esac + AC_LANG_POP([CPPAS])]) +AM_CONDITIONAL([GNUISH_AS], [test $mdw_cv_gnuish_as = yes]) +if test $mdw_cv_gnuish_as = no; then CPUFAM=nil ABI=nil; fi + +dnl A hairy macro used to set the `CPUFAM_...' and `ABI_...' variables. We +dnl basically need to do the same thing for the family and ABI, so it's worth +dnl some effort to hide the ugliness. +m4_define([catacomb_DEFINE_CPU_OR_ABI], +[case $$1 in + m4_define([_def], + [m4_ifdef([catacomb_seen_$3/$$2], [], + [$$2) + AC_DEFINE([$4]m4_translit([$$2], [a-z], [A-Z]), [1], [$5]) + ;;m4_define([catacomb_seen_$3/$$2], [t])])]) + catacomb_CPU_FAMILIES([_def]) + nil) ;; + *) AC_MSG_ERROR([BUG: unexpected $1 `$$1']) ;; +esac]) + +dnl Now that's out the way, we can explain what we're doing. +AC_MSG_CHECKING([CPU family and ABI]) + +dnl Figure out the target CPU family and ABI. +catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS]) +catacomb_DEFINE_CPU_OR_ABI([CPUFAM], [2], [cpu], + [CPUFAM_], [Define if target CPU is `$][2'.]) +catacomb_DEFINE_CPU_OR_ABI([ABI], [3], [abi], + [ABI_], [Define if target ABI is `$][3'.]) + +dnl Establish Automake conditions for things. +catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS]) +m4_define([catacomb_COND_CPU], +[m4_define([_CPU], m4_translit([$2], [a-z], [A-Z])) +m4_define([_ABI], m4_translit([$3], [a-z], [A-Z])) +AM_CONDITIONAL([CPUABI_]_CPU[_]_ABI, [test x$CPUFAM/$ABI = x$2/$3]) +m4_ifdef([catacomb_seen_cpu/$2], [], +[AM_CONDITIONAL([CPUFAM_]_CPU, [test x$CPUFAM = x$2])dnl +m4_define([catacomb_seen_cpu/$2], [t])]) +m4_ifdef([catacomb_seen_abi/$3], [], +[AM_CONDITIONAL([ABI_]_ABI, [test x$ABI = x$3])dnl +m4_define([catacomb_seen_abi/$3], [t])])]) +catacomb_CPU_FAMILIES([catacomb_COND_CPU]) +AM_CONDITIONAL([KNOWN_CPUFAM], [test x$CPUFAM != xnil]) + +dnl Report on what we found. +case $CPUFAM in + nil) AC_MSG_RESULT([not supported]) ;; + *) AC_MSG_RESULT([$CPUFAM/$ABI]) ;; +esac + +dnl Consider enabling support for assembler-level debugging toys. +AC_ARG_ENABLE([asm-debug], + AS_HELP_STRING([--enable-asm-debug], + [enable assembler debugging features]), + [mdw_asm_debug=$enableval], [mdw_asm_debug=no]) +case $CPUFAM in nil) mdw_asm_debug=no ;; esac +case $mdw_asm_debug in + no) ;; + *) AC_DEFINE([ENABLE_ASM_DEBUG], [1], + [Define to enable assembler-level debugging.]) ;; +esac +AM_CONDITIONAL([ASM_DEBUG], [test x$mdw_asm_debug != xno]) + +dnl Check for leading underscores on C symbols. +LT_SYS_SYMBOL_USCORE +case $sys_symbol_underscore in + yes) AC_DEFINE([SYM_USCORE], [1], + [Define if C symbols are prefixed with an underscore.]) ;; +esac + +dnl-------------------------------------------------------------------------- +dnl CPU-specific assembler features. + +AC_LANG([CPPAS]) + +case $CPUFAM in + armel) + AC_CACHE_CHECK( + [whether the assembler understands ARMv8 crypto extensions], + [mdw_cv_as_armv8_crypto], + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + .arch armv8-a + .fpu crypto-neon-fp-armv8 + + .text + .globl foo +foo: + vldmia r0, {d0-d3} + aese.8 q0, q1 + aesmc.8 q0, q0 + vstmia r0, {d0, d1} + bx r14]])], + [mdw_cv_as_armv8_crypto=yes], + [mdw_cv_as_armv8_crypto=no])]) + ;; +esac + +: ${mdw_cv_as_armv8_crypto=no} +AM_CONDITIONAL([HAVE_AS_ARMV8_CRYPTO], [test $mdw_cv_as_armv8_crypto = yes]) +if test $mdw_cv_as_armv8_crypto = yes; then + AC_DEFINE([HAVE_AS_ARMV8_CRYPTO], [1], + [Define to 1 if your ARM assembler supports the ARMv8 crypto instructions.]) +fi + +dnl-------------------------------------------------------------------------- dnl C programming environment. +AC_LANG([C]) + +CATACOMB_LIBS= + dnl Find out if we're cross-compiling. AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes]) dnl Various standard types. -AC_CHECK_TYPE([pid_t], [int]) +AC_CHECK_TYPE([pid_t], [], + [AC_DEFINE([pid_t], [int], + [Define to `int' if does not define])]) AC_TYPE_UID_T -AC_CHECK_TYPE([ssize_t], [int]) -AC_CHECK_TYPE([socklen_t], [int]) +AC_CHECK_TYPE([ssize_t], [], + [AC_DEFINE([ssize_t], [int], + [Define to `int' if does not define])]) +AC_CHECK_TYPE([socklen_t], [], + [AC_DEFINE([socklen_t], [int], + [Define to `int' if does not define])], + [AC_INCLUDES_DEFAULT +@%:@include +]) dnl The maths library. -mdw_ORIG_LIBS=$LIBS LIBS= +mdw_ORIG_LIBS=$LIBS LIBS=$CATACOMB_LIBS AC_SEARCH_LIBS([log], [m]) AC_SEARCH_LIBS([sqrt], [m]) -AC_SUBST([MATHLIBS], [$LIBS]) -LIBS=$mdw_ORIG_LIBS +CATACOMB_LIBS=$LIBS LIBS=$mdw_ORIG_LIBS + +dnl Logging is weird under Termux. Unfortunately, it involves macros, so we +dnl have to do this the hard way. +AC_CACHE_CHECK( + [library needed for syslog], [mdw_cv_syslog_lib], + [mdw_ORIG_LIBS=$LIBS LIBS= + for i in 0 1; do + AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [[@%:@include ]], + [[openlog("test", LOG_PID, LOG_DAEMON); + syslog(LOG_ERR, "this is a test");]])], + [ok=t], [ok=nil]) + case $i,$ok in + *,t) mdw_cv_syslog_lib=${LIBS:-none}; break ;; + 0,nil) LIBS="-llog" ;; + 1,nil) AC_MSG_ERROR("failed to link test program") ;; + esac + done + LIBS=$mdw_ORIG_LIBS]) +case $mdw_cv_syslog_lib in + none) LOGLIBS= ;; + *) LOGLIBS=$mdw_cv_syslog_lib ;; +esac +AC_SUBST([LOGLIBS]) dnl Find out whether very long integer types are available. AC_CHECK_HEADERS([stdint.h]) AC_SUBST([have_stdint_h]) -AC_C_LONG_LONG +AX_C_LONG_LONG + +dnl Some equipment wanted for checking CPU features at runtime. +AC_CHECK_HEADERS([asm/hwcap.h]) +AC_CHECK_HEADERS([sys/auxv.h]) +AC_CHECK_HEADERS([linux/auxvec.h]) +AC_CHECK_FUNCS([getauxval]) + +dnl Some equipment for measuring CPU performance. +AC_CHECK_HEADERS([linux/perf_event.h]) dnl Find the bit lengths of the obvious integer types. This will be useful dnl when deciding on a representation for multiprecision integers. @@ -91,7 +333,7 @@ limits="" limits_sep="" AC_DEFUN([catacomb_COMPILE_TIME_CONSTANT], [case "$2" in =*) - $1="$2"; $1=${$1#=} + $1="$2"; $1=${$1@%:@=} ;; *) AC_CACHE_CHECK([compile-time value of $2], [mdw_cv_constant_$3], @@ -101,11 +343,11 @@ AC_DEFUN([catacomb_COMPILE_TIME_CONSTANT], esac]) AC_DEFUN([catacomb_LIMIT], [catacomb_COMPILE_TIME_CONSTANT([lo], [$2], [$1_min], -[#include -#include ]) +[@%:@include +@%:@include ]) catacomb_COMPILE_TIME_CONSTANT([hi], [$3], [$1_max], -[#include -#include ]) +[@%:@include +@%:@include ]) limits="$limits$limits_sep('$1', $lo, $hi)" limits_sep=", "]) catacomb_LIMIT([SCHAR], [SCHAR_MIN], [SCHAR_MAX]) catacomb_LIMIT([CHAR], [CHAR_MIN], [CHAR_MAX]) @@ -126,17 +368,41 @@ fi catacomb_LIMIT([SIZET], [=0], [~(size_t)0]) AC_SUBST([limits]) +dnl Figure out other aspects of the implementation's arithmetic. +AC_CACHE_CHECK([whether negative numbers use two's complement], + [catacomb_cv_neg_twoc], +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM( +[[@%:@include ]], +[[int check[2*!!(-INT_MAX == INT_MIN + 1) - 1];]])], +[catacomb_cv_neg_twoc=yes], +[catacomb_cv_neg_twoc=no])]) +case $catacomb_cv_neg_twoc in + yes) + AC_DEFINE([NEG_TWOC], [1], + [Define if signed numbers are represented in two's complement.]) + ;; +esac + dnl Functions used for noise-gathering. AC_CHECK_FUNCS([setgroups]) +AC_CHECK_HEADERS([linux/random.h]) +mdw_ORIG_LIBS=$LIBS LIBS=$CATACOMB_LIBS +AC_SEARCH_LIBS([clock_gettime], [rt]) +CATACOMB_LIBS=$LIBS LIBS=$mdw_ORIG_LIBS +if test "$ac_cv_search_clock_gettime" != no; then + AC_DEFINE([HAVE_CLOCK_GETTIME], [1], + [Define if you have the `clock_gettime' function.]) +fi +AC_CHECK_FUNCS([getentropy]) AC_CACHE_CHECK([whether the freewheel noise generator will work], [catacomb_cv_freewheel], -[AC_TRY_LINK( -[#include -#include ], -[struct itimerval itv = { { 0, 0 }, { 0, 5000 } }; +[AC_LINK_IFELSE([AC_LANG_PROGRAM( +[[@%:@include +@%:@include ]], +[[struct itimerval itv = { { 0, 0 }, { 0, 5000 } }; jmp_buf j; setitimer(ITIMER_REAL, &itv, 0); -sigsetjmp(j, 1);], +sigsetjmp(j, 1);]])], [catacomb_cv_freewheel=yes], [catacomb_cv_freewheel=no])]) case $catacomb_cv_freewheel in @@ -155,8 +421,17 @@ LIBS=$mdw_ORIG_LIBS dnl Memory locking support. AC_CHECK_FUNCS([mlock]) +dnl See if we can find Valgrind's header files. +AC_CHECK_HEADER([valgrind/memcheck.h], + AC_DEFINE([HAVE_VALGRIND_H], [1], + [Define if the Valgrind header files are available.]) + []) + +dnl Set the master libraries we need. +AC_SUBST([CATACOMB_LIBS]) + dnl Necessary support libraries. -PKG_CHECK_MODULES([mLib], [mLib >= 2.2.1]) +PKG_CHECK_MODULES([mLib], [mLib >= 2.4.1]) AM_CFLAGS="$AM_CFLAGS $mLib_CFLAGS" dnl-------------------------------------------------------------------------- @@ -184,7 +459,7 @@ AC_ARG_ENABLE([mpw], dnl-------------------------------------------------------------------------- dnl Produce output. -AC_CONFIG_HEADER([config/config.h]) +AC_CONFIG_HEADERS([config/config.h]) AC_CONFIG_FILES( [Makefile]