2003-06-11 Moritz Schulte <moritz@g10code.com>
[libgcrypt.git] / acinclude.m4
1 dnl macros to configure Libgcrypt
2 dnl Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3 dnl
4 dnl This file is part of Libgcrypt.
5 dnl
6 dnl Libgcrypt is free software; you can redistribute it and/or modify
7 dnl it under the terms of the GNU Lesser General Public License as
8 dnl published by the Free Software Foundation; either version 2.1 of
9 dnl the License, or (at your option) any later version.
10 dnl
11 dnl Libgcrypt is distributed in the hope that it will be useful,
12 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
13 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 dnl GNU Lesser General Public License for more details.
15 dnl
16 dnl You should have received a copy of the GNU Lesser General Public
17 dnl License along with this program; if not, write to the Free Software
18 dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19
20
21
22 dnl GNUPG_MSG_PRINT(STRING)
23 dnl print a message
24 dnl
25 define(GNUPG_MSG_PRINT,
26   [ echo $ac_n "$1"" $ac_c" 1>&AS_MESSAGE_FD([])
27   ])
28
29
30 dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
31 dnl Check whether a typedef exists and create a #define $2 if it exists
32 dnl
33 AC_DEFUN(GNUPG_CHECK_TYPEDEF,
34   [ AC_MSG_CHECKING(for $1 typedef)
35     AC_CACHE_VAL(gnupg_cv_typedef_$1,
36     [AC_TRY_COMPILE([#define _GNU_SOURCE 1
37     #include <stdlib.h>
38     #include <sys/types.h>], [
39     #undef $1
40     int a = sizeof($1);
41     ], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
42     AC_MSG_RESULT($gnupg_cv_typedef_$1)
43     if test "$gnupg_cv_typedef_$1" = yes; then
44         AC_DEFINE($2,1,[Defined if a `]$1[' is typedef'd])
45     fi
46   ])
47
48
49 dnl GNUPG_FIX_HDR_VERSION(FILE, NAME)
50 dnl Make the version number in gcrypt/gcrypt.h the same as the one here.
51 dnl (this is easier than to have a .in file just for one substitution)
52 dnl We must use a temp file in the current directory because make distcheck 
53 dnl install all sourcefiles RO.
54 dnl
55 AC_DEFUN(GNUPG_FIX_HDR_VERSION,
56   [ sed "s/^#define $2 \".*/#define $2 \"$VERSION\"/" $srcdir/$1 > fixhdr.tmp
57     if cmp -s $srcdir/$1 fixhdr.tmp 2>/dev/null; then
58         rm -f fixhdr.tmp
59     else
60         rm -f $srcdir/$1
61         if mv fixhdr.tmp $srcdir/$1 ; then
62             :
63         else
64             AC_MSG_ERROR([[
65 ***
66 *** Failed to fix the version string macro $2 in $1.
67 *** The old file has been saved as fixhdr.tmp
68 ***]])
69         fi
70         AC_MSG_WARN([fixed the $2 macro in $1])
71     fi
72   ])
73
74
75 dnl GNUPG_CHECK_GNUMAKE
76 dnl
77 AC_DEFUN(GNUPG_CHECK_GNUMAKE,
78   [
79     if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
80         :
81     else
82         AC_MSG_WARN([[
83 ***
84 *** It seems that you are not using GNU make.  Some make tools have serious
85 *** flaws and you may not be able to build this software at all. Before you
86 *** complain, please try GNU make:  GNU make is easy to build and available
87 *** at all GNU archives.  It is always available from ftp.gnu.org:/gnu/make.
88 ***]])
89     fi
90   ])
91
92 dnl GNUPG_CHECK_FAQPROG
93 dnl
94 AC_DEFUN(GNUPG_CHECK_FAQPROG,
95   [ AC_MSG_CHECKING(for faqprog.pl)
96     if faqprog.pl -V 2>/dev/null | grep '^faqprog.pl ' >/dev/null 2>&1; then
97         working_faqprog=yes
98         FAQPROG="faqprog.pl"
99     else 
100         working_faqprog=no
101         FAQPROG=": "
102     fi
103     AC_MSG_RESULT($working_faqprog)
104     AC_SUBST(FAQPROG)
105     AM_CONDITIONAL(WORKING_FAQPROG, test "$working_faqprog" = "yes" )
106
107     if test $working_faqprog = no; then
108         AC_MSG_WARN([[
109 ***
110 *** It seems that the faqprog.pl program is not installed.
111 *** Unless you do not change the source of the FAQs it is not required.
112 *** The working version of this utility should be available at:
113 ***   ftp://ftp.gnupg.org/pub/gcrypt/contrib/faqprog.pl
114 ***]])
115     fi
116   ])       
117
118
119
120 dnl GNUPG_CHECK_ENDIAN
121 dnl define either LITTLE_ENDIAN_HOST or BIG_ENDIAN_HOST
122 dnl
123 define(GNUPG_CHECK_ENDIAN,
124   [ if test "$cross_compiling" = yes; then
125         AC_MSG_WARN(cross compiling; assuming little endianess)
126     fi
127     AC_MSG_CHECKING(endianess)
128     AC_CACHE_VAL(gnupg_cv_c_endian,
129       [ gnupg_cv_c_endian=unknown
130         # See if sys/param.h defines the BYTE_ORDER macro.
131         AC_TRY_COMPILE([#include <sys/types.h>
132         #include <sys/param.h>], [
133         #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
134          bogus endian macros
135         #endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
136         AC_TRY_COMPILE([#include <sys/types.h>
137         #include <sys/param.h>], [
138         #if BYTE_ORDER != BIG_ENDIAN
139          not big endian
140         #endif], gnupg_cv_c_endian=big, gnupg_cv_c_endian=little)])
141         if test "$gnupg_cv_c_endian" = unknown; then
142             AC_TRY_RUN([main () {
143               /* Are we little or big endian?  From Harbison&Steele.  */
144               union
145               {
146                 long l;
147                 char c[sizeof (long)];
148               } u;
149               u.l = 1;
150               exit (u.c[sizeof (long) - 1] == 1);
151               }],
152               gnupg_cv_c_endian=little,
153               gnupg_cv_c_endian=big,
154               gnupg_cv_c_endian=little
155             )
156         fi
157       ])
158     AC_MSG_RESULT([$gnupg_cv_c_endian])
159     if test "$gnupg_cv_c_endian" = little; then
160       AC_DEFINE(LITTLE_ENDIAN_HOST,1,
161                 [Defined if the host has little endian byte ordering])
162     else
163       AC_DEFINE(BIG_ENDIAN_HOST,1,
164                 [Defined if the host has big endian byte ordering])
165     fi
166   ])
167
168 dnl GNUPG_CHECK_CACHE
169 dnl
170 define(GNUPG_CHECK_CACHE,
171   [ AC_MSG_CHECKING(cached information)
172     gnupg_hostcheck="$target"
173     AC_CACHE_VAL(gnupg_cv_hostcheck, [ gnupg_cv_hostcheck="$gnupg_hostcheck" ])
174     if test "$gnupg_cv_hostcheck" != "$gnupg_hostcheck"; then
175         AC_MSG_RESULT(changed)
176         AC_MSG_WARN(config.cache exists!)
177         AC_MSG_ERROR(you must do 'make distclean' first to compile for
178                  different target or different parameters.)
179     else
180         AC_MSG_RESULT(ok)
181     fi
182   ])
183
184
185 ######################################################################
186 # Check for -fPIC etc (taken from libtool)
187 # This sets CFLAGS_PIC to the required flags
188 #           NO_PIC to yes if it is not possible to
189 #                  generate PIC
190 ######################################################################
191 dnl GNUPG_CHECK_PIC
192 dnl
193 define(GNUPG_CHECK_PIC,
194   [ AC_MSG_CHECKING(for option to create PIC)
195     CFLAGS_PIC=
196     NO_PIC=no
197     if test "$cross_compiling" = yes; then
198         AC_MSG_RESULT(assume none)
199     else
200         if test "$GCC" = yes; then
201             CFLAGS_PIC="-fPIC"
202         else
203             case "$host_os" in
204               aix3* | aix4*)
205                 # All rs/6000 code is PIC
206                 # but is there any non-rs/6000 AIX platform?
207                 ;;
208
209               hpux9* | hpux10*)
210                 CFLAGS_PIC="+Z"
211                 ;;
212
213               irix5* | irix6*)
214                 # PIC (with -KPIC) is the default.
215                 ;;
216
217               osf3* | osf4*)
218                 # FIXME - pic_flag is probably required for
219                 # hppa*-osf* and i860-osf*
220                 ;;
221
222               sco3.2v5*)
223                 CFLAGS_PIC='-Kpic'
224                 ;;
225
226               solaris2* | solaris7* )
227                 CFLAGS_PIC='-KPIC'
228                 ;;
229
230               sunos4*)
231                 CFLAGS_PIC='-PIC'
232                 ;;
233
234               *)
235                 NO_PIC=yes
236                 ;;
237             esac
238         fi
239
240         case "$host_cpu" in
241         rs6000 | powerpc | powerpcle)
242           # Yippee! All RS/6000 and PowerPC code is position-independent.
243           CFLAGS_PIC=""
244           ;;
245         esac
246
247         if test "$NO_PIC" = yes; then
248             AC_MSG_RESULT(not possible)
249         else
250             if test -z "$CFLAGS_PIC"; then
251                AC_MSG_RESULT(none)
252             else
253                 AC_MSG_RESULT($CFLAGS_PIC)
254             fi
255         fi
256     fi
257   ])
258
259
260 ######################################################################
261 # Check for export-dynamic flag
262 # This sets CFLAGS_EXPORTDYNAMIC to the required flags
263 ######################################################################
264 dnl GNUPG_CHECK_EXPORTDYNAMIC
265 dnl
266 define(GNUPG_CHECK_EXPORTDYNAMIC,
267   [ AC_MSG_CHECKING(how to specify -export-dynamic)
268     if test "$cross_compiling" = yes; then
269       AC_MSG_RESULT(assume none)
270       CFLAGS_EXPORTDYNAMIC=""
271     else
272       AC_CACHE_VAL(gnupg_cv_export_dynamic,[
273       if AC_TRY_COMMAND([${CC-cc} $CFLAGS -Wl,--version 2>&1 |
274                                           grep "GNU ld" >/dev/null]); then
275           # using gnu's linker
276           gnupg_cv_export_dynamic="-Wl,-export-dynamic"
277       else
278           case "$host_os" in
279             hpux* )
280               gnupg_cv_export_dynamic="-Wl,-E"
281               ;;
282             * )
283               gnupg_cv_export_dynamic=""
284               ;;
285           esac
286       fi
287       ])
288       AC_MSG_RESULT($gnupg_cv_export_dynamic)
289       CFLAGS_EXPORTDYNAMIC="$gnupg_cv_export_dynamic"
290     fi
291   ])
292
293 #####################################################################
294 # Check for SysV IPC  (from GIMP)
295 #   And see whether we have a SHM_LOCK (FreeBSD does not have it).
296 #####################################################################
297 dnl GNUPG_CHECK_IPC
298 dnl
299 define(GNUPG_CHECK_IPC,
300    [ AC_CHECK_HEADERS(sys/ipc.h sys/shm.h)
301      if test "$ac_cv_header_sys_shm_h" = "yes"; then
302        AC_MSG_CHECKING(whether IPC_RMID allowes subsequent attaches)
303        AC_CACHE_VAL(gnupg_cv_ipc_rmid_deferred_release,
304           AC_TRY_RUN([
305              #include <sys/types.h>
306              #include <sys/ipc.h>
307              #include <sys/shm.h>
308              int main()
309              {
310                int id;
311                char *shmaddr;
312              id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0777);
313              if (id == -1)
314                exit (2);
315                shmaddr = shmat (id, 0, 0);
316                shmctl (id, IPC_RMID, 0);
317                if ((char*) shmat (id, 0, 0) == (char*) -1)
318                {
319                  shmdt (shmaddr);
320                  exit (1);
321                }
322                shmdt (shmaddr);
323                shmdt (shmaddr);
324                exit (0);
325              }
326          ],
327          gnupg_cv_ipc_rmid_deferred_release="yes",
328          gnupg_cv_ipc_rmid_deferred_release="no",
329          gnupg_cv_ipc_rmid_deferred_release="assume-no")
330        )
331        if test "$gnupg_cv_ipc_rmid_deferred_release" = "yes"; then
332            AC_DEFINE(IPC_RMID_DEFERRED_RELEASE,1,
333                      [Defined if we can do a deferred shm release])
334            AC_MSG_RESULT(yes)
335        else
336           if test "$gnupg_cv_ipc_rmid_deferred_release" = "no"; then
337               AC_MSG_RESULT(no)
338           else
339               AC_MSG_RESULT([assuming no])
340           fi
341        fi
342
343        AC_MSG_CHECKING(whether SHM_LOCK is available)
344        AC_CACHE_VAL(gnupg_cv_ipc_have_shm_lock,
345           AC_TRY_COMPILE([#include <sys/types.h>
346              #include <sys/ipc.h>
347              #include <sys/shm.h>],[
348              int shm_id;
349              shmctl(shm_id, SHM_LOCK, 0);
350              ],
351              gnupg_cv_ipc_have_shm_lock="yes",
352              gnupg_cv_ipc_have_shm_lock="no"
353           )
354        )
355        if test "$gnupg_cv_ipc_have_shm_lock" = "yes"; then
356          AC_DEFINE(IPC_HAVE_SHM_LOCK,1,
357                    [Defined if a SysV shared memory supports the LOCK flag])
358          AC_MSG_RESULT(yes)
359        else
360          AC_MSG_RESULT(no)
361        fi
362      fi
363    ])
364
365
366 ######################################################################
367 # Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
368 # is not called from uid 0 (not tested whether uid 0 works)
369 # For DECs Tru64 we have also to check whether mlock is in librt
370 # mlock is there a macro using memlk()
371 ######################################################################
372 dnl GNUPG_CHECK_MLOCK
373 dnl
374 define(GNUPG_CHECK_MLOCK,
375   [ AC_CHECK_FUNCS(mlock)
376     if test "$ac_cv_func_mlock" = "no"; then
377         AC_CHECK_HEADERS(sys/mman.h)
378         if test "$ac_cv_header_sys_mman_h" = "yes"; then
379             # Add librt to LIBS:
380             AC_CHECK_LIB(rt, memlk)
381             AC_CACHE_CHECK([whether mlock is in sys/mman.h],
382                             gnupg_cv_mlock_is_in_sys_mman,
383                 [AC_TRY_LINK([
384                     #include <assert.h>
385                     #ifdef HAVE_SYS_MMAN_H
386                     #include <sys/mman.h>
387                     #endif
388                 ], [
389                     int i;
390                     
391                     /* glibc defines this for functions which it implements
392                      * to always fail with ENOSYS.  Some functions are actually
393                      * named something starting with __ and the normal name
394                      * is an alias.  */
395                     #if defined (__stub_mlock) || defined (__stub___mlock)
396                     choke me
397                     #else
398                     mlock(&i, 4);
399                     #endif
400                     ; return 0;
401                 ],
402                 gnupg_cv_mlock_is_in_sys_mman=yes,
403                 gnupg_cv_mlock_is_in_sys_mman=no)])
404             if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
405                 AC_DEFINE(HAVE_MLOCK,1,
406                           [Defined if the system supports an mlock() call])
407             fi
408         fi
409     fi
410     if test "$ac_cv_func_mlock" = "yes"; then
411         AC_MSG_CHECKING(whether mlock is broken)
412           AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
413              AC_TRY_RUN([
414                 #include <stdlib.h>
415                 #include <unistd.h>
416                 #include <errno.h>
417                 #include <sys/mman.h>
418                 #include <sys/types.h>
419                 #include <fcntl.h>
420
421                 int main()
422                 {
423                     char *pool;
424                     int err;
425                     long int pgsize = getpagesize();
426
427                     pool = malloc( 4096 + pgsize );
428                     if( !pool )
429                         return 2;
430                     pool += (pgsize - ((long int)pool % pgsize));
431
432                     err = mlock( pool, 4096 );
433                     if( !err || errno == EPERM )
434                         return 0; /* okay */
435
436                     return 1;  /* hmmm */
437                 }
438
439             ],
440             gnupg_cv_have_broken_mlock="no",
441             gnupg_cv_have_broken_mlock="yes",
442             gnupg_cv_have_broken_mlock="assume-no"
443            )
444          )
445          if test "$gnupg_cv_have_broken_mlock" = "yes"; then
446              AC_DEFINE(HAVE_BROKEN_MLOCK,1,
447                        [Defined if the mlock() call does not work])
448              AC_MSG_RESULT(yes)
449          else
450             if test "$gnupg_cv_have_broken_mlock" = "no"; then
451                 AC_MSG_RESULT(no)
452             else
453                 AC_MSG_RESULT(assuming no)
454             fi
455          fi
456     fi
457   ])
458
459
460
461 ################################################################
462 # GNUPG_PROG_NM - find the path to a BSD-compatible name lister
463 ################################################################
464 AC_DEFUN(GNUPG_PROG_NM,
465 [AC_MSG_CHECKING([for BSD-compatible nm])
466 AC_CACHE_VAL(ac_cv_path_NM,
467 [if test -n "$NM"; then
468   # Let the user override the test.
469   ac_cv_path_NM="$NM"
470 else
471   IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
472   for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
473     test -z "$ac_dir" && ac_dir=.
474     if test -f $ac_dir/nm; then
475       # Check to see if the nm accepts a BSD-compat flag.
476       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
477       #   nm: unknown option "B" ignored
478       if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
479         ac_cv_path_NM="$ac_dir/nm -B"
480       elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
481         ac_cv_path_NM="$ac_dir/nm -p"
482       else
483         ac_cv_path_NM="$ac_dir/nm"
484       fi
485       break
486     fi
487   done
488   IFS="$ac_save_ifs"
489   test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
490 fi])
491 NM="$ac_cv_path_NM"
492 AC_MSG_RESULT([$NM])
493 AC_SUBST(NM)
494 ])
495
496 # GNUPG_SYS_NM_PARSE - Check for command ro grab the raw symbol name followed
497 # by C symbol name from nm.
498 AC_DEFUN(GNUPG_SYS_NM_PARSE,
499 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
500 AC_REQUIRE([GNUPG_PROG_NM])dnl
501 # Check for command to grab the raw symbol name followed by C symbol from nm.
502 AC_MSG_CHECKING([command to parse $NM output])
503 AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
504 [# These are sane defaults that work on at least a few old systems.
505 # {They come from Ultrix.  What could be older than Ultrix?!! ;)}
506
507 changequote(,)dnl
508 # Character class describing NM global symbol codes.
509 ac_symcode='[BCDEGRSTU]'
510
511 # Regexp to match symbols that can be accessed directly from C.
512 ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
513
514 # Transform the above into a raw symbol and a C symbol.
515 ac_symxfrm='\1 \1'
516
517 # Define system-specific variables.
518 case "$host_os" in
519 aix*)
520   ac_symcode='[BCDTU]'
521   ;;
522 freebsd* | netbsd* | openbsd* | bsdi* | sunos* | cygwin32* | mingw32*)
523   ac_sympat='_\([_A-Za-z][_A-Za-z0-9]*\)'
524   ac_symxfrm='_\1 \1'
525   ;;
526 irix*)
527   # Cannot use undefined symbols on IRIX because inlined functions mess us up.
528   ac_symcode='[BCDEGRST]'
529   ;;
530 solaris*)
531   ac_symcode='[BDTU]'
532   ;;
533 esac
534
535 # If we're using GNU nm, then use its standard symbol codes.
536 if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
537   ac_symcode='[ABCDGISTUW]'
538 fi
539
540 case "$host_os" in
541 cygwin32* | mingw32*)
542   # We do not want undefined symbols on cygwin32.  The user must
543   # arrange to define them via -l arguments.
544   ac_symcode='[ABCDGISTW]'
545   ;;
546 esac
547 changequote([,])dnl
548
549 # Write the raw and C identifiers.
550 ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.* $ac_symcode $ac_sympat$/$ac_symxfrm/p'"
551
552 # Check to see that the pipe works correctly.
553 ac_pipe_works=no
554 cat > conftest.$ac_ext <<EOF
555 #ifdef __cplusplus
556 extern "C" {
557 #endif
558 char nm_test_var;
559 void nm_test_func(){}
560 #ifdef __cplusplus
561 }
562 #endif
563 int main(){nm_test_var='a';nm_test_func;return 0;}
564 EOF
565 if AC_TRY_EVAL(ac_compile); then
566   # Now try to grab the symbols.
567   ac_nlist=conftest.nm
568   if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
569
570     # Try sorting and uniquifying the output.
571     if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
572       mv -f "$ac_nlist"T "$ac_nlist"
573       ac_wcout=`wc "$ac_nlist" 2>/dev/null`
574 changequote(,)dnl
575       ac_count=`echo "X$ac_wcout" | sed -e 's,^X,,' -e 's/^[    ]*\([0-9][0-9]*\).*$/\1/'`
576 changequote([,])dnl
577       (test "$ac_count" -ge 0) 2>/dev/null || ac_count=-1
578     else
579       rm -f "$ac_nlist"T
580       ac_count=-1
581     fi
582
583     # Make sure that we snagged all the symbols we need.
584     if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
585       if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
586         cat <<EOF > conftest.c
587 #ifdef __cplusplus
588 extern "C" {
589 #endif
590
591 EOF
592         # Now generate the symbol file.
593         sed 's/^.* \(.*\)$/extern char \1;/' < "$ac_nlist" >> conftest.c
594
595         cat <<EOF >> conftest.c
596 #if defined (__STDC__) && __STDC__
597 # define __ptr_t void *
598 #else
599 # define __ptr_t char *
600 #endif
601
602 /* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
603 int dld_preloaded_symbol_count = $ac_count;
604
605 /* The mapping between symbol names and symbols. */
606 struct {
607   char *name;
608   __ptr_t address;
609 }
610 changequote(,)dnl
611 dld_preloaded_symbols[] =
612 changequote([,])dnl
613 {
614 EOF
615         sed 's/^\(.*\) \(.*\)$/  {"\1", (__ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
616         cat <<\EOF >> conftest.c
617   {0, (__ptr_t) 0}
618 };
619
620 #ifdef __cplusplus
621 }
622 #endif
623 EOF
624         # Now try linking the two files.
625         mv conftest.$ac_objext conftestm.$ac_objext
626         ac_save_LIBS="$LIBS"
627         ac_save_CFLAGS="$CFLAGS"
628         LIBS="conftestm.$ac_objext"
629         CFLAGS="$CFLAGS$no_builtin_flag"
630         if AC_TRY_EVAL(ac_link) && test -s conftest; then
631           ac_pipe_works=yes
632         else
633           echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD()
634           cat conftest.c >&AS_MESSAGE_LOG_FD()
635         fi
636         LIBS="$ac_save_LIBS"
637         CFLAGS="$ac_save_CFLAGS"
638       else
639         echo "cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD()
640       fi
641     else
642       echo "cannot find nm_test_var in $ac_nlist" >&AS_MESSAGE_LOG_FD()
643     fi
644   else
645     echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD()
646   fi
647 else
648   echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD()
649   cat conftest.c >&AS_MESSAGE_LOG_FD()
650 fi
651 rm -rf conftest*
652
653 # Do not use the global_symbol_pipe unless it works.
654 test "$ac_pipe_works" = yes || ac_cv_sys_global_symbol_pipe=
655 ])
656
657 ac_result=yes
658 if test -z "$ac_cv_sys_global_symbol_pipe"; then
659    ac_result=no
660 fi
661 AC_MSG_RESULT($ac_result)
662 ])
663
664 # GNUPG_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
665 AC_DEFUN(GNUPG_SYS_LIBTOOL_CYGWIN32,
666 [AC_CHECK_TOOL(DLLTOOL, dlltool, false)
667 AC_CHECK_TOOL(AS, as, false)
668 ])
669
670 # GNUPG_SYS_SYMBOL_UNDERSCORE - does the compiler prefix global symbols
671 #                              with an underscore?
672 AC_DEFUN(GNUPG_SYS_SYMBOL_UNDERSCORE,
673 [tmp_do_check="no"
674 case "${target}" in
675     i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp)
676         ac_cv_sys_symbol_underscore=yes
677         ;;
678     *)
679       if test "$cross_compiling" = yes; then
680          ac_cv_sys_symbol_underscore=yes
681       else
682          tmp_do_check="yes"
683       fi
684        ;;
685 esac
686
687 if test "$tmp_do_check" = "yes"; then
688 AC_REQUIRE([GNUPG_PROG_NM])dnl
689 AC_REQUIRE([GNUPG_SYS_NM_PARSE])dnl
690 AC_MSG_CHECKING([for _ prefix in compiled symbols])
691 AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
692 [ac_cv_sys_symbol_underscore=no
693 cat > conftest.$ac_ext <<EOF
694 void nm_test_func(){}
695 int main(){nm_test_func;return 0;}
696 EOF
697 if AC_TRY_EVAL(ac_compile); then
698   # Now try to grab the symbols.
699   ac_nlist=conftest.nm
700   if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
701     # See whether the symbols have a leading underscore.
702     if egrep '^_nm_test_func' "$ac_nlist" >/dev/null; then
703       ac_cv_sys_symbol_underscore=yes
704     else
705       if egrep '^nm_test_func ' "$ac_nlist" >/dev/null; then
706         :
707       else
708         echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD()
709       fi
710     fi
711   else
712     echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD()
713   fi
714 else
715   echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD()
716   cat conftest.c >&AS_MESSAGE_LOG_FD()
717 fi
718 rm -rf conftest*
719 ])
720 else
721 AC_MSG_CHECKING([for _ prefix in compiled symbols])
722 fi
723 AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
724 if test x$ac_cv_sys_symbol_underscore = xyes; then
725   AC_DEFINE(WITH_SYMBOL_UNDERSCORE,1,
726   [define if compiled symbols have a leading underscore])
727 fi
728 ])
729
730 dnl Stolen from gcc
731 dnl Define MKDIR_TAKES_ONE_ARG if mkdir accepts only one argument instead
732 dnl of the usual 2.
733 AC_DEFUN(GNUPG_FUNC_MKDIR_TAKES_ONE_ARG,
734 [AC_CHECK_HEADERS(sys/stat.h unistd.h direct.h)
735 AC_CACHE_CHECK([if mkdir takes one argument], gnupg_cv_mkdir_takes_one_arg,
736 [AC_TRY_COMPILE([
737 #include <sys/types.h>
738 #ifdef HAVE_SYS_STAT_H
739 # include <sys/stat.h>
740 #endif
741 #ifdef HAVE_UNISTD_H
742 # include <unistd.h>
743 #endif
744 #ifdef HAVE_DIRECT_H
745 # include <direct.h>
746 #endif], [mkdir ("foo", 0);],
747         gnupg_cv_mkdir_takes_one_arg=no, gnupg_cv_mkdir_takes_one_arg=yes)])
748 if test $gnupg_cv_mkdir_takes_one_arg = yes ; then
749   AC_DEFINE(MKDIR_TAKES_ONE_ARG,1,
750             [Defined if mkdir() does not take permission flags])
751 fi
752 ])
753
754
755 dnl GPH_PROG_DB2ANY()
756 dnl Check whether we have the needed Docbook tools
757 dnl and issue a warning if this is not the case.
758 dnl
759 dnl This test defines these variables for substitution:
760 dnl    DB2ANY  - script used to render Docbook
761 dnl
762 dnl (wk 2000-05-16)
763 dnl
764 AC_DEFUN(GPH_PROG_DB2ANY,
765   [  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
766      working_db2any=no
767      if $ac_aux_dir/db2any --systemcheck; then
768         working_db2any=yes
769         DB2ANY=`cd $ac_aux_dir && pwd`/db2any
770      else
771         DB2ANY=": "
772         AC_MSG_WARN([[
773 ***
774 *** It seems that the Docbook environment is not installed as required.
775 *** We will try to build everything,  but if you either touch some files
776 *** or use a bogus make tool, you may run into problems.
777 *** Docbook is normally only needed to build the documentation.
778 *** To further investigate the problem you can run the command
779 ***    $ac_aux_dir/db2any --systemcheck --verbose
780 ***]])
781     fi
782     AC_SUBST(DB2ANY)
783     AM_CONDITIONAL(WORKING_DB2ANY, test "$working_db2any" != yes )
784   ])
785
786 dnl LIST_MEMER()
787 dnl Check wether an element ist contained in a list.  Set `found' to
788 dnl `1' if the element is found in the list, to `0' otherwise.
789 AC_DEFUN(LIST_MEMBER,
790 [
791 name=$1
792 list=$2
793 found=0
794
795 for n in $list; do
796   if test "x$name" = "x$n"; then
797     found=1
798   fi
799 done
800 ])