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