configure, netsniff-ng: make netsniff-ng's geoip dependency optional
[netsniff-ng.git] / configure
blob53b5d03beeb73d79fded6ff383175c092e6ba8ec
1 #!/bin/bash
2 # This isn't a configure generated by autoconf!
3 # netsniff-ng build system
4 # Copyright 2013 Tobias Klauser <tklauser@distanz.ch>
5 # Copyright 2013 Daniel Borkmann <borkmann@gnumaniacs.org>
6 # Subject to the GNU GPL, version 2.
8 MISSING_PKG_CONFIG=0
9 MISSING_DEFS=0
10 MISSING_NACL=0
12 TOOLS="netsniff-ng trafgen astraceroute flowtop ifpps bpfc curvetun mausezahn"
13 TOOLS_NOBUILD=""
15 HAVE_LIBPCAP=0
16 HAVE_HWTSTAMP=0
17 HAVE_LIBGEOIP=0
19 [ -z $CC ] && CC=cc
21 TMPDIR=$(mktemp -d config.XXXXXX)
22 trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM
24 tools_remove()
26 local _tools=$TOOLS
27 TOOLS=""
28 for tool in $_tools ; do
29 case "$tool" in
30 $1)
31 m=`expr match \"$TOOLS_NOBUILD\" '$1'`
32 if [ "$m" == "0" ] ; then
33 TOOLS_NOBUILD="$TOOLS_NOBUILD $tool"
36 *) TOOLS="$TOOLS $tool" ;;
37 esac
38 done
40 TOOLS=${TOOLS# }
41 TOOLS_NOBUILD=${TOOLS_NOBUILD# }
44 check_pkg_config()
46 echo -n "[*] Checking pkg-config ... "
48 if [ "x$(which pkg-config)" == "x" ] ; then
49 echo "[NO]"
50 MISSING_PKG_CONFIG=1
51 else
52 echo "[YES]"
56 check_ccache()
58 echo -n "[*] Checking ccache ... "
60 if [ "x$(which ccache)" == "x" ] ; then
61 echo "[NO]"
62 echo "CONFIG_CCACHE=" >> Config
63 else
64 echo "[YES]"
65 echo "CONFIG_CCACHE=ccache" >> Config
69 check_flex()
71 echo -n "[*] Checking flex ... "
73 if [ "x$(which flex)" == "x" ] ; then
74 echo "[NO]"
75 MISSING_DEFS=1
76 tools_remove "trafgen"
77 tools_remove "bpfc"
78 else
79 echo "[YES]"
83 check_bison()
85 echo -n "[*] Checking bison ... "
87 if [ "x$(which bison)" == "x" ] ; then
88 echo "[NO]"
89 MISSING_DEFS=1
90 tools_remove "trafgen"
91 tools_remove "bpfc"
92 else
93 echo "[YES]"
97 check_nacl()
99 echo -n "[*] Checking nacl ... "
101 cat > $TMPDIR/nacltest.c << EOF
102 #include "crypto_hash_sha512.h"
103 #include "crypto_verify_32.h"
104 #include "crypto_hash_sha512.h"
105 #include "crypto_box_curve25519xsalsa20poly1305.h"
106 #include "crypto_scalarmult_curve25519.h"
107 #include "crypto_auth_hmacsha512256.h"
109 int main(void) { }
112 if [ -z $NACL_INC_DIR ] ; then
113 NACL_INC_DIR="/usr/include/nacl"
116 if [ -z $NACL_LIB_DIR ] ; then
117 NACL_LIB_DIR="/usr/lib"
120 LDFLAGS="-L $NACL_LIB_DIR"
121 CFLAGS="-I $NACL_INC_DIR"
123 $CC $CFLAGS $LDFLAGS -o $TMPDIR/nacltest $TMPDIR/nacltest.c >> $TMPDIR/config.log 2>&1
124 if [ ! -x $TMPDIR/nacltest ] ; then
125 echo "[NO]"
126 MISSING_NACL=1
127 tools_remove "curvetun"
128 else
129 echo "[YES]"
130 echo "CONFIG_NACL_INC_DIR:=$NACL_INC_DIR" >> Config
131 echo "CONFIG_NACL_LIB_DIR:=$NACL_LIB_DIR" >> Config
135 check_libnl()
137 echo -n "[*] Checking libnl ... "
139 cat > $TMPDIR/libnltest.c << EOF
140 #include <libnl3/netlink/genl/genl.h>
141 #include <libnl3/netlink/genl/family.h>
142 #include <libnl3/netlink/genl/ctrl.h>
143 #include <libnl3/netlink/msg.h>
144 #include <libnl3/netlink/attr.h>
145 #include <libnl3/netlink/version.h>
147 #if LIBNL_VER_NUM < LIBNL_VER(3,0)
148 # error incompatible libnl version
149 #endif
151 void main(void)
153 struct nl_sock *sock = nl_socket_alloc();
154 struct nl_cache *nl_cache;
155 int ret = genl_connect(sock);
157 ret = genl_ctrl_alloc_cache(sock, &nl_cache);
161 $CC \
162 $(pkg-config --cflags libnl-3.0) \
163 $(pkg-config --cflags libnl-genl-3.0) \
164 -o $TMPDIR/libnltest \
165 $TMPDIR/libnltest.c \
166 $(pkg-config --libs libnl-3.0) \
167 $(pkg-config --libs libnl-genl-3.0) \
168 >> $TMPDIR/config.log 2>&1
169 if [ ! -x $TMPDIR/libnltest ] ; then
170 echo "[NO]"
171 MISSING_DEFS=1
172 tools_remove "trafgen"
173 tools_remove "netsniff-ng"
174 else
175 echo "[YES]"
179 check_tpacket_v3()
181 echo -n "[*] Checking tpacket_v3 ... "
183 cat > $TMPDIR/tpacketv3test.c << EOF
184 #include <stdio.h>
185 #include <linux/if_packet.h>
187 void main(void)
189 struct tpacket3_hdr *hdr;
190 int foo[] = {
191 TP_STATUS_BLK_TMO,
194 printf("%d\n", hdr->tp_status);
198 $CC -o $TMPDIR/tpacketv3test $TMPDIR/tpacketv3test.c >> $TMPDIR/config.log 2>&1
199 if [ ! -x $TMPDIR/tpacketv3test ] ; then
200 echo "[NO]"
201 MISSING_DEFS=1
202 tools_remove "netsniff-ng"
203 else
204 echo "[YES]"
208 check_tpacket_v2()
210 echo -n "[*] Checking tpacket_v2 ... "
212 cat > $TMPDIR/tpacketv2test.c << EOF
213 #include <stdio.h>
214 #include <linux/if_packet.h>
216 void main(void)
218 struct tpacket2_hdr *hdr;
219 int foo[] = {
220 TP_STATUS_AVAILABLE,
221 TP_STATUS_SEND_REQUEST,
222 TP_STATUS_SENDING,
223 TP_STATUS_KERNEL,
224 TP_STATUS_USER,
227 printf("%d\n", hdr->tp_status);
231 $CC -o $TMPDIR/tpacketv2test $TMPDIR/tpacketv2test.c >> $TMPDIR/config.log 2>&1
232 if [ ! -x $TMPDIR/tpacketv2test ] ; then
233 echo "[NO]"
234 MISSING_DEFS=1
235 tools_remove "netsniff-ng"
236 tools_remove "trafgen"
237 else
238 echo "[YES]"
243 check_ncurses()
245 echo -n "[*] Checking ncurses ... "
247 cat > $TMPDIR/ncursestest.c << EOF
248 #include <curses.h>
250 void main(void)
252 WINDOW *screen = initscr();
256 $CC \
257 $(pkg-config --cflags ncurses) \
258 -o $TMPDIR/ncursestest $TMPDIR/ncursestest.c \
259 $(pkg-config --libs ncurses) \
260 >> $TMPDIR/config.log 2>&1
261 if [ ! -x $TMPDIR/ncursestest ] ; then
262 echo "[NO]"
263 MISSING_DEFS=1
264 tools_remove "flowtop"
265 tools_remove "ifpps"
266 else
267 echo "[YES]"
271 check_libgeoip()
273 echo -n "[*] Checking libGeoIP ... "
275 cat > $TMPDIR/geoiptest.c << EOF
276 #include <GeoIP.h>
277 #include <GeoIPCity.h>
279 void main(void)
281 int dbs[] = {
282 GEOIP_CITY_EDITION_REV1,
283 GEOIP_CITY_EDITION_REV1_V6,
284 GEOIP_COUNTRY_EDITION,
285 GEOIP_COUNTRY_EDITION_V6,
286 GEOIP_ASNUM_EDITION,
287 GEOIP_ASNUM_EDITION_V6,
289 GeoIP *geoip = GeoIP_new(0);
293 $CC -o $TMPDIR/geoiptest $TMPDIR/geoiptest.c -lGeoIP >> $TMPDIR/config.log 2>&1
294 if [ ! -x $TMPDIR/geoiptest ] ; then
295 echo "[NO]"
296 echo "CONFIG_LIBGEOIP=0" >> Config
297 MISSING_DEFS=1
298 tools_remove "astraceroute"
299 tools_remove "flowtop"
300 else
301 echo "[YES]"
302 echo "CONFIG_LIBGEOIP=1" >> Config
303 HAVE_LIBGEOIP=1
307 check_libnf_ct()
309 echo -n "[*] Checking libnetfilter-conntrack ... "
311 cat > $TMPDIR/nfcttest.c << EOF
312 #include <libnetfilter_conntrack/libnetfilter_conntrack.h>
313 #include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
314 #include <libnetfilter_conntrack/libnetfilter_conntrack_dccp.h>
315 #include <libnetfilter_conntrack/libnetfilter_conntrack_sctp.h>
317 void main(void)
319 struct nf_conntrack *ct;
320 const uint32_t id = nfct_get_attr_u32(ct, ATTR_ID);
324 $CC -o $TMPDIR/nfcttest $TMPDIR/nfcttest.c -lnetfilter_conntrack >> $TMPDIR/config.log 2>&1
325 if [ ! -x $TMPDIR/nfcttest ] ; then
326 echo "[NO]"
327 MISSING_DEFS=1
328 tools_remove "libnetfilter-conntrack"
329 else
330 echo "[YES]"
334 check_zlib()
336 echo -n "[*] Checking libz ... "
338 cat > $TMPDIR/ztest.c << EOF
339 #include "zlib.h"
341 void main(void)
343 gzFile fp = gzopen("foo.gz", "rb");
347 $CC -o $TMPDIR/ztest $TMPDIR/ztest.c -lz >> $TMPDIR/config.log 2>&1
348 if [ ! -x $TMPDIR/ztest ] ; then
349 echo "[NO]"
350 MISSING_DEFS=1
351 tools_remove "netsniff-ng"
352 tools_remove "astraceroute"
353 tools_remove "flowtop"
354 else
355 echo "[YES]"
359 check_urcu()
361 echo -n "[*] Checking liburcu ... "
363 cat > $TMPDIR/urcutest.c << EOF
364 #include <urcu.h>
366 void main(void)
368 rcu_init();
369 synchronize_rcu();
373 $CC -o $TMPDIR/urcutest $TMPDIR/urcutest.c -lurcu >> $TMPDIR/config.log 2>&1
374 if [ ! -x $TMPDIR/urcutest ] ; then
375 echo "[NO]"
376 MISSING_DEFS=1
377 tools_remove "flowtop"
378 else
379 echo "[YES]"
383 check_libpcap()
385 echo -n "[*] Checking libpcap ... "
387 cat > $TMPDIR/pcaptest.c << EOF
388 #include <pcap.h>
390 void main(void)
392 struct bpf_program bpf;
393 int ret = pcap_compile_nopcap(65535, 1, &bpf, "foo.bpf", 1, 0xffffffff);
397 $CC -o $TMPDIR/pcaptest $TMPDIR/pcaptest.c -lpcap >> $TMPDIR/config.log 2>&1
398 if [ ! -x $TMPDIR/pcaptest ] ; then
399 echo "[NO]"
400 echo "CONFIG_LIBPCAP=0" >> Config
401 MISSING_DEFS=1
402 tools_remove "mausezahn"
403 else
404 echo "[YES]"
405 echo "CONFIG_LIBPCAP=1" >> Config
406 HAVE_LIBPCAP=1
410 check_hwtstamp()
412 echo -n "[*] Checking hw timestamping ... "
414 cat > $TMPDIR/hwtstest.c << EOF
415 #include <string.h>
416 #include <arpa/inet.h>
417 #include <sys/ioctl.h>
418 #include <sys/types.h>
419 #include <sys/socket.h>
420 #include <linux/sockios.h>
421 #include <linux/net_tstamp.h>
422 #include <linux/if_packet.h>
423 #include <linux/if_ether.h>
424 #include <linux/if.h>
426 void main(void)
428 int timesource = SOF_TIMESTAMPING_RAW_HARDWARE, ret;
429 int sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
430 struct hwtstamp_config hwconfig;
431 struct ifreq ifr;
433 memset(&hwconfig, 0, sizeof(hwconfig));
434 hwconfig.tx_type = HWTSTAMP_TX_OFF;
435 hwconfig.rx_filter = HWTSTAMP_FILTER_ALL;
437 memset(&ifr, 0, sizeof(ifr));
438 strncpy(ifr.ifr_name, "lo", sizeof(ifr.ifr_name));
439 ifr.ifr_data = &hwconfig;
441 ioctl(sock, SIOCSHWTSTAMP, &ifr);
442 setsockopt(sock, SOL_PACKET, PACKET_TIMESTAMP, &timesource,
443 sizeof(timesource));
447 $CC -o $TMPDIR/hwtstest $TMPDIR/hwtstest.c >> $TMPDIR/config.log 2>&1
448 if [ ! -x $TMPDIR/hwtstest ] ; then
449 echo "[NO]"
450 echo "CONFIG_HWTSTAMP=0" >> Config
451 else
452 echo "[YES]"
453 echo "CONFIG_HWTSTAMP=1" >> Config
454 HAVE_HWTSTAMP=1
458 check_libcli()
460 echo -n "[*] Checking libcli ... "
462 cat > $TMPDIR/clitest.c << EOF
463 #include <libcli.h>
465 void main(void)
467 struct cli_def *cli = cli_init();
471 $CC -o $TMPDIR/clitest $TMPDIR/clitest.c -lcli >> $TMPDIR/config.log 2>&1
472 if [ ! -x $TMPDIR/clitest ] ; then
473 echo "[NO]"
474 MISSING_DEFS=1
475 tools_remove "mausezahn"
476 else
477 echo "[YES]"
481 check_libnet()
483 echo -n "[*] Checking libnet ... "
485 cat > $TMPDIR/nettest.c << EOF
486 #include <libnet.h>
488 void main(void)
490 char err_buf[LIBNET_ERRBUF_SIZE];
491 libnet_t *l = libnet_init(LIBNET_LINK_ADV, "ethX", err_buf);
495 $CC -o $TMPDIR/nettest $TMPDIR/nettest.c -lnet >> $TMPDIR/config.log 2>&1
496 if [ ! -x $TMPDIR/nettest ] ; then
497 echo "[NO]"
498 MISSING_DEFS=1
499 tools_remove "mausezahn"
500 else
501 echo "[YES]"
505 gen_config_hdr()
507 local _version="`git describe --always`"
508 local _have_libpcap=""
509 local _have_libgeoip=""
510 local _have_hwts=""
512 echo "[*] Generating config.h ... "
514 if [ "$HAVE_LIBPCAP" == "1" ] ; then
515 _have_libpcap="#define HAVE_TCPDUMP_LIKE_FILTER 1"
518 if [ "$HAVE_HWTSTAMP" == "1" ] ; then
519 _have_hwts="#define HAVE_HARDWARE_TIMESTAMPING 1"
522 if [ "$HAVE_LIBGEOIP" == "1" ] ; then
523 _have_libgeoip="#define HAVE_GEOIP 1"
526 cat > config.h << EOF
527 #ifndef CONFIG_H
528 #define CONFIG_H
529 #define FILE_CLIENTS ".curvetun/clients"
530 #define FILE_SERVERS ".curvetun/servers"
531 #define FILE_PRIVKEY ".curvetun/priv.key"
532 #define FILE_PUBKEY ".curvetun/pub.key"
533 #define FILE_USERNAM ".curvetun/username"
534 #define GITVERSION "$_version"
535 $_have_libpcap
536 $_have_libgeoip
537 $_have_hwts
538 #endif /* CONFIG_H */
542 echo "# This file is autogenerated by the configure script" > Config
543 check_pkg_config
545 if [ "$MISSING_PKG_CONFIG" == "1" ] ; then
546 echo "[!] pkg-config is not installed on your system or not in the PATH"
547 exit 1
550 check_ccache
551 check_flex
552 check_bison
553 check_nacl
554 check_libnl
555 check_tpacket_v2
556 check_tpacket_v3
557 check_libnf_ct
558 check_ncurses
559 check_libgeoip
560 check_zlib
561 check_urcu
562 check_libpcap
563 check_hwtstamp
564 check_libcli
565 check_libnet
567 gen_config_hdr
569 if [ "$MISSING_DEFS" == "1" ] ; then
570 echo "[!] Some libraries or header definitions are missing or too old."
571 echo " Thus certain tools will not be built (see below). Please"
572 echo " refer to the INSTALL file for the libraries needed to build"
573 echo " the complete netsniff-ng toolkit."
576 if [ "$MISSING_NACL" == "1" ] ; then
577 echo "[!] The NaCl crypto library is currently not present on your"
578 echo " system or could not be found. Either install it from your"
579 echo " distro or build it manually using 'make nacl' and make sure"
580 echo " that the NACL_INC_DIR and NACL_LIB_DIR variables are set"
581 echo " appropriately."
584 if [ "x$TOOLS_NOBUILD" != "x" ] ; then
585 echo "[!] The following tools will *not* be built: $TOOLS_NOBUILD"
586 echo "[*] The following tools will be built: $TOOLS"
587 else
588 echo "[*] Looks good! All tools will be built!"
591 echo "CONFIG_TOOLS=$TOOLS" >> Config
592 echo "CONFIG_OK=1" >> Config
594 exit 0