Use auto-clone device /dev/{tun,tap} as default on FreeBSD/DragonFly
[tinc] / configure.ac
1 dnl Process this file with autoconf to produce a configure script.
2
3 origcflags="$CFLAGS"
4
5 AC_PREREQ(2.61)
6 AC_INIT([tinc], m4_esyscmd_s((git describe || echo UNKNOWN) | sed 's/release-//'))
7 AC_CONFIG_SRCDIR([src/tincd.c])
8 AM_INIT_AUTOMAKE([std-options subdir-objects nostdinc silent-rules -Wall])
9 AC_CONFIG_HEADERS([config.h])
10 AC_CONFIG_MACRO_DIR([m4])
11 AM_SILENT_RULES([yes])
12
13 # Enable GNU extensions.
14 # Define this here, not in acconfig's @TOP@ section, since definitions
15 # in the latter don't make it into the configure-time tests.
16 AC_GNU_SOURCE
17 AC_DEFINE([__USE_BSD], 1, [Enable BSD extensions])
18
19 dnl Checks for programs.
20 AC_PROG_CC_C99
21 AC_PROG_CPP
22 AC_PROG_INSTALL
23 AM_PROG_CC_C_O
24
25 dnl Check whether to enable code coverage testing, and if so, clear the default CFLAGS.
26 AX_CODE_COVERAGE
27 AS_IF([test "x$enable_code_coverage" = "xyes" -a "x$origcflags" = "x"], [CFLAGS=""])
28
29 dnl Check and set OS
30
31 AC_CANONICAL_HOST
32
33 case $host_os in
34   *linux*)
35     linux=true
36     AC_DEFINE(HAVE_LINUX, 1, [Linux])
37   ;;
38   *freebsd*)
39     bsd=true
40     AC_DEFINE(HAVE_FREEBSD, 1, [FreeBSD])
41   ;;
42   *darwin*)
43     bsd=true
44     AC_DEFINE(HAVE_DARWIN, 1, [Darwin (MacOS/X)])
45   ;;
46   *solaris*)
47     solaris=true
48     AC_DEFINE(HAVE_SOLARIS, 1, [Solaris/SunOS])
49   ;;
50   *openbsd*)
51     bsd=true
52     AC_DEFINE(HAVE_OPENBSD, 1, [OpenBSD])
53   ;;
54   *netbsd*)
55     bsd=true
56     AC_DEFINE(HAVE_NETBSD, 1, [NetBSD])
57   ;;
58   *dragonfly*)
59     bsd=true
60     AC_DEFINE(HAVE_DRAGONFLY, 1, [DragonFly])
61   ;;
62   *bsd*)
63     bsd=true
64     AC_MSG_WARN("Unknown BSD variant, tinc might not compile or work!")
65     AC_DEFINE(HAVE_BSD, 1, [Unknown BSD variant])
66   ;;
67   *cygwin*)
68     AC_MSG_ERROR("Cygwin is no longer supported. Use MinGW to build native Windows binaries.")
69   ;;
70   *mingw*)
71     mingw=true
72     AC_DEFINE(HAVE_MINGW, 1, [MinGW])
73     LIBS="$LIBS -lws2_32 -lgdi32 -lcrypt32 -liphlpapi"
74     LDFLAGS="$LDFLAGS -static"
75     CPPFLAGS="$CPPFLAGS -DMINIUPNP_STATICLIB"
76   ;;
77   *)
78     AC_MSG_ERROR("Unknown operating system.")
79   ;;
80 esac
81
82 AC_ARG_ENABLE(uml,
83   AS_HELP_STRING([--enable-uml], [enable support for User Mode Linux]),
84   [ AS_IF([test "x$enable_uml" = "xyes"],
85       [ AC_DEFINE(ENABLE_UML, 1, [Support for UML])
86         uml=true
87       ],
88       [uml=false])
89   ],
90   [uml=false]
91 )
92
93 AC_ARG_ENABLE(vde,
94   AS_HELP_STRING([--enable-vde], [enable support for Virtual Distributed Ethernet]),
95   [ AS_IF([test "x$enable_vde" = "xyes"],
96       [ AC_CHECK_HEADERS(libvdeplug_dyn.h, [], [AC_MSG_ERROR([VDE plug header files not found.]); break])
97         AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"], [AC_MSG_ERROR([VDE plug depends on libdl.]); break])
98         AC_DEFINE(ENABLE_VDE, 1, [Support for VDE])
99         vde=true
100       ],
101       [vde=false])
102   ],
103   [vde=false]
104 )
105
106 AC_ARG_ENABLE(tunemu,
107   AS_HELP_STRING([--enable-tunemu], [enable support for the tunemu driver]),
108   [ AS_IF([test "x$enable_tunemu" = "xyes"],
109       [ AC_DEFINE(ENABLE_TUNEMU, 1, [Support for tunemu])
110         tunemu=true
111       ],
112       [tunemu=false])
113   ],
114   [tunemu=false]
115 )
116
117 AC_ARG_WITH(systemd,
118   AS_HELP_STRING([--with-systemd@<:@=DIR@:>@], [install systemd service files @<:@to DIR if specified@:>@]),
119   [ systemd=true; systemd_path="$with_systemd" ],
120   [ systemd=false ]
121 )
122
123 AS_IF([test "x$with_systemd" = "xyes"], [systemd_path="\${libdir}/systemd/system"],
124       [AS_IF([test "x$with_systemd" = "xno"], [systemd=false])])
125
126 AC_SUBST(systemd_path, $systemd_path)
127
128 AM_CONDITIONAL(LINUX, test "$linux" = true)
129 AM_CONDITIONAL(BSD, test "$bsd" = true)
130 AM_CONDITIONAL(SOLARIS, test "$solaris" = true)
131 AM_CONDITIONAL(MINGW, test "$mingw" = true)
132 AM_CONDITIONAL(CYGWIN, test "$cygwin" = true)
133 AM_CONDITIONAL(UML, test "$uml" = true)
134 AM_CONDITIONAL(VDE, test "$vde" = true)
135 AM_CONDITIONAL(TUNEMU, test "$tunemu" = true)
136 AM_CONDITIONAL(WITH_SYSTEMD, test "$systemd" = true)
137
138 AC_CACHE_SAVE
139
140 AS_IF([test -d /sw/include], [CPPFLAGS="$CPPFLAGS -I/sw/include"])
141 AS_IF([test -d /sw/lib], [LIBS="$LIBS -L/sw/lib"])
142
143 dnl Compiler hardening flags
144 dnl No -fstack-protector-all because it doesn't work on all platforms or architectures.
145
146 AX_CFLAGS_WARN_ALL(CFLAGS)
147
148 AC_ARG_ENABLE([hardening], AS_HELP_STRING([--disable-hardening], [disable compiler and linker hardening flags]))
149 AS_IF([test "x$enable_hardening" != "xno"],
150   [AX_CHECK_COMPILE_FLAG([-DFORTIFY_SOURCE=2], [CPPFLAGS="$CPPFLAGS -DFORTIFY_SOURCE=2"])
151    AX_CHECK_COMPILE_FLAG([-fwrapv], [CPPFLAGS="$CPPFLAGS -fwrapv"],
152    AX_CHECK_COMPILE_FLAG([-fno-strict-overflow], [CPPFLAGS="$CPPFLAGS -fno-strict-overflow"]))
153    case $host_os in
154      *mingw*)
155        AX_CHECK_LINK_FLAG([-Wl,--dynamicbase], [LDFLAGS="$LDFLAGS -Wl,--dynamicbase"])
156        AX_CHECK_LINK_FLAG([-Wl,--nxcompat], [LDFLAGS="$LDFLAGS -Wl,--nxcompat"])
157        ;;
158      *)
159        AX_CHECK_COMPILE_FLAG([-fPIE], [CPPFLAGS="$CPPFLAGS -fPIE"])
160        AX_CHECK_LINK_FLAG([-pie], [LDFLAGS="$LDFLAGS -pie"])
161        ;;
162    esac
163    AX_CHECK_LINK_FLAG([-Wl,-z,relro], [LDFLAGS="$LDFLAGS -Wl,-z,relro"])
164    AX_CHECK_LINK_FLAG([-Wl,-z,now], [LDFLAGS="$LDFLAGS -Wl,-z,now"])
165   ]
166 );
167
168 dnl Checks for header files.
169 dnl We do this in multiple stages, because unlike Linux all the other operating systems really suck and don't include their own dependencies.
170
171 AC_CHECK_HEADERS([syslog.h sys/file.h sys/ioctl.h sys/mman.h sys/param.h sys/resource.h sys/socket.h sys/time.h sys/un.h sys/wait.h netdb.h arpa/inet.h dirent.h getopt.h stddef.h])
172 AC_CHECK_HEADERS([net/if.h net/if_types.h net/ethernet.h net/if_arp.h netinet/in_systm.h netinet/in.h netinet/in6.h netpacket/packet.h],
173   [], [], [#include "$srcdir/src/have.h"]
174 )
175 AC_CHECK_HEADERS([netinet/if_ether.h netinet/ip.h netinet/ip6.h resolv.h],
176   [], [], [#include "$srcdir/src/have.h"]
177 )
178 AC_CHECK_HEADERS([netinet/tcp.h netinet/ip_icmp.h netinet/icmp6.h],
179   [], [], [#include "$srcdir/src/have.h"]
180 )
181
182 dnl Checks for typedefs, structures, and compiler characteristics.
183 tinc_ATTRIBUTE(__malloc__)
184 tinc_ATTRIBUTE(__nonnull__)
185 tinc_ATTRIBUTE(__warn_unused_result__)
186
187 AC_CHECK_TYPES([struct ether_header, struct arphdr, struct ether_arp, struct ip, struct icmp, struct ip6_hdr, struct icmp6_hdr, struct nd_neighbor_solicit, struct nd_opt_hdr], , ,
188   [#include "$srcdir/src/have.h"]
189 )
190
191 dnl Checks for library functions.
192 AC_TYPE_SIGNAL
193 AC_CHECK_FUNCS([asprintf daemon fchmod flock fork gettimeofday mlockall putenv recvmmsg strsignal nanosleep unsetenv vsyslog devname fdevname],
194   [], [], [#include "$srcdir/src/have.h"]
195 )
196
197 AC_CHECK_FUNC(getopt_long, [getopt=true; AC_DEFINE(HAVE_GETOPT_LONG, 1, [getopt_long()])], [getopt=false])
198 AM_CONDITIONAL(GETOPT, test "$getopt" = true)
199
200 AC_CHECK_DECLS([res_init], [AC_CHECK_LIB(resolv, res_init)], [], [
201   #include <netinet/in.h>
202   #include <resolv.h>
203 ])
204
205 dnl Operating system specific checks
206 case $host_os in
207   *linux*)
208     AC_CHECK_HEADERS([linux/if_tun.h],
209       [], [AC_MSG_ERROR([Required header file missng])], [#include "$srcdir/src/have.h"]
210     )
211   ;;
212   *bsd*|*dragonfly*|*darwin*)
213     AC_CHECK_HEADERS([net/if_tun.h net/if_utun.h net/tun/if_tun.h net/if_tap.h net/tap/if_tap.h],
214       [], [], [#include "$srcdir/src/have.h"]
215     )
216   ;;
217   *solaris*)
218     AC_CHECK_FUNC(socket, [], [AC_CHECK_LIB(socket, connect)])
219   ;;
220   *)
221   ;;
222 esac
223
224 AC_CACHE_SAVE
225
226 AC_ARG_ENABLE(legacy-protocol,
227   AS_HELP_STRING([--disable-legacy-protocol], [disable support for the legacy (tinc 1.0) protocol]),
228   [ AS_IF([test "x$enable_legacy_protocol" = "xno"],
229     [ AC_DEFINE(DISABLE_LEGACY, 1, [Disable support for the legacy (tinc 1.0) protocol]) ])
230   ]
231 )
232
233 dnl These are defined in files in m4/
234
235 dnl AC_ARG_WITH(libgcrypt, AC_HELP_STRING([--with-libgcrypt], [enable use of libgcrypt instead of OpenSSL])], [])
236 dnl AC_ARG_WITH(openssl, AC_HELP_STRING([--without-openssl], [disable support for OpenSSL])], [])
237
238 tinc_CURSES
239 tinc_READLINE
240 tinc_ZLIB
241 tinc_LZO
242
243 AS_IF([test "x$enable_legacy_protocol" != "xno"],
244       [AS_IF([test -n "$with_libgcrypt"],
245              [gcrypt=true; tinc_LIBGCRYPT],
246              [openssl=true; tinc_OPENSSL])
247       ]
248 )
249
250 AM_CONDITIONAL(OPENSSL, test -n "$openssl")
251 AM_CONDITIONAL(GCRYPT, test -n "$gcrypt")
252
253 tinc_MINIUPNPC
254 AM_CONDITIONAL(MINIUPNPC, test "x$enable_miniupnpc" = "xyes")
255
256 dnl Check if support for jumbograms is requested
257 AC_ARG_ENABLE(jumbograms,
258   AS_HELP_STRING([--enable-jumbograms], [enable support for jumbograms (packets up to 9000 bytes)]),
259   [ AS_IF([test "x$enable_jumbograms" = "xyes"],
260       [ AC_DEFINE(ENABLE_JUMBOGRAMS, 1, [Support for jumbograms (packets up to 9000 bytes)]) ])
261   ]
262 )
263
264 dnl Ensure runstatedir is set if we are using a version of autoconf that does not support it
265 if test "x$runstatedir" = "x"; then
266   AC_SUBST([runstatedir], ['${localstatedir}/run'])
267 fi
268
269 AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile test/Makefile test/testlib.sh systemd/Makefile bash_completion.d/Makefile])
270
271 AC_OUTPUT