Skip to content
Snippets Groups Projects
configure 223 KiB
Newer Older
        echo "#include $hdr"    ||
        echo "#include <$hdr>"
}

check_code(){
    log check_code "$@"
    check=$1
    headers=$2
    code=$3
    shift 3
    {
        for hdr in $headers; do
        done
        echo "int main(void) { $code; return 0; }"
    } | check_$check "$@"
}

check_cppflags(){
    log check_cppflags "$@"
    check_cc "$@" <<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 "$@")
Mohamed Naufal's avatar
Mohamed Naufal committed
    check_cxx "$@" <<EOF && append CXXFLAGS "$@"
int x;
EOF
}

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

check_objcflags(){
    log check_cflags "$@"
    test_objcflags "$@" && add_objcflags "$@"
}

test_ldflags(){
    log test_ldflags "$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
    check_ld "cc" "$@" <<EOF
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

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

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

check_header(){
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
check_header_objcc(){
    log check_header_objcc "$@"
    {
       echo "#include <$header>"
       echo "int main(void) { return 0; }"
    } | check_objcc && check_stat "$TMPO" && enable_safe $headers
Måns Rullgård's avatar
Måns Rullgård committed
    disable $func
Mohamed Naufal's avatar
Mohamed Naufal committed
    check_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
    check_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"
    disable $func
    check_ld "cc" "$@" <<EOF && enable $func
#include <math.h>
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; }"
Mohamed Naufal's avatar
Mohamed Naufal committed
    } | check_ld "cc" "$@" && enable $funcs && enable_safe $headers
}

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; }"
    } | check_ld "cxx" "$@" && enable $funcs && enable_safe $headers
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
    check_cpp "$@" <<EOF
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

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

    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
check_lib_cpp(){
    log check_lib_cpp "$@"
    headers="$1"
    classes="$2"
    shift 2
    check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@"
}

