bb8700f51d9184d3364196afbea2eae308a8d89c
[gnupg.git] / acinclude.m4
1 dnl macros to configure g10
2
3
4 dnl WK_MSG_PRINT(STRING)
5 dnl print a message
6 dnl
7 define(WK_MSG_PRINT,
8   [ echo $ac_n "$1"" $ac_c" 1>&AC_FD_MSG
9   ])
10
11
12 dnl WK_CHECK_TYPEDEF(TYPE, HAVE_NAME)
13 dnl Check whether a typedef exists and create a #define $2 if it exists
14 dnl
15 AC_DEFUN(WK_CHECK_TYPEDEF,
16   [ AC_MSG_CHECKING(for $1 typedef)
17     AC_CACHE_VAL(wk_cv_typedef_$1,
18     [AC_TRY_COMPILE([#include <stdlib.h>
19     #include <sys/types.h>], [
20     #undef $1
21     int a = sizeof($1);
22     ], wk_cv_typedef_$1=yes, wk_cv_typedef_$1=no )])
23     AC_MSG_RESULT($wk_cv_typedef_$1)
24     if test "$wk_cv_typedef_$1" = yes; then
25         AC_DEFINE($2)
26     fi
27   ])
28
29
30
31 dnl WK_LINK_FILES( SRC, DEST )
32 dnl same as AC_LINK_FILES, but collect the files to link in
33 dnl some special variables and do the link
34 dnl when WK_DO_LINK_FILES is called
35 dnl This is a workaround for AC_LINK_FILES, because it does not work
36 dnl correct when using a caching scheme
37 dnl
38 define(WK_LINK_FILES,
39   [ if test "x$wk_link_files_src" = "x"; then
40         wk_link_files_src="$1"
41         wk_link_files_dst="$2"
42     else
43         wk_link_files_src="$wk_link_files_src $1"
44         wk_link_files_dst="$wk_link_files_dst $2"
45     fi
46   ])
47 define(WK_DO_LINK_FILES,
48   [ AC_LINK_FILES( $wk_link_files_src, $wk_link_files_dst )
49   ])
50
51
52 dnl WK_CHECK_ENDIAN
53 dnl define either LITTLE_ENDIAN_HOST or BIG_ENDIAN_HOST
54 dnl
55 define(WK_CHECK_ENDIAN,
56   [ if test "$cross_compiling" = yes; then
57         AC_MSG_WARN(cross compiling; assuming little endianess)
58     fi
59     AC_MSG_CHECKING(endianess)
60     AC_CACHE_VAL(wk_cv_c_endian,
61       [ wk_cv_c_endian=unknown
62         # See if sys/param.h defines the BYTE_ORDER macro.
63         AC_TRY_COMPILE([#include <sys/types.h>
64         #include <sys/param.h>], [
65         #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
66          bogus endian macros
67         #endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
68         AC_TRY_COMPILE([#include <sys/types.h>
69         #include <sys/param.h>], [
70         #if BYTE_ORDER != BIG_ENDIAN
71          not big endian
72         #endif], wk_cv_c_endian=big, wk_cv_c_endian=little)])
73         if test "$wk_cv_c_endian" = unknown; then
74             AC_TRY_RUN([main () {
75               /* Are we little or big endian?  From Harbison&Steele.  */
76               union
77               {
78                 long l;
79                 char c[sizeof (long)];
80               } u;
81               u.l = 1;
82               exit (u.c[sizeof (long) - 1] == 1);
83               }],
84               wk_cv_c_endian=little,
85               wk_cv_c_endian=big,
86               wk_cv_c_endian=little
87             )
88         fi
89       ])
90     AC_MSG_RESULT([$wk_cv_c_endian])
91     if test "$wk_cv_c_endian" = little; then
92       AC_DEFINE(LITTLE_ENDIAN_HOST)
93     else
94       AC_DEFINE(BIG_ENDIAN_HOST)
95     fi
96   ])
97
98 dnl WK_CHECK_CACHE
99 dnl
100 define(WK_CHECK_CACHE,
101   [ AC_MSG_CHECKING(cached information)
102     wk_hostcheck="$target"
103     AC_CACHE_VAL(wk_cv_hostcheck, [ wk_cv_hostcheck="$wk_hostcheck" ])
104     if test "$wk_cv_hostcheck" != "$wk_hostcheck"; then
105         AC_MSG_RESULT(changed)
106         AC_MSG_WARN(config.cache exists!)
107         AC_MSG_ERROR(you must do 'make distclean' first to compile for
108                  different target or different parameters.)
109     else
110         AC_MSG_RESULT(ok)
111     fi
112   ])
113
114
115
116
117 ######################################################################
118 # Check for SysV IPC  (from GIMP)
119 #   And see whether we have a SHM_LOCK (FreeBSD does not have it).
120 ######################################################################
121 dnl WK_CHECK_IPC
122 dnl
123 define(WK_CHECK_IPC,
124   [ AC_CHECK_HEADERS(sys/ipc.h sys/shm.h)
125     if test "$ac_cv_header_sys_shm_h" = "yes"; then
126       AC_MSG_CHECKING(whether shmctl IPC_RMID allowes subsequent attaches)
127       AC_TRY_RUN([
128             #include <sys/types.h>
129             #include <sys/ipc.h>
130             #include <sys/shm.h>
131             int main()
132             {
133               int id;
134               char *shmaddr;
135             id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0777);
136             if (id == -1)
137               exit (2);
138               shmaddr = shmat (id, 0, 0);
139               shmctl (id, IPC_RMID, 0);
140               if ((char*) shmat (id, 0, 0) == (char*) -1)
141               {
142                 shmdt (shmaddr);
143                 exit (1);
144               }
145               shmdt (shmaddr);
146               shmdt (shmaddr);
147               exit (0);
148             }
149         ],
150         AC_DEFINE(IPC_RMID_DEFERRED_RELEASE)
151         AC_MSG_RESULT(yes),
152         AC_MSG_RESULT(no),
153         AC_MSG_RESULT(assuming no))
154       AC_MSG_CHECKING(whether SHM_LOCK is available)
155       AC_TRY_COMPILE([#include <sys/types.h>
156             #include <sys/ipc.h>
157             #include <sys/shm.h>],[
158             int foo( int shm_id ) {  shmctl(shm_id, SHM_LOCK, 0); }
159             ],
160         AC_DEFINE(IPC_HAVE_SHM_LOCK)
161         AC_MSG_RESULT(yes),
162         AC_MSG_RESULT(no))
163     fi
164   ])
165
166
167 ######################################################################
168 # Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
169 # is not called from uid 0 (not tested whether uid 0 works)
170 ######################################################################
171 dnl WK_CHECK_MLOCK
172 dnl
173 define(WK_CHECK_MLOCK,
174   [ AC_CHECK_FUNCS(mlock)
175     if test "$ac_cv_func_mlock" = "yes"; then
176         AC_MSG_CHECKING(whether mlock is broken)
177           AC_TRY_RUN([
178                 #include <stdlib.h>
179                 #include <unistd.h>
180                 #include <errno.h>
181                 #include <sys/mman.h>
182                 #include <sys/types.h>
183                 #include <fcntl.h>
184
185                 int main()
186                 {
187                     char *pool;
188                     int err;
189                     long int pgsize = getpagesize();
190
191                     pool = malloc( 4096 + pgsize );
192                     if( !pool )
193                         return 2;
194                     pool += (pgsize - ((long int)pool % pgsize));
195
196                     err = mlock( pool, 4096 );
197                     if( !err || errno == EPERM )
198                         return 0; /* okay */
199
200                     return 1;  /* hmmm */
201                 }
202
203             ],
204             AC_MSG_RESULT(no),
205             AC_DEFINE(HAVE_BROKEN_MLOCK)
206             AC_MSG_RESULT(yes),
207             AC_MSG_RESULT(assuming no))
208     fi
209   ])
210
211
212
213
214
215
216
217
218 # Macro to add for using GNU gettext.
219 # Ulrich Drepper <drepper@cygnus.com>, 1995.
220 #
221 # This file can be copied and used freely without restrictions.  It can
222 # be used in projects which are not available under the GNU Public License
223 # but which still want to provide support for the GNU gettext functionality.
224 # Please note that the actual code is *not* freely available.
225
226 # serial 5 + patch (wk 21.10.98)
227
228 AC_DEFUN(AM_WITH_NLS,
229   [AC_MSG_CHECKING([whether NLS is requested])
230     dnl Default is enabled NLS
231     AC_ARG_ENABLE(nls,
232       [  --disable-nls           do not use Native Language Support],
233       USE_NLS=$enableval, USE_NLS=yes)
234     AC_MSG_RESULT($USE_NLS)
235     AC_SUBST(USE_NLS)
236
237     USE_INCLUDED_LIBINTL=no
238
239     dnl If we use NLS figure out what method
240     if test "$USE_NLS" = "yes"; then
241       AC_DEFINE(ENABLE_NLS)
242       AC_MSG_CHECKING([whether included gettext is requested])
243       AC_ARG_WITH(included-gettext,
244         [  --with-included-gettext use the GNU gettext library included here],
245         nls_cv_force_use_gnu_gettext=$withval,
246         nls_cv_force_use_gnu_gettext=no)
247       AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
248
249       nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
250       if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
251         dnl User does not insist on using GNU NLS library.  Figure out what
252         dnl to use.  If gettext or catgets are available (in this order) we
253         dnl use this.  Else we have to fall back to GNU NLS library.
254         dnl catgets is only used if permitted by option --with-catgets.
255         nls_cv_header_intl=
256         nls_cv_header_libgt=
257         CATOBJEXT=NONE
258
259         AC_CHECK_HEADER(libintl.h,
260           [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc,
261             [AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")],
262                gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)])
263
264            if test "$gt_cv_func_gettext_libc" != "yes"; then
265              AC_CHECK_LIB(intl, bindtextdomain,
266                [AC_CHECK_LIB(intl, gettext,
267                  gt_cv_func_gettext_libintl=yes,
268                  gt_cv_func_gettext_libintl=no)])
269            fi
270
271            if test "$gt_cv_func_gettext_libintl" = "yes" ; then
272              LIBS="-lintl $LIBS"
273            fi
274
275            if test "$gt_cv_func_gettext_libc" = "yes" \
276               || test "$gt_cv_func_gettext_libintl" = "yes"; then
277               AC_DEFINE(HAVE_GETTEXT)
278               AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
279                 [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
280               if test "$MSGFMT" != "no"; then
281                 AC_CHECK_FUNCS(dcgettext)
282                 AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
283                 AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
284                   [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
285                 AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
286                                return _nl_msg_cat_cntr],
287                   [CATOBJEXT=.gmo
288                    DATADIRNAME=share],
289                   [CATOBJEXT=.mo
290                    DATADIRNAME=lib])
291                 INSTOBJEXT=.mo
292               fi
293             fi
294         ])
295
296         if test "$CATOBJEXT" = "NONE"; then
297           AC_MSG_CHECKING([whether catgets can be used])
298           AC_ARG_WITH(catgets,
299             [  --with-catgets          use catgets functions if available],
300             nls_cv_use_catgets=$withval, nls_cv_use_catgets=no)
301           AC_MSG_RESULT($nls_cv_use_catgets)
302
303           if test "$nls_cv_use_catgets" = "yes"; then
304             dnl No gettext in C library.  Try catgets next.
305             AC_CHECK_LIB(i, main)
306             AC_CHECK_FUNC(catgets,
307               [AC_DEFINE(HAVE_CATGETS)
308                INTLOBJS="\$(CATOBJS)"
309                AC_PATH_PROG(GENCAT, gencat, no)dnl
310                if test "$GENCAT" != "no"; then
311                  AC_PATH_PROG(GMSGFMT, gmsgfmt, no)
312                  if test "$GMSGFMT" = "no"; then
313                    AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt,
314                     [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)
315                  fi
316                  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
317                    [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
318                  USE_INCLUDED_LIBINTL=yes
319                  CATOBJEXT=.cat
320                  INSTOBJEXT=.cat
321                  DATADIRNAME=lib
322                  INTLDEPS='$(top_builddir)/intl/libintl.a'
323                  INTLLIBS=$INTLDEPS
324                  LIBS=`echo $LIBS | sed -e 's/-lintl//'`
325                  nls_cv_header_intl=intl/libintl.h
326                  nls_cv_header_libgt=intl/libgettext.h
327                fi])
328           fi
329         fi
330
331         if test "$CATOBJEXT" = "NONE"; then
332           dnl Neither gettext nor catgets in included in the C library.
333           dnl Fall back on GNU gettext library.
334           nls_cv_use_gnu_gettext=yes
335         fi
336       fi
337
338       if test "$nls_cv_use_gnu_gettext" = "yes"; then
339         dnl Mark actions used to generate GNU NLS library.
340         INTLOBJS="\$(GETTOBJS)"
341         AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
342           [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt)
343         AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
344         AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
345           [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
346         AC_SUBST(MSGFMT)
347         USE_INCLUDED_LIBINTL=yes
348         CATOBJEXT=.gmo
349         INSTOBJEXT=.mo
350         DATADIRNAME=share
351         INTLDEPS='$(top_builddir)/intl/libintl.a'
352         INTLLIBS=$INTLDEPS
353         LIBS=`echo $LIBS | sed -e 's/-lintl//'`
354         nls_cv_header_intl=intl/libintl.h
355         nls_cv_header_libgt=intl/libgettext.h
356       fi
357
358       dnl Test whether we really found GNU xgettext.
359       if test "$XGETTEXT" != ":"; then
360         dnl If it is no GNU xgettext we define it as : so that the
361         dnl Makefiles still can work.
362         if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
363           : ;
364         else
365           AC_MSG_RESULT(
366             [found xgettext program is not GNU xgettext; ignore it])
367           XGETTEXT=":"
368         fi
369       fi
370
371       # We need to process the po/ directory.
372       POSUB=po
373     else
374       DATADIRNAME=share
375       nls_cv_header_intl=intl/libintl.h
376       nls_cv_header_libgt=intl/libgettext.h
377     fi
378     AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
379     AC_OUTPUT_COMMANDS(
380      [case "$CONFIG_FILES" in *po/Makefile.in*)
381         sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
382       esac])
383
384
385     # If this is used in GNU gettext we have to set USE_NLS to `yes'
386     # because some of the sources are only built for this goal.
387     if test "$PACKAGE" = gettext; then
388       USE_NLS=yes
389       USE_INCLUDED_LIBINTL=yes
390     fi
391
392     dnl These rules are solely for the distribution goal.  While doing this
393     dnl we only have to keep exactly one list of the available catalogs
394     dnl in configure.in.
395     for lang in $ALL_LINGUAS; do
396       GMOFILES="$GMOFILES $lang.gmo"
397       POFILES="$POFILES $lang.po"
398     done
399
400     dnl Make all variables we use known to autoconf.
401     AC_SUBST(USE_INCLUDED_LIBINTL)
402     AC_SUBST(CATALOGS)
403     AC_SUBST(CATOBJEXT)
404     AC_SUBST(DATADIRNAME)
405     AC_SUBST(GMOFILES)
406     AC_SUBST(INSTOBJEXT)
407     AC_SUBST(INTLDEPS)
408     AC_SUBST(INTLLIBS)
409     AC_SUBST(INTLOBJS)
410     AC_SUBST(POFILES)
411     AC_SUBST(POSUB)
412   ])
413
414
415 AC_DEFUN(AM_GNU_GETTEXT,
416   [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
417    AC_REQUIRE([AC_PROG_CC])dnl
418    AC_REQUIRE([AC_PROG_RANLIB])dnl
419    AC_REQUIRE([AC_ISC_POSIX])dnl
420    AC_REQUIRE([AC_HEADER_STDC])dnl
421    AC_REQUIRE([AC_C_CONST])dnl
422    AC_REQUIRE([AC_C_INLINE])dnl
423    AC_REQUIRE([AC_TYPE_OFF_T])dnl
424    AC_REQUIRE([AC_TYPE_SIZE_T])dnl
425    AC_REQUIRE([AC_FUNC_ALLOCA])dnl
426    AC_REQUIRE([AC_FUNC_MMAP])dnl
427
428    AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \
429 unistd.h sys/param.h])
430    AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \
431 strdup __argz_count __argz_stringify __argz_next])
432
433    if test "${ac_cv_func_stpcpy+set}" != "set"; then
434      AC_CHECK_FUNCS(stpcpy)
435    fi
436    if test "${ac_cv_func_stpcpy}" = "yes"; then
437      AC_DEFINE(HAVE_STPCPY)
438    fi
439
440    AM_LC_MESSAGES
441    AM_WITH_NLS
442
443    if test "x$CATOBJEXT" != "x"; then
444      if test "x$ALL_LINGUAS" = "x"; then
445        LINGUAS=
446      else
447        AC_MSG_CHECKING(for catalogs to be installed)
448        NEW_LINGUAS=
449        for lang in ${LINGUAS=$ALL_LINGUAS}; do
450          case "$ALL_LINGUAS" in
451           *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
452          esac
453        done
454        LINGUAS=$NEW_LINGUAS
455        AC_MSG_RESULT($LINGUAS)
456      fi
457
458      dnl Construct list of names of catalog files to be constructed.
459      if test -n "$LINGUAS"; then
460        for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
461      fi
462    fi
463
464    dnl The reference to <locale.h> in the installed <libintl.h> file
465    dnl must be resolved because we cannot expect the users of this
466    dnl to define HAVE_LOCALE_H.
467    if test $ac_cv_header_locale_h = yes; then
468      INCLUDE_LOCALE_H="#include <locale.h>"
469    else
470      INCLUDE_LOCALE_H="\
471 /* The system does not provide the header <locale.h>.  Take care yourself.  */"
472    fi
473    AC_SUBST(INCLUDE_LOCALE_H)
474
475    dnl Determine which catalog format we have (if any is needed)
476    dnl For now we know about two different formats:
477    dnl   Linux libc-5 and the normal X/Open format
478    test -d intl || mkdir intl
479    if test "$CATOBJEXT" = ".cat"; then
480      AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen)
481
482      dnl Transform the SED scripts while copying because some dumb SEDs
483      dnl cannot handle comments.
484      sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
485    fi
486    dnl po2tbl.sed is always needed.
487    sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
488      $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
489
490    dnl In the intl/Makefile.in we have a special dependency which makes
491    dnl only sense for gettext.  We comment this out for non-gettext
492    dnl packages.
493    if test "$PACKAGE" = "gettext"; then
494      GT_NO="#NO#"
495      GT_YES=
496    else
497      GT_NO=
498      GT_YES="#YES#"
499    fi
500    AC_SUBST(GT_NO)
501    AC_SUBST(GT_YES)
502
503    dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
504    dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
505    dnl Try to locate is.
506    MKINSTALLDIRS=
507    if test -n "$ac_aux_dir"; then
508      MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
509    fi
510    if test -z "$MKINSTALLDIRS"; then
511      MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
512    fi
513    AC_SUBST(MKINSTALLDIRS)
514
515    dnl *** For now the libtool support in intl/Makefile is not for real.
516    l=
517    AC_SUBST(l)
518
519    dnl Generate list of files to be processed by xgettext which will
520    dnl be included in po/Makefile.
521    test -d po || mkdir po
522    if test "x$srcdir" != "x."; then
523      if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
524        posrcprefix="$srcdir/"
525      else
526        posrcprefix="../$srcdir/"
527      fi
528    else
529      posrcprefix="../"
530    fi
531    rm -f po/POTFILES
532    sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
533         < $srcdir/po/POTFILES.in > po/POTFILES
534   ])
535