bumped version to 2.0.1-pre2
[fwknop.git] / configure.ac
1 dnl Fwknop AutoConf script...
2 dnl =========================
3 dnl
4 dnl Created by Damien Stuart
5 dnl
6 dnl Inspiration from RRDtool configure.ac, the AutoConf Archive
7 dnl (http://www.nongnu.org/autoconf-archive/), and other examples.
8
9 dnl Minimum Autoconf version required.
10 AC_PREREQ(2.62)
11
12 dnl Define our name, version and email.
13 m4_define(my_package,   [fwknop])
14 m4_define(my_version,   [2.0.1-pre2])
15 m4_define(my_bug_email, [dstuart@dstuart.org])
16
17 AC_INIT(my_package, my_version, my_bug_email)
18
19 AC_CONFIG_MACRO_DIR([m4])
20 AC_CONFIG_AUX_DIR(config)
21
22 AC_CANONICAL_TARGET
23
24 AM_INIT_AUTOMAKE([tar-ustar -Wall -Werror foreign])
25
26 dnl AM_MAINTAINER_MODE
27
28 AC_CONFIG_HEADERS([config.h])
29
30 dnl The top of our header
31 dnl
32 AH_TOP([
33 #ifndef FWKNOP_CONFIG_H
34 #define FWKNOP_CONFIG_H
35 ])
36
37 dnl The bottom of our header file
38 dnl
39 AH_BOTTOM([
40 #endif /* FWKNOP_CONFIG_H */
41 ])
42
43 dnl FKO_CHECK_COMPILER_ARG([COMPILER FLAG])
44 dnl
45 dnl Macro to check compiler support for the given compiler option.
46 dnl Adds to CFLAGS and LDFLAGS if supported.
47 dnl
48 dnl The structure of this macro was adapted from OpenSSH.
49 dnl
50 AC_DEFUN([FKO_CHECK_COMPILER_ARG], [
51     saved_CFLAGS="$CFLAGS"
52     saved_LDFLAGS="$LDFLAGS"
53     CFLAGS="$CFLAGS $1 -Werror"
54     LDFLAGS="$LDFLAGS $1 -Werror"
55     AC_MSG_CHECKING([if $CC supports $1])
56     AC_LINK_IFELSE(
57         [AC_LANG_SOURCE([
58 #include <stdio.h>
59 int main(void){char x[[256]]; snprintf(x, sizeof(x), "NNN"); return 0;}
60         ])],
61         [
62             CFLAGS="$saved_CFLAGS $1"
63             LDFLAGS="$saved_LDFLAGS $1"
64             AC_RUN_IFELSE(
65                 [AC_LANG_SOURCE([
66 #include <stdio.h>
67 int main(void){char x[[256]]; snprintf(x, sizeof(x), "NNN"); return 0;}
68                 ])],
69                 [AC_MSG_RESULT(yes)],
70                 [AC_MSG_RESULT(no)
71                     CFLAGS="$saved_CFLAGS"
72                     LDFLAGS="$saved_LDFLAGS"],
73                 [AC_MSG_WARN([cross compiling: cannot test])])
74         ],
75         [AC_MSG_RESULT(no)
76             CFLAGS="$saved_CFLAGS"
77             LDFLAGS="$saved_LDFLAGS"]
78     )])dnl
79
80 dnl FKO_CHECK_COMPILER_ARG_LDFLAGS_ONLY([COMPILER FLAG])
81 dnl
82 dnl Macro to check compiler support for the given compiler option.
83 dnl Adds to LDFLAGS only if supported.
84 dnl
85 AC_DEFUN([FKO_CHECK_COMPILER_ARG_LDFLAGS_ONLY], [
86     saved_LDFLAGS="$LDFLAGS"
87     LDFLAGS="$LDFLAGS $1 -Werror"
88     AC_MSG_CHECKING([if $CC supports $1])
89     AC_LINK_IFELSE(
90         [AC_LANG_SOURCE([
91 #include <stdio.h>
92 int main(void){char x[[256]]; snprintf(x, sizeof(x), "NNN"); return 0;}
93         ])],
94         [
95             LDFLAGS="$saved_LDFLAGS $1"
96             AC_RUN_IFELSE(
97                 [AC_LANG_SOURCE([
98 #include <stdio.h>
99 int main(void){char x[[256]]; snprintf(x, sizeof(x), "NNN"); return 0;}
100                 ])],
101                 [AC_MSG_RESULT(yes)],
102                 [AC_MSG_RESULT(no)
103                     LDFLAGS="$saved_LDFLAGS"],
104                 [AC_MSG_WARN([cross compiling: cannot test])])
105         ],
106         [AC_MSG_RESULT(no)
107             LDFLAGS="$saved_LDFLAGS"]
108     )])dnl
109
110 AC_GNU_SOURCE
111
112 AC_PROG_CC
113 AM_PROG_CC_C_O
114 AC_PROG_CPP
115 AC_PROG_AWK
116 AC_PROG_SED
117 AC_PROG_GREP
118 AC_PROG_INSTALL
119 AC_PROG_LN_S
120 AC_PROG_MAKE_SET
121 AC_PROG_LIBTOOL
122
123 dnl Decide whether or not to enable all warnings with -Wall
124 dnl
125 use_wall=yes
126 AC_ARG_ENABLE([wall],
127   [AS_HELP_STRING([--disable-wall],
128     [Do not enable all warnings via -Wall @<:@default is on@:>@])],
129   [use_wall=$enableval],
130   [])
131
132 if test "x$use_wall" = "xyes"; then
133     FKO_CHECK_COMPILER_ARG([-Wall])
134 fi
135
136 dnl Check for security features offered by the compiler
137
138 dnl -fstack-protector-all doesn't always work for some GCC versions
139 dnl and/or platforms, so we test if we can.  If it's not supported
140 dnl on a given platform gcc will emit a warning so we use -Werror.
141 dnl
142 dnl Decide whether or not to enable -fstack-protector
143 dnl
144 use_stack_protector=yes
145 AC_ARG_ENABLE([stack-protector],
146   [AS_HELP_STRING([--disable-stack-protector],
147     [Do not enable -fstack-protector @<:@default is on@:>@])],
148   [use_stack_protector=$enableval],
149   [])
150
151 if test "x$use_stack_protector" = "xyes"; then
152     FKO_CHECK_COMPILER_ARG([-fstack-protector-all -fstack-protector])
153 fi
154
155 dnl Decide whether or not to enable Position Independent Executable (PIE)
156 dnl support
157 dnl
158 use_pie=yes
159 AC_ARG_ENABLE([pie],
160   [AS_HELP_STRING([--disable-pie],
161     [Do not enable Position Independent Executable support @<:@default is on@:>@])],
162   [use_pie=$enableval],
163   [])
164
165 if test "x$use_pie" = "xyes"; then
166     FKO_CHECK_COMPILER_ARG([-fPIE -pie])
167 fi
168
169 dnl Decide whether or not to enable -D_FORTIFY_SOURCE support
170 dnl
171 use_fortify_source=yes
172 AC_ARG_ENABLE([fortify-source],
173   [AS_HELP_STRING([--disable-fortify-source],
174     [Do not enable -D_FORTIFY_SOURCE support @<:@default is on@:>@])],
175   [use_fortify_source=$enableval],
176   [])
177
178 if test "x$use_fortify_source" = "xyes"; then
179     FKO_CHECK_COMPILER_ARG([-D_FORTIFY_SOURCE=2])
180 fi
181
182 dnl Decide whether or not to use read-only relocations protection
183 dnl
184 use_ro_relocations=yes
185 AC_ARG_ENABLE([ro-relocations],
186   [AS_HELP_STRING([--disable-ro-relocations],
187     [Do not enable read-only relocations protection @<:@default is on@:>@])],
188   [use_ro_relocations=$enableval],
189   [])
190
191 if test "x$use_ro_relocations" = "xyes"; then
192     FKO_CHECK_COMPILER_ARG_LDFLAGS_ONLY([-Wl,-z,relro])
193 fi
194
195 dnl Decide whether or not to use immediate binding protection
196 dnl
197 use_immediate_binding=yes
198 AC_ARG_ENABLE([immediate-binding],
199   [AS_HELP_STRING([--disable-immediate-binding],
200     [Do not enable immediate binding protection @<:@default is on@:>@])],
201   [use_immediate_binding=$enableval],
202   [])
203
204 if test "x$use_immediate_binding" = "xyes"; then
205     FKO_CHECK_COMPILER_ARG_LDFLAGS_ONLY([-Wl,-z,now])
206 fi
207
208 # Checks for header files.
209 #
210 AC_HEADER_STDC
211 AC_HEADER_TIME
212 AC_HEADER_RESOLV
213
214 AC_CHECK_HEADERS([arpa/inet.h ctype.h endian.h errno.h locale.h netdb.h net/ethernet.h netinet/in.h stdint.h stdlib.h string.h strings.h sys/byteorder.h sys/endian.h sys/ethernet.h sys/socket.h sys/stat.h sys/time.h sys/wait.h termios.h time.h unistd.h])
215
216 # Type checks.
217 #
218 AC_C_CONST
219 AC_TYPE_INT8_T
220 AC_TYPE_INT16_T
221 AC_TYPE_INT32_T
222 AC_TYPE_INT64_T
223 AC_TYPE_UINT8_T
224 AC_TYPE_UINT16_T
225 AC_TYPE_UINT32_T
226 AC_TYPE_UINT64_T
227 AC_TYPE_OFF_T
228 AC_TYPE_PID_T
229 AC_TYPE_SIZE_T
230 AC_TYPE_SSIZE_T
231
232 AC_CHECK_SIZEOF(unsigned int)
233 dnl AC_CHECK_TYPES([uint8_t, uint32_t])
234
235 AC_C_BIGENDIAN
236
237 AC_SYS_LARGEFILE
238
239 # Checks for library functions.
240 #
241 AC_FUNC_MALLOC
242 AC_FUNC_REALLOC
243 AC_FUNC_STAT
244
245 AC_CHECK_FUNCS([bzero gettimeofday memmove memset socket strchr strcspn strdup strncasecmp strndup strrchr strspn])
246
247 AC_SEARCH_LIBS([socket], [socket])
248 AC_SEARCH_LIBS([inet_addr], [nsl])
249
250 case "$host" in
251 *-*-linux*)
252     ;;
253 *-*-openbsd*)
254     AC_DEFINE_UNQUOTED([PLATFORM_OPENBSD], [1], [Define if you are running on OpenBSD])
255     ;;
256 esac
257
258 dnl Decide whether or not to build the client
259 dnl
260 want_client=yes
261 AC_ARG_ENABLE([client],
262   [AS_HELP_STRING([--disable-client],
263     [Do not build the fwknop client @<:@default is to build@:>@])],
264   [want_client=$enableval],
265   [])
266 AM_CONDITIONAL([WANT_CLIENT], [test "$want_client" = yes])
267
268 dnl Decide whether or not to build the server
269 dnl
270 want_server=yes
271 AC_ARG_ENABLE([server],
272   [AS_HELP_STRING([--disable-server],
273     [Do not build the fwknop server @<:@default is to build@:>@])],
274   [want_server=$enableval],
275   [])
276 AM_CONDITIONAL([WANT_SERVER], [test "$want_server" = yes])
277
278 dnl Decide whether or not to enable the digest-cache
279 dnl
280 want_digest_cache=yes
281 AC_ARG_ENABLE([digest-cache],
282   [AS_HELP_STRING([--disable-digest-cache],
283     [Do not enable the fwknopd digest-cache @<:@default is to build@:>@])],
284   [want_digest_cache=$enableval],
285   [])
286 dnl AM_CONDITIONAL([WANT_DIGEST_CACHE], [test "$want_digest_cache" = yes])
287
288 dnl Decide whether or not to try to look for gdbm/ndbm (default to just
289 dnl use a file-based solution - reduces dependencies)
290 dnl
291 want_file_cache=yes
292 AC_ARG_ENABLE([file-cache],
293   [AS_HELP_STRING([--disable-file-cache],
294     [Replace file cache with gdbm/ndbm @<:@default on@:>@])],
295   [want_file_cache=$enableval],
296   [])
297 AS_IF([test "$want_file_cache" = yes], [
298     AC_DEFINE([USE_FILE_CACHE], [1], [Define this to enable non-gdbm/ndbm digest storing (eliminates gdbm/ndbm dependency).])
299 ])
300
301 # Check for 3rd-party libs
302 #
303 AC_ARG_WITH([gpgme],
304   [AS_HELP_STRING([--with-gpgme],
305     [support for gpg encryption using libgpgme @<:@default=check@:>@])],
306   [],
307   [with_gpgme=check])
308
309 have_gpgme=yes
310 AS_IF([test "x$with_gpgme" != xno],
311   [AM_PATH_GPGME([],
312     [AC_DEFINE([HAVE_LIBGPGME], [1], [Define if you have libgpgme])],
313     [if test "x$with_gpgme" != xcheck; then
314        AC_MSG_FAILURE(
315          [--with-gpgme was given, but test for gpgme failed])
316      else
317        have_gpgme=no
318      fi
319     ], [have_gpgme=no])], [have_gpgme=no])
320
321 dnl Add various common way to sbin dir to the path (just in case)
322   APP_PATH=$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/usr/local/sbin
323
324 dnl Check for gpg (not gpg2)
325 dnl
326 AC_ARG_WITH([gpg],
327   [AS_HELP_STRING([--with-gpg=/path/to/gpg],
328     [Specify path to the gpg executable that gpgme will use @<:@default=check path@:>@])],
329   [
330       AS_IF([ test "x$withval" = x -o "x$withval" = xyes -o "x$withval" = xno ],
331         [AC_MSG_ERROR([--with-gpg requires an argument specifying a path to gpg])],
332         [ GPG_EXE=$withval ]
333       )
334   ],
335   [
336       AC_PATH_PROG(GPG_EXE, [gpg], [], [$APP_PATH])
337   ]
338 )
339 AS_IF([test "x$GPG_EXE" != x],
340   [
341     AC_DEFINE_UNQUOTED([GPG_EXE], ["$GPG_EXE"], [Path to gpg executable])
342     gpg_exe=$GPG_EXE
343   ], [ gpg_exe="(not found)"]
344 )
345
346 if [test "$have_gpgme" = "yes" ]; then
347 case "$host" in
348 *-*-linux*)
349     ;;
350 *-*-freebsd*)
351     if [ test "x$CPPFLAGS" = "x" ] ; then
352         CPPFLAGS="-I/usr/local/include -I/usr/local/include/gpgme"
353     fi
354     if [ test "x$LDFLAGS" = "x" ] ; then
355         LDFLAGS="-L/usr/local/lib"
356     fi
357     ;;
358 esac
359 fi
360
361 dnl Check for libpcap, gdbm (or ndbm) if we are building the server component
362 dnl
363 AS_IF([test "$want_server" = yes], [
364     # Looking for libpcap
365     #
366     AC_CHECK_LIB([pcap],[pcap_open_live],
367       [ AC_DEFINE([HAVE_LIBPCAP], [1], [Define if you have libpcap]) ],
368       [ AC_MSG_ERROR([fwknopd needs libpcap])]
369     )
370
371   AS_IF([test "$want_digest_cache" = yes], [
372     use_ndbm=no
373     have_digest_cache=yes
374
375     AS_IF([test "$want_file_cache" = no], [
376
377       # Looking for gdbm or fallback to ndbm or bail
378       #
379       AC_CHECK_LIB([gdbm],[gdbm_open],
380           [
381               AC_DEFINE([HAVE_LIBGDBM], [1], [Define if you have libgdbm])
382           ],
383           [ AC_CHECK_LIB([ndbm],[dbm_open],
384               [
385                   AC_DEFINE([HAVE_LIBNDBM], [1], [Define if you have libndbm])
386                   use_ndbm=yes
387               ],
388               [ AC_CHECK_HEADER([ndbm.h],
389                   [ AC_CHECK_FUNC([dbm_open],
390                       [ AC_DEFINE([HAVE_LIBNDBM], [1], [Define if you have libndbm])],
391                       [
392                           AC_DEFINE([NO_DIGEST_CACHE], [1], [Define this to disable the digest cache for replay detection - not recommended.])
393                           AC_MSG_WARN([No DBM implementation found. Replay detection will be disabled.])
394                           have_digest_cache=no
395                       ]
396                   )]
397               )]
398           )]
399       )]
400     )],
401     [
402         AC_DEFINE([NO_DIGEST_CACHE], [1], [Define this to disable the digest cache for replay detection - not recommended.])
403         have_digest_cache=no
404     ]
405   )
406
407   AM_CONDITIONAL([USE_NDBM], [test x$use_ndbm = xyes])
408   AM_CONDITIONAL([CONFIG_FILE_CACHE], [test x$want_file_cache = xyes])
409
410 dnl Check for iptables
411 dnl
412   AC_ARG_WITH([iptables],
413     [AS_HELP_STRING([--with-iptables=/path/to/iptables],
414       [Specify path to the iptables executable @<:@default=check path@:>@])],
415     [
416       AS_IF([ test "x$withval" = xno ], [],
417         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
418           [AC_MSG_ERROR([--with-iptables requires an argument specifying a path to iptables])],
419           [ IPTABLES_EXE=$withval ]
420         )
421       )
422     ],
423     [
424       AC_PATH_PROG(IPTABLES_EXE, [iptables], [], [$APP_PATH])
425     ]
426   )
427
428 dnl Check for ipfw
429 dnl
430   AC_ARG_WITH([ipfw],
431     [AS_HELP_STRING([--with-ipfw=/path/to/ipfw],
432       [Specify path to the ipfw executable @<:@default=check path@:>@])],
433     [
434       AS_IF([ test "x$withval" = xno ], [],
435         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
436           [AC_MSG_ERROR([--with-ipfw requires an argument specifying a path to ipfw])],
437           [ IPFW_EXE=$withval ]
438         )
439       )
440     ],
441     [
442       AC_PATH_PROG(IPFW_EXE, [ipfw], [], [$APP_PATH])
443     ]
444   )
445
446 dnl Check for pf from OpenBSD
447 dnl
448   AC_ARG_WITH([pf],
449     [AS_HELP_STRING([--with-pf=/path/to/pfctl],
450       [Specify path to the pf executable @<:@default=check path@:>@])],
451     [
452       AS_IF([ test "x$withval" = xno ], [],
453         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
454           [AC_MSG_ERROR([--with-pf requires an argument specifying a path to pf])],
455           [ PF_EXE=$withval ]
456         )
457       )
458     ],
459     [
460       AC_PATH_PROG(PF_EXE, [pfctl], [], [$APP_PATH])
461     ]
462   )
463
464 dnl Check for ipf (ipfilter)
465 dnl
466   AC_ARG_WITH([ipf],
467     [AS_HELP_STRING([--with-ipf=/path/to/ipf],
468       [Specify path to the ipf executable @<:@default=check path@:>@])],
469     [
470       AS_IF([ test "x$withval" = xno ], [],
471         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
472           [AC_MSG_ERROR([--with-ipf requires an argument specifying a path to ipf])],
473           [ IPF_EXE=$withval ]
474         )
475       )
476     ],
477     [
478       AC_PATH_PROG(IPF_EXE, [ipf], [], [$APP_PATH])
479     ]
480   )
481
482 dnl Determine which firewall exe we use (if we have one).
483 dnl If iptables was found or specified, it wins, then we fallback to ipfw,
484 dnl then pf, and otherwise we try ipf.
485 dnl
486   AS_IF([test "x$IPTABLES_EXE" != x], [
487       FW_DEF="FW_IPTABLES"
488       FIREWALL_TYPE="iptables" 
489       FIREWALL_EXE=$IPTABLES_EXE
490       AC_DEFINE_UNQUOTED([FIREWALL_IPTABLES], [1], [The firewall type: iptables.])
491   ],[
492     AS_IF([test "x$IPFW_EXE" != x], [
493         FW_DEF="FW_IPFW"
494         FIREWALL_TYPE="ipfw" 
495         FIREWALL_EXE=$IPFW_EXE
496         AC_DEFINE_UNQUOTED([FIREWALL_IPFW], [1], [The firewall type: ipfw.])
497     ],[
498         AS_IF([test "x$PF_EXE" != x], [
499             FW_DEF="FW_PF"
500             FIREWALL_TYPE="pf"
501             FIREWALL_EXE=$PF_EXE
502             AC_DEFINE_UNQUOTED([FIREWALL_PF], [1], [The firewall type: pf.])
503         ],[
504             AS_IF([test "x$IPF_EXE" != x], [
505               AC_MSG_ERROR([Sorry - ipf was specified or the only one found, however, it is not supported yet.])
506               FIREWALL_TYPE="ipf" 
507               FIREWALL_EXE=$IPF_EXE
508               AC_DEFINE_UNQUOTED([FIREWALL_IPF], [1], [The firewall type: ipf.])
509           ], [AC_MSG_ERROR([No firewall program was found or specified.]) ]
510         ]
511     ]
512   ]
513   ))))
514
515   AC_DEFINE_UNQUOTED([FIREWALL_EXE], ["$FIREWALL_EXE"],
516     [Path to firewall command executable (it should match the firewall type).])
517
518   ],
519   [test "$want_server" = no], [
520     use_ndbm=no
521     AM_CONDITIONAL([USE_NDBM], [test x$use_ndbm = xno])
522     AM_CONDITIONAL([CONFIG_FILE_CACHE], [test x$use_ndbm = xno])
523   ]
524 )
525
526 AC_CONFIG_FILES([Makefile
527                  lib/Makefile
528                  client/Makefile
529                  server/Makefile
530                  common/Makefile
531                  doc/Makefile])
532
533 AC_OUTPUT
534
535 if [test "$have_gpgme" = "yes" ]; then
536     have_gpgme="$have_gpgme
537                   Gpgme engine:     $GPG_EXE"
538 fi
539
540 echo "
541     $PACKAGE_NAME-$PACKAGE_VERSION configuration.
542     ==========================================================
543         Client build:               $want_client
544         Server build:               $want_server
545         GPG encryption support:     $have_gpgme
546
547         Installation prefix:        $prefix
548 "
549 if [test "$want_server" = "yes" ]; then
550   echo "    Server support:
551         firewall type:              $FIREWALL_TYPE
552         firewall program path:      $FIREWALL_EXE
553 "
554
555     if [test "$want_digest_cache" = "no" ]; then
556         echo "    *WARNING*
557         The digest-cache functionality is not enabled.  This
558         could leave the fwknopd server open to replay attacks!
559 "
560     fi
561 fi