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