Home | History | Annotate | Download | only in iproute2
      1 #! /bin/bash
      2 # This is not an autoconf generated configure
      3 #
      4 INCLUDE=${1:-"$PWD/include"}
      5 
      6 # Output file which is input to Makefile
      7 CONFIG=config.mk
      8 
      9 # Make a temp directory in build tree.
     10 TMPDIR=$(mktemp -d config.XXXXXX)
     11 trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM
     12 
     13 check_prog()
     14 {
     15     echo -n "$2"
     16     command -v $1 >/dev/null 2>&1 && (echo "$3:=y" >> $CONFIG; echo "yes") || (echo "no"; return 1)
     17 }
     18 
     19 check_docs()
     20 {
     21     if check_prog latex " latex: " HAVE_LATEX; then
     22         check_prog pdflatex " pdflatex: " HAVE_PDFLATEX || echo " WARNING: no PDF docs can be built from LaTeX files"
     23         check_prog sgml2latex " sgml2latex: " HAVE_SGML2LATEX || echo " WARNING: no LaTeX files can be build from SGML files"
     24     else
     25         echo " WARNING: no docs can be built from LaTeX files"
     26     fi
     27 
     28     check_prog sgml2html " sgml2html: " HAVE_SGML2HTML || echo " WARNING: no HTML docs can be built from SGML"
     29 }
     30 
     31 check_toolchain()
     32 {
     33     : ${PKG_CONFIG:=pkg-config}
     34     : ${AR=ar}
     35     : ${CC=gcc}
     36     echo "PKG_CONFIG:=${PKG_CONFIG}" >>$CONFIG
     37     echo "AR:=${AR}" >>$CONFIG
     38     echo "CC:=${CC}" >>$CONFIG
     39 }
     40 
     41 check_atm()
     42 {
     43     cat >$TMPDIR/atmtest.c <<EOF
     44 #include <atm.h>
     45 int main(int argc, char **argv) {
     46 	struct atm_qos qos;
     47 	(void) text2qos("aal5,ubr:sdu=9180,rx:none",&qos,0);
     48 	return 0;
     49 }
     50 EOF
     51 
     52     $CC -I$INCLUDE -o $TMPDIR/atmtest $TMPDIR/atmtest.c -latm >/dev/null 2>&1
     53     if [ $? -eq 0 ]
     54     then
     55 	echo "TC_CONFIG_ATM:=y" >>$CONFIG
     56 	echo yes
     57     else
     58 	echo no
     59     fi
     60     rm -f $TMPDIR/atmtest.c $TMPDIR/atmtest
     61 }
     62 
     63 check_xtables()
     64 {
     65 	if ! ${PKG_CONFIG} xtables --exists
     66 	then
     67 		echo "TC_CONFIG_NO_XT:=y" >>$CONFIG
     68 	fi
     69 }
     70 
     71 check_xt()
     72 {
     73     #check if we have xtables from iptables >= 1.4.5.
     74     cat >$TMPDIR/ipttest.c <<EOF
     75 #include <xtables.h>
     76 #include <linux/netfilter.h>
     77 static struct xtables_globals test_globals = {
     78 	.option_offset = 0,
     79 	.program_name = "tc-ipt",
     80 	.program_version = XTABLES_VERSION,
     81 	.orig_opts = NULL,
     82 	.opts = NULL,
     83 	.exit_err = NULL,
     84 };
     85 
     86 int main(int argc, char **argv)
     87 {
     88 	xtables_init_all(&test_globals, NFPROTO_IPV4);
     89 	return 0;
     90 }
     91 EOF
     92 
     93     if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL \
     94 	$(${PKG_CONFIG} xtables --cflags --libs) -ldl >/dev/null 2>&1
     95     then
     96 	echo "TC_CONFIG_XT:=y" >>$CONFIG
     97 	echo "using xtables"
     98     fi
     99     rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
    100 }
    101 
    102 check_xt_old()
    103 {
    104     # bail if previous XT checks has already succeded.
    105     if grep -q TC_CONFIG_XT $CONFIG
    106     then
    107 	return
    108     fi
    109 
    110     #check if we dont need our internal header ..
    111     cat >$TMPDIR/ipttest.c <<EOF
    112 #include <xtables.h>
    113 char *lib_dir;
    114 unsigned int global_option_offset = 0;
    115 const char *program_version = XTABLES_VERSION;
    116 const char *program_name = "tc-ipt";
    117 struct afinfo afinfo = {
    118 	.libprefix      = "libxt_",
    119 };
    120 
    121 void exit_error(enum exittype status, const char *msg, ...)
    122 {
    123 }
    124 
    125 int main(int argc, char **argv) {
    126 
    127 	return 0;
    128 }
    129 
    130 EOF
    131 
    132     $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1
    133     if [ $? -eq 0 ]
    134     then
    135 	echo "TC_CONFIG_XT_OLD:=y" >>$CONFIG
    136 	echo "using old xtables (no need for xt-internal.h)"
    137     fi
    138     rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
    139 }
    140 
    141 check_xt_old_internal_h()
    142 {
    143     # bail if previous XT checks has already succeded.
    144     if grep -q TC_CONFIG_XT $CONFIG
    145     then
    146 	return
    147     fi
    148 
    149     #check if we need our own internal.h
    150     cat >$TMPDIR/ipttest.c <<EOF
    151 #include <xtables.h>
    152 #include "xt-internal.h"
    153 char *lib_dir;
    154 unsigned int global_option_offset = 0;
    155 const char *program_version = XTABLES_VERSION;
    156 const char *program_name = "tc-ipt";
    157 struct afinfo afinfo = {
    158 	.libprefix      = "libxt_",
    159 };
    160 
    161 void exit_error(enum exittype status, const char *msg, ...)
    162 {
    163 }
    164 
    165 int main(int argc, char **argv) {
    166 
    167 	return 0;
    168 }
    169 
    170 EOF
    171 	$CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1
    172 
    173 	if [ $? -eq 0 ]
    174 	then
    175 	    echo "using old xtables with xt-internal.h"
    176 	    echo "TC_CONFIG_XT_OLD_H:=y" >>$CONFIG
    177 	fi
    178 	rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
    179 }
    180 
    181 check_ipt()
    182 {
    183 	if ! grep TC_CONFIG_XT $CONFIG > /dev/null
    184 	then
    185 		echo "using iptables"
    186 	fi
    187 }
    188 
    189 check_ipt_lib_dir()
    190 {
    191 	IPT_LIB_DIR=$(${PKG_CONFIG} --variable=xtlibdir xtables)
    192 	if [ -n "$IPT_LIB_DIR" ]; then
    193 		echo $IPT_LIB_DIR
    194 		echo "IPT_LIB_DIR:=$IPT_LIB_DIR" >> $CONFIG
    195 		return
    196 	fi
    197 
    198 	for dir in /lib /usr/lib /usr/local/lib
    199 	do
    200 		for file in $dir/{xtables,iptables}/lib*t_*so ; do
    201 			if [ -f $file ]; then
    202 				echo ${file%/*}
    203 				echo "IPT_LIB_DIR:=${file%/*}" >> $CONFIG
    204 				return
    205 			fi
    206 		done
    207 	done
    208 	echo "not found!"
    209 }
    210 
    211 check_setns()
    212 {
    213     cat >$TMPDIR/setnstest.c <<EOF
    214 #include <sched.h>
    215 int main(int argc, char **argv)
    216 {
    217 	(void)setns(0,0);
    218 	return 0;
    219 }
    220 EOF
    221     $CC -I$INCLUDE -o $TMPDIR/setnstest $TMPDIR/setnstest.c >/dev/null 2>&1
    222     if [ $? -eq 0 ]
    223     then
    224 	echo "IP_CONFIG_SETNS:=y" >>$CONFIG
    225 	echo "yes"
    226 	echo "CFLAGS += -DHAVE_SETNS" >>$CONFIG
    227     else
    228 	echo "no"
    229     fi
    230     rm -f $TMPDIR/setnstest.c $TMPDIR/setnstest
    231 }
    232 
    233 check_ipset()
    234 {
    235     cat >$TMPDIR/ipsettest.c <<EOF
    236 #include <linux/netfilter/ipset/ip_set.h>
    237 #ifndef IP_SET_INVALID
    238 #define IPSET_DIM_MAX 3
    239 typedef unsigned short ip_set_id_t;
    240 #endif
    241 #include <linux/netfilter/xt_set.h>
    242 
    243 struct xt_set_info info;
    244 #if IPSET_PROTOCOL == 6
    245 int main(void)
    246 {
    247 	return IPSET_MAXNAMELEN;
    248 }
    249 #else
    250 #error unknown ipset version
    251 #endif
    252 EOF
    253 
    254     if $CC -I$INCLUDE -o $TMPDIR/ipsettest $TMPDIR/ipsettest.c >/dev/null 2>&1
    255     then
    256 	echo "TC_CONFIG_IPSET:=y" >>$CONFIG
    257 	echo "yes"
    258     else
    259 	echo "no"
    260     fi
    261     rm -f $TMPDIR/ipsettest.c $TMPDIR/ipsettest
    262 }
    263 
    264 check_elf()
    265 {
    266     if ${PKG_CONFIG} libelf --exists
    267     then
    268 	echo "HAVE_ELF:=y" >>$CONFIG
    269 	echo "yes"
    270 
    271 	echo 'CFLAGS += -DHAVE_ELF' `${PKG_CONFIG} libelf --cflags` >> $CONFIG
    272 	echo 'LDLIBS += ' `${PKG_CONFIG} libelf --libs` >>$CONFIG
    273     else
    274 	echo "no"
    275     fi
    276 }
    277 
    278 check_selinux()
    279 # SELinux is a compile time option in the ss utility
    280 {
    281 	if ${PKG_CONFIG} libselinux --exists
    282 	then
    283 		echo "HAVE_SELINUX:=y" >>$CONFIG
    284 		echo "yes"
    285 
    286 		echo 'LDLIBS +=' `${PKG_CONFIG} --libs libselinux` >>$CONFIG
    287 		echo 'CFLAGS += -DHAVE_SELINUX' `${PKG_CONFIG} --cflags libselinux` >>$CONFIG
    288 	else
    289 		echo "no"
    290 	fi
    291 }
    292 
    293 check_mnl()
    294 {
    295 	if ${PKG_CONFIG} libmnl --exists
    296 	then
    297 		echo "HAVE_MNL:=y" >>$CONFIG
    298 		echo "yes"
    299 
    300 		echo 'CFLAGS += -DHAVE_LIBMNL' `${PKG_CONFIG} libmnl --cflags` >>$CONFIG
    301 		echo 'LDLIBS +=' `${PKG_CONFIG} libmnl --libs` >> $CONFIG
    302 	else
    303 		echo "no"
    304 	fi
    305 }
    306 
    307 check_berkeley_db()
    308 {
    309     cat >$TMPDIR/dbtest.c <<EOF
    310 #include <fcntl.h>
    311 #include <stdlib.h>
    312 #include <db_185.h>
    313 int main(int argc, char **argv) {
    314 	dbopen("/tmp/xxx_test_db.db", O_CREAT|O_RDWR, 0644, DB_HASH, NULL);
    315 	return 0;
    316 }
    317 EOF
    318     $CC -I$INCLUDE -o $TMPDIR/dbtest $TMPDIR/dbtest.c -ldb >/dev/null 2>&1
    319     if [ $? -eq 0 ]
    320     then
    321 	echo "HAVE_BERKELEY_DB:=y" >>$CONFIG
    322 	echo "yes"
    323     else
    324 	echo "no"
    325     fi
    326     rm -f $TMPDIR/dbtest.c $TMPDIR/dbtest
    327 }
    328 
    329 check_strlcpy()
    330 {
    331     cat >$TMPDIR/strtest.c <<EOF
    332 #include <string.h>
    333 int main(int argc, char **argv) {
    334 	char dst[10];
    335 	strlcpy(dst, "test", sizeof(dst));
    336 	return 0;
    337 }
    338 EOF
    339     $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1
    340     if [ $? -eq 0 ]
    341     then
    342 	echo "no"
    343     else
    344 	echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG
    345 	echo "yes"
    346     fi
    347     rm -f $TMPDIR/strtest.c $TMPDIR/strtest
    348 }
    349 
    350 quiet_config()
    351 {
    352 	cat <<EOF
    353 # user can control verbosity similar to kernel builds (e.g., V=1)
    354 ifeq ("\$(origin V)", "command line")
    355   VERBOSE = \$(V)
    356 endif
    357 ifndef VERBOSE
    358   VERBOSE = 0
    359 endif
    360 ifeq (\$(VERBOSE),1)
    361   Q =
    362 else
    363   Q = @
    364 endif
    365 
    366 ifeq (\$(VERBOSE), 0)
    367     QUIET_CC       = @echo '    CC       '\$@;
    368     QUIET_AR       = @echo '    AR       '\$@;
    369     QUIET_LINK     = @echo '    LINK     '\$@;
    370     QUIET_YACC     = @echo '    YACC     '\$@;
    371     QUIET_LEX      = @echo '    LEX      '\$@;
    372 endif
    373 EOF
    374 }
    375 
    376 echo "# Generated config based on" $INCLUDE >$CONFIG
    377 quiet_config >> $CONFIG
    378 
    379 check_toolchain
    380 
    381 echo "TC schedulers"
    382 
    383 echo -n " ATM	"
    384 check_atm
    385 
    386 check_xtables
    387 if ! grep -q TC_CONFIG_NO_XT $CONFIG
    388 then
    389 	echo -n " IPT	"
    390 	check_xt
    391 	check_xt_old
    392 	check_xt_old_internal_h
    393 	check_ipt
    394 
    395 	echo -n " IPSET  "
    396 	check_ipset
    397 fi
    398 
    399 echo
    400 if ! grep -q TC_CONFIG_NO_XT $CONFIG
    401 then
    402 	echo -n "iptables modules directory: "
    403 	check_ipt_lib_dir
    404 fi
    405 
    406 echo -n "libc has setns: "
    407 check_setns
    408 
    409 echo -n "SELinux support: "
    410 check_selinux
    411 
    412 echo -n "ELF support: "
    413 check_elf
    414 
    415 echo -n "libmnl support: "
    416 check_mnl
    417 
    418 echo -n "Berkeley DB: "
    419 check_berkeley_db
    420 
    421 echo -n "need for strlcpy: "
    422 check_strlcpy
    423 
    424 echo
    425 echo -n "docs:"
    426 check_docs
    427 echo
    428 
    429 echo >> $CONFIG
    430 echo "%.o: %.c" >> $CONFIG
    431 echo '	$(QUIET_CC)$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<' >> $CONFIG
    432