Fix compiling when support for UML sockets is enabled.
[oweals/tinc.git] / 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     cygwin=true
69     AC_DEFINE(HAVE_CYGWIN, 1, [Cygwin])
70   ;;
71   *mingw*)
72     mingw=true
73     AC_DEFINE(HAVE_MINGW, 1, [MinGW])
74     LIBS="$LIBS -lws2_32 -lgdi32 -lcrypt32 -liphlpapi"
75     LDFLAGS="$LDFLAGS -static"
76     CPPFLAGS="$CPPFLAGS -DMINIUPNP_STATICLIB"
77   ;;
78   *)
79     AC_MSG_ERROR("Unknown operating system.")
80   ;;
81 esac
82
83 AC_ARG_ENABLE(uml,
84   AS_HELP_STRING([--enable-uml], [enable support for User Mode Linux]),
85   [ AS_IF([test "x$enable_uml" = "xyes"],
86       [ AC_DEFINE(ENABLE_UML, 1, [Support for UML])
87         uml=true
88       ],
89       [uml=false])
90   ],
91   [uml=false]
92 )
93
94 AC_ARG_ENABLE(vde,
95   AS_HELP_STRING([--enable-vde], [enable support for Virtual Distributed Ethernet]),
96   [ AS_IF([test "x$enable_vde" = "xyes"],
97       [ AC_CHECK_HEADERS(libvdeplug_dyn.h, [], [AC_MSG_ERROR([VDE plug header files not found.]); 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])
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(__warn_unused_result__)
185
186 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], , ,
187   [#include "$srcdir/src/have.h"]
188 )
189
190 dnl Checks for library functions.
191 AC_TYPE_SIGNAL
192 AC_CHECK_FUNCS([asprintf daemon fchmod flock fork gettimeofday mlockall putenv recvmmsg strsignal nanosleep unsetenv vsyslog devname fdevname],
193   [], [], [#include "$srcdir/src/have.h"]
194 )
195
196 AC_CHECK_FUNC(getopt_long, [getopt=true; AC_DEFINE(HAVE_GETOPT_LONG, 1, [getopt_long()])], [getopt=false])
197 AM_CONDITIONAL(GETOPT, test "$getopt" = true)
198
199 AC_CHECK_DECLS([res_init], [AC_CHECK_LIB(resolv, res_init)], [], [
200   #include <netinet/in.h>
201   #include <resolv.h>
202 ])
203
204 dnl Operating system specific checks
205 case $host_os in
206   *linux*)
207     AC_CHECK_HEADERS([linux/if_tun.h],
208       [], [AC_MSG_ERROR([Required header file missng])], [#include "$srcdir/src/have.h"]
209     )
210   ;;
211   *bsd*|*dragonfly*|*darwin*)
212     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],
213       [], [], [#include "$srcdir/src/have.h"]
214     )
215   ;;
216   *solaris*)
217     AC_CHECK_FUNC(socket, [], [AC_CHECK_LIB(socket, connect)])
218   ;;
219   *)
220   ;;
221 esac
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 dnl Ensure runstatedir is set if we are using a version of autoconf that does not suppport it
264 if test "x$runstatedir" = "x"; then
265   AC_SUBST([runstatedir], ['${localstatedir}/run'])
266 fi
267
268 AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile gui/Makefile test/Makefile systemd/Makefile])
269
270 AC_OUTPUT