Fix for botched cherry-pick commit 60fb230.
[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])
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 dnl Support for SunOS
206
207 AC_CHECK_FUNC(socket, [], [
208   AC_CHECK_LIB(socket, connect)
209 ])
210 AC_CHECK_FUNC(gethostbyname, [], [
211   AC_CHECK_LIB(nsl, gethostbyname)
212 ])
213
214 AC_CHECK_DECLS([freeaddrinfo, gai_strerror, getaddrinfo, getnameinfo],
215   [], [], [#include "$srcdir/src/have.h"]
216 )
217
218 AC_CHECK_DECLS([res_init], [AC_CHECK_LIB(resolv, res_init)], [], [
219   #include <netinet/in.h>
220   #include <resolv.h>
221 ])
222
223 AC_CACHE_SAVE
224
225 AC_ARG_ENABLE(legacy-protocol,
226   AS_HELP_STRING([--disable-legacy-protocol], [disable support for the legacy (tinc 1.0) protocol]),
227   [ AS_IF([test "x$enable_legacy_protocol" = "xno"],
228     [ AC_DEFINE(DISABLE_LEGACY, 1, [Disable support for the legacy (tinc 1.0) protocol]) ])
229   ]
230 )
231
232 dnl These are defined in files in m4/
233
234 dnl AC_ARG_WITH(libgcrypt, AC_HELP_STRING([--with-libgcrypt], [enable use of libgcrypt instead of OpenSSL])], [])
235 dnl AC_ARG_WITH(openssl, AC_HELP_STRING([--without-openssl], [disable support for OpenSSL])], [])
236
237 tinc_CURSES
238 tinc_READLINE
239 tinc_ZLIB
240 tinc_LZO
241
242 AS_IF([test "x$enable_legacy_protocol" != "xno"],
243       [AS_IF([test -n "$with_libgcrypt"],
244              [gcrypt=true; tinc_LIBGCRYPT],
245              [openssl=true; tinc_OPENSSL])
246       ]
247 )
248
249 AM_CONDITIONAL(OPENSSL, test -n "$openssl")
250 AM_CONDITIONAL(GCRYPT, test -n "$gcrypt")
251
252 tinc_MINIUPNPC
253 AM_CONDITIONAL(MINIUPNPC, test "x$enable_miniupnpc" = "xyes")
254
255 dnl Check if support for jumbograms is requested
256 AC_ARG_ENABLE(jumbograms,
257   AS_HELP_STRING([--enable-jumbograms], [enable support for jumbograms (packets up to 9000 bytes)]),
258   [ AS_IF([test "x$enable_jumbograms" = "xyes"],
259       [ AC_DEFINE(ENABLE_JUMBOGRAMS, 1, [Support for jumbograms (packets up to 9000 bytes)]) ])
260   ]
261 )
262
263 AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile gui/Makefile test/Makefile systemd/Makefile])
264
265 AC_OUTPUT