Merge branch 'mdw/cpu-dispatch'
[catacomb] / configure.ac
index 7c66807..715a5c2 100644 (file)
@@ -31,7 +31,8 @@ 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
@@ -39,11 +40,102 @@ AX_CFLAGS_WARN_ALL
 AM_PROG_LIBTOOL
 mdw_LIBTOOL_VERSION_INFO
 
+AM_PROG_AS
+
 AC_PROG_YACC
 
 AC_SUBST(AM_CFLAGS)
 
 dnl--------------------------------------------------------------------------
+dnl Host-specific configuration.
+
+AC_MSG_CHECKING([CPU family and ABI])
+
+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([armv*,*-gnueabi | armv*,*-gnueabihf], [armel], [gnueabi])])
+
+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 Figure out the current CPU.
+catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
+case $CPUFAM in
+  m4_define([catacomb_DEFINE_CPU],
+    [m4_ifdef([catacomb_seen_cpu/$2], [],
+      [$2)
+       AC_DEFINE([CPUFAM_]m4_translit([$2], [a-z], [A-Z]), [1],
+                 [Define if host CPU family is \`$2\'.])
+       ;;m4_define([catacomb_seen_cpu/$2], [t])])])
+  catacomb_CPU_FAMILIES([catacomb_DEFINE_CPU])
+  nil) ;;
+  *) AC_MSG_ERROR([BUG: unexpected cpufam \`$CPUFAM']) ;;
+esac
+AC_SUBST([CPUFAM])
+
+dnl Figure out the current ABI.
+catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
+case $ABI in
+  m4_define([catacomb_DEFINE_ABI],
+    [m4_ifdef([catacomb_seen_abi/$3], [],
+      [$3)
+       AC_DEFINE([ABI_]m4_translit([$3], [a-z], [A-Z]), [1],
+                 [Define if host ABI variant is \`$3\'.])
+       ;;m4_define([catacomb_seen_abi/$3], [t])])])
+  catacomb_CPU_FAMILIES([catacomb_DEFINE_ABI])
+  nil) ;;
+  *) AC_MSG_ERROR([BUG: unexpected ABI \`$ABI']) ;;
+esac
+AC_SUBST([ABI])
+
+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 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--------------------------------------------------------------------------
 dnl C programming environment.
 
 dnl Find out if we're cross-compiling.
@@ -53,12 +145,13 @@ dnl Various standard types.
 AC_CHECK_TYPE([pid_t], [int])
 AC_TYPE_UID_T
 AC_CHECK_TYPE([ssize_t], [int])
+AC_CHECK_TYPE([socklen_t], [int])
 
 dnl The maths library.
-mdw_ORIG_LIBS=$LIBS
+mdw_ORIG_LIBS=$LIBS LIBS=
 AC_SEARCH_LIBS([log], [m])
 AC_SEARCH_LIBS([sqrt], [m])
-AC_SUBST([CATACOMB_LIBS], [$LIBS])
+AC_SUBST([MATHLIBS], [$LIBS])
 LIBS=$mdw_ORIG_LIBS
 
 dnl Find out whether very long integer types are available.
@@ -135,7 +228,7 @@ AC_CACHE_CHECK([whether the freewheel noise generator will work],
 [struct itimerval itv = { { 0, 0 }, { 0, 5000 } };
 jmp_buf j;
 setitimer(ITIMER_REAL, &itv, 0);
-sigsetjump(j, 1);],
+sigsetjmp(j, 1);],
 [catacomb_cv_freewheel=yes],
 [catacomb_cv_freewheel=no])])
 case $catacomb_cv_freewheel in
@@ -155,7 +248,7 @@ dnl Memory locking support.
 AC_CHECK_FUNCS([mlock])
 
 dnl Necessary support libraries.
-PKG_CHECK_MODULES([mLib], [mLib >= 2.0.4])
+PKG_CHECK_MODULES([mLib], [mLib >= 2.2.2.1])
 AM_CFLAGS="$AM_CFLAGS $mLib_CFLAGS"
 
 dnl--------------------------------------------------------------------------