Updated standard files
[libgcrypt.git] / acinclude.m4
1 dnl macros to configure Libgcrypt
2 dnl Copyright (C) 1998, 1999, 2000, 2001, 2002,
3 dnl               2003 Free Software Foundation, Inc.
4 dnl
5 dnl This file is part of Libgcrypt.
6 dnl
7 dnl Libgcrypt is free software; you can redistribute it and/or modify
8 dnl it under the terms of the GNU Lesser General Public License as
9 dnl published by the Free Software Foundation; either version 2.1 of
10 dnl the License, or (at your option) any later version.
11 dnl
12 dnl Libgcrypt is distributed in the hope that it will be useful,
13 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
14 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 dnl GNU Lesser General Public License for more details.
16 dnl
17 dnl You should have received a copy of the GNU Lesser General Public
18 dnl License along with this program; if not, write to the Free Software
19 dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20
21 dnl GNUPG_MSG_PRINT(STRING)
22 dnl print a message
23 dnl
24 define([GNUPG_MSG_PRINT],
25   [ echo $ac_n "$1"" $ac_c" 1>&AS_MESSAGE_FD([])
26   ])
27
28 dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
29 dnl Check whether a typedef exists and create a #define $2 if it exists
30 dnl
31 AC_DEFUN([GNUPG_CHECK_TYPEDEF],
32   [ AC_MSG_CHECKING(for $1 typedef)
33     AC_CACHE_VAL(gnupg_cv_typedef_$1,
34     [AC_TRY_COMPILE([#define _GNU_SOURCE 1
35     #include <stdlib.h>
36     #include <sys/types.h>], [
37     #undef $1
38     int a = sizeof($1);
39     ], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
40     AC_MSG_RESULT($gnupg_cv_typedef_$1)
41     if test "$gnupg_cv_typedef_$1" = yes; then
42         AC_DEFINE($2,1,[Defined if a `]$1[' is typedef'd])
43     fi
44   ])
45
46
47 dnl GNUPG_FIX_HDR_VERSION(FILE, NAME)
48 dnl Make the version number in gcrypt/gcrypt.h the same as the one here.
49 dnl (this is easier than to have a .in file just for one substitution)
50 dnl We must use a temp file in the current directory because make distcheck 
51 dnl install all sourcefiles RO.
52 dnl
53 AC_DEFUN([GNUPG_FIX_HDR_VERSION],
54   [ sed "s/^#define $2 \".*/#define $2 \"$VERSION\"/" $srcdir/$1 > fixhdr.tmp
55     if cmp -s $srcdir/$1 fixhdr.tmp 2>/dev/null; then
56         rm -f fixhdr.tmp
57     else
58         rm -f $srcdir/$1
59         if mv fixhdr.tmp $srcdir/$1 ; then
60             :
61         else
62             AC_MSG_ERROR([[
63 ***
64 *** Failed to fix the version string macro $2 in $1.
65 *** The old file has been saved as fixhdr.tmp
66 ***]])
67         fi
68         AC_MSG_WARN([fixed the $2 macro in $1])
69     fi
70   ])
71
72
73 dnl GNUPG_CHECK_GNUMAKE
74 dnl
75 AC_DEFUN([GNUPG_CHECK_GNUMAKE],
76   [
77     if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
78         :
79     else
80         AC_MSG_WARN([[
81 ***
82 *** It seems that you are not using GNU make.  Some make tools have serious
83 *** flaws and you may not be able to build this software at all. Before you
84 *** complain, please try GNU make:  GNU make is easy to build and available
85 *** at all GNU archives.  It is always available from ftp.gnu.org:/gnu/make.
86 ***]])
87     fi
88   ])
89
90
91 #
92 # GNUPG_SYS_SYMBOL_UNDERSCORE
93 # Does the compiler prefix global symbols with an underscore?
94 #
95 # Taken from GnuPG 1.2 and modified to use the libtool macros.
96 AC_DEFUN([GNUPG_SYS_SYMBOL_UNDERSCORE],
97 [tmp_do_check="no"
98 case "${target}" in
99     i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp)
100         ac_cv_sys_symbol_underscore=yes
101         ;;
102     *)
103       if test "$cross_compiling" = yes; then
104          ac_cv_sys_symbol_underscore=yes
105       else
106          tmp_do_check="yes"
107       fi
108        ;;
109 esac
110 if test "$tmp_do_check" = "yes"; then
111   AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
112   AC_MSG_CHECKING([for _ prefix in compiled symbols])
113   AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
114   [ac_cv_sys_symbol_underscore=no
115    cat > conftest.$ac_ext <<EOF
116       void nm_test_func(){}
117       int main(){nm_test_func;return 0;
118 EOF
119   if AC_TRY_EVAL(ac_compile); then
120     # Now try to grab the symbols.
121     ac_nlist=conftest.nm
122     if AC_TRY_EVAL(NM conftest.$ac_objext \| $global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
123       # See whether the symbols have a leading underscore.
124       if egrep '^_nm_test_func' "$ac_nlist" >/dev/null; then
125         ac_cv_sys_symbol_underscore=yes
126       else
127         if egrep '^nm_test_func ' "$ac_nlist" >/dev/null; then
128           :
129         else
130           echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
131         fi
132       fi
133     else
134       echo "configure: cannot run $global_symbol_pipe" >&AC_FD_CC
135     fi
136   else
137     echo "configure: failed program was:" >&AC_FD_CC
138     cat conftest.c >&AC_FD_CC
139   fi
140   rm -rf conftest*
141   ])
142   else
143   AC_MSG_CHECKING([for _ prefix in compiled symbols])
144   fi
145 AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
146 if test x$ac_cv_sys_symbol_underscore = xyes; then
147   AC_DEFINE(WITH_SYMBOL_UNDERSCORE,1,
148             [Defined if compiled symbols have a leading underscore])
149 fi
150 ])
151
152
153 ######################################################################
154 # Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
155 # is not called from uid 0 (not tested whether uid 0 works)
156 # For DECs Tru64 we have also to check whether mlock is in librt
157 # mlock is there a macro using memlk()
158 ######################################################################
159 dnl GNUPG_CHECK_MLOCK
160 dnl
161 define(GNUPG_CHECK_MLOCK,
162   [ AC_CHECK_FUNCS(mlock)
163     if test "$ac_cv_func_mlock" = "no"; then
164         AC_CHECK_HEADERS(sys/mman.h)
165         if test "$ac_cv_header_sys_mman_h" = "yes"; then
166             # Add librt to LIBS:
167             AC_CHECK_LIB(rt, memlk)
168             AC_CACHE_CHECK([whether mlock is in sys/mman.h],
169                             gnupg_cv_mlock_is_in_sys_mman,
170                 [AC_TRY_LINK([
171                     #include <assert.h>
172                     #ifdef HAVE_SYS_MMAN_H
173                     #include <sys/mman.h>
174                     #endif
175                 ], [
176                     int i;
177                     
178                     /* glibc defines this for functions which it implements
179                      * to always fail with ENOSYS.  Some functions are actually
180                      * named something starting with __ and the normal name
181                      * is an alias.  */
182                     #if defined (__stub_mlock) || defined (__stub___mlock)
183                     choke me
184                     #else
185                     mlock(&i, 4);
186                     #endif
187                     ; return 0;
188                 ],
189                 gnupg_cv_mlock_is_in_sys_mman=yes,
190                 gnupg_cv_mlock_is_in_sys_mman=no)])
191             if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
192                 AC_DEFINE(HAVE_MLOCK,1,
193                           [Defined if the system supports an mlock() call])
194             fi
195         fi
196     fi
197     if test "$ac_cv_func_mlock" = "yes"; then
198         AC_MSG_CHECKING(whether mlock is broken)
199           AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
200              AC_TRY_RUN([
201                 #include <stdlib.h>
202                 #include <unistd.h>
203                 #include <errno.h>
204                 #include <sys/mman.h>
205                 #include <sys/types.h>
206                 #include <fcntl.h>
207
208                 int main()
209                 {
210                     char *pool;
211                     int err;
212                     long int pgsize = getpagesize();
213
214                     pool = malloc( 4096 + pgsize );
215                     if( !pool )
216                         return 2;
217                     pool += (pgsize - ((long int)pool % pgsize));
218
219                     err = mlock( pool, 4096 );
220                     if( !err || errno == EPERM )
221                         return 0; /* okay */
222
223                     return 1;  /* hmmm */
224                 }
225
226             ],
227             gnupg_cv_have_broken_mlock="no",
228             gnupg_cv_have_broken_mlock="yes",
229             gnupg_cv_have_broken_mlock="assume-no"
230            )
231          )
232          if test "$gnupg_cv_have_broken_mlock" = "yes"; then
233              AC_DEFINE(HAVE_BROKEN_MLOCK,1,
234                        [Defined if the mlock() call does not work])
235              AC_MSG_RESULT(yes)
236          else
237             if test "$gnupg_cv_have_broken_mlock" = "no"; then
238                 AC_MSG_RESULT(no)
239             else
240                 AC_MSG_RESULT(assuming no)
241             fi
242          fi
243     fi
244   ])
245
246 # GNUPG_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
247 AC_DEFUN([GNUPG_SYS_LIBTOOL_CYGWIN32],
248 [AC_CHECK_TOOL(DLLTOOL, dlltool, false)
249 AC_CHECK_TOOL(AS, as, false)
250 ])
251
252 dnl LIST_MEMBER()
253 dnl Check wether an element ist contained in a list.  Set `found' to
254 dnl `1' if the element is found in the list, to `0' otherwise.
255 AC_DEFUN([LIST_MEMBER],
256 [
257 name=$1
258 list=$2
259 found=0
260
261 for n in $list; do
262   if test "x$name" = "x$n"; then
263     found=1
264   fi
265 done
266 ])
267
268 dnl AM_PATH_GPG_ERROR([MINIMUM-VERSION,
269 dnl                   [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
270 dnl Test for libgpg-error and define GPG_ERROR_CFLAGS and GPG_ERROR_LIBS
271 dnl
272 AC_DEFUN([AM_PATH_GPG_ERROR],
273 [ AC_ARG_WITH(gpg-error-prefix,
274             AC_HELP_STRING([--with-gpg-error-prefix=PFX],
275                            [prefix where GPG Error is installed (optional)]),
276      gpg_error_config_prefix="$withval", gpg_error_config_prefix="")
277   if test x$gpg_error_config_prefix != x ; then
278      if test x${GPG_ERROR_CONFIG+set} != xset ; then
279         GPG_ERROR_CONFIG=$gpg_error_config_prefix/bin/gpg-error-config
280      fi
281   fi
282
283   AC_PATH_PROG(GPG_ERROR_CONFIG, gpg-error-config, no)
284   min_gpg_error_version=ifelse([$1], ,0.0,$1)
285   AC_MSG_CHECKING(for GPG Error - version >= $min_gpg_error_version)
286   ok=no
287   if test "$GPG_ERROR_CONFIG" != "no" ; then
288     req_major=`echo $min_gpg_error_version | \
289                sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
290     req_minor=`echo $min_gpg_error_version | \
291                sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
292     gpg_error_config_version=`$GPG_ERROR_CONFIG $gpg_error_config_args --version`
293     if test "$gpg_error_config_version"; then
294       major=`echo $gpg_error_config_version | \
295                  sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
296       minor=`echo $gpg_error_config_version | \
297                  sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
298       if test "$major" -gt "$req_major"; then
299           ok=yes
300       else 
301           if test "$major" -eq "$req_major"; then
302               if test "$minor" -ge "$req_minor"; then
303                  ok=yes
304               fi
305           fi
306       fi
307     fi
308   fi
309   if test $ok = yes; then
310     GPG_ERROR_CFLAGS=`$GPG_ERROR_CONFIG $gpg_error_config_args --cflags`
311     GPG_ERROR_LIBS=`$GPG_ERROR_CONFIG $gpg_error_config_args --libs`
312     AC_MSG_RESULT(yes)
313     ifelse([$2], , :, [$2])
314   else
315     GPG_ERROR_CFLAGS=""
316     GPG_ERROR_LIBS=""
317     AC_MSG_RESULT(no)
318     ifelse([$3], , :, [$3])
319   fi
320   AC_SUBST(GPG_ERROR_CFLAGS)
321   AC_SUBST(GPG_ERROR_LIBS)
322 ])
323
324
325 dnl Check for socklen_t: historically on BSD it is an int, and in
326 dnl POSIX 1g it is a type of its own, but some platforms use different
327 dnl types for the argument to getsockopt, getpeername, etc.  So we
328 dnl have to test to find something that will work.
329 AC_DEFUN([TYPE_SOCKLEN_T],
330 [
331    AC_CHECK_TYPE([socklen_t], ,[
332       AC_MSG_CHECKING([for socklen_t equivalent])
333       AC_CACHE_VAL([socklen_t_equiv],
334       [
335          # Systems have either "struct sockaddr *" or
336          # "void *" as the second argument to getpeername
337          socklen_t_equiv=
338          for arg2 in "struct sockaddr" void; do
339             for t in int size_t unsigned long "unsigned long"; do
340                AC_TRY_COMPILE([
341                   #include <sys/types.h>
342                   #include <sys/socket.h>
343
344                   int getpeername (int, $arg2 *, $t *);
345                ],[
346                   $t len;
347                   getpeername(0,0,&len);
348                ],[
349                   socklen_t_equiv="$t"
350                   break
351                ])
352             done
353          done
354
355          if test "x$socklen_t_equiv" = x; then
356             AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
357          fi
358       ])
359       AC_MSG_RESULT($socklen_t_equiv)
360       AC_DEFINE_UNQUOTED(socklen_t, $socklen_t_equiv,
361                         [type to use in place of socklen_t if not defined])],
362       [#include <sys/types.h>
363 #include <sys/socket.h>])
364 ])
365
366
367 # GNUPG_PTH_VERSION_CHECK(REQUIRED)
368
369 # If the version is sufficient, HAVE_PTH will be set to yes.
370 #
371 # Taken form the m4 macros which come with Pth
372 AC_DEFUN([GNUPG_PTH_VERSION_CHECK],
373   [
374     _pth_version=`$PTH_CONFIG --version | awk 'NR==1 {print [$]3}'`
375     _req_version="ifelse([$1],,1.2.0,$1)"
376
377     AC_MSG_CHECKING(for PTH - version >= $_req_version)
378     for _var in _pth_version _req_version; do
379         eval "_val=\"\$${_var}\""
380         _major=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\1/'`
381         _minor=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\2/'`
382         _rtype=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\3/'`
383         _micro=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\4/'`
384         case $_rtype in
385             "a" ) _rtype=0 ;;
386             "b" ) _rtype=1 ;;
387             "." ) _rtype=2 ;;
388         esac
389         _hex=`echo dummy | awk '{ printf("%d%02d%1d%02d", major, minor, rtype, micro); }' \
390               "major=$_major" "minor=$_minor" "rtype=$_rtype" "micro=$_micro"`
391         eval "${_var}_hex=\"\$_hex\""
392     done
393     have_pth=no
394     if test ".$_pth_version_hex" != .; then
395         if test ".$_req_version_hex" != .; then
396             if test $_pth_version_hex -ge $_req_version_hex; then
397                 have_pth=yes
398             fi
399         fi
400     fi
401     if test $have_pth = yes; then
402        AC_MSG_RESULT(yes)
403        AC_MSG_CHECKING([whether PTH installation is sane])
404        AC_CACHE_VAL(gnupg_cv_pth_is_sane,[
405          _gnupg_pth_save_cflags=$CFLAGS
406          _gnupg_pth_save_ldflags=$LDFLAGS
407          _gnupg_pth_save_libs=$LIBS
408          CFLAGS="$CFLAGS `$PTH_CONFIG --cflags`"
409          LDFLAGS="$LDFLAGS `$PTH_CONFIG --ldflags`"
410          LIBS="$LIBS `$PTH_CONFIG --libs`"
411          AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pth.h>
412                                          ],
413                                          [[ pth_init ();]])],
414                         gnupg_cv_pth_is_sane=yes,
415                         gnupg_cv_pth_is_sane=no)
416          CFLAGS=$_gnupg_pth_save_cflags
417          LDFLAGS=$_gnupg_pth_save_ldflags
418          LIBS=$_gnupg_pth_save_libs
419        ])
420        if test $gnupg_cv_pth_is_sane != yes; then
421           have_pth=no
422        fi
423        AC_MSG_RESULT($gnupg_cv_pth_is_sane)
424     else
425        AC_MSG_RESULT(no)
426     fi    
427   ])
428
429