acinclude.m4
6fbf66fa
 dnl Special Autoconf Macros for OpenVPN
 
 dnl OPENVPN_ADD_LIBS(LIB)
 AC_DEFUN([OPENVPN_ADD_LIBS], [
   LIBS="$1 $LIBS"
 ])
 
 dnl @synopsis AX_EMPTY_ARRAY
 dnl
 dnl Define EMPTY_ARRAY_SIZE to be either "0"
 dnl or "" depending on which syntax the compiler
 dnl prefers for empty arrays in structs.
 dnl
 dnl @version
 dnl @author James Yonan <jim@yonan.net>
 
 
 AC_DEFUN([AX_EMPTY_ARRAY], [
   AC_MSG_RESULT([checking for C compiler empty array support])
   AC_COMPILE_IFELSE(
     [
5acb3a79
         struct { int foo; int bar[[0]]; } mystruct;
6fbf66fa
     ], [
         AC_DEFINE_UNQUOTED(EMPTY_ARRAY_SIZE, 0, [Dimension to use for empty array declaration])
     ], [
         AC_COMPILE_IFELSE(
 	    [
5acb3a79
 	        struct { int foo; int bar[[]]; } mystruct;
6fbf66fa
 	    ], [
                 AC_DEFINE_UNQUOTED(EMPTY_ARRAY_SIZE,, [Dimension to use for empty array declaration])
 	    ], [
 	        AC_MSG_ERROR([C compiler is unable to creaty empty arrays])
 	    ])
     ])
   ]
 )
 
 dnl @synopsis AX_CPP_VARARG_MACRO_GCC
 dnl
 dnl Test if the preprocessor understands GNU GCC-style vararg macros.
 dnl If it does, defines HAVE_CPP_VARARG_MACRO_GCC to 1.
 dnl
 dnl @version
 dnl @author James Yonan <jim@yonan.net>, Matthias Andree <matthias.andree@web.de>
 AC_DEFUN([AX_CPP_VARARG_MACRO_GCC], [dnl
     AS_VAR_PUSHDEF([VAR],[ax_cv_cpp_vararg_macro_gcc])dnl
     AC_CACHE_CHECK([for GNU GCC vararg macro support], VAR, [dnl
       AC_COMPILE_IFELSE([
 	#define macro(a, b...) func(a, b)
 	int func(int a, int b, int c);
 	int test() { return macro(1, 2, 3); }
 	], [ VAR=yes ], [VAR=no])])
     if test $VAR = yes ; then
     AC_DEFINE([HAVE_CPP_VARARG_MACRO_GCC], 1, 
       [Define to 1 if your compiler supports GNU GCC-style variadic macros])
     fi
     AS_VAR_POPDEF([VAR])dnl
 ])
 
 dnl @synopsis AX_CPP_VARARG_MACRO_ISO
 dnl
 dnl Test if the preprocessor understands ISO C 1999 vararg macros.
 dnl If it does, defines HAVE_CPP_VARARG_MACRO_ISO to 1.
 dnl
 dnl @version
 dnl @author James Yonan <jim@yonan.net>, Matthias Andree <matthias.andree@web.de>
 AC_DEFUN([AX_CPP_VARARG_MACRO_ISO], [dnl
     AS_VAR_PUSHDEF([VAR],[ax_cv_cpp_vararg_macro_iso])dnl
     AC_CACHE_CHECK([for ISO C 1999 vararg macro support], VAR, [dnl
       AC_COMPILE_IFELSE([
 #define macro(a, ...) func(a, __VA_ARGS__)
 	int func(int a, int b, int c);
 	int test() { return macro(1, 2, 3); }
 	], [ VAR=yes ], [VAR=no])])
     if test $VAR = yes ; then
     AC_DEFINE([HAVE_CPP_VARARG_MACRO_ISO], 1, 
       [Define to 1 if your compiler supports ISO C99 variadic macros])
     fi
     AS_VAR_POPDEF([VAR])dnl
 ])
 
 dnl -- The following is taken from curl's acinclude.m4 --
 dnl Check for socklen_t: historically on BSD it is an int, and in
 dnl POSIX 1g it is a type of its own, but some platforms use different
 dnl types for the argument to getsockopt, getpeername, etc.  So we
 dnl have to test to find something that will work.
 AC_DEFUN([TYPE_SOCKLEN_T],
 [
    AC_CHECK_TYPE([socklen_t], ,[
       AC_MSG_CHECKING([for socklen_t equivalent])
       AC_CACHE_VAL([curl_cv_socklen_t_equiv],
       [
          # Systems have either "struct sockaddr *" or
          # "void *" as the second argument to getpeername
          curl_cv_socklen_t_equiv=
          for arg2 in "struct sockaddr" void; do
             for t in int size_t unsigned long "unsigned long"; do
                AC_TRY_COMPILE([
1bda73a7
                   #ifdef _WIN32
                   #include <windows.h>
                   #define PREFIX1 WINSOCK_API_LINKAGE
                   #define PREFIX2 PASCAL
                   #else
6fbf66fa
                   #include <sys/types.h>
                   #include <sys/socket.h>
1bda73a7
                   #define PREFIX1
                   #define PREFIX2
                   #define SOCKET int
                   #endif
6fbf66fa
 
1bda73a7
                   PREFIX1 int PREFIX2 getpeername (SOCKET, $arg2 *, $t *);
6fbf66fa
                ],[
                   $t len;
                   getpeername(0,0,&len);
                ],[
                   curl_cv_socklen_t_equiv="$t"
                   break
                ])
             done
          done
 
          if test "x$curl_cv_socklen_t_equiv" = x; then
             AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
          fi
       ])
       AC_MSG_RESULT($curl_cv_socklen_t_equiv)
       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
 			[type to use in place of socklen_t if not defined])],
       [#include <sys/types.h>
 #include <sys/socket.h>])
 ])
 
 dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
 dnl
 dnl This macro figures out how to build C programs using POSIX
 dnl threads.  It sets the PTHREAD_LIBS output variable to the threads
 dnl library and linker flags, and the PTHREAD_CFLAGS output variable
 dnl to any special C compiler flags that are needed.  (The user can also
 dnl force certain compiler flags/libs to be tested by setting these
 dnl environment variables.)
 dnl
 dnl Also sets PTHREAD_CC to any special C compiler that is needed for
 dnl multi-threaded programs (defaults to the value of CC otherwise).
 dnl (This is necessary on AIX to use the special cc_r compiler alias.)
 dnl
 dnl If you are only building threads programs, you may wish to
 dnl use these variables in your default LIBS, CFLAGS, and CC:
 dnl
 dnl        LIBS="$PTHREAD_LIBS $LIBS"
 dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 dnl        CC="$PTHREAD_CC"
 dnl
 dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
 dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE
 dnl to that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
 dnl
 dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
 dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands
 dnl to run it if it is not found.  If ACTION-IF-FOUND is not specified,
 dnl the default action will define HAVE_PTHREAD.
 dnl
 dnl Please let the authors know if this macro fails on any platform,
 dnl or if you have any other suggestions or comments.  This macro was
 dnl based on work by SGJ on autoconf scripts for FFTW (www.fftw.org)
 dnl (with help from M. Frigo), as well as ac_pthread and hb_pthread
 dnl macros posted by AFC to the autoconf macro repository.  We are also
 dnl grateful for the helpful feedback of numerous users.
 dnl
 dnl @author Steven G. Johnson <stevenj@alum.mit.edu> and Alejandro Forero Cuervo <bachue@bachue.com>
 
 AC_DEFUN([ACX_PTHREAD], [
 AC_REQUIRE([AC_CANONICAL_HOST])
 acx_pthread_ok=no
 
 # We used to check for pthread.h first, but this fails if pthread.h
 # requires special compiler flags (e.g. on True64 or Sequent).
 # It gets checked for in the link test anyway.
 
 # First of all, check if the user has set any of the PTHREAD_LIBS,
 # etcetera environment variables, and if threads linking works using
 # them:
 if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
         save_CFLAGS="$CFLAGS"
         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
         save_LIBS="$LIBS"
         LIBS="$PTHREAD_LIBS $LIBS"
         AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
         AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
         AC_MSG_RESULT($acx_pthread_ok)
         if test x"$acx_pthread_ok" = xno; then
                 PTHREAD_LIBS=""
                 PTHREAD_CFLAGS=""
         fi
         LIBS="$save_LIBS"
         CFLAGS="$save_CFLAGS"
 fi
 
 # We must check for the threads library under a number of different
 # names; the ordering is very important because some systems
 # (e.g. DEC) have both -lpthread and -lpthreads, where one of the
 # libraries is broken (non-POSIX).
 
 # Create a list of thread flags to try.  Items starting with a "-" are
 # C compiler flags, and other items are library names, except for "none"
 # which indicates that we try without any flags at all.
 
 acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt"
 
 # The ordering *is* (sometimes) important.  Some notes on the
 # individual items follow:
 
 # pthreads: AIX (must check this before -lpthread)
 # none: in case threads are in libc; should be tried before -Kthread and
 #       other compiler flags to prevent continual compiler warnings
 # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
 # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
 # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
 # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
 # -pthreads: Solaris/gcc
 # -mthreads: Mingw32/gcc, Lynx/gcc
 # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
 #      doesn't hurt to check since this sometimes defines pthreads too;
 #      also defines -D_REENTRANT)
 # pthread: Linux, etcetera
 # --thread-safe: KAI C++
 
64f3c5b0
 case "$host" in
         *-*-solaris*)
6fbf66fa
 
         # On Solaris (at least, for some versions), libc contains stubbed
         # (non-functional) versions of the pthreads routines, so link-based
         # tests will erroneously succeed.  (We need to link with -pthread or
         # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
         # a function called by this macro, so we could check for that, but
         # who knows whether they'll stub that too in a future libc.)  So,
         # we'll just look for -pthreads and -lpthread first:
 
         acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags"
         ;;
 esac
 
 if test x"$acx_pthread_ok" = xno; then
 for flag in $acx_pthread_flags; do
 
         case $flag in
                 none)
                 AC_MSG_CHECKING([whether pthreads work without any flags])
                 ;;
 
                 -*)
                 AC_MSG_CHECKING([whether pthreads work with $flag])
                 PTHREAD_CFLAGS="$flag"
                 ;;
 
                 *)
                 AC_MSG_CHECKING([for the pthreads library -l$flag])
                 PTHREAD_LIBS="-l$flag"
                 ;;
         esac
 
         save_LIBS="$LIBS"
         save_CFLAGS="$CFLAGS"
         LIBS="$PTHREAD_LIBS $LIBS"
         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 
         # Check for various functions.  We must include pthread.h,
         # since some functions may be macros.  (On the Sequent, we
         # need a special flag -Kthread to make this header compile.)
         # We check for pthread_join because it is in -lpthread on IRIX
         # while pthread_create is in libc.  We check for pthread_attr_init
         # due to DEC craziness with -lpthreads.  We check for
         # pthread_cleanup_push because it is one of the few pthread
         # functions on Solaris that doesn't have a non-functional libc stub.
         # We try pthread_create on general principles.
         AC_TRY_LINK([#include <pthread.h>],
                     [pthread_t th; pthread_join(th, 0);
                      pthread_attr_init(0); pthread_cleanup_push(0, 0);
                      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
                     [acx_pthread_ok=yes])
 
         LIBS="$save_LIBS"
         CFLAGS="$save_CFLAGS"
 
         AC_MSG_RESULT($acx_pthread_ok)
         if test "x$acx_pthread_ok" = xyes; then
                 break;
         fi
 
         PTHREAD_LIBS=""
         PTHREAD_CFLAGS=""
 done
 fi
 
 # Various other checks:
 if test "x$acx_pthread_ok" = xyes; then
         save_LIBS="$LIBS"
         LIBS="$PTHREAD_LIBS $LIBS"
         save_CFLAGS="$CFLAGS"
         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 
         # Detect AIX lossage: threads are created detached by default
         # and the JOINABLE attribute has a nonstandard name (UNDETACHED).
         AC_MSG_CHECKING([for joinable pthread attribute])
         AC_TRY_LINK([#include <pthread.h>],
                     [int attr=PTHREAD_CREATE_JOINABLE;],
                     ok=PTHREAD_CREATE_JOINABLE, ok=unknown)
         if test x"$ok" = xunknown; then
                 AC_TRY_LINK([#include <pthread.h>],
                             [int attr=PTHREAD_CREATE_UNDETACHED;],
                             ok=PTHREAD_CREATE_UNDETACHED, ok=unknown)
         fi
         if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then
                 AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok,
                           [Define to the necessary symbol if this constant
                            uses a non-standard name on your system.])
         fi
         AC_MSG_RESULT(${ok})
         if test x"$ok" = xunknown; then
                 AC_MSG_WARN([we do not know how to create joinable pthreads])
         fi
 
         AC_MSG_CHECKING([if more special flags are required for pthreads])
         flag=no
64f3c5b0
         case "$host" in
                 *-*-aix* | *-freebsd*)               flag="-D_THREAD_SAFE";;
                 *-*-solaris* | alpha*-osf* | *linux*) flag="-D_REENTRANT";;
6fbf66fa
         esac
         AC_MSG_RESULT(${flag})
         if test "x$flag" != xno; then
                 PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
         fi
 
         LIBS="$save_LIBS"
         CFLAGS="$save_CFLAGS"
 
         # More AIX lossage: must compile with cc_r
         AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
 else
         PTHREAD_CC="$CC"
 fi
 
 AC_SUBST(PTHREAD_LIBS)
 AC_SUBST(PTHREAD_CFLAGS)
 AC_SUBST(PTHREAD_CC)
 
 # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
 if test x"$acx_pthread_ok" = xyes; then
         ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
         :
 else
         acx_pthread_ok=no
         $2
 fi
 
 ])dnl ACX_PTHREAD