1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0 3# This is not an autoconf generated configure 4 5INCLUDE="$PWD/include" 6PREFIX="/usr" 7LIBDIR="\${prefix}/lib" 8COLOR="never" 9 10# Output file which is input to Makefile 11CONFIG=config.mk 12 13# Make a temp directory in build tree. 14TMPDIR=$(mktemp -d config.XXXXXX) 15trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM 16 17check_toolchain() 18{ 19 : ${PKG_CONFIG:=pkg-config} 20 : ${AR=ar} 21 : ${CC=gcc} 22 : ${YACC=bison} 23 echo "PKG_CONFIG:=${PKG_CONFIG}" >>$CONFIG 24 echo "AR:=${AR}" >>$CONFIG 25 echo "CC:=${CC}" >>$CONFIG 26 echo "YACC:=${YACC}" >>$CONFIG 27} 28 29check_xtables() 30{ 31 if ! ${PKG_CONFIG} xtables --exists; then 32 echo "TC_CONFIG_NO_XT:=y" >>$CONFIG 33 fi 34} 35 36check_xt() 37{ 38 #check if we have xtables from iptables >= 1.4.5. 39 cat >$TMPDIR/ipttest.c <<EOF 40#include <xtables.h> 41#include <linux/netfilter.h> 42static struct xtables_globals test_globals = { 43 .option_offset = 0, 44 .program_name = "tc-ipt", 45 .program_version = XTABLES_VERSION, 46 .orig_opts = NULL, 47 .opts = NULL, 48 .exit_err = NULL, 49}; 50 51int main(int argc, char **argv) 52{ 53 xtables_init_all(&test_globals, NFPROTO_IPV4); 54 return 0; 55} 56EOF 57 58 if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL \ 59 $(${PKG_CONFIG} xtables --cflags --libs) -ldl >/dev/null 2>&1; then 60 echo "TC_CONFIG_XT:=y" >>$CONFIG 61 echo "using xtables" 62 fi 63 rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest 64} 65 66check_xt_old() 67{ 68 # bail if previous XT checks has already succeeded. 69 grep -q TC_CONFIG_XT $CONFIG && return 70 71 #check if we don't need our internal header .. 72 cat >$TMPDIR/ipttest.c <<EOF 73#include <xtables.h> 74char *lib_dir; 75unsigned int global_option_offset = 0; 76const char *program_version = XTABLES_VERSION; 77const char *program_name = "tc-ipt"; 78struct afinfo afinfo = { 79 .libprefix = "libxt_", 80}; 81 82void exit_error(enum exittype status, const char *msg, ...) 83{ 84} 85 86int main(int argc, char **argv) { 87 88 return 0; 89} 90 91EOF 92 93 if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1; then 94 echo "TC_CONFIG_XT_OLD:=y" >>$CONFIG 95 echo "using old xtables (no need for xt-internal.h)" 96 fi 97 rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest 98} 99 100check_xt_old_internal_h() 101{ 102 # bail if previous XT checks has already succeeded. 103 grep -q TC_CONFIG_XT $CONFIG && return 104 105 #check if we need our own internal.h 106 cat >$TMPDIR/ipttest.c <<EOF 107#include <xtables.h> 108#include "xt-internal.h" 109char *lib_dir; 110unsigned int global_option_offset = 0; 111const char *program_version = XTABLES_VERSION; 112const char *program_name = "tc-ipt"; 113struct afinfo afinfo = { 114 .libprefix = "libxt_", 115}; 116 117void exit_error(enum exittype status, const char *msg, ...) 118{ 119} 120 121int main(int argc, char **argv) { 122 123 return 0; 124} 125 126EOF 127 if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1; then 128 echo "using old xtables with xt-internal.h" 129 echo "TC_CONFIG_XT_OLD_H:=y" >>$CONFIG 130 fi 131 rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest 132} 133 134check_lib_dir() 135{ 136 LIBDIR=$(echo $LIBDIR | sed "s|\${prefix}|$PREFIX|") 137 138 echo -n "lib directory: " 139 echo "$LIBDIR" 140 echo "LIBDIR:=$LIBDIR" >> $CONFIG 141} 142 143check_setns() 144{ 145 cat >$TMPDIR/setnstest.c <<EOF 146#define _GNU_SOURCE 147#include <sched.h> 148int main(int argc, char **argv) 149{ 150 (void)setns(0,0); 151 return 0; 152} 153EOF 154 if $CC -I$INCLUDE -o $TMPDIR/setnstest $TMPDIR/setnstest.c >/dev/null 2>&1; then 155 echo "IP_CONFIG_SETNS:=y" >>$CONFIG 156 echo "yes" 157 echo "CFLAGS += -DHAVE_SETNS" >>$CONFIG 158 else 159 echo "no" 160 fi 161 rm -f $TMPDIR/setnstest.c $TMPDIR/setnstest 162} 163 164check_name_to_handle_at() 165{ 166 cat >$TMPDIR/name_to_handle_at_test.c <<EOF 167#define _GNU_SOURCE 168#include <sys/types.h> 169#include <fcntl.h> 170int main(int argc, char **argv) 171{ 172 struct file_handle *fhp; 173 int mount_id, flags, dirfd; 174 char *pathname; 175 name_to_handle_at(dirfd, pathname, fhp, &mount_id, flags); 176 return 0; 177} 178EOF 179 if $CC -I$INCLUDE -o $TMPDIR/name_to_handle_at_test $TMPDIR/name_to_handle_at_test.c >/dev/null 2>&1; then 180 echo "yes" 181 echo "CFLAGS += -DHAVE_HANDLE_AT" >>$CONFIG 182 else 183 echo "no" 184 fi 185 rm -f $TMPDIR/name_to_handle_at_test.c $TMPDIR/name_to_handle_at_test 186} 187 188check_ipset() 189{ 190 cat >$TMPDIR/ipsettest.c <<EOF 191#include <linux/netfilter/ipset/ip_set.h> 192#ifndef IP_SET_INVALID 193#define IPSET_DIM_MAX 3 194typedef unsigned short ip_set_id_t; 195#endif 196#include <linux/netfilter/xt_set.h> 197 198struct xt_set_info info; 199#if IPSET_PROTOCOL == 6 || IPSET_PROTOCOL == 7 200int main(void) 201{ 202 return IPSET_MAXNAMELEN; 203} 204#else 205#error unknown ipset version 206#endif 207EOF 208 209 if $CC -I$INCLUDE -o $TMPDIR/ipsettest $TMPDIR/ipsettest.c >/dev/null 2>&1; then 210 echo "TC_CONFIG_IPSET:=y" >>$CONFIG 211 echo "yes" 212 else 213 echo "no" 214 fi 215 rm -f $TMPDIR/ipsettest.c $TMPDIR/ipsettest 216} 217 218check_elf() 219{ 220 if ${PKG_CONFIG} libelf --exists; then 221 echo "HAVE_ELF:=y" >>$CONFIG 222 echo "yes" 223 224 echo 'CFLAGS += -DHAVE_ELF' "$(${PKG_CONFIG} libelf --cflags)" >> $CONFIG 225 echo 'LDLIBS += ' "$(${PKG_CONFIG} libelf --libs)" >>$CONFIG 226 else 227 echo "no" 228 fi 229} 230 231have_libbpf_basic() 232{ 233 cat >$TMPDIR/libbpf_test.c <<EOF 234#include <bpf/libbpf.h> 235int main(int argc, char **argv) { 236 bpf_program__set_autoload(NULL, false); 237 bpf_map__ifindex(NULL); 238 bpf_map__set_pin_path(NULL, NULL); 239 bpf_object__open_file(NULL, NULL); 240 return 0; 241} 242EOF 243 244 $CC -o $TMPDIR/libbpf_test $TMPDIR/libbpf_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1 245 local ret=$? 246 247 rm -f $TMPDIR/libbpf_test.c $TMPDIR/libbpf_test 248 return $ret 249} 250 251have_libbpf_sec_name() 252{ 253 cat >$TMPDIR/libbpf_sec_test.c <<EOF 254#include <bpf/libbpf.h> 255int main(int argc, char **argv) { 256 void *ptr; 257 bpf_program__section_name(NULL); 258 return 0; 259} 260EOF 261 262 $CC -o $TMPDIR/libbpf_sec_test $TMPDIR/libbpf_sec_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1 263 local ret=$? 264 265 rm -f $TMPDIR/libbpf_sec_test.c $TMPDIR/libbpf_sec_test 266 return $ret 267} 268 269check_force_libbpf_on() 270{ 271 # if set LIBBPF_FORCE=on but no libbpf support, just exist the config 272 # process to make sure we don't build without libbpf. 273 if [ "$LIBBPF_FORCE" = on ]; then 274 echo " LIBBPF_FORCE=on set, but couldn't find a usable libbpf" 275 exit 1 276 fi 277} 278 279check_libbpf() 280{ 281 # if set LIBBPF_FORCE=off, disable libbpf entirely 282 if [ "$LIBBPF_FORCE" = off ]; then 283 echo "no" 284 return 285 fi 286 287 if ! ${PKG_CONFIG} libbpf --exists && [ -z "$LIBBPF_DIR" ] ; then 288 echo "no" 289 check_force_libbpf_on 290 return 291 fi 292 293 if [ $(uname -m) = x86_64 ]; then 294 local LIBBPF_LIBDIR="${LIBBPF_DIR}/usr/lib64" 295 else 296 local LIBBPF_LIBDIR="${LIBBPF_DIR}/usr/lib" 297 fi 298 299 if [ -n "$LIBBPF_DIR" ]; then 300 LIBBPF_CFLAGS="-I${LIBBPF_DIR}/usr/include" 301 LIBBPF_LDLIBS="${LIBBPF_LIBDIR}/libbpf.a -lz -lelf" 302 LIBBPF_VERSION=$(PKG_CONFIG_LIBDIR=${LIBBPF_LIBDIR}/pkgconfig ${PKG_CONFIG} libbpf --modversion) 303 else 304 LIBBPF_CFLAGS=$(${PKG_CONFIG} libbpf --cflags) 305 LIBBPF_LDLIBS=$(${PKG_CONFIG} libbpf --libs) 306 LIBBPF_VERSION=$(${PKG_CONFIG} libbpf --modversion) 307 fi 308 309 if ! have_libbpf_basic; then 310 echo "no" 311 echo " libbpf version $LIBBPF_VERSION is too low, please update it to at least 0.1.0" 312 check_force_libbpf_on 313 return 314 else 315 echo "HAVE_LIBBPF:=y" >> $CONFIG 316 echo 'CFLAGS += -DHAVE_LIBBPF ' $LIBBPF_CFLAGS >> $CONFIG 317 echo "CFLAGS += -DLIBBPF_VERSION=\\\"$LIBBPF_VERSION\\\"" >> $CONFIG 318 LIBBPF_MAJOR=$(IFS="."; set $LIBBPF_VERSION; echo $1) 319 LIBBPF_MINOR=$(IFS="."; set $LIBBPF_VERSION; echo $2) 320 if [ "$LIBBPF_MAJOR" -eq 0 -a "$LIBBPF_MINOR" -lt 7 ]; then 321 # Newer libbpf versions provide these defines in the bpf/libbpf_version.h header. 322 echo "CFLAGS += -DLIBBPF_MAJOR_VERSION=$LIBBPF_MAJOR -DLIBBPF_MINOR_VERSION=$LIBBPF_MINOR" >> $CONFIG 323 fi 324 echo 'LDLIBS += ' $LIBBPF_LDLIBS >> $CONFIG 325 326 if [ -z "$LIBBPF_DIR" ]; then 327 echo "CFLAGS += -DLIBBPF_DYNAMIC" >> $CONFIG 328 fi 329 fi 330 331 # bpf_program__title() is deprecated since libbpf 0.2.0, use 332 # bpf_program__section_name() instead if we support 333 if have_libbpf_sec_name; then 334 echo "HAVE_LIBBPF_SECTION_NAME:=y" >> $CONFIG 335 echo 'CFLAGS += -DHAVE_LIBBPF_SECTION_NAME ' >> $CONFIG 336 fi 337 338 echo "yes" 339 echo " libbpf version $LIBBPF_VERSION" 340} 341 342check_selinux() 343# SELinux is a compile time option in the ss utility 344{ 345 if ${PKG_CONFIG} libselinux --exists; then 346 echo "HAVE_SELINUX:=y" >>$CONFIG 347 echo "yes" 348 349 echo 'LDLIBS +=' "$(${PKG_CONFIG} --libs libselinux)" >>$CONFIG 350 echo 'CFLAGS += -DHAVE_SELINUX' "$(${PKG_CONFIG} --cflags libselinux)" >>$CONFIG 351 else 352 echo "no" 353 fi 354} 355 356check_tirpc() 357{ 358 if ${PKG_CONFIG} libtirpc --exists; then 359 echo "HAVE_RPC:=y" >>$CONFIG 360 echo "yes" 361 362 echo 'LDLIBS +=' "$(${PKG_CONFIG} --libs libtirpc)" >>$CONFIG 363 echo 'CFLAGS += -DHAVE_RPC' "$(${PKG_CONFIG} --cflags libtirpc)" >>$CONFIG 364 else 365 echo "no" 366 fi 367} 368 369check_mnl() 370{ 371 if ${PKG_CONFIG} libmnl --exists; then 372 echo "HAVE_MNL:=y" >>$CONFIG 373 echo "yes" 374 375 echo 'CFLAGS += -DHAVE_LIBMNL' "$(${PKG_CONFIG} libmnl --cflags)" >>$CONFIG 376 echo 'LDLIBS +=' "$(${PKG_CONFIG} libmnl --libs)" >> $CONFIG 377 else 378 echo "no" 379 fi 380} 381 382check_berkeley_db() 383{ 384 cat >$TMPDIR/dbtest.c <<EOF 385#include <fcntl.h> 386#include <stdlib.h> 387#include <db_185.h> 388int main(int argc, char **argv) { 389 dbopen("/tmp/xxx_test_db.db", O_CREAT|O_RDWR, 0644, DB_HASH, NULL); 390 return 0; 391} 392EOF 393 if $CC -I$INCLUDE -o $TMPDIR/dbtest $TMPDIR/dbtest.c -ldb >/dev/null 2>&1; then 394 echo "HAVE_BERKELEY_DB:=y" >>$CONFIG 395 echo "yes" 396 else 397 echo "no" 398 fi 399 rm -f $TMPDIR/dbtest.c $TMPDIR/dbtest 400} 401 402check_strlcpy() 403{ 404 cat >$TMPDIR/strtest.c <<EOF 405#define _GNU_SOURCE 406#include <string.h> 407int main(int argc, char **argv) { 408 char dst[10]; 409 strlcpy(dst, "test", sizeof(dst)); 410 return 0; 411} 412EOF 413 if $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1; then 414 echo "no" 415 else 416 if ${PKG_CONFIG} libbsd --exists; then 417 echo 'CFLAGS += -DHAVE_LIBBSD' "$(${PKG_CONFIG} libbsd --cflags)" >>$CONFIG 418 echo 'LDLIBS +=' "$(${PKG_CONFIG} libbsd --libs)" >> $CONFIG 419 echo "no" 420 else 421 echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG 422 echo "yes" 423 fi 424 fi 425 rm -f $TMPDIR/strtest.c $TMPDIR/strtest 426} 427 428check_cap() 429{ 430 if ${PKG_CONFIG} libcap --exists; then 431 echo "HAVE_CAP:=y" >>$CONFIG 432 echo "yes" 433 434 echo 'CFLAGS += -DHAVE_LIBCAP' "$(${PKG_CONFIG} libcap --cflags)" >>$CONFIG 435 echo 'LDLIBS +=' "$(${PKG_CONFIG} libcap --libs)" >> $CONFIG 436 else 437 echo "no" 438 fi 439} 440 441check_color() 442{ 443 case "$COLOR" in 444 never) 445 echo 'CONF_COLOR:=COLOR_OPT_NEVER' >> $CONFIG 446 echo 'never' 447 ;; 448 auto) 449 echo 'CONF_COLOR:=COLOR_OPT_AUTO' >> $CONFIG 450 echo 'auto' 451 ;; 452 always) 453 echo 'CONF_COLOR:=COLOR_OPT_ALWAYS' >> $CONFIG 454 echo 'always' 455 ;; 456 esac 457} 458 459quiet_config() 460{ 461 cat <<EOF 462# user can control verbosity similar to kernel builds (e.g., V=1) 463ifeq ("\$(origin V)", "command line") 464 VERBOSE = \$(V) 465endif 466ifndef VERBOSE 467 VERBOSE = 0 468endif 469ifeq (\$(VERBOSE),1) 470 Q = 471else 472 Q = @ 473endif 474 475ifeq (\$(VERBOSE), 0) 476 QUIET_CC = @echo ' CC '\$@; 477 QUIET_AR = @echo ' AR '\$@; 478 QUIET_LINK = @echo ' LINK '\$@; 479 QUIET_YACC = @echo ' YACC '\$@; 480 QUIET_LEX = @echo ' LEX '\$@; 481endif 482EOF 483} 484 485usage() 486{ 487 cat <<EOF 488Usage: $0 [OPTIONS] 489 --color <never|auto|always> Default color output configuration. Available options: 490 never: color output is disabled (default) 491 auto: color output is enabled if stdout is a terminal 492 always: color output is enabled regardless of stdout state 493 --include_dir <dir> Path to iproute2 include dir 494 --libdir <dir> Path to iproute2 lib dir 495 --libbpf_dir <dir> Path to libbpf DESTDIR 496 --libbpf_force <on|off> Enable/disable libbpf by force. Available options: 497 on: require link against libbpf, quit config if no libbpf support 498 off: disable libbpf probing 499 --prefix <dir> Path prefix of the lib files to install 500 -h | --help Show this usage info 501EOF 502 exit $1 503} 504 505# Compat with the old INCLUDE path setting method. 506if [ $# -eq 1 ] && [ "$(echo $1 | cut -c 1)" != '-' ]; then 507 INCLUDE="$1" 508else 509 while [ "$#" -gt 0 ]; do 510 case "$1" in 511 --color) 512 shift 513 COLOR="$1" ;; 514 --color=*) 515 COLOR="${1#*=}" ;; 516 --include_dir) 517 shift 518 INCLUDE="$1" ;; 519 --include_dir=*) 520 INCLUDE="${1#*=}" ;; 521 --libdir) 522 shift 523 LIBDIR="$1" ;; 524 --libdir=*) 525 LIBDIR="${1#*=}" ;; 526 --libbpf_dir) 527 shift 528 LIBBPF_DIR="$1" ;; 529 --libbpf_dir=*) 530 LIBBPF_DIR="${1#*=}" ;; 531 --libbpf_force) 532 shift 533 LIBBPF_FORCE="$1" ;; 534 --libbpf_force=*) 535 LIBBPF_FORCE="${1#*=}" ;; 536 --prefix) 537 shift 538 PREFIX="$1" ;; 539 --prefix=*) 540 PREFIX="${1#*=}" ;; 541 -h | --help) 542 usage 0 ;; 543 --*) 544 ;; 545 *) 546 usage 1 ;; 547 esac 548 [ "$#" -gt 0 ] && shift 549 done 550fi 551 552case "$COLOR" in 553 never) ;; 554 auto) ;; 555 always) ;; 556 *) usage 1 ;; 557esac 558[ -d "$INCLUDE" ] || usage 1 559if [ "${LIBBPF_DIR-unused}" != "unused" ]; then 560 [ -d "$LIBBPF_DIR" ] || usage 1 561fi 562if [ "${LIBBPF_FORCE-unused}" != "unused" ]; then 563 if [ "$LIBBPF_FORCE" != 'on' ] && [ "$LIBBPF_FORCE" != 'off' ]; then 564 usage 1 565 fi 566fi 567[ -z "$PREFIX" ] && usage 1 568[ -z "$LIBDIR" ] && usage 1 569 570echo "# Generated config based on" $INCLUDE >$CONFIG 571quiet_config >> $CONFIG 572 573check_toolchain 574 575echo "TC schedulers" 576 577check_xtables 578if ! grep -q TC_CONFIG_NO_XT $CONFIG; then 579 echo -n " IPT " 580 check_xt 581 check_xt_old 582 check_xt_old_internal_h 583 584 echo -n " IPSET " 585 check_ipset 586fi 587 588echo 589check_lib_dir 590 591echo -n "libc has setns: " 592check_setns 593 594echo -n "libc has name_to_handle_at: " 595check_name_to_handle_at 596 597echo -n "SELinux support: " 598check_selinux 599 600echo -n "libtirpc support: " 601check_tirpc 602 603echo -n "libbpf support: " 604check_libbpf 605 606echo -n "ELF support: " 607check_elf 608 609echo -n "libmnl support: " 610check_mnl 611 612echo -n "Berkeley DB: " 613check_berkeley_db 614 615echo -n "need for strlcpy: " 616check_strlcpy 617 618echo -n "libcap support: " 619check_cap 620 621echo -n "color output: " 622check_color 623 624echo >> $CONFIG 625echo "%.o: %.c" >> $CONFIG 626echo ' $(QUIET_CC)$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CPPFLAGS) -c -o $@ $<' >> $CONFIG 627

