Skip to content
Snippets Groups Projects
configure 232 KiB
Newer Older
    log check_inline_asm_flags "$@"
    name="$1"
    code="$2"
    flags=''
    shift 2
    while [ "$1" != "" ]; do
      append flags $1
      shift
    done;
    disable $name
    cat > $TMPC <<EOF
void foo(void){ __asm__ volatile($code); }
EOF
    log_file $TMPC
    test_cmd $cc $CPPFLAGS $CFLAGS $flags "$@" $CC_C $(cc_o $TMPO) $TMPC &&
    enable $name && add_cflags $flags && add_asflags $flags && add_ldflags $flags
}

check_insn(){
    log check_insn "$@"
Loren Merritt's avatar
Loren Merritt committed
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
    test_cmd $x86asmexe $X86ASMFLAGS -Werror "$@" -o $TMPO $TMPS
ld_o(){
    eval printf '%s\\n' $LD_O
}

Mohamed Naufal's avatar
Mohamed Naufal committed
    type=$1
    shift 1
Jonas Bechtel's avatar
Jonas Bechtel committed
    flags=$(filter_out '-l*|*.so' $@)
    libs=$(filter '-l*|*.so' $@)
    test_$type $($cflags_filter $flags) || return
    flags=$($ldflags_filter $flags)
    libs=$($ldflags_filter $libs)
    test_cmd $ld $LDFLAGS $LDEXEFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
    test_ld $type $@ && enable $name
print_include(){
    hdr=$1
    test "${hdr%.h}" = "${hdr}" &&
        echo "#include $hdr"    ||
        echo "#include <$hdr>"
}

    check=$1
    headers=$2
    code=$3
    shift 3
    {
        for hdr in $headers; do
        done
        echo "int main(void) { $code; return 0; }"
check_cppflags(){
    log check_cppflags "$@"
    test_cpp "$@" <<EOF && append CPPFLAGS "$@"
test_cflags(){
    log test_cflags "$@"
    set -- $($cflags_filter "$@")
check_cflags(){
    log check_cflags "$@"
    test_cflags "$@" && add_cflags "$@"
}

Mohamed Naufal's avatar
Mohamed Naufal committed
check_cxxflags(){
    log check_cxxflags "$@"
    set -- $($cflags_filter "$@")
    test_cxx "$@" <<EOF && append CXXFLAGS "$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
int x;
EOF
}

Luca Barbato's avatar
Luca Barbato committed
test_objcflags(){
    log test_objcflags "$@"
    set -- $($objcflags_filter "$@")
Luca Barbato's avatar
Luca Barbato committed
int x;
EOF
}

check_objcflags(){
Luca Barbato's avatar
Luca Barbato committed
    test_objcflags "$@" && add_objcflags "$@"
}

test_ldflags(){
    log test_ldflags "$@"
    set -- $($ldflags_filter "$@")
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

test_stripflags(){
    log test_stripflags "$@"
    # call test_cc to get a fresh TMPO
    test_cc <<EOF
int main(void) { return 0; }
EOF
    test_cmd $strip $ASMSTRIPFLAGS "$@" $TMPO
}

check_stripflags(){
    log check_stripflags "$@"
    test_stripflags "$@" && add_stripflags "$@"
}

check_header(){
    disable_sanitized $headers
    {
        for hdr in $headers; do
            print_include $hdr
        done
        echo "int x;"
    } | test_cpp "$@" && enable_sanitized $headers
check_header_objcc(){
    log check_header_objcc "$@"
    disable_sanitized $header
    {
       echo "#include <$header>"
       echo "int main(void) { return 0; }"
    } | test_objcc && test_stat "$TMPO" && enable_sanitized $header
check_apple_framework(){
    log check_apple_framework "$@"
    framework="$1"
    name="$(tolower $framework)"
    header="${framework}/${framework}.h"
    disable $name
    check_header_objcc $header &&
        enable $name && eval ${name}_extralibs='"-framework $framework"'
Måns Rullgård's avatar
Måns Rullgård committed
    disable $func
    test_ld "cc" "$@" <<EOF && enable $func
extern int $func();
check_complexfunc(){
    log check_complexfunc "$@"
    func=$1
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f * I"
    disable $func
    test_ld "cc" "$@" <<EOF && enable $func
#include <complex.h>
#include <math.h>
float foo(complex float f, complex float g) { return $func($args); }
int main(void){ return (int) foo; }
EOF
}

check_mathfunc(){
    log check_mathfunc "$@"
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
    test_ld "cc" "$@" <<EOF && enable $func
float foo(float f, float g) { return $func($args); }
check_func_headers(){
    log check_func_headers "$@"
        for func in $funcs; do
            echo "long check_$func(void) { return (long) $func; }"
        done
        echo "int main(void) { int ret = 0;"
        # LTO could optimize out the test functions without this
        for func in $funcs; do
            echo " ret |= ((intptr_t)check_$func) & 0xFFFF;"
        done
        echo "return ret; }"
    } | test_ld "cc" "$@" && enable $funcs && enable_sanitized $headers
Mohamed Naufal's avatar
Mohamed Naufal committed
}

check_class_headers_cpp(){
    log check_class_headers_cpp "$@"
    headers=$1
    classes=$2
    shift 2
    {
        for hdr in $headers; do
            echo "#include <$hdr>"
        done
        echo "int main(void) { "
        i=1
        for class in $classes; do
            echo "$class obj$i;"
            i=$(expr $i + 1)
        done
        echo "return 0; }"
    } | test_ld "cxx" "$@" && enable $funcs && enable_sanitized $headers
test_cpp_condition(){
    log test_cpp_condition "$@"
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

check_cpp_condition(){
    log check_cpp_condition "$@"
    name=$1
    shift 1
    disable $name
    test_cpp_condition "$@" && enable $name
}

    set -- $($cflags_filter "$flags")
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

    name="$1"
    headers="$2"
    funcs="$3"
    shift 3
    disable $name
    check_func_headers "$headers" "$funcs" "$@" &&
        enable $name && eval ${name}_extralibs="\$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
check_lib_cpp(){
    log check_lib_cpp "$@"
    name="$1"
    headers="$2"
    classes="$3"
    shift 3
    disable $name
    check_class_headers_cpp "$headers" "$classes" "$@" &&
        enable $name && eval ${name}_extralibs="\$@"
test_pkg_config(){
    log test_pkg_config "$@"
    name="$1"
    pkg_version="$2"
    pkg="${2%% *}"
    headers="$3"
    funcs="$4"
    shift 4
    disable $name
    test_cmd $pkg_config --exists --print-errors $pkg_version || return
    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
        set_sanitized "${name}_cflags"    $pkg_cflags &&
        set_sanitized "${name}_extralibs" $pkg_libs
check_pkg_config(){
    log check_pkg_config "$@"
    name="$1"
    test_pkg_config "$@" &&
        eval add_cflags \$${name}_cflags
    test_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
check_exec_crash(){

    # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
    # are safe but may not be available everywhere.  Thus we use
    # raise(SIGTERM) instead.  The check is run in a subshell so we
    # can redirect the "Terminated" message from the shell.  SIGBUS
    # is not defined by standard C so it is used conditionally.

    (test_exec "$@") >> $logfile 2>&1 <<EOF
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
int (*func_ptr)(void) = foo;
Diego Biurrun's avatar
Diego Biurrun committed
int main(void){
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
    return func_ptr();
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
    test_code cc "$headers" "$type v" "$@" && enable_sanitized "$type"
check_struct(){
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_sanitized "${struct}_${member}"
    test_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_sanitized "${struct}_${member}"
check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
    test_code ld "$headers" "$builtin" "cc" "$@" && enable "$name"
check_compile_assert(){
    log check_compile_assert "$@"
    name=$1
    headers=$2
    condition=$3
    shift 3
    disable "$name"
    test_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name"
check_cc(){
    log check_cc "$@"
    name=$1
    shift
    disable "$name"
    test_code cc "$@" && enable "$name"
}

    shift
    check_lib $name "$@" || die "ERROR: $name_version not found"
require_cc(){
    log require_cc "$@"
    name="$1"
    shift
    test_code cc "$@" || die "ERROR: $name failed"
}

Mohamed Naufal's avatar
Mohamed Naufal committed
require_cpp(){
    name="$1"
    headers="$2"
    classes="$3"
    shift 3
    check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
}

    check_header "$@" || die "ERROR: $headers not found"
    log require_cpp_condition "$@"
    test_cpp_condition "$@" || die "ERROR: $condition not satisfied"
    check_pkg_config "$@" || die "ERROR: $pkg_version not found using pkg-config$pkg_config_fail_message"
hostcc_e(){
    eval printf '%s\\n' $HOSTCC_E
}

hostcc_o(){
    eval printf '%s\\n' $HOSTCC_O
}

    cat > $TMPC
    log_file $TMPC
    test_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
    cat > $TMPC
    log_file $TMPC
    test_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC
check_host_cppflags(){
    log check_host_cppflags "$@"
    test_host_cpp "$@" <<EOF && append host_cppflags "$@"
check_host_cflags(){
    log check_host_cflags "$@"
    set -- $($host_cflags_filter "$@")
    test_host_cc "$@" <<EOF && append host_cflags "$@"
test_host_cpp_condition(){
    log test_host_cpp_condition "$@"
    header=$1
    condition=$2
    shift 2
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

check_host_cpp_condition(){
    log check_host_cpp_condition "$@"
    name=$1
    shift 1
    disable $name
    test_host_cpp_condition "$@" && enable $name
}

    cmp -s "$1" "$2" && { test "$quiet" != "yes" && echo "$2 is unchanged"; } && return
    mkdir -p "$(dirname $2)"
Diego Biurrun's avatar
Diego Biurrun committed
    cp -f "$1" "$2"
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

COMPONENT_LIST="
    $AVCODEC_COMPONENTS
    $AVDEVICE_COMPONENTS
    $AVFILTER_COMPONENTS
    $AVFORMAT_COMPONENTS
"

    avio_reading_example
    demuxing_decoding_example
    filter_audio_example
    filtering_audio_example
    filtering_video_example
    http_multiclient_example
    metadata_example
    qsvdec_example
    remuxing_example
    resampling_audio_example
    scaling_video_example
    transcode_aac_example
    transcoding_example
    vaapi_encode_example
    vaapi_transcode_example
    iconv
    libxcb
    libxcb_shm
    libxcb_shape
    libxcb_xfixes
    lzma
    schannel
    sdl2
    securetransport
EXTERNAL_LIBRARY_GPL_LIST="
    libx264
    libx265
    libxavs
    libxvid
"

EXTERNAL_LIBRARY_NONFREE_LIST="
"

EXTERNAL_LIBRARY_VERSION3_LIST="
    libopencore_amrnb
    libopencore_amrwb
EXTERNAL_LIBRARY_GPLV3_LIST="
    libsmbclient
"

    $EXTERNAL_LIBRARY_GPL_LIST
    $EXTERNAL_LIBRARY_NONFREE_LIST
    $EXTERNAL_LIBRARY_VERSION3_LIST
    $EXTERNAL_LIBRARY_GPLV3_LIST
    chromaprint
Tomas Härdin's avatar
Tomas Härdin committed
    libcodec2
Mark Thompson's avatar
Mark Thompson committed
    libdrm
    libfontconfig
wm4's avatar
wm4 committed
    libgme
    libopenmpt
    libsnappy
Paul B Mahol's avatar
Paul B Mahol committed
    libtesseract
Justin Ruggles's avatar
Justin Ruggles committed
    libwebp
    libzimg
Stefano Sabatini's avatar
Stefano Sabatini committed
    libzmq
Lukasz Marek's avatar
Lukasz Marek committed
    opengl
    videotoolbox
# catchall list of things that require external libs to link
EXTRALIBS_LIST="
    cpu_init
    cws2fws
"

HWACCEL_LIBRARY_NONFREE_LIST="
    $HWACCEL_LIBRARY_NONFREE_LIST
    runtime_cpudetect
    safe_bitstream_reader
    shared
    small
    static
    swscale_alpha
"

LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
    postproc
    pixelutils
# COMPONENT_LIST needs to come last to ensure correct dependency checking
    $EXTERNAL_AUTODETECT_LIBRARY_LIST
    $HWACCEL_AUTODETECT_LIBRARY_LIST
    memory_poisoning
THREADS_LIST="
    os2threads
ATOMICS_LIST="
    atomics_gcc
    atomics_suncc
AUTODETECT_LIBS="
    $EXTERNAL_AUTODETECT_LIBRARY_LIST
    $HWACCEL_AUTODETECT_LIBRARY_LIST
    $THREADS_LIST
"

ARCH_LIST="
Måns Rullgård's avatar
Måns Rullgård committed
    tomi
ARCH_EXT_LIST_ARM="
    armv8
ARCH_EXT_LIST_MIPS="
    mipsfpu
    mips32r2
    loongson2
    loongson3
ARCH_EXT_LIST_X86_SIMD="
Rodger Combs's avatar
Rodger Combs committed
    aesni
ARCH_EXT_LIST_PPC="
    altivec
    dcbzl
    ldbrx
ARCH_FEATURES="
    aligned_stack
    fast_64bit
    fast_clz
    fast_cmov
BUILTIN_LIST="
    atomic_cas_ptr
    machine_rw_barrier
    MemoryBarrier
    mm_empty
    rdtsc
HAVE_LIST_CMDLINE="
HAVE_LIST_PUB="
    fast_unaligned
    cdio_paranoia_h
    cdio_paranoia_paranoia_h
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_bktr_ioctl_bt848_h
    dev_video_meteor_ioctl_meteor_h
    direct_h
    io_h
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h