2006-10-11 Marcus Brinkmann <marcus@g10code.de>
[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_CHECK_GNUMAKE
48 dnl
49 AC_DEFUN([GNUPG_CHECK_GNUMAKE],
50   [
51     if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
52         :
53     else
54         AC_MSG_WARN([[
55 ***
56 *** It seems that you are not using GNU make.  Some make tools have serious
57 *** flaws and you may not be able to build this software at all. Before you
58 *** complain, please try GNU make:  GNU make is easy to build and available
59 *** at all GNU archives.  It is always available from ftp.gnu.org:/gnu/make.
60 ***]])
61     fi
62   ])
63
64
65 #
66 # GNUPG_SYS_SYMBOL_UNDERSCORE
67 # Does the compiler prefix global symbols with an underscore?
68 #
69 # Taken from GnuPG 1.2 and modified to use the libtool macros.
70 AC_DEFUN([GNUPG_SYS_SYMBOL_UNDERSCORE],
71 [tmp_do_check="no"
72 case "${target}" in
73     i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp)
74         ac_cv_sys_symbol_underscore=yes
75         ;;
76     *)
77       if test "$cross_compiling" = yes; then
78          ac_cv_sys_symbol_underscore=yes
79       else
80          tmp_do_check="yes"
81       fi
82        ;;
83 esac
84 if test "$tmp_do_check" = "yes"; then
85   AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
86   AC_MSG_CHECKING([for _ prefix in compiled symbols])
87   AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
88   [ac_cv_sys_symbol_underscore=no
89    cat > conftest.$ac_ext <<EOF
90       void nm_test_func(){}
91       int main(){nm_test_func;return 0;
92 EOF
93   if AC_TRY_EVAL(ac_compile); then
94     # Now try to grab the symbols.
95     ac_nlist=conftest.nm
96     if AC_TRY_EVAL(NM conftest.$ac_objext \| $global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
97       # See whether the symbols have a leading underscore.
98       if egrep '^_nm_test_func' "$ac_nlist" >/dev/null; then
99         ac_cv_sys_symbol_underscore=yes
100       else
101         if egrep '^nm_test_func ' "$ac_nlist" >/dev/null; then
102           :
103         else
104           echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
105         fi
106       fi
107     else
108       echo "configure: cannot run $global_symbol_pipe" >&AC_FD_CC
109     fi
110   else
111     echo "configure: failed program was:" >&AC_FD_CC
112     cat conftest.c >&AC_FD_CC
113   fi
114   rm -rf conftest*
115   ])
116   else
117   AC_MSG_CHECKING([for _ prefix in compiled symbols])
118   fi
119 AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
120 if test x$ac_cv_sys_symbol_underscore = xyes; then
121   AC_DEFINE(WITH_SYMBOL_UNDERSCORE,1,
122             [Defined if compiled symbols have a leading underscore])
123 fi
124 ])
125
126
127 ######################################################################
128 # Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
129 # is not called from uid 0 (not tested whether uid 0 works)
130 # For DECs Tru64 we have also to check whether mlock is in librt
131 # mlock is there a macro using memlk()
132 ######################################################################
133 dnl GNUPG_CHECK_MLOCK
134 dnl
135 define(GNUPG_CHECK_MLOCK,
136   [ AC_CHECK_FUNCS(mlock)
137     if test "$ac_cv_func_mlock" = "no"; then
138         AC_CHECK_HEADERS(sys/mman.h)
139         if test "$ac_cv_header_sys_mman_h" = "yes"; then
140             # Add librt to LIBS:
141             AC_CHECK_LIB(rt, memlk)
142             AC_CACHE_CHECK([whether mlock is in sys/mman.h],
143                             gnupg_cv_mlock_is_in_sys_mman,
144                 [AC_TRY_LINK([
145                     #include <assert.h>
146                     #ifdef HAVE_SYS_MMAN_H
147                     #include <sys/mman.h>
148                     #endif
149                 ], [
150                     int i;
151                     
152                     /* glibc defines this for functions which it implements
153                      * to always fail with ENOSYS.  Some functions are actually
154                      * named something starting with __ and the normal name
155                      * is an alias.  */
156                     #if defined (__stub_mlock) || defined (__stub___mlock)
157                     choke me
158                     #else
159                     mlock(&i, 4);
160                     #endif
161                     ; return 0;
162                 ],
163                 gnupg_cv_mlock_is_in_sys_mman=yes,
164                 gnupg_cv_mlock_is_in_sys_mman=no)])
165             if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
166                 AC_DEFINE(HAVE_MLOCK,1,
167                           [Defined if the system supports an mlock() call])
168             fi
169         fi
170     fi
171     if test "$ac_cv_func_mlock" = "yes"; then
172         AC_MSG_CHECKING(whether mlock is broken)
173           AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
174              AC_TRY_RUN([
175                 #include <stdlib.h>
176                 #include <unistd.h>
177                 #include <errno.h>
178                 #include <sys/mman.h>
179                 #include <sys/types.h>
180                 #include <fcntl.h>
181
182                 int main()
183                 {
184                     char *pool;
185                     int err;
186                     long int pgsize = getpagesize();
187
188                     pool = malloc( 4096 + pgsize );
189                     if( !pool )
190                         return 2;
191                     pool += (pgsize - ((long int)pool % pgsize));
192
193                     err = mlock( pool, 4096 );
194                     if( !err || errno == EPERM )
195                         return 0; /* okay */
196
197                     return 1;  /* hmmm */
198                 }
199
200             ],
201             gnupg_cv_have_broken_mlock="no",
202             gnupg_cv_have_broken_mlock="yes",
203             gnupg_cv_have_broken_mlock="assume-no"
204            )
205          )
206          if test "$gnupg_cv_have_broken_mlock" = "yes"; then
207              AC_DEFINE(HAVE_BROKEN_MLOCK,1,
208                        [Defined if the mlock() call does not work])
209              AC_MSG_RESULT(yes)
210          else
211             if test "$gnupg_cv_have_broken_mlock" = "no"; then
212                 AC_MSG_RESULT(no)
213             else
214                 AC_MSG_RESULT(assuming no)
215             fi
216          fi
217     fi
218   ])
219
220 # GNUPG_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
221 AC_DEFUN([GNUPG_SYS_LIBTOOL_CYGWIN32],
222 [AC_CHECK_TOOL(DLLTOOL, dlltool, false)
223 AC_CHECK_TOOL(AS, as, false)
224 ])
225
226 dnl LIST_MEMBER()
227 dnl Check wether an element ist contained in a list.  Set `found' to
228 dnl `1' if the element is found in the list, to `0' otherwise.
229 AC_DEFUN([LIST_MEMBER],
230 [
231 name=$1
232 list=$2
233 found=0
234
235 for n in $list; do
236   if test "x$name" = "x$n"; then
237     found=1
238   fi
239 done
240 ])
241
242 dnl AM_PATH_GPG_ERROR([MINIMUM-VERSION,
243 dnl                   [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
244 dnl Test for libgpg-error and define GPG_ERROR_CFLAGS and GPG_ERROR_LIBS
245 dnl
246 AC_DEFUN([AM_PATH_GPG_ERROR],
247 [ AC_ARG_WITH(gpg-error-prefix,
248             AC_HELP_STRING([--with-gpg-error-prefix=PFX],
249                            [prefix where GPG Error is installed (optional)]),
250      gpg_error_config_prefix="$withval", gpg_error_config_prefix="")
251   if test x$gpg_error_config_prefix != x ; then
252      if test x${GPG_ERROR_CONFIG+set} != xset ; then
253         GPG_ERROR_CONFIG=$gpg_error_config_prefix/bin/gpg-error-config
254      fi
255   fi
256
257   AC_PATH_PROG(GPG_ERROR_CONFIG, gpg-error-config, no)
258   min_gpg_error_version=ifelse([$1], ,0.0,$1)
259   AC_MSG_CHECKING(for GPG Error - version >= $min_gpg_error_version)
260   ok=no
261   if test "$GPG_ERROR_CONFIG" != "no" ; then
262     req_major=`echo $min_gpg_error_version | \
263                sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
264     req_minor=`echo $min_gpg_error_version | \
265                sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
266     gpg_error_config_version=`$GPG_ERROR_CONFIG $gpg_error_config_args --version`
267     if test "$gpg_error_config_version"; then
268       major=`echo $gpg_error_config_version | \
269                  sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
270       minor=`echo $gpg_error_config_version | \
271                  sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
272       if test "$major" -gt "$req_major"; then
273           ok=yes
274       else 
275           if test "$major" -eq "$req_major"; then
276               if test "$minor" -ge "$req_minor"; then
277                  ok=yes
278               fi
279           fi
280       fi
281     fi
282   fi
283   if test $ok = yes; then
284     GPG_ERROR_CFLAGS=`$GPG_ERROR_CONFIG $gpg_error_config_args --cflags`
285     GPG_ERROR_LIBS=`$GPG_ERROR_CONFIG $gpg_error_config_args --libs`
286     AC_MSG_RESULT(yes)
287     ifelse([$2], , :, [$2])
288   else
289     GPG_ERROR_CFLAGS=""
290     GPG_ERROR_LIBS=""
291     AC_MSG_RESULT(no)
292     ifelse([$3], , :, [$3])
293   fi
294   AC_SUBST(GPG_ERROR_CFLAGS)
295   AC_SUBST(GPG_ERROR_LIBS)
296 ])
297
298
299 dnl Check for socklen_t: historically on BSD it is an int, and in
300 dnl POSIX 1g it is a type of its own, but some platforms use different
301 dnl types for the argument to getsockopt, getpeername, etc.  So we
302 dnl have to test to find something that will work.
303 AC_DEFUN([TYPE_SOCKLEN_T],
304 [
305    AC_CHECK_TYPE([socklen_t], ,[
306       AC_MSG_CHECKING([for socklen_t equivalent])
307       AC_CACHE_VAL([socklen_t_equiv],
308       [
309          # Systems have either "struct sockaddr *" or
310          # "void *" as the second argument to getpeername
311          socklen_t_equiv=
312          for arg2 in "struct sockaddr" void; do
313             for t in int size_t unsigned long "unsigned long"; do
314                AC_TRY_COMPILE([
315                   #include <sys/types.h>
316                   #include <sys/socket.h>
317
318                   int getpeername (int, $arg2 *, $t *);
319                ],[
320                   $t len;
321                   getpeername(0,0,&len);
322                ],[
323                   socklen_t_equiv="$t"
324                   break
325                ])
326             done
327          done
328
329          if test "x$socklen_t_equiv" = x; then
330             AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
331          fi
332       ])
333       AC_MSG_RESULT($socklen_t_equiv)
334       AC_DEFINE_UNQUOTED(socklen_t, $socklen_t_equiv,
335                         [type to use in place of socklen_t if not defined])],
336       [#include <sys/types.h>
337 #include <sys/socket.h>])
338 ])
339
340
341 # GNUPG_PTH_VERSION_CHECK(REQUIRED)
342
343 # If the version is sufficient, HAVE_PTH will be set to yes.
344 #
345 # Taken form the m4 macros which come with Pth
346 AC_DEFUN([GNUPG_PTH_VERSION_CHECK],
347   [
348     _pth_version=`$PTH_CONFIG --version | awk 'NR==1 {print [$]3}'`
349     _req_version="ifelse([$1],,1.2.0,$1)"
350
351     AC_MSG_CHECKING(for PTH - version >= $_req_version)
352     for _var in _pth_version _req_version; do
353         eval "_val=\"\$${_var}\""
354         _major=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\1/'`
355         _minor=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\2/'`
356         _rtype=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\3/'`
357         _micro=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\4/'`
358         case $_rtype in
359             "a" ) _rtype=0 ;;
360             "b" ) _rtype=1 ;;
361             "." ) _rtype=2 ;;
362         esac
363         _hex=`echo dummy | awk '{ printf("%d%02d%1d%02d", major, minor, rtype, micro); }' \
364               "major=$_major" "minor=$_minor" "rtype=$_rtype" "micro=$_micro"`
365         eval "${_var}_hex=\"\$_hex\""
366     done
367     have_pth=no
368     if test ".$_pth_version_hex" != .; then
369         if test ".$_req_version_hex" != .; then
370             if test $_pth_version_hex -ge $_req_version_hex; then
371                 have_pth=yes
372             fi
373         fi
374     fi
375     if test $have_pth = yes; then
376        AC_MSG_RESULT(yes)
377        AC_MSG_CHECKING([whether PTH installation is sane])
378        AC_CACHE_VAL(gnupg_cv_pth_is_sane,[
379          _gnupg_pth_save_cflags=$CFLAGS
380          _gnupg_pth_save_ldflags=$LDFLAGS
381          _gnupg_pth_save_libs=$LIBS
382          CFLAGS="$CFLAGS `$PTH_CONFIG --cflags`"
383          LDFLAGS="$LDFLAGS `$PTH_CONFIG --ldflags`"
384          LIBS="$LIBS `$PTH_CONFIG --libs`"
385          AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pth.h>
386                                          ],
387                                          [[ pth_init ();]])],
388                         gnupg_cv_pth_is_sane=yes,
389                         gnupg_cv_pth_is_sane=no)
390          CFLAGS=$_gnupg_pth_save_cflags
391          LDFLAGS=$_gnupg_pth_save_ldflags
392          LIBS=$_gnupg_pth_save_libs
393        ])
394        if test $gnupg_cv_pth_is_sane != yes; then
395           have_pth=no
396        fi
397        AC_MSG_RESULT($gnupg_cv_pth_is_sane)
398     else
399        AC_MSG_RESULT(no)
400     fi    
401   ])
402
403