Test suite support for function coverage testing via gcov
[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])
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 build binaries with profiling coverage support
124 dnl
125 want_profile_coverage=no
126 AC_ARG_ENABLE([profile-coverage],
127   [AS_HELP_STRING([--enable-profile-coverage],
128     [Build fwknop binaries with profile coverage support @<:@default is to disable@:>@])],
129   [want_profile_coverage=$enableval],
130   [])
131
132 if test "x$want_profile_coverage" = "xyes"; then
133     CFLAGS="-g -O0"
134     FKO_CHECK_COMPILER_ARG([-fprofile-arcs -ftest-coverage -fno-inline])
135 fi
136
137 dnl Decide whether or not to enable all warnings with -Wall
138 dnl
139 use_wall=yes
140 AC_ARG_ENABLE([wall],
141   [AS_HELP_STRING([--disable-wall],
142     [Do not enable all warnings via -Wall @<:@default is on@:>@])],
143   [use_wall=$enableval],
144   [])
145
146 if test "x$use_wall" = "xyes"; then
147     FKO_CHECK_COMPILER_ARG([-Wall])
148 fi
149
150 dnl Check for security features offered by the compiler
151
152 dnl -fstack-protector-all doesn't always work for some GCC versions
153 dnl and/or platforms, so we test if we can.  If it's not supported
154 dnl on a given platform gcc will emit a warning so we use -Werror.
155 dnl
156 dnl Decide whether or not to enable -fstack-protector
157 dnl
158 use_stack_protector=yes
159 AC_ARG_ENABLE([stack-protector],
160   [AS_HELP_STRING([--disable-stack-protector],
161     [Do not enable -fstack-protector @<:@default is on@:>@])],
162   [use_stack_protector=$enableval],
163   [])
164
165 if test "x$use_stack_protector" = "xyes"; then
166     FKO_CHECK_COMPILER_ARG([-fstack-protector-all -fstack-protector])
167 fi
168
169 dnl Decide whether or not to enable Position Independent Executable (PIE)
170 dnl support
171 dnl
172 use_pie=yes
173 AC_ARG_ENABLE([pie],
174   [AS_HELP_STRING([--disable-pie],
175     [Do not enable Position Independent Executable support @<:@default is on@:>@])],
176   [use_pie=$enableval],
177   [])
178
179 if test "x$use_pie" = "xyes"; then
180     FKO_CHECK_COMPILER_ARG([-fPIE -pie])
181 fi
182
183 dnl Decide whether or not to enable -D_FORTIFY_SOURCE support
184 dnl
185 use_fortify_source=yes
186 AC_ARG_ENABLE([fortify-source],
187   [AS_HELP_STRING([--disable-fortify-source],
188     [Do not enable -D_FORTIFY_SOURCE support @<:@default is on@:>@])],
189   [use_fortify_source=$enableval],
190   [])
191
192 if test "x$use_fortify_source" = "xyes"; then
193     FKO_CHECK_COMPILER_ARG([-D_FORTIFY_SOURCE=2])
194 fi
195
196 dnl Decide whether or not to use read-only relocations protection
197 dnl
198 use_ro_relocations=yes
199 AC_ARG_ENABLE([ro-relocations],
200   [AS_HELP_STRING([--disable-ro-relocations],
201     [Do not enable read-only relocations protection @<:@default is on@:>@])],
202   [use_ro_relocations=$enableval],
203   [])
204
205 if test "x$use_ro_relocations" = "xyes"; then
206     FKO_CHECK_COMPILER_ARG_LDFLAGS_ONLY([-Wl,-z,relro])
207 fi
208
209 dnl Decide whether or not to use immediate binding protection
210 dnl
211 use_immediate_binding=yes
212 AC_ARG_ENABLE([immediate-binding],
213   [AS_HELP_STRING([--disable-immediate-binding],
214     [Do not enable immediate binding protection @<:@default is on@:>@])],
215   [use_immediate_binding=$enableval],
216   [])
217
218 if test "x$use_immediate_binding" = "xyes"; then
219     FKO_CHECK_COMPILER_ARG_LDFLAGS_ONLY([-Wl,-z,now])
220 fi
221
222 # Checks for header files.
223 #
224 AC_HEADER_STDC
225 AC_HEADER_TIME
226 AC_HEADER_RESOLV
227
228 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])
229
230 # Type checks.
231 #
232 AC_C_CONST
233 AC_TYPE_INT8_T
234 AC_TYPE_INT16_T
235 AC_TYPE_INT32_T
236 AC_TYPE_INT64_T
237 AC_TYPE_UINT8_T
238 AC_TYPE_UINT16_T
239 AC_TYPE_UINT32_T
240 AC_TYPE_UINT64_T
241 AC_TYPE_OFF_T
242 AC_TYPE_PID_T
243 AC_TYPE_SIZE_T
244 AC_TYPE_SSIZE_T
245
246 AC_CHECK_SIZEOF(unsigned int)
247 dnl AC_CHECK_TYPES([uint8_t, uint32_t])
248
249 AC_C_BIGENDIAN
250
251 AC_SYS_LARGEFILE
252
253 # Checks for library functions.
254 #
255 AC_FUNC_MALLOC
256 AC_FUNC_REALLOC
257 AC_FUNC_STAT
258
259 AC_CHECK_FUNCS([bzero gettimeofday memmove memset socket strchr strcspn strdup strncasecmp strndup strrchr strspn])
260
261 AC_SEARCH_LIBS([socket], [socket])
262 AC_SEARCH_LIBS([inet_addr], [nsl])
263
264 case "$host" in
265 *-*-linux*)
266     ;;
267 *-*-openbsd*)
268     AC_DEFINE_UNQUOTED([PLATFORM_OPENBSD], [1], [Define if you are running on OpenBSD])
269     ;;
270 esac
271
272 dnl Decide whether or not to build the client
273 dnl
274 want_client=yes
275 AC_ARG_ENABLE([client],
276   [AS_HELP_STRING([--disable-client],
277     [Do not build the fwknop client @<:@default is to build@:>@])],
278   [want_client=$enableval],
279   [])
280 AM_CONDITIONAL([WANT_CLIENT], [test "$want_client" = yes])
281
282 dnl Decide whether or not to build the server
283 dnl
284 want_server=yes
285 AC_ARG_ENABLE([server],
286   [AS_HELP_STRING([--disable-server],
287     [Do not build the fwknop server @<:@default is to build@:>@])],
288   [want_server=$enableval],
289   [])
290 AM_CONDITIONAL([WANT_SERVER], [test "$want_server" = yes])
291
292 dnl Decide whether or not to enable the digest-cache
293 dnl
294 want_digest_cache=yes
295 AC_ARG_ENABLE([digest-cache],
296   [AS_HELP_STRING([--disable-digest-cache],
297     [Do not enable the fwknopd digest-cache @<:@default is to build@:>@])],
298   [want_digest_cache=$enableval],
299   [])
300 dnl AM_CONDITIONAL([WANT_DIGEST_CACHE], [test "$want_digest_cache" = yes])
301
302 dnl Decide whether or not to try to look for gdbm/ndbm (default to just
303 dnl use a file-based solution - reduces dependencies)
304 dnl
305 want_file_cache=yes
306 AC_ARG_ENABLE([file-cache],
307   [AS_HELP_STRING([--disable-file-cache],
308     [Replace file cache with gdbm/ndbm @<:@default on@:>@])],
309   [want_file_cache=$enableval],
310   [])
311 AS_IF([test "$want_file_cache" = yes], [
312     AC_DEFINE([USE_FILE_CACHE], [1], [Define this to enable non-gdbm/ndbm digest storing (eliminates gdbm/ndbm dependency).])
313 ])
314
315 # Check for 3rd-party libs
316 #
317 AC_ARG_WITH([gpgme],
318   [AS_HELP_STRING([--with-gpgme],
319     [support for gpg encryption using libgpgme @<:@default=check@:>@])],
320   [],
321   [with_gpgme=check])
322
323 have_gpgme=yes
324 AS_IF([test "x$with_gpgme" != xno],
325   [AM_PATH_GPGME([],
326     [AC_DEFINE([HAVE_LIBGPGME], [1], [Define if you have libgpgme])],
327     [if test "x$with_gpgme" != xcheck; then
328        AC_MSG_FAILURE(
329          [--with-gpgme was given, but test for gpgme failed])
330      else
331        have_gpgme=no
332      fi
333     ], [have_gpgme=no])], [have_gpgme=no])
334
335 dnl Add various common way to sbin dir to the path (just in case)
336   APP_PATH=$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/usr/local/sbin
337
338 dnl Check for gpg (not gpg2)
339 dnl
340 AC_ARG_WITH([gpg],
341   [AS_HELP_STRING([--with-gpg=/path/to/gpg],
342     [Specify path to the gpg executable that gpgme will use @<:@default=check path@:>@])],
343   [
344       AS_IF([ test "x$withval" = x -o "x$withval" = xyes -o "x$withval" = xno ],
345         [AC_MSG_ERROR([--with-gpg requires an argument specifying a path to gpg])],
346         [ GPG_EXE=$withval ]
347       )
348   ],
349   [
350       AC_PATH_PROG(GPG_EXE, [gpg], [], [$APP_PATH])
351   ]
352 )
353 AS_IF([test "x$GPG_EXE" != x],
354   [
355     AC_DEFINE_UNQUOTED([GPG_EXE], ["$GPG_EXE"], [Path to gpg executable])
356     gpg_exe=$GPG_EXE
357   ], [ gpg_exe="(not found)"]
358 )
359
360 if [test "$have_gpgme" = "yes" ]; then
361 case "$host" in
362 *-*-linux*)
363     ;;
364 *-*-freebsd*)
365     if [ test "x$CPPFLAGS" = "x" ] ; then
366         CPPFLAGS="-I/usr/local/include -I/usr/local/include/gpgme"
367     fi
368     if [ test "x$LDFLAGS" = "x" ] ; then
369         LDFLAGS="-L/usr/local/lib"
370     fi
371     ;;
372 esac
373 fi
374
375 dnl Check for libpcap, gdbm (or ndbm) if we are building the server component
376 dnl
377 AS_IF([test "$want_server" = yes], [
378     # Looking for libpcap
379     #
380     AC_CHECK_LIB([pcap],[pcap_open_live],
381       [ AC_DEFINE([HAVE_LIBPCAP], [1], [Define if you have libpcap]) ],
382       [ AC_MSG_ERROR([fwknopd needs libpcap])]
383     )
384
385   AS_IF([test "$want_digest_cache" = yes], [
386     use_ndbm=no
387     have_digest_cache=yes
388
389     AS_IF([test "$want_file_cache" = no], [
390
391       # Looking for gdbm or fallback to ndbm or bail
392       #
393       AC_CHECK_LIB([gdbm],[gdbm_open],
394           [
395               AC_DEFINE([HAVE_LIBGDBM], [1], [Define if you have libgdbm])
396           ],
397           [ AC_CHECK_LIB([ndbm],[dbm_open],
398               [
399                   AC_DEFINE([HAVE_LIBNDBM], [1], [Define if you have libndbm])
400                   use_ndbm=yes
401               ],
402               [ AC_CHECK_HEADER([ndbm.h],
403                   [ AC_CHECK_FUNC([dbm_open],
404                       [ AC_DEFINE([HAVE_LIBNDBM], [1], [Define if you have libndbm])],
405                       [
406                           AC_DEFINE([NO_DIGEST_CACHE], [1], [Define this to disable the digest cache for replay detection - not recommended.])
407                           AC_MSG_WARN([No DBM implementation found. Replay detection will be disabled.])
408                           have_digest_cache=no
409                       ]
410                   )]
411               )]
412           )]
413       )]
414     )],
415     [
416         AC_DEFINE([NO_DIGEST_CACHE], [1], [Define this to disable the digest cache for replay detection - not recommended.])
417         have_digest_cache=no
418     ]
419   )
420
421   AM_CONDITIONAL([USE_NDBM], [test x$use_ndbm = xyes])
422   AM_CONDITIONAL([CONFIG_FILE_CACHE], [test x$want_file_cache = xyes])
423
424 dnl Check for iptables
425 dnl
426   AC_ARG_WITH([iptables],
427     [AS_HELP_STRING([--with-iptables=/path/to/iptables],
428       [Specify path to the iptables executable @<:@default=check path@:>@])],
429     [
430       AS_IF([ test "x$withval" = xno ], [],
431         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
432           [AC_MSG_ERROR([--with-iptables requires an argument specifying a path to iptables])],
433           [ IPTABLES_EXE=$withval ]
434         )
435       )
436     ],
437     [
438       AC_PATH_PROG(IPTABLES_EXE, [iptables], [], [$APP_PATH])
439     ]
440   )
441
442 dnl Check for ipfw
443 dnl
444   AC_ARG_WITH([ipfw],
445     [AS_HELP_STRING([--with-ipfw=/path/to/ipfw],
446       [Specify path to the ipfw executable @<:@default=check path@:>@])],
447     [
448       AS_IF([ test "x$withval" = xno ], [],
449         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
450           [AC_MSG_ERROR([--with-ipfw requires an argument specifying a path to ipfw])],
451           [ IPFW_EXE=$withval ]
452         )
453       )
454     ],
455     [
456       AC_PATH_PROG(IPFW_EXE, [ipfw], [], [$APP_PATH])
457     ]
458   )
459
460 dnl Check for pf from OpenBSD
461 dnl
462   AC_ARG_WITH([pf],
463     [AS_HELP_STRING([--with-pf=/path/to/pfctl],
464       [Specify path to the pf executable @<:@default=check path@:>@])],
465     [
466       AS_IF([ test "x$withval" = xno ], [],
467         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
468           [AC_MSG_ERROR([--with-pf requires an argument specifying a path to pf])],
469           [ PF_EXE=$withval ]
470         )
471       )
472     ],
473     [
474       AC_PATH_PROG(PF_EXE, [pfctl], [], [$APP_PATH])
475     ]
476   )
477
478 dnl Check for ipf (ipfilter)
479 dnl
480   AC_ARG_WITH([ipf],
481     [AS_HELP_STRING([--with-ipf=/path/to/ipf],
482       [Specify path to the ipf executable @<:@default=check path@:>@])],
483     [
484       AS_IF([ test "x$withval" = xno ], [],
485         AS_IF([ test "x$withval" = x -o "x$withval" = xyes ],
486           [AC_MSG_ERROR([--with-ipf requires an argument specifying a path to ipf])],
487           [ IPF_EXE=$withval ]
488         )
489       )
490     ],
491     [
492       AC_PATH_PROG(IPF_EXE, [ipf], [], [$APP_PATH])
493     ]
494   )
495
496 dnl Determine which firewall exe we use (if we have one).
497 dnl If iptables was found or specified, it wins, then we fallback to ipfw,
498 dnl then pf, and otherwise we try ipf.
499 dnl
500   AS_IF([test "x$IPTABLES_EXE" != x], [
501       FW_DEF="FW_IPTABLES"
502       FIREWALL_TYPE="iptables" 
503       FIREWALL_EXE=$IPTABLES_EXE
504       AC_DEFINE_UNQUOTED([FIREWALL_IPTABLES], [1], [The firewall type: iptables.])
505   ],[
506     AS_IF([test "x$IPFW_EXE" != x], [
507         FW_DEF="FW_IPFW"
508         FIREWALL_TYPE="ipfw" 
509         FIREWALL_EXE=$IPFW_EXE
510         AC_DEFINE_UNQUOTED([FIREWALL_IPFW], [1], [The firewall type: ipfw.])
511     ],[
512         AS_IF([test "x$PF_EXE" != x], [
513             FW_DEF="FW_PF"
514             FIREWALL_TYPE="pf"
515             FIREWALL_EXE=$PF_EXE
516             AC_DEFINE_UNQUOTED([FIREWALL_PF], [1], [The firewall type: pf.])
517         ],[
518             AS_IF([test "x$IPF_EXE" != x], [
519               AC_MSG_ERROR([Sorry - ipf was specified or the only one found, however, it is not supported yet.])
520               FIREWALL_TYPE="ipf" 
521               FIREWALL_EXE=$IPF_EXE
522               AC_DEFINE_UNQUOTED([FIREWALL_IPF], [1], [The firewall type: ipf.])
523           ], [AC_MSG_ERROR([No firewall program was found or specified.]) ]
524         ]
525     ]
526   ]
527   ))))
528
529   AC_DEFINE_UNQUOTED([FIREWALL_EXE], ["$FIREWALL_EXE"],
530     [Path to firewall command executable (it should match the firewall type).])
531
532   ],
533   [test "$want_server" = no], [
534     use_ndbm=no
535     AM_CONDITIONAL([USE_NDBM], [test x$use_ndbm = xno])
536     AM_CONDITIONAL([CONFIG_FILE_CACHE], [test x$use_ndbm = xno])
537   ]
538 )
539
540 AC_CONFIG_FILES([Makefile
541                  lib/Makefile
542                  client/Makefile
543                  server/Makefile
544                  common/Makefile
545                  doc/Makefile])
546
547 AC_OUTPUT
548
549 if [test "$have_gpgme" = "yes" ]; then
550     have_gpgme="$have_gpgme
551                   Gpgme engine:     $GPG_EXE"
552 fi
553
554 echo "
555     $PACKAGE_NAME-$PACKAGE_VERSION configuration.
556     ==========================================================
557         Client build:               $want_client
558         Server build:               $want_server
559         GPG encryption support:     $have_gpgme
560
561         Installation prefix:        $prefix
562 "
563 if [test "$want_server" = "yes" ]; then
564   echo "    Server support:
565         firewall type:              $FIREWALL_TYPE
566         firewall program path:      $FIREWALL_EXE
567 "
568
569     if [test "$want_digest_cache" = "no" ]; then
570         echo "    *WARNING*
571         The digest-cache functionality is not enabled.  This
572         could leave the fwknopd server open to replay attacks!
573 "
574     fi
575 fi