2005-03-24 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / configure.ac
1 # configure.ac for GPGME
2 # Copyright (C) 2000 Werner Koch (dd9jn)
3 # Copyright (C) 2001, 2002, 2003, 2004, 2005 g10 Code GmbH
4
5 # This file is part of GPGME.
6
7 # GPGME is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU Lesser General Public License as
9 # published by the Free Software Foundation; either version 2.1 of the
10 # License, or (at your option) any later version.
11
12 # GPGME is distributed in the hope that it will be useful, but WITHOUT
13 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
15 # Public License for more details.
16
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  
21 # (Process this file with autoconf to produce a configure script.)
22
23 AC_PREREQ(2.59)
24 min_automake_version="1.9.3"
25
26 # Version number: Remember to change it immediately *after* a release.
27 AC_INIT(gpgme, 1.1.0-cvs, [bug-gpgme@gnupg.org])
28 # LT Version numbers, remember to change them just *before* a release.
29 #   (Code changed:                      REVISION++)
30 #   (Interfaces added/removed/changed:  CURRENT++, REVISION=0)
31 #   (Interfaces added:                  AGE++)
32 #   (Interfaces removed/changed:        AGE=0)
33 #
34 LIBGPGME_LT_CURRENT=14
35 # Subtract 2 from this value if you want to make the LFS transition an
36 # ABI break.  [Note to self: Remove this comment with the next regular break.]
37 LIBGPGME_LT_AGE=3
38 LIBGPGME_LT_REVISION=3
39
40 # If the API is changed in an incompatible way: increment the next counter.
41 GPGME_CONFIG_API_VERSION=1
42
43 NEED_GPG_VERSION=1.2.2
44 NEED_GPGSM_VERSION=1.9.6
45 ##############################################
46
47
48 PACKAGE=$PACKAGE_NAME
49 VERSION=$PACKAGE_VERSION
50
51 AC_CONFIG_SRCDIR(gpgme/gpgme.h)
52 dnl FIXME: Enable this with autoconf 2.59.
53 dnl AC_CONFIG_MACRO_DIR(m4)
54 AM_CONFIG_HEADER(config.h)
55 AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
56 AM_MAINTAINER_MODE
57 AC_CANONICAL_HOST
58
59 # Enable GNU extensions on systems that have them.
60 AC_GNU_SOURCE
61
62 AH_VERBATIM([_REENTRANT],
63 [/* To allow the use of GPGME in multithreaded programs we have to use
64   special features from the library.
65   IMPORTANT: gpgme is not yet fully reentrant and you should use it
66   only from one thread.  */
67 #ifndef _REENTRANT
68 # define _REENTRANT 1
69 #endif])
70
71 AH_BOTTOM([
72 /* Some environments miss the definition for EOPNOTSUPP.  We provide
73    the error code here and test where neded whether it should be
74    defined.  Can't do the test here due to the order of includes.  */
75 #ifdef HAVE_W32_SYSTEM
76 #define VALUE_FOR_EOPNOTSUPP 95
77 #endif /*!HAVE_W32_SYSTEM*/
78
79 ])
80
81
82 AC_PROG_CC
83
84
85 AC_SUBST(LIBGPGME_LT_CURRENT)
86 AC_SUBST(LIBGPGME_LT_AGE)
87 AC_SUBST(LIBGPGME_LT_REVISION)
88 AC_DEFINE_UNQUOTED(NEED_GPG_VERSION, "$NEED_GPG_VERSION",
89                                      [Min. needed GnuPG version.])
90 AC_DEFINE_UNQUOTED(NEED_GPGSM_VERSION, "$NEED_GPGSM_VERSION",
91                                        [Min. needed GPGSM version.])
92
93 AC_SUBST(PACKAGE)
94 AC_SUBST(VERSION)
95 AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of this package])
96 AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version of this package])
97
98 # Don't default to build static libs.
99 AC_DISABLE_STATIC
100 AC_PROG_LIBTOOL
101
102 # For now we hardcode the use of version scripts.  It would be better
103 # to write a test for this or even implement this within libtool.
104 have_ld_version_script=no
105 case "${host}" in
106     *-*-linux*)
107         have_ld_version_script=yes
108         ;;
109     *-*-gnu*)
110         have_ld_version_script=yes
111         ;;
112 esac
113 AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
114
115 GPG_DEFAULT=no
116 GPGSM_DEFAULT=no
117 component_system=None
118 have_dosish_system=no
119 have_w32_system=no
120 case "${host}" in
121     *-mingw32*)
122         # special stuff for Windoze NT
123         have_dosish_system=yes
124         have_w32_system=yes
125         GPG_DEFAULT='c:\\gnupg\\gpg.exe'
126         # XXX Assuan is not supported in this configuration.
127         #GPGSM_DEFAULT='c:\\gnupg\\gpgsm.exe'
128         #component_system='COM+'
129         ;;
130     *)
131         AC_CHECK_PTH(1.2.0,,,no,have_pth=yes)
132         if test "$have_pth" = yes; then
133           AC_DEFINE(HAVE_PTH, ,[Define if we have Pth.])
134           CFLAGS="$CFLAGS $PTH_CFLAGS"
135         fi
136         AC_CHECK_LIB(pthread,pthread_create,have_pthread=yes)
137         if test "$have_pthread" = yes; then
138           AC_DEFINE(HAVE_PTHREAD, ,[Define if we have pthread.])
139         fi
140
141         # XXX: Probably use exec-prefix here?
142 #       GPG_DEFAULT='/usr/bin/gpg'
143 #       GPGSM_DEFAULT='/usr/bin/gpgsm'
144         ;;
145 esac
146
147 if test "$have_dosish_system" = yes; then
148    AC_DEFINE(HAVE_DOSISH_SYSTEM,1,
149              [Defined if we run on some of the PCDOS like systems 
150               (DOS, Windoze. OS/2) with special properties like
151               no file modes])
152 fi
153 AM_CONDITIONAL(HAVE_DOSISH_SYSTEM, test "$have_dosish_system" = yes)
154
155 if test "$have_w32_system" = yes; then
156    AC_DEFINE(HAVE_W32_SYSTEM,1, [Defined if we run on a W32 API based system])
157 fi
158 AM_CONDITIONAL(HAVE_W32_SYSTEM, test "$have_w32_system" = yes)
159
160
161 AM_CONDITIONAL(HAVE_PTH, test "$have_pth" = "yes")
162 AM_CONDITIONAL(HAVE_PTHREAD, test "$have_pthread" = "yes")
163
164
165 # Checks for header files.
166 AC_CHECK_HEADERS(sys/select.h)
167
168
169 # Type checks.
170 AC_CHECK_SIZEOF(unsigned int)
171 AC_SYS_LARGEFILE
172 AC_TYPE_OFF_T
173
174 # Checks for compiler features.
175 if test "$GCC" = yes; then
176     CFLAGS="$CFLAGS -Wall -Wcast-align -Wshadow -Wstrict-prototypes"
177 fi
178
179
180 # Checks for library functions.
181 AC_FUNC_FSEEKO
182
183 AC_REPLACE_FUNCS(stpcpy)
184
185 AC_REPLACE_FUNCS(vasprintf)
186 if test "$ac_cv_func_vasprintf" != yes; then
187   GNUPG_CHECK_VA_COPY
188 fi
189
190 # Try to find a thread-safe version of ttyname().
191 AC_REPLACE_FUNCS(ttyname_r)
192 if test "$ac_cv_func_ttyname_r" != yes; then
193   AC_MSG_WARN([
194 ***
195 *** ttyname() is not thread-safe and ttyname_r() does not exist
196 ***])
197 fi
198
199 # Try to find a thread-safe version of getenv().
200 have_thread_safe_getenv=no
201 jm_GLIBC21
202 if test $GLIBC21 = yes; then
203   have_thread_safe_getenv=yes
204 fi
205 if test $have_thread_safe_getenv = yes; then
206   AC_DEFINE(HAVE_THREAD_SAFE_GETENV, [1], [Define if getenv() is thread-safe])
207 fi
208 have_getenv_r=no
209 AC_CHECK_FUNCS(getenv_r, have_getenv_r=yes)
210 if test $have_getenv_r = no && test $have_thread_safe_getenv = no; then
211   AC_MSG_WARN([
212 ***
213 *** getenv() is not thread-safe and getenv_r() does not exist
214 ***])
215 fi
216
217 # For converting time strings to seconds since Epoch, we need the timegm
218 # function.
219 AC_CHECK_FUNCS(timegm)
220 if test "$ac_cv_func_timegm" != yes; then
221   AC_MSG_WARN([
222 ***
223 *** timegm() not available - a non-thread-safe kludge will be used
224 *** and the TZ variable might be changed at runtime.
225 ***])
226 fi
227
228 # Checking for libgpg-error.
229 AM_PATH_GPG_ERROR(0.5,, AC_MSG_ERROR([libgpg-error was not found]))
230 AC_DEFINE(GPG_ERR_SOURCE_DEFAULT, GPG_ERR_SOURCE_GPGME,
231           [The default error source for GPGME.])
232
233
234
235 # Checks for system services
236 NO_OVERRIDE=no
237 AC_ARG_WITH(gpg,
238             AC_HELP_STRING([--with-gpg=PATH], [use GnuPG binary at PATH]),
239             GPG=$withval, NO_OVERRIDE=yes)
240 if test "$NO_OVERRIDE" = "yes" || test "$GPG" = "yes"; then
241   GPG=
242   NO_OVERRIDE=yes
243   if test "$cross_compiling" != "yes"; then
244     AC_PATH_PROG(GPG, gpg)
245   fi
246   if test -z "$GPG"; then
247     GPG="$GPG_DEFAULT"
248   fi
249 fi
250 if test "$GPG" = no; then
251   if test "$NO_OVERRIDE" = "yes"; then
252     if test "$cross_compiling" != "yes"; then
253       AC_MSG_WARN([
254 ***
255 *** Could not find GnuPG, install GnuPG or use --with-gpg=PATH to enable it
256 ***])
257     else
258       AC_MSG_ERROR([
259 ***
260 *** Can not determine path to GnuPG when cross-compiling, use --with-gpg=PATH
261 ***])
262     fi
263   fi
264 else
265   AC_DEFINE_UNQUOTED(GPG_PATH, "$GPG", [Path to the GnuPG binary.])
266   AC_SUBST(GPG)
267 fi
268 dnl Check for GnuPG version requirement.
269 GPG_VERSION=unknown
270 ok=maybe
271 if test -z "$GPG" -o "x$GPG" = "xno"; then
272   ok=no
273 else
274   if test "$cross_compiling" = "yes"; then
275     AC_MSG_WARN([GnuPG version can not be checked when cross compiling])
276     ok=no
277   else
278     if test ! -x "$GPG"; then
279       AC_MSG_WARN([GnuPG not executable, version check disabled])
280       ok=no
281     fi
282   fi
283 fi
284 if test "$ok" = "maybe"; then
285   AC_MSG_CHECKING(for GnuPG >= $NEED_GPG_VERSION)
286   req_major=`echo $NEED_GPG_VERSION | \
287              sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
288   req_minor=`echo $NEED_GPG_VERSION | \
289              sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
290   req_micro=`echo $NEED_GPG_VERSION | \
291              sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
292   gpg_version=`$GPG --version | grep ^gpg`
293   major=`echo $gpg_version | \
294          sed 's/^gpg (GnuPG) \([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
295   minor=`echo $gpg_version | \
296          sed 's/^gpg (GnuPG) \([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
297   micro=`echo $gpg_version | \
298          sed 's/^gpg (GnuPG) \([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
299   GPG_VERSION=`echo $gpg_version | sed 's/^gpg (GnuPG) //'`
300
301   if test "$major" -gt "$req_major"; then
302     ok=yes
303   else
304     if test "$major" -eq "$req_major"; then
305       if test "$minor" -gt "$req_minor"; then
306         ok=yes
307       else
308         if test "$minor" -eq "$req_minor"; then
309           if test "$micro" -ge "$req_micro"; then
310             ok=yes
311           fi
312         fi
313       fi
314     fi
315   fi
316   if test "$ok" = "yes"; then
317     AC_MSG_RESULT(yes)
318   else
319     AC_MSG_RESULT(no)
320     AC_MSG_WARN([GnuPG must be at least version $NEED_GPG_VERSION])
321   fi
322 fi
323 AM_CONDITIONAL(RUN_GPG_TESTS, test "$ok" = "yes")
324 AC_SUBST(GPG_PATH)
325
326 NO_OVERRIDE=no
327 AC_ARG_WITH(gpgsm,
328             AC_HELP_STRING([--with-gpgsm=PATH], [use GpgSM binary at PATH]),
329             GPGSM=$withval, NO_OVERRIDE=yes)
330 if test "$NO_OVERRIDE" = "yes" || test "$GPGSM" = "yes"; then
331   GPGSM=
332   NO_OVERRIDE=yes
333   if test "$cross_compiling" != "yes"; then
334     AC_PATH_PROG(GPGSM, gpgsm)
335   fi
336   if test -z "$GPGSM"; then
337     GPGSM="$GPGSM_DEFAULT"
338   fi
339 fi
340 if test "$GPGSM" = no; then
341   if test "$NO_OVERRIDE" = "yes"; then
342     if test "$cross_compiling" != "yes"; then
343       AC_MSG_WARN([
344 ***
345 *** Could not find GpgSM, install GpgSM or use --with-gpgsm=PATH to enable it
346 ***])
347     else
348       AC_MSG_ERROR([
349 ***
350 *** Can not determine path to GpgSM when cross-compiling, use --with-gpgsm=PATH
351 ***])
352     fi
353   fi
354 else
355   AC_DEFINE_UNQUOTED(GPGSM_PATH, "$GPGSM", [Path to the GPGSM binary.])
356   AC_SUBST(GPGSM)
357 fi
358 AM_CONDITIONAL(HAVE_GPGSM, test "$GPGSM" != "no")
359 dnl Check for GPGSM version requirement.
360 GPGSM_VERSION=unknown
361 ok=maybe
362 if test -z "$GPGSM" -o "x$GPGSM" = "xno"; then
363   ok=no
364 else
365   if test "$cross_compiling" = "yes"; then
366     AC_MSG_WARN([GPGSM version can not be checked when cross compiling])
367     ok=no
368   else
369     if test ! -x "$GPGSM"; then
370       AC_MSG_WARN([GPGSM not executable, version check disabled])
371       ok=no
372     fi
373   fi
374 fi
375 if test "$ok" = "maybe"; then
376   AC_MSG_CHECKING(for GPGSM >= $NEED_GPGSM_VERSION)
377   req_major=`echo $NEED_GPGSM_VERSION | \
378              sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
379   req_minor=`echo $NEED_GPGSM_VERSION | \
380              sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
381   req_micro=`echo $NEED_GPGSM_VERSION | \
382              sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
383   gpgsm_version=`$GPGSM --version | grep ^gpgsm`
384   major=`echo $gpgsm_version | \
385          sed 's/^gpgsm (GnuPG) \([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
386   minor=`echo $gpgsm_version | \
387          sed 's/^gpgsm (GnuPG) \([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
388   micro=`echo $gpgsm_version | \
389          sed 's/^gpgsm (GnuPG) \([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
390   GPGSM_VERSION=`echo $gpgsm_version | sed 's/^gpgsm (GnuPG) //'`
391
392   if test "$major" -gt "$req_major"; then
393     ok=yes
394   else
395     if test "$major" -eq "$req_major"; then
396       if test "$minor" -gt "$req_minor"; then
397         ok=yes
398       else
399         if test "$minor" -eq "$req_minor"; then
400           if test "$micro" -ge "$req_micro"; then
401             ok=yes
402           fi
403         fi
404       fi
405     fi
406   fi
407   if test "$ok" = "yes"; then
408     AC_MSG_RESULT(yes)
409   else
410     AC_MSG_RESULT(no)
411     AC_MSG_WARN([GPGSM must be at least version $NEED_GPGSM_VERSION])
412   fi
413 fi
414 AM_CONDITIONAL(RUN_GPGSM_TESTS, test "$ok" = "yes")
415
416 # FIXME: Only build if supported.
417 AM_CONDITIONAL(BUILD_ASSUAN, test "$GPGSM" != "no")
418
419
420 # The assuan code uses funopen but it will also build without it.  So
421 # test for it.  Frankly, this is not required in gpgme, but thats the
422 # way we handle it in libassuan.
423 AC_CHECK_FUNCS(funopen)
424 if test $ac_cv_func_funopen != yes; then
425     # No funopen but we can implement that in terms of fopencookie.
426     AC_CHECK_FUNCS(fopencookie)
427     if test $ac_cv_func_fopencookie = yes; then
428         AC_LIBOBJ([funopen])
429     else
430         AC_MSG_WARN([
431 ***
432 *** No implementation of fopencookie or funopen available
433 ***])
434     fi
435 fi
436
437 # More assuan replacement functions.
438 AC_REPLACE_FUNCS(isascii)
439 AC_REPLACE_FUNCS(putc_unlocked)
440 AC_REPLACE_FUNCS(memrchr)
441
442 # More assuan checks.
443 AC_CHECK_HEADERS([sys/uio.h])
444
445 # End of assuan checks.
446
447 AM_CONDITIONAL(BUILD_COMPLUS, test "$component_system" = "COM+")
448
449 # Make the version number in gpgme/gpgme.h the same as the one here.
450 # (this is easier than to have a *.in file just for one substitution)
451 GNUPG_FIX_HDR_VERSION(gpgme/gpgme.h, GPGME_VERSION)
452
453 # Substitution used for gpgme-config 
454 GPGME_CONFIG_LIBS="-lgpgme"
455 GPGME_CONFIG_CFLAGS=""
456 AC_SUBST(GPGME_CONFIG_API_VERSION)
457 AC_SUBST(GPGME_CONFIG_LIBS)
458 AC_SUBST(GPGME_CONFIG_CFLAGS)
459
460 # Frob'da Variables
461 LTLIBOBJS=`echo "$LIB@&t@OBJS" |
462            sed 's,\.[[^.]]* ,.lo ,g;s,\.[[^.]]*$,.lo,'`
463 AC_SUBST(LTLIBOBJS)
464
465 #
466 # Create config files 
467
468 AC_CONFIG_FILES(Makefile assuan/Makefile gpgme/Makefile
469                 tests/Makefile tests/gpg/Makefile tests/gpgsm/Makefile
470                 doc/Makefile complus/Makefile)
471 AC_CONFIG_FILES(gpgme/gpgme-config, chmod +x gpgme/gpgme-config)
472 AC_OUTPUT
473
474 echo "
475         GPGME v${VERSION} has been configured as follows:
476
477         GnuPG path:    $GPG
478         GnuPG version: $GPG_VERSION, min. $NEED_GPG_VERSION
479
480         GpgSM path:    $GPGSM
481         GpgSM version: $GPGSM_VERSION, min. $NEED_GPGSM_VERSION
482
483         GPGME Pthread: $have_pthread
484         GPGME Pth:     $have_pth
485 "