iproute2/configure
<<
>>
Prefs
   1#!/bin/sh
   2# SPDX-License-Identifier: GPL-2.0
   3# This is not an autoconf generated configure
   4#
   5# Influential LIBBPF environment variables:
   6#   LIBBPF_FORCE={on,off}   on: require link against libbpf;
   7#                           off: disable libbpf probing
   8#   LIBBPF_DIR              Path to libbpf DESTDIR to use
   9
  10INCLUDE=${1:-"$PWD/include"}
  11
  12# Output file which is input to Makefile
  13CONFIG=config.mk
  14
  15# Make a temp directory in build tree.
  16TMPDIR=$(mktemp -d config.XXXXXX)
  17trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM
  18
  19check_toolchain()
  20{
  21    : ${PKG_CONFIG:=pkg-config}
  22    : ${AR=ar}
  23    : ${CC=gcc}
  24    : ${YACC=bison}
  25    echo "PKG_CONFIG:=${PKG_CONFIG}" >>$CONFIG
  26    echo "AR:=${AR}" >>$CONFIG
  27    echo "CC:=${CC}" >>$CONFIG
  28    echo "YACC:=${YACC}" >>$CONFIG
  29}
  30
  31check_atm()
  32{
  33    cat >$TMPDIR/atmtest.c <<EOF
  34#include <atm.h>
  35int main(int argc, char **argv) {
  36        struct atm_qos qos;
  37        (void) text2qos("aal5,ubr:sdu=9180,rx:none",&qos,0);
  38        return 0;
  39}
  40EOF
  41
  42    if $CC -I$INCLUDE -o $TMPDIR/atmtest $TMPDIR/atmtest.c -latm >/dev/null 2>&1; then
  43        echo "TC_CONFIG_ATM:=y" >>$CONFIG
  44        echo yes
  45    else
  46        echo no
  47    fi
  48    rm -f $TMPDIR/atmtest.c $TMPDIR/atmtest
  49}
  50
  51check_xtables()
  52{
  53        if ! ${PKG_CONFIG} xtables --exists; then
  54                echo "TC_CONFIG_NO_XT:=y" >>$CONFIG
  55        fi
  56}
  57
  58check_xt()
  59{
  60    #check if we have xtables from iptables >= 1.4.5.
  61    cat >$TMPDIR/ipttest.c <<EOF
  62#include <xtables.h>
  63#include <linux/netfilter.h>
  64static struct xtables_globals test_globals = {
  65        .option_offset = 0,
  66        .program_name = "tc-ipt",
  67        .program_version = XTABLES_VERSION,
  68        .orig_opts = NULL,
  69        .opts = NULL,
  70        .exit_err = NULL,
  71};
  72
  73int main(int argc, char **argv)
  74{
  75        xtables_init_all(&test_globals, NFPROTO_IPV4);
  76        return 0;
  77}
  78EOF
  79
  80    if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL \
  81        $(${PKG_CONFIG} xtables --cflags --libs) -ldl >/dev/null 2>&1; then
  82        echo "TC_CONFIG_XT:=y" >>$CONFIG
  83        echo "using xtables"
  84    fi
  85    rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
  86}
  87
  88check_xt_old()
  89{
  90    # bail if previous XT checks has already succeeded.
  91    grep -q TC_CONFIG_XT $CONFIG && return
  92
  93    #check if we don't need our internal header ..
  94    cat >$TMPDIR/ipttest.c <<EOF
  95#include <xtables.h>
  96char *lib_dir;
  97unsigned int global_option_offset = 0;
  98const char *program_version = XTABLES_VERSION;
  99const char *program_name = "tc-ipt";
 100struct afinfo afinfo = {
 101        .libprefix      = "libxt_",
 102};
 103
 104void exit_error(enum exittype status, const char *msg, ...)
 105{
 106}
 107
 108int main(int argc, char **argv) {
 109
 110        return 0;
 111}
 112
 113EOF
 114
 115    if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1; then
 116        echo "TC_CONFIG_XT_OLD:=y" >>$CONFIG
 117        echo "using old xtables (no need for xt-internal.h)"
 118    fi
 119    rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
 120}
 121
 122check_xt_old_internal_h()
 123{
 124    # bail if previous XT checks has already succeeded.
 125    grep -q TC_CONFIG_XT $CONFIG && return
 126
 127    #check if we need our own internal.h
 128    cat >$TMPDIR/ipttest.c <<EOF
 129#include <xtables.h>
 130#include "xt-internal.h"
 131char *lib_dir;
 132unsigned int global_option_offset = 0;
 133const char *program_version = XTABLES_VERSION;
 134const char *program_name = "tc-ipt";
 135struct afinfo afinfo = {
 136        .libprefix      = "libxt_",
 137};
 138
 139void exit_error(enum exittype status, const char *msg, ...)
 140{
 141}
 142
 143int main(int argc, char **argv) {
 144
 145        return 0;
 146}
 147
 148EOF
 149        if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1; then
 150            echo "using old xtables with xt-internal.h"
 151            echo "TC_CONFIG_XT_OLD_H:=y" >>$CONFIG
 152        fi
 153        rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
 154}
 155
 156check_ipt()
 157{
 158        if ! grep TC_CONFIG_XT $CONFIG > /dev/null; then
 159                echo "using iptables"
 160        fi
 161}
 162
 163check_ipt_lib_dir()
 164{
 165        IPT_LIB_DIR=$(${PKG_CONFIG} --variable=xtlibdir xtables)
 166        if [ -n "$IPT_LIB_DIR" ]; then
 167                echo $IPT_LIB_DIR
 168                echo "IPT_LIB_DIR:=$IPT_LIB_DIR" >> $CONFIG
 169                return
 170        fi
 171
 172        for dir in /lib /usr/lib /usr/local/lib; do
 173                for file in "xtables" "iptables"; do
 174                        file="$dir/$file/lib*t_*so"
 175                        if [ -f $file ]; then
 176                                echo ${file%/*}
 177                                echo "IPT_LIB_DIR:=${file%/*}" >> $CONFIG
 178                                return
 179                        fi
 180                done
 181        done
 182        echo "not found!"
 183}
 184
 185check_setns()
 186{
 187    cat >$TMPDIR/setnstest.c <<EOF
 188#include <sched.h>
 189int main(int argc, char **argv)
 190{
 191        (void)setns(0,0);
 192        return 0;
 193}
 194EOF
 195    if $CC -I$INCLUDE -o $TMPDIR/setnstest $TMPDIR/setnstest.c >/dev/null 2>&1; then
 196        echo "IP_CONFIG_SETNS:=y" >>$CONFIG
 197        echo "yes"
 198        echo "CFLAGS += -DHAVE_SETNS" >>$CONFIG
 199    else
 200        echo "no"
 201    fi
 202    rm -f $TMPDIR/setnstest.c $TMPDIR/setnstest
 203}
 204
 205check_ipset()
 206{
 207    cat >$TMPDIR/ipsettest.c <<EOF
 208#include <linux/netfilter/ipset/ip_set.h>
 209#ifndef IP_SET_INVALID
 210#define IPSET_DIM_MAX 3
 211typedef unsigned short ip_set_id_t;
 212#endif
 213#include <linux/netfilter/xt_set.h>
 214
 215struct xt_set_info info;
 216#if IPSET_PROTOCOL == 6 || IPSET_PROTOCOL == 7
 217int main(void)
 218{
 219        return IPSET_MAXNAMELEN;
 220}
 221#else
 222#error unknown ipset version
 223#endif
 224EOF
 225
 226    if $CC -I$INCLUDE -o $TMPDIR/ipsettest $TMPDIR/ipsettest.c >/dev/null 2>&1; then
 227        echo "TC_CONFIG_IPSET:=y" >>$CONFIG
 228        echo "yes"
 229    else
 230        echo "no"
 231    fi
 232    rm -f $TMPDIR/ipsettest.c $TMPDIR/ipsettest
 233}
 234
 235check_elf()
 236{
 237    if ${PKG_CONFIG} libelf --exists; then
 238        echo "HAVE_ELF:=y" >>$CONFIG
 239        echo "yes"
 240
 241        echo 'CFLAGS += -DHAVE_ELF' `${PKG_CONFIG} libelf --cflags` >> $CONFIG
 242        echo 'LDLIBS += ' `${PKG_CONFIG} libelf --libs` >>$CONFIG
 243    else
 244        echo "no"
 245    fi
 246}
 247
 248have_libbpf_basic()
 249{
 250    cat >$TMPDIR/libbpf_test.c <<EOF
 251#include <bpf/libbpf.h>
 252int main(int argc, char **argv) {
 253    bpf_program__set_autoload(NULL, false);
 254    bpf_map__ifindex(NULL);
 255    bpf_map__set_pin_path(NULL, NULL);
 256    bpf_object__open_file(NULL, NULL);
 257    return 0;
 258}
 259EOF
 260
 261    $CC -o $TMPDIR/libbpf_test $TMPDIR/libbpf_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1
 262    local ret=$?
 263
 264    rm -f $TMPDIR/libbpf_test.c $TMPDIR/libbpf_test
 265    return $ret
 266}
 267
 268have_libbpf_sec_name()
 269{
 270    cat >$TMPDIR/libbpf_sec_test.c <<EOF
 271#include <bpf/libbpf.h>
 272int main(int argc, char **argv) {
 273    void *ptr;
 274    bpf_program__section_name(NULL);
 275    return 0;
 276}
 277EOF
 278
 279    $CC -o $TMPDIR/libbpf_sec_test $TMPDIR/libbpf_sec_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1
 280    local ret=$?
 281
 282    rm -f $TMPDIR/libbpf_sec_test.c $TMPDIR/libbpf_sec_test
 283    return $ret
 284}
 285
 286check_force_libbpf_on()
 287{
 288    # if set LIBBPF_FORCE=on but no libbpf support, just exist the config
 289    # process to make sure we don't build without libbpf.
 290    if [ "$LIBBPF_FORCE" = on ]; then
 291        echo "  LIBBPF_FORCE=on set, but couldn't find a usable libbpf"
 292        exit 1
 293    fi
 294}
 295
 296check_libbpf()
 297{
 298    # if set LIBBPF_FORCE=off, disable libbpf entirely
 299    if [ "$LIBBPF_FORCE" = off ]; then
 300        echo "no"
 301        return
 302    fi
 303
 304    if ! ${PKG_CONFIG} libbpf --exists && [ -z "$LIBBPF_DIR" ] ; then
 305        echo "no"
 306        check_force_libbpf_on
 307        return
 308    fi
 309
 310    if [ $(uname -m) = x86_64 ]; then
 311        local LIBBPF_LIBDIR="${LIBBPF_DIR}/usr/lib64"
 312    else
 313        local LIBBPF_LIBDIR="${LIBBPF_DIR}/usr/lib"
 314    fi
 315
 316    if [ -n "$LIBBPF_DIR" ]; then
 317        LIBBPF_CFLAGS="-I${LIBBPF_DIR}/usr/include"
 318        LIBBPF_LDLIBS="${LIBBPF_LIBDIR}/libbpf.a -lz -lelf"
 319        LIBBPF_VERSION=$(PKG_CONFIG_LIBDIR=${LIBBPF_LIBDIR}/pkgconfig ${PKG_CONFIG} libbpf --modversion)
 320    else
 321        LIBBPF_CFLAGS=$(${PKG_CONFIG} libbpf --cflags)
 322        LIBBPF_LDLIBS=$(${PKG_CONFIG} libbpf --libs)
 323        LIBBPF_VERSION=$(${PKG_CONFIG} libbpf --modversion)
 324    fi
 325
 326    if ! have_libbpf_basic; then
 327        echo "no"
 328        echo "  libbpf version $LIBBPF_VERSION is too low, please update it to at least 0.1.0"
 329        check_force_libbpf_on
 330        return
 331    else
 332        echo "HAVE_LIBBPF:=y" >> $CONFIG
 333        echo 'CFLAGS += -DHAVE_LIBBPF ' $LIBBPF_CFLAGS >> $CONFIG
 334        echo "CFLAGS += -DLIBBPF_VERSION=\\\"$LIBBPF_VERSION\\\"" >> $CONFIG
 335        echo 'LDLIBS += ' $LIBBPF_LDLIBS >> $CONFIG
 336
 337        if [ -z "$LIBBPF_DIR" ]; then
 338            echo "CFLAGS += -DLIBBPF_DYNAMIC" >> $CONFIG
 339        fi
 340    fi
 341
 342    # bpf_program__title() is deprecated since libbpf 0.2.0, use
 343    # bpf_program__section_name() instead if we support
 344    if have_libbpf_sec_name; then
 345        echo "HAVE_LIBBPF_SECTION_NAME:=y" >> $CONFIG
 346        echo 'CFLAGS += -DHAVE_LIBBPF_SECTION_NAME ' >> $CONFIG
 347    fi
 348
 349    echo "yes"
 350    echo "      libbpf version $LIBBPF_VERSION"
 351}
 352
 353check_selinux()
 354# SELinux is a compile time option in the ss utility
 355{
 356        if ${PKG_CONFIG} libselinux --exists; then
 357                echo "HAVE_SELINUX:=y" >>$CONFIG
 358                echo "yes"
 359
 360                echo 'LDLIBS +=' `${PKG_CONFIG} --libs libselinux` >>$CONFIG
 361                echo 'CFLAGS += -DHAVE_SELINUX' `${PKG_CONFIG} --cflags libselinux` >>$CONFIG
 362        else
 363                echo "no"
 364        fi
 365}
 366
 367check_mnl()
 368{
 369        if ${PKG_CONFIG} libmnl --exists; then
 370                echo "HAVE_MNL:=y" >>$CONFIG
 371                echo "yes"
 372
 373                echo 'CFLAGS += -DHAVE_LIBMNL' `${PKG_CONFIG} libmnl --cflags` >>$CONFIG
 374                echo 'LDLIBS +=' `${PKG_CONFIG} libmnl --libs` >> $CONFIG
 375        else
 376                echo "no"
 377        fi
 378}
 379
 380check_berkeley_db()
 381{
 382    cat >$TMPDIR/dbtest.c <<EOF
 383#include <fcntl.h>
 384#include <stdlib.h>
 385#include <db_185.h>
 386int main(int argc, char **argv) {
 387        dbopen("/tmp/xxx_test_db.db", O_CREAT|O_RDWR, 0644, DB_HASH, NULL);
 388        return 0;
 389}
 390EOF
 391    if $CC -I$INCLUDE -o $TMPDIR/dbtest $TMPDIR/dbtest.c -ldb >/dev/null 2>&1; then
 392        echo "HAVE_BERKELEY_DB:=y" >>$CONFIG
 393        echo "yes"
 394    else
 395        echo "no"
 396    fi
 397    rm -f $TMPDIR/dbtest.c $TMPDIR/dbtest
 398}
 399
 400check_strlcpy()
 401{
 402    cat >$TMPDIR/strtest.c <<EOF
 403#include <string.h>
 404int main(int argc, char **argv) {
 405        char dst[10];
 406        strlcpy(dst, "test", sizeof(dst));
 407        return 0;
 408}
 409EOF
 410    if $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1; then
 411        echo "no"
 412    else
 413        if ${PKG_CONFIG} libbsd --exists; then
 414                echo 'CFLAGS += -DHAVE_LIBBSD' `${PKG_CONFIG} libbsd --cflags` >>$CONFIG
 415                echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >> $CONFIG
 416                echo "no"
 417        else
 418                echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG
 419                echo "yes"
 420        fi
 421    fi
 422    rm -f $TMPDIR/strtest.c $TMPDIR/strtest
 423}
 424
 425check_cap()
 426{
 427        if ${PKG_CONFIG} libcap --exists; then
 428                echo "HAVE_CAP:=y" >>$CONFIG
 429                echo "yes"
 430
 431                echo 'CFLAGS += -DHAVE_LIBCAP' `${PKG_CONFIG} libcap --cflags` >>$CONFIG
 432                echo 'LDLIBS +=' `${PKG_CONFIG} libcap --libs` >> $CONFIG
 433        else
 434                echo "no"
 435        fi
 436}
 437
 438quiet_config()
 439{
 440        cat <<EOF
 441# user can control verbosity similar to kernel builds (e.g., V=1)
 442ifeq ("\$(origin V)", "command line")
 443  VERBOSE = \$(V)
 444endif
 445ifndef VERBOSE
 446  VERBOSE = 0
 447endif
 448ifeq (\$(VERBOSE),1)
 449  Q =
 450else
 451  Q = @
 452endif
 453
 454ifeq (\$(VERBOSE), 0)
 455    QUIET_CC       = @echo '    CC       '\$@;
 456    QUIET_AR       = @echo '    AR       '\$@;
 457    QUIET_LINK     = @echo '    LINK     '\$@;
 458    QUIET_YACC     = @echo '    YACC     '\$@;
 459    QUIET_LEX      = @echo '    LEX      '\$@;
 460endif
 461EOF
 462}
 463
 464echo "# Generated config based on" $INCLUDE >$CONFIG
 465quiet_config >> $CONFIG
 466
 467check_toolchain
 468
 469echo "TC schedulers"
 470
 471echo -n " ATM   "
 472check_atm
 473
 474check_xtables
 475if ! grep -q TC_CONFIG_NO_XT $CONFIG; then
 476        echo -n " IPT   "
 477        check_xt
 478        check_xt_old
 479        check_xt_old_internal_h
 480        check_ipt
 481
 482        echo -n " IPSET  "
 483        check_ipset
 484fi
 485
 486echo
 487if ! grep -q TC_CONFIG_NO_XT $CONFIG; then
 488        echo -n "iptables modules directory: "
 489        check_ipt_lib_dir
 490fi
 491
 492echo -n "libc has setns: "
 493check_setns
 494
 495echo -n "SELinux support: "
 496check_selinux
 497
 498echo -n "libbpf support: "
 499check_libbpf
 500
 501echo -n "ELF support: "
 502check_elf
 503
 504echo -n "libmnl support: "
 505check_mnl
 506
 507echo -n "Berkeley DB: "
 508check_berkeley_db
 509
 510echo -n "need for strlcpy: "
 511check_strlcpy
 512
 513echo -n "libcap support: "
 514check_cap
 515
 516echo >> $CONFIG
 517echo "%.o: %.c" >> $CONFIG
 518echo '  $(QUIET_CC)$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CPPFLAGS) -c -o $@ $<' >> $CONFIG
 519