2003-06-17 Moritz Schulte <moritz@g10code.com>
[libgcrypt.git] / acinclude.m4
index 2349da6..b0435e8 100644 (file)
-dnl macros to configure g10
-
+dnl macros to configure Libgcrypt
+dnl Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+dnl
+dnl This file is part of Libgcrypt.
+dnl
+dnl Libgcrypt is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU Lesser General Public License as
+dnl published by the Free Software Foundation; either version 2.1 of
+dnl the License, or (at your option) any later version.
+dnl
+dnl Libgcrypt is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU Lesser General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU Lesser General Public
+dnl License along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 
 dnl GNUPG_MSG_PRINT(STRING)
 dnl print a message
 dnl
 define(GNUPG_MSG_PRINT,
-  [ echo $ac_n "$1"" $ac_c" 1>&AC_FD_MSG
+  [ echo $ac_n "$1"" $ac_c" 1>&AS_MESSAGE_FD([])
   ])
 
-
 dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
 dnl Check whether a typedef exists and create a #define $2 if it exists
 dnl
 AC_DEFUN(GNUPG_CHECK_TYPEDEF,
   [ AC_MSG_CHECKING(for $1 typedef)
     AC_CACHE_VAL(gnupg_cv_typedef_$1,
-    [AC_TRY_COMPILE([#include <stdlib.h>
+    [AC_TRY_COMPILE([#define _GNU_SOURCE 1
+    #include <stdlib.h>
     #include <sys/types.h>], [
     #undef $1
     int a = sizeof($1);
     ], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
     AC_MSG_RESULT($gnupg_cv_typedef_$1)
     if test "$gnupg_cv_typedef_$1" = yes; then
-        AC_DEFINE($2)
+        AC_DEFINE($2,1,[Defined if a `]$1[' is typedef'd])
     fi
   ])
 
 
-
-dnl GNUPG_LINK_FILES( SRC, DEST )
-dnl same as AC_LINK_FILES, but collect the files to link in
-dnl some special variables and do the link
-dnl when GNUPG_DO_LINK_FILES is called
-dnl This is a workaround for AC_LINK_FILES, because it does not work
-dnl correct when using a caching scheme
-dnl
-define(GNUPG_LINK_FILES,
-  [ if test "x$wk_link_files_src" = "x"; then
-        wk_link_files_src="$1"
-        wk_link_files_dst="$2"
-    else
-        wk_link_files_src="$wk_link_files_src $1"
-        wk_link_files_dst="$wk_link_files_dst $2"
-    fi
-  ])
-define(GNUPG_DO_LINK_FILES,
-  [ AC_LINK_FILES( $wk_link_files_src, $wk_link_files_dst )
-  ])
-
-
-dnl GNUPG_CHECK_ENDIAN
-dnl define either LITTLE_ENDIAN_HOST or BIG_ENDIAN_HOST
-dnl
-define(GNUPG_CHECK_ENDIAN,
-  [ if test "$cross_compiling" = yes; then
-        AC_MSG_WARN(cross compiling; assuming little endianess)
-    fi
-    AC_MSG_CHECKING(endianess)
-    AC_CACHE_VAL(gnupg_cv_c_endian,
-      [ gnupg_cv_c_endian=unknown
-        # See if sys/param.h defines the BYTE_ORDER macro.
-        AC_TRY_COMPILE([#include <sys/types.h>
-        #include <sys/param.h>], [
-        #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
-         bogus endian macros
-        #endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
-        AC_TRY_COMPILE([#include <sys/types.h>
-        #include <sys/param.h>], [
-        #if BYTE_ORDER != BIG_ENDIAN
-         not big endian
-        #endif], gnupg_cv_c_endian=big, gnupg_cv_c_endian=little)])
-        if test "$gnupg_cv_c_endian" = unknown; then
-            AC_TRY_RUN([main () {
-              /* Are we little or big endian?  From Harbison&Steele.  */
-              union
-              {
-                long l;
-                char c[sizeof (long)];
-              } u;
-              u.l = 1;
-              exit (u.c[sizeof (long) - 1] == 1);
-              }],
-              gnupg_cv_c_endian=little,
-              gnupg_cv_c_endian=big,
-              gnupg_cv_c_endian=little
-            )
-        fi
-      ])
-    AC_MSG_RESULT([$gnupg_cv_c_endian])
-    if test "$gnupg_cv_c_endian" = little; then
-      AC_DEFINE(LITTLE_ENDIAN_HOST)
-    else
-      AC_DEFINE(BIG_ENDIAN_HOST)
-    fi
-  ])
-
-dnl GNUPG_CHECK_CACHE
-dnl
-define(GNUPG_CHECK_CACHE,
-  [ AC_MSG_CHECKING(cached information)
-    gnupg_hostcheck="$target"
-    AC_CACHE_VAL(gnupg_cv_hostcheck, [ gnupg_cv_hostcheck="$gnupg_hostcheck" ])
-    if test "$gnupg_cv_hostcheck" != "$gnupg_hostcheck"; then
-        AC_MSG_RESULT(changed)
-        AC_MSG_WARN(config.cache exists!)
-        AC_MSG_ERROR(you must do 'make distclean' first to compile for
-                 different target or different parameters.)
-    else
-        AC_MSG_RESULT(ok)
-    fi
-  ])
-
-
-######################################################################
-# Check for -fPIC etc (taken from libtool)
-# This sets CFLAGS_PIC to the required flags
-#           NO_PIC to yes if it is not possible to
-#                  generate PIC
-######################################################################
-dnl GNUPG_CHECK_PIC
+dnl GNUPG_FIX_HDR_VERSION(FILE, NAME)
+dnl Make the version number in gcrypt/gcrypt.h the same as the one here.
+dnl (this is easier than to have a .in file just for one substitution)
+dnl We must use a temp file in the current directory because make distcheck 
+dnl install all sourcefiles RO.
 dnl
-define(GNUPG_CHECK_PIC,
-  [ AC_MSG_CHECKING(for option to create PIC)
-    CFLAGS_PIC=
-    NO_PIC=no
-    if test "$cross_compiling" = yes; then
-        AC_MSG_RESULT(assume none)
+AC_DEFUN(GNUPG_FIX_HDR_VERSION,
+  [ sed "s/^#define $2 \".*/#define $2 \"$VERSION\"/" $srcdir/$1 > fixhdr.tmp
+    if cmp -s $srcdir/$1 fixhdr.tmp 2>/dev/null; then
+        rm -f fixhdr.tmp
     else
-        if test "$GCC" = yes; then
-            CFLAGS_PIC="-fPIC"
+        rm -f $srcdir/$1
+        if mv fixhdr.tmp $srcdir/$1 ; then
+            :
         else
-            case "$host_os" in
-              aix3* | aix4*)
-                # All rs/6000 code is PIC
-                # but is there any non-rs/6000 AIX platform?
-                ;;
-
-              hpux9* | hpux10*)
-                CFLAGS_PIC="+Z"
-                ;;
-
-              irix5* | irix6*)
-                # PIC (with -KPIC) is the default.
-                ;;
-
-              osf3* | osf4*)
-                # FIXME - pic_flag is probably required for
-                # hppa*-osf* and i860-osf*
-                ;;
-
-              sco3.2v5*)
-                CFLAGS_PIC='-Kpic'
-                ;;
-
-              solaris2* | solaris7* )
-                CFLAGS_PIC='-KPIC'
-                ;;
-
-              sunos4*)
-                CFLAGS_PIC='-PIC'
-                ;;
-
-              *)
-                NO_PIC=yes
-                ;;
-            esac
-        fi
-
-        case "$host_cpu" in
-        rs6000 | powerpc | powerpcle)
-          # Yippee! All RS/6000 and PowerPC code is position-independent.
-          CFLAGS_PIC=""
-          ;;
-        esac
-
-        if test "$NO_PIC" = yes; then
-            AC_MSG_RESULT(not possible)
-        else
-            if test -z "$CFLAGS_PIC"; then
-               AC_MSG_RESULT(none)
-            else
-                AC_MSG_RESULT($CFLAGS_PIC)
-            fi
+            AC_MSG_ERROR([[
+***
+*** Failed to fix the version string macro $2 in $1.
+*** The old file has been saved as fixhdr.tmp
+***]])
         fi
+        AC_MSG_WARN([fixed the $2 macro in $1])
     fi
   ])
 
 
-######################################################################
-# Check for rdynamic flag
-# This sets CFLAGS_RDYNAMIC to the required flags
-######################################################################
-dnl GNUPG_CHECK_RDYNAMIC
+dnl GNUPG_CHECK_GNUMAKE
 dnl
-define(GNUPG_CHECK_RDYNAMIC,
-  [ AC_MSG_CHECKING(how to specify -rdynamic)
-    CFLAGS_RDYNAMIC=
-    if test "$cross_compiling" = yes; then
-        AC_MSG_RESULT(assume none)
+AC_DEFUN(GNUPG_CHECK_GNUMAKE,
+  [
+    if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
+        :
     else
-        case "$host_os" in
-          solaris* )
-            CFLAGS_RDYNAMIC="-Wl,-dy"
-            ;;
-
-          freebsd2* | osf4* )
-            CFLAGS_RDYNAMIC=""
-            ;;
-          * )
-            CFLAGS_RDYNAMIC="-Wl,-export-dynamic"
-            ;;
-        esac
-        AC_MSG_RESULT($CFLAGS_RDYNAMIC)
+        AC_MSG_WARN([[
+***
+*** It seems that you are not using GNU make.  Some make tools have serious
+*** flaws and you may not be able to build this software at all. Before you
+*** complain, please try GNU make:  GNU make is easy to build and available
+*** at all GNU archives.  It is always available from ftp.gnu.org:/gnu/make.
+***]])
     fi
   ])
 
 
-#####################################################################
-# Check for SysV IPC  (from GIMP)
-#   And see whether we have a SHM_LOCK (FreeBSD does not have it).
-#####################################################################
-dnl GNUPG_CHECK_IPC
-dnl
-define(GNUPG_CHECK_IPC,
-   [ AC_CHECK_HEADERS(sys/ipc.h sys/shm.h)
-     if test "$ac_cv_header_sys_shm_h" = "yes"; then
-       AC_MSG_CHECKING(whether IPC_RMID allowes subsequent attaches)
-       AC_CACHE_VAL(gnupg_cv_ipc_rmid_deferred_release,
-          AC_TRY_RUN([
-             #include <sys/types.h>
-             #include <sys/ipc.h>
-             #include <sys/shm.h>
-             int main()
-             {
-               int id;
-               char *shmaddr;
-             id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0777);
-             if (id == -1)
-               exit (2);
-               shmaddr = shmat (id, 0, 0);
-               shmctl (id, IPC_RMID, 0);
-               if ((char*) shmat (id, 0, 0) == (char*) -1)
-               {
-                 shmdt (shmaddr);
-                 exit (1);
-               }
-               shmdt (shmaddr);
-               shmdt (shmaddr);
-               exit (0);
-             }
-         ],
-         gnupg_cv_ipc_rmid_deferred_release="yes",
-         gnupg_cv_ipc_rmid_deferred_release="no",
-         gnupg_cv_ipc_rmid_deferred_release="assume-no")
-       )
-       if test "$gnupg_cv_ipc_rmid_deferred_release" = "yes"; then
-           AC_DEFINE(IPC_RMID_DEFERRED_RELEASE)
-           AC_MSG_RESULT(yes)
-       else
-          if test "$gnupg_cv_ipc_rmid_deferred_release" = "no"; then
-              AC_MSG_RESULT(no)
-          else
-              AC_MSG_RESULT([assuming no])
-          fi
-       fi
-
-       AC_MSG_CHECKING(whether SHM_LOCK is available)
-       AC_CACHE_VAL(gnupg_cv_ipc_have_shm_lock,
-          AC_TRY_COMPILE([#include <sys/types.h>
-             #include <sys/ipc.h>
-             #include <sys/shm.h>],[
-             int foo( int shm_id ) {  shmctl(shm_id, SHM_LOCK, 0); }
-             ],
-             gnupg_cv_ipc_have_shm_lock="yes",
-             gnupg_cv_ipc_have_shm_lock="no"
-          )
-       )
-       if test "$gnupg_cv_ipc_have_shm_lock" = "yes"; then
-         AC_DEFINE(IPC_HAVE_SHM_LOCK)
-         AC_MSG_RESULT(yes)
-       else
-         AC_MSG_RESULT(no)
-       fi
-     fi
-   ])
-
-
 ######################################################################
 # Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
 # is not called from uid 0 (not tested whether uid 0 works)
+# For DECs Tru64 we have also to check whether mlock is in librt
+# mlock is there a macro using memlk()
 ######################################################################
 dnl GNUPG_CHECK_MLOCK
 dnl
 define(GNUPG_CHECK_MLOCK,
   [ AC_CHECK_FUNCS(mlock)
+    if test "$ac_cv_func_mlock" = "no"; then
+        AC_CHECK_HEADERS(sys/mman.h)
+        if test "$ac_cv_header_sys_mman_h" = "yes"; then
+            # Add librt to LIBS:
+            AC_CHECK_LIB(rt, memlk)
+            AC_CACHE_CHECK([whether mlock is in sys/mman.h],
+                            gnupg_cv_mlock_is_in_sys_mman,
+                [AC_TRY_LINK([
+                    #include <assert.h>
+                    #ifdef HAVE_SYS_MMAN_H
+                    #include <sys/mman.h>
+                    #endif
+                ], [
+                    int i;
+                    
+                    /* glibc defines this for functions which it implements
+                     * to always fail with ENOSYS.  Some functions are actually
+                     * named something starting with __ and the normal name
+                     * is an alias.  */
+                    #if defined (__stub_mlock) || defined (__stub___mlock)
+                    choke me
+                    #else
+                    mlock(&i, 4);
+                    #endif
+                    ; return 0;
+                ],
+                gnupg_cv_mlock_is_in_sys_mman=yes,
+                gnupg_cv_mlock_is_in_sys_mman=no)])
+            if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
+                AC_DEFINE(HAVE_MLOCK,1,
+                          [Defined if the system supports an mlock() call])
+            fi
+        fi
+    fi
     if test "$ac_cv_func_mlock" = "yes"; then
         AC_MSG_CHECKING(whether mlock is broken)
           AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
@@ -330,7 +167,8 @@ define(GNUPG_CHECK_MLOCK,
            )
          )
          if test "$gnupg_cv_have_broken_mlock" = "yes"; then
-             AC_DEFINE(HAVE_BROKEN_MLOCK)
+             AC_DEFINE(HAVE_BROKEN_MLOCK,1,
+                       [Defined if the mlock() call does not work])
              AC_MSG_RESULT(yes)
          else
             if test "$gnupg_cv_have_broken_mlock" = "no"; then
@@ -342,5 +180,80 @@ define(GNUPG_CHECK_MLOCK,
     fi
   ])
 
+# GNUPG_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
+AC_DEFUN(GNUPG_SYS_LIBTOOL_CYGWIN32,
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+AC_CHECK_TOOL(AS, as, false)
+])
+
+dnl LIST_MEMBER()
+dnl Check wether an element ist contained in a list.  Set `found' to
+dnl `1' if the element is found in the list, to `0' otherwise.
+AC_DEFUN(LIST_MEMBER,
+[
+name=$1
+list=$2
+found=0
+
+for n in $list; do
+  if test "x$name" = "x$n"; then
+    found=1
+  fi
+done
+])
+
+dnl AM_PATH_GPG_ERROR([MINIMUM-VERSION,
+dnl                   [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpg-error and define GPG_ERROR_CFLAGS and GPG_ERROR_LIBS
+dnl
+AC_DEFUN(AM_PATH_GPG_ERROR,
+[ AC_ARG_WITH(gpg-error-prefix,
+            AC_HELP_STRING([--with-gpg-error-prefix=PFX],
+                           [prefix where GPG Error is installed (optional)]),
+     gpg_error_config_prefix="$withval", gpg_error_config_prefix="")
+  if test x$gpg_error_config_prefix != x ; then
+     gpg_error_config_args="$gpg_error_config_args --prefix=$gpg_error_config_prefix"
+     if test x${GPG_ERROR_CONFIG+set} != xset ; then
+        GPG_ERROR_CONFIG=$gpg_error_config_prefix/bin/gpg-error-config
+     fi
+  fi
+
+  AC_PATH_PROG(GPG_ERROR_CONFIG, gpg-error-config, no)
+  min_gpg_error_version=ifelse([$1], ,0.0.0,$1)
+  AC_MSG_CHECKING(for GPG Error - version >= $min_gpg_error_version)
+  ok=no
+  if test "$GPG_ERROR_CONFIG" != "no" ; then
+    req_major=`echo $min_gpg_error_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+    req_minor=`echo $min_gpg_error_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+    gpg_error_config_version=`$GPG_ERROR_CONFIG $gpg_error_config_args --version`
+    major=`echo $gpg_error_config_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
+    minor=`echo $gpg_error_config_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
+    if test "$major" -gt "$req_major"; then
+        ok=yes
+    else 
+        if test "$major" -eq "$req_major"; then
+            if test "$minor" -ge "$req_minor"; then
+               ok=yes
+            fi
+        fi
+    fi
+  fi
+  if test $ok = yes; then
+    GPG_ERROR_CFLAGS=`$GPG_ERROR_CONFIG $gpg_error_config_args --cflags`
+    GPG_ERROR_LIBS=`$GPG_ERROR_CONFIG $gpg_error_config_args --libs`
+    AC_MSG_RESULT(yes)
+    ifelse([$2], , :, [$2])
+  else
+    GPG_ERROR_CFLAGS=""
+    GPG_ERROR_LIBS=""
+    AC_MSG_RESULT(no)
+    ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GPG_ERROR_CFLAGS)
+  AC_SUBST(GPG_ERROR_LIBS)
+])
 
-dnl *-*wedit:notab*-*  Please keep this as the last line.