build: Update standard build-aux files.
[gnupg.git] / acinclude.m4
1 dnl macros to configure gnupg
2 dnl Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
3 dnl
4 dnl This file is part of GnuPG.
5 dnl
6 dnl GnuPG is free software; you can redistribute it and/or modify
7 dnl it under the terms of the GNU General Public License as published by
8 dnl the Free Software Foundation; either version 3 of the License, or
9 dnl (at your option) any later version.
10 dnl
11 dnl GnuPG 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 General Public License for more details.
15 dnl
16 dnl You should have received a copy of the GNU General Public License
17 dnl along with this program; if not, see <http://www.gnu.org/licenses/>.
18
19 dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
20 dnl Check whether a typedef exists and create a #define $2 if it exists
21 dnl
22 AC_DEFUN([GNUPG_CHECK_TYPEDEF],
23   [ AC_MSG_CHECKING(for $1 typedef)
24     AC_CACHE_VAL(gnupg_cv_typedef_$1,
25     [AC_TRY_COMPILE([#define _GNU_SOURCE 1
26     #include <stdlib.h>
27     #include <sys/types.h>], [
28     #undef $1
29     int a = sizeof($1);
30     ], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
31     AC_MSG_RESULT($gnupg_cv_typedef_$1)
32     if test "$gnupg_cv_typedef_$1" = yes; then
33         AC_DEFINE($2,1,[Defined if a `]$1[' is typedef'd])
34     fi
35   ])
36
37
38 dnl GNUPG_CHECK_GNUMAKE
39 dnl
40 AC_DEFUN([GNUPG_CHECK_GNUMAKE],
41   [
42     if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
43         :
44     else
45         AC_MSG_WARN([[
46 ***
47 *** It seems that you are not using GNU make.  Some make tools have serious
48 *** flaws and you may not be able to build this software at all. Before you
49 *** complain, please try GNU make:  GNU make is easy to build and available
50 *** at all GNU archives.  It is always available from ftp.gnu.org:/gnu/make.
51 ***]])
52     fi
53   ])
54
55 dnl GNUPG_CHECK_FAQPROG
56 dnl
57 AC_DEFUN([GNUPG_CHECK_FAQPROG],
58   [ AC_MSG_CHECKING(for faqprog.pl)
59     if faqprog.pl -V 2>/dev/null | grep '^faqprog.pl ' >/dev/null 2>&1; then
60         working_faqprog=yes
61         FAQPROG="faqprog.pl"
62     else
63         working_faqprog=no
64         FAQPROG=": "
65     fi
66     AC_MSG_RESULT($working_faqprog)
67     AC_SUBST(FAQPROG)
68     AM_CONDITIONAL(WORKING_FAQPROG, test "$working_faqprog" = "yes" )
69
70 dnl     if test $working_faqprog = no; then
71 dnl         AC_MSG_WARN([[
72 dnl ***
73 dnl *** It seems that the faqprog.pl program is not installed;
74 dnl *** however it is only needed if you want to change the FAQ.
75 dnl ***  (faqprog.pl should be available at:
76 dnl ***    ftp://ftp.gnupg.org/gcrypt/contrib/faqprog.pl )
77 dnl *** No need to worry about this warning.
78 dnl ***]])
79 dnl     fi
80    ])
81
82 dnl GNUPG_CHECK_DOCBOOK_TO_TEXI
83 dnl
84 AC_DEFUN([GNUPG_CHECK_DOCBOOK_TO_TEXI],
85   [
86     AC_CHECK_PROG(DOCBOOK_TO_TEXI, docbook2texi, yes, no)
87     AC_MSG_CHECKING(for sgml to texi tools)
88     working_sgmltotexi=no
89     if test "$ac_cv_prog_DOCBOOK_TO_TEXI" = yes; then
90       if sgml2xml -v /dev/null 2>&1 | grep 'SP version' >/dev/null 2>&1 ; then
91             working_sgmltotexi=yes
92       fi
93     fi
94     AC_MSG_RESULT($working_sgmltotexi)
95     AM_CONDITIONAL(HAVE_DOCBOOK_TO_TEXI, test "$working_sgmltotexi" = "yes" )
96    ])
97
98
99
100 dnl GNUPG_CHECK_ENDIAN
101 dnl define either LITTLE_ENDIAN_HOST or BIG_ENDIAN_HOST
102 dnl
103 AC_DEFUN([GNUPG_CHECK_ENDIAN],
104   [
105     tmp_assumed_endian=big
106     tmp_assume_warn=""
107     if test "$cross_compiling" = yes; then
108       case "$host_cpu" in
109          i@<:@345678@:>@* )
110             tmp_assumed_endian=little
111             ;;
112          *)
113             ;;
114       esac
115     fi
116     AC_MSG_CHECKING(endianess)
117     AC_CACHE_VAL(gnupg_cv_c_endian,
118       [ gnupg_cv_c_endian=unknown
119         # See if sys/param.h defines the BYTE_ORDER macro.
120         AC_TRY_COMPILE([#include <sys/types.h>
121         #include <sys/param.h>], [
122         #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
123          bogus endian macros
124         #endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
125         AC_TRY_COMPILE([#include <sys/types.h>
126         #include <sys/param.h>], [
127         #if BYTE_ORDER != BIG_ENDIAN
128          not big endian
129         #endif], gnupg_cv_c_endian=big, gnupg_cv_c_endian=little)])
130         if test "$gnupg_cv_c_endian" = unknown; then
131             AC_TRY_RUN([main () {
132               /* Are we little or big endian?  From Harbison&Steele.  */
133               union
134               {
135                 long l;
136                 char c[sizeof (long)];
137               } u;
138               u.l = 1;
139               exit (u.c[sizeof (long) - 1] == 1);
140               }],
141               gnupg_cv_c_endian=little,
142               gnupg_cv_c_endian=big,
143               gnupg_cv_c_endian=$tmp_assumed_endian
144               tmp_assumed_warn=" (assumed)"
145             )
146         fi
147       ])
148     AC_MSG_RESULT([${gnupg_cv_c_endian}${tmp_assumed_warn}])
149     if test "$gnupg_cv_c_endian" = little; then
150       AC_DEFINE(LITTLE_ENDIAN_HOST,1,
151                 [Defined if the host has little endian byte ordering])
152     else
153       AC_DEFINE(BIG_ENDIAN_HOST,1,
154                 [Defined if the host has big endian byte ordering])
155     fi
156   ])
157
158
159
160
161 # GNUPG_BUILD_PROGRAM(NAME,DEFAULT)
162 # Add a --enable-NAME option to configure an set the
163 # shell variable build_NAME either to "yes" or "no".  DEFAULT must
164 # either be "yes" or "no" and decided on the default value for
165 # build_NAME and whether --enable-NAME or --disable-NAME is shown with
166 # ./configure --help
167 AC_DEFUN([GNUPG_BUILD_PROGRAM],
168   [build_$1=$2
169    m4_if([$2],[yes],[
170       AC_ARG_ENABLE([$1], AC_HELP_STRING([--disable-$1],
171                                          [do not build the $1 program]),
172                            build_$1=$enableval, build_$1=$2)
173     ],[
174       AC_ARG_ENABLE([$1], AC_HELP_STRING([--enable-$1],
175                                          [build the $1 program]),
176                            build_$1=$enableval, build_$1=$2)
177     ])
178    case "$build_$1" in
179          no|yes)
180            ;;
181          *)
182            AC_MSG_ERROR([only yes or no allowed for feature --enable-$1])
183            ;;
184    esac
185   ])
186
187
188
189 # GNUPG_DISABLE_GPG_ALGO(NAME,DESCRIPTION)
190 #
191 # Add a --disable-gpg-NAME option and the corresponding ac_define
192 # GPG_USE_<NAME>.
193 AC_DEFUN([GNUPG_GPG_DISABLE_ALGO],
194   [AC_MSG_CHECKING([whether to enable the $2 for gpg])
195    AC_ARG_ENABLE([gpg-$1], AC_HELP_STRING([--disable-gpg-$1],
196                                           [disable the $2 algorithm in gpg]),
197                                           , enableval=yes)
198    AC_MSG_RESULT($enableval)
199    if test x"$enableval" = xyes ; then
200      AC_DEFINE(GPG_USE_[]m4_toupper($1), 1, [Define to support the $2])
201    fi
202   ])
203
204
205
206
207 # Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
208 # is not called from uid 0 (not tested whether uid 0 works)
209 # For DECs Tru64 we have also to check whether mlock is in librt
210 # mlock is there a macro using memlk()
211 dnl GNUPG_CHECK_MLOCK
212 dnl
213 AC_DEFUN([GNUPG_CHECK_MLOCK],
214   [ AC_CHECK_FUNCS(mlock)
215     if test "$ac_cv_func_mlock" = "no"; then
216         AC_CHECK_HEADERS(sys/mman.h)
217         if test "$ac_cv_header_sys_mman_h" = "yes"; then
218             # Add librt to LIBS:
219             AC_CHECK_LIB(rt, memlk)
220             AC_CACHE_CHECK([whether mlock is in sys/mman.h],
221                             gnupg_cv_mlock_is_in_sys_mman,
222                 [AC_TRY_LINK([
223                     #include <assert.h>
224                     #ifdef HAVE_SYS_MMAN_H
225                     #include <sys/mman.h>
226                     #endif
227                 ], [
228                     int i;
229
230                     /* glibc defines this for functions which it implements
231                      * to always fail with ENOSYS.  Some functions are actually
232                      * named something starting with __ and the normal name
233                      * is an alias.  */
234                     #if defined (__stub_mlock) || defined (__stub___mlock)
235                     choke me
236                     #else
237                     mlock(&i, 4);
238                     #endif
239                     ; return 0;
240                 ],
241                 gnupg_cv_mlock_is_in_sys_mman=yes,
242                 gnupg_cv_mlock_is_in_sys_mman=no)])
243             if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
244                 AC_DEFINE(HAVE_MLOCK,1,
245                           [Defined if the system supports an mlock() call])
246             fi
247         fi
248     fi
249     if test "$ac_cv_func_mlock" = "yes"; then
250         AC_MSG_CHECKING(whether mlock is broken)
251           AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
252              AC_TRY_RUN([
253                 #include <stdlib.h>
254                 #include <unistd.h>
255                 #include <errno.h>
256                 #include <sys/mman.h>
257                 #include <sys/types.h>
258                 #include <fcntl.h>
259
260                 int main()
261                 {
262                     char *pool;
263                     int err;
264                     long int pgsize = getpagesize();
265
266                     pool = malloc( 4096 + pgsize );
267                     if( !pool )
268                         return 2;
269                     pool += (pgsize - ((long int)pool % pgsize));
270
271                     err = mlock( pool, 4096 );
272                     if( !err || errno == EPERM )
273                         return 0; /* okay */
274
275                     return 1;  /* hmmm */
276                 }
277
278             ],
279             gnupg_cv_have_broken_mlock="no",
280             gnupg_cv_have_broken_mlock="yes",
281             gnupg_cv_have_broken_mlock="assume-no"
282            )
283          )
284          if test "$gnupg_cv_have_broken_mlock" = "yes"; then
285              AC_DEFINE(HAVE_BROKEN_MLOCK,1,
286                        [Defined if the mlock() call does not work])
287              AC_MSG_RESULT(yes)
288              AC_CHECK_FUNCS(plock)
289          else
290             if test "$gnupg_cv_have_broken_mlock" = "no"; then
291                 AC_MSG_RESULT(no)
292             else
293                 AC_MSG_RESULT(assuming no)
294             fi
295          fi
296     fi
297   ])
298
299
300 dnl Stolen from gcc
301 dnl Define MKDIR_TAKES_ONE_ARG if mkdir accepts only one argument instead
302 dnl of the usual 2.
303 AC_DEFUN([GNUPG_FUNC_MKDIR_TAKES_ONE_ARG],
304 [AC_CHECK_HEADERS(sys/stat.h unistd.h direct.h)
305 AC_CACHE_CHECK([if mkdir takes one argument], gnupg_cv_mkdir_takes_one_arg,
306 [AC_TRY_COMPILE([
307 #include <sys/types.h>
308 #ifdef HAVE_SYS_STAT_H
309 # include <sys/stat.h>
310 #endif
311 #ifdef HAVE_UNISTD_H
312 # include <unistd.h>
313 #endif
314 #ifdef HAVE_DIRECT_H
315 # include <direct.h>
316 #endif], [mkdir ("foo", 0);],
317         gnupg_cv_mkdir_takes_one_arg=no, gnupg_cv_mkdir_takes_one_arg=yes)])
318 if test $gnupg_cv_mkdir_takes_one_arg = yes ; then
319   AC_DEFINE(MKDIR_TAKES_ONE_ARG,1,
320             [Defined if mkdir() does not take permission flags])
321 fi
322 ])
323
324
325 # GNUPG_TIME_T_UNSIGNED
326 # Check whether time_t is unsigned
327 #
328 AC_DEFUN([GNUPG_TIME_T_UNSIGNED],
329   [ AC_CACHE_CHECK(whether time_t is unsigned, gnupg_cv_time_t_unsigned,
330      [AC_REQUIRE([AC_HEADER_TIME])dnl
331       AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY(
332        [AC_INCLUDES_DEFAULT([])
333 #if TIME_WITH_SYS_TIME
334 # include <sys/time.h>
335 # include <time.h>
336 #else
337 # if HAVE_SYS_TIME_H
338 #  include <sys/time.h>
339 # else
340 #  include <time.h>
341 # endif
342 #endif
343 ],
344        [((time_t)-1) < 0])],
345        gnupg_cv_time_t_unsigned=no, gnupg_cv_time_t_unsigned=yes)])
346     if test $gnupg_cv_time_t_unsigned = yes; then
347       AC_DEFINE(HAVE_UNSIGNED_TIME_T,1,[Defined if time_t is an unsigned type])
348     fi
349 ])# GNUPG_TIME_T_UNSIGNED