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