check_pkg_config(){
    log check_pkg_config "$@"
    headers="$2"
    funcs="$3"
    shift 3
    check_cmd $pkg_config --exists --print-errors $pkgandversion || 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_safe "${pkg}_cflags" $pkg_cflags   &&
        set_safe "${pkg}_libs"   $pkg_libs
Mohamed Naufal's avatar
Mohamed Naufal committed
    check_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.

    (check_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
    check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
check_struct(){
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
    check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_safe "${struct}_${member}"
check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
    check_code ld "$headers" "$builtin" "cc" "$@" && enable "$name"
check_compile_assert(){
    log check_compile_assert "$@"
    name=$1
    headers=$2
    condition=$3
    shift 3
    disable "$name"
    check_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name"
}

    check_lib "$headers" $func "$@" || die "ERROR: $name not found"
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_pkg_config "$@" || return 1
    add_cflags    $(get_safe "${pkg}_cflags")
    add_extralibs $(get_safe "${pkg}_libs")
    use_pkg_config "$@" || die "ERROR: $pkg not found using pkg-config$pkg_config_fail_message"
require_libfreetype(){
    log require_libfreetype "$@"
    pkg="freetype2"
    check_cmd $pkg_config --exists --print-errors $pkg \
      || die "ERROR: $pkg not found"
    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
    {
        echo "#include <ft2build.h>"
        echo "#include FT_FREETYPE_H"
        echo "long check_func(void) { return (long) FT_Init_FreeType; }"
        echo "int main(void) { return 0; }"
    } | check_ld "cc" $pkg_cflags $pkg_libs \
      && set_safe "${pkg}_cflags" $pkg_cflags \
      && set_safe "${pkg}_libs"   $pkg_libs \
      || die "ERROR: $pkg not found"
    add_cflags    $(get_safe "${pkg}_cflags")
    add_extralibs $(get_safe "${pkg}_libs")
hostcc_e(){
    eval printf '%s\\n' $HOSTCC_E
}

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

check_host_cc(){
    log check_host_cc "$@"
    cat > $TMPC
    log_file $TMPC
    check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
check_host_cpp(){
    log check_host_cpp "$@"
    cat > $TMPC
    log_file $TMPC
    check_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC
check_host_cppflags(){
    log check_host_cppflags "$@"
    check_host_cc "$@" <<EOF && append host_cppflags "$@"
int x;
EOF
}

check_host_cflags(){
    log check_host_cflags "$@"
    set -- $($host_cflags_filter "$@")
    check_host_cc "$@" <<EOF && append host_cflags "$@"
int x;
EOF
}

check_host_cpp_condition(){
    log check_host_cpp_condition "$@"
    header=$1
    condition=$2
    shift 2
    check_host_cpp "$@" <<EOF
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

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

"
AVFILTER_COMPONENTS="
    filters
"
AVFORMAT_COMPONENTS="
    demuxers
    muxers
AVRESAMPLE_COMPONENTS=""
AVUTIL_COMPONENTS=""

COMPONENT_LIST="
    $AVCODEC_COMPONENTS
    $AVDEVICE_COMPONENTS
    $AVFILTER_COMPONENTS
    $AVFORMAT_COMPONENTS
    $AVRESAMPLE_COMPONENTS
    $AVUTIL_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
EXTERNAL_AUTODETECT_LIBRARY_LIST="
    bzlib
    iconv
    libxcb
    libxcb_shm
    libxcb_shape
    libxcb_xfixes
    lzma
    schannel
    sdl
    sdl2
    securetransport
    xlib
    zlib
"
EXTERNAL_LIBRARY_GPL_LIST="
    libx264
    libx265
    libxavs
    libxvid
"

EXTERNAL_LIBRARY_NONFREE_LIST="
    libfdk_aac
    openssl
"

EXTERNAL_LIBRARY_VERSION3_LIST="
    libopencore_amrnb
    libopencore_amrwb
    libvo_amrwbenc
"

EXTERNAL_LIBRARY_GPLV3_LIST="
    libsmbclient
"

    $EXTERNAL_LIBRARY_GPL_LIST
    $EXTERNAL_LIBRARY_NONFREE_LIST
    $EXTERNAL_LIBRARY_VERSION3_LIST
    $EXTERNAL_LIBRARY_GPLV3_LIST
    chromaprint
    decklink
    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
    audiotoolbox
    cuda
    cuvid
    d3d11va
    dxva2
    nvenc
    vaapi
    vda
    vdpau
    videotoolbox_hwaccel
    xvmc
"

HWACCEL_LIBRARY_LIST="
    $HWACCEL_AUTODETECT_LIBRARY_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
    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
    local_aligned_8
    local_aligned_16
James Almer's avatar
James Almer committed
    local_aligned_32
BUILTIN_LIST="
    atomic_cas_ptr
    machine_rw_barrier
    MemoryBarrier
    mm_empty
    rdtsc
HAVE_LIST_CMDLINE="
HAVE_LIST_PUB="
    fast_unaligned
HEADERS_LIST="
    alsa_asoundlib_h
    altivec_h
    arpa_inet_h
    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
    gsm_h
    io_h
    mach_mach_time_h
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
    malloc_h
    opencv2_core_core_c_h
    openjpeg_2_1_openjpeg_h
    openjpeg_2_0_openjpeg_h
    openjpeg_1_5_openjpeg_h
    OpenGL_gl3_h
    stdatomic_h
    sys_mman_h
    sys_param_h
    sys_resource_h
    sys_select_h
    sys_soundcard_h
    sys_time_h
    sys_un_h
    sys_videoio_h
INTRINSICS_LIST="
    intrinsics_neon
"

Alex Beregszaszi's avatar
Alex Beregszaszi committed
    closesocket
Måns Rullgård's avatar
Måns Rullgård committed
    fcntl
Måns Rullgård's avatar
Måns Rullgård committed
    fork
    GetProcessAffinityMask
Ramiro Polla's avatar
Ramiro Polla committed
    getrusage
    GetSystemTimeAsFileTime
Lukasz Marek's avatar
Lukasz Marek committed
    glXGetProcAddress
    kbhit
    MapViewOfFile
    mkstemp
    mprotect
    nanosleep
    posix_memalign
    pthread_cancel
    strerror_r
    UTGetOSTypeFromString
    as_dn_directive