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