Skip to content
Snippets Groups Projects
configure 113 KiB
Newer Older
  • Learn to ignore specific revisions
  • # Libav configure script
    
    Diego Biurrun's avatar
    Diego Biurrun committed
    # Copyright (c) 2000-2002 Fabrice Bellard
    # Copyright (c) 2005-2008 Diego Biurrun
    # Copyright (c) 2005-2008 Mans Rullgard
    
    # Prevent locale nonsense from breaking basic text processing.
    
    # make sure we are running under a compatible shell
    
    # try to make this part work with most shells
    
    try_exec(){
    
        echo "Trying shell $1"
    
        type "$1" > /dev/null 2>&1 && exec "$@"
    
    unset foo
    
    (: ${foo%%bar}) 2> /dev/null
    
    (: ${foo?}) 2> /dev/null
    
    E2="$?"
    
    if test "$E1" != 0 || test "$E2" = 0; then
        echo "Broken shell detected.  Trying alternatives."
    
        export FF_CONF_EXEC
        if test "0$FF_CONF_EXEC" -lt 1; then
            FF_CONF_EXEC=1
            try_exec bash "$0" "$@"
        fi
        if test "0$FF_CONF_EXEC" -lt 2; then
            FF_CONF_EXEC=2
            try_exec ksh "$0" "$@"
        fi
        if test "0$FF_CONF_EXEC" -lt 3; then
            FF_CONF_EXEC=3
            try_exec /usr/xpg4/bin/sh "$0" "$@"
    
        fi
        echo "No compatible shell script interpreter found."
    
    Diego Biurrun's avatar
    Diego Biurrun committed
        echo "This configure script requires a POSIX-compatible shell"
    
        echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
    
        echo "Instead, install a working POSIX-compatible shell."
    
        echo "Disabling this configure test will create a broken Libav."
    
        if test "$BASH_VERSION" = '2.04.0(1)-release'; then
            echo "This bash version ($BASH_VERSION) is broken on your platform."
            echo "Upgrade to a later version if available."
        fi
    
    test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH
    
    
        cat <<EOF
    
    Usage: configure [options]
    Options: [defaults in brackets after descriptions]
    
    
    Help options:
    
      --help                   print this message
    
      --list-decoders          show all available decoders
      --list-encoders          show all available encoders
      --list-hwaccels          show all available hardware accelerators
      --list-demuxers          show all available demuxers
      --list-muxers            show all available muxers
      --list-parsers           show all available parsers
      --list-protocols         show all available protocols
      --list-bsfs              show all available bitstream filters
      --list-indevs            show all available input devices
      --list-outdevs           show all available output devices
      --list-filters           show all available filters
    
    Standard options:
    
      --logfile=FILE           log tests and output to FILE [config.log]
    
      --disable-logging        do not log configure debug information
      --prefix=PREFIX          install in PREFIX [$prefix]
      --bindir=DIR             install binaries in DIR [PREFIX/bin]
    
      --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
    
      --libdir=DIR             install libs in DIR [PREFIX/lib]
      --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
      --incdir=DIR             install includes in DIR [PREFIX/include]
      --mandir=DIR             install man page in DIR [PREFIX/share/man]
    
    
    Licensing options:
    
      --enable-gpl             allow use of GPL code, the resulting libs
                               and binaries will be under GPL [no]
      --enable-version3        upgrade (L)GPL to version 3 [no]
      --enable-nonfree         allow use of nonfree code, the resulting libs
                               and binaries will be unredistributable [no]
    
    
    Configuration options:
      --disable-static         do not build static libraries [no]
      --enable-shared          build shared libraries [no]
      --enable-small           optimize for size instead of speed
      --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
      --enable-gray            enable full grayscale support (slower color)
      --disable-swscale-alpha  disable alpha channel support in swscale
    
    Component options:
    
      --disable-doc            do not build documentation
    
      --disable-avconv         disable avconv build
    
    Anton Khirnov's avatar
    Anton Khirnov committed
      --disable-avplay         disable avplay build
    
      --disable-avprobe        disable avprobe build
    
      --disable-avserver       disable avserver build
    
      --disable-avdevice       disable libavdevice build
      --disable-avcodec        disable libavcodec build
      --disable-avformat       disable libavformat build
      --disable-swscale        disable libswscale build
    
      --disable-avfilter       disable video filter support [no]
    
    Justin Ruggles's avatar
    Justin Ruggles committed
      --disable-avresample     disable libavresample build [no]
    
      --disable-pthreads       disable pthreads [auto]
    
      --disable-w32threads     disable Win32 threads [auto]
    
      --enable-x11grab         enable X11 grabbing [no]
      --disable-network        disable network support [no]
    
      --disable-dct            disable DCT code
    
      --disable-dwt            disable DWT code
      --disable-lsp            disable LSP code
    
      --disable-lzo            disable LZO decoder code
    
      --disable-mdct           disable MDCT code
      --disable-rdft           disable RDFT code
    
      --disable-fft            disable FFT code
      --enable-dxva2           enable DXVA2 code
    
      --enable-vaapi           enable VAAPI code
    
      --enable-vda             enable VDA code
    
      --enable-vdpau           enable VDPAU code
    
    
    Individual component options:
    
      --disable-everything     disable all components listed below
    
      --disable-encoder=NAME   disable encoder NAME
      --enable-encoder=NAME    enable encoder NAME
      --disable-encoders       disable all encoders
      --disable-decoder=NAME   disable decoder NAME
      --enable-decoder=NAME    enable decoder NAME
      --disable-decoders       disable all decoders
      --disable-hwaccel=NAME   disable hwaccel NAME
      --enable-hwaccel=NAME    enable hwaccel NAME
      --disable-hwaccels       disable all hwaccels
      --disable-muxer=NAME     disable muxer NAME
      --enable-muxer=NAME      enable muxer NAME
      --disable-muxers         disable all muxers
      --disable-demuxer=NAME   disable demuxer NAME
      --enable-demuxer=NAME    enable demuxer NAME
      --disable-demuxers       disable all demuxers
      --enable-parser=NAME     enable parser NAME
      --disable-parser=NAME    disable parser NAME
      --disable-parsers        disable all parsers
      --enable-bsf=NAME        enable bitstream filter NAME
      --disable-bsf=NAME       disable bitstream filter NAME
      --disable-bsfs           disable all bitstream filters
      --enable-protocol=NAME   enable protocol NAME
      --disable-protocol=NAME  disable protocol NAME
      --disable-protocols      disable all protocols
    
      --enable-indev=NAME      enable input device NAME
    
      --disable-indev=NAME     disable input device NAME
      --disable-indevs         disable input devices
    
      --enable-outdev=NAME     enable output device NAME
      --disable-outdev=NAME    disable output device NAME
    
      --disable-outdevs        disable output devices
      --disable-devices        disable all devices
      --enable-filter=NAME     enable filter NAME
      --disable-filter=NAME    disable filter NAME
      --disable-filters        disable all filters
    
    External library support:
      --enable-avisynth        enable reading of AVISynth script files [no]
      --enable-bzlib           enable bzlib [autodetect]
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
      --enable-frei0r          enable frei0r video filtering
    
      --enable-gnutls          enable gnutls [no]
    
      --enable-libcdio         enable audio CD grabbing with libcdio
    
      --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                               and libraw1394 [no]
    
      --enable-libfaac         enable AAC encoding via libfaac [no]
      --enable-libfdk-aac      enable AAC encoding via libfdk-aac [no]
    
      --enable-libfreetype     enable libfreetype [no]
    
      --enable-libgsm          enable GSM de/encoding via libgsm [no]
    
      --enable-libilbc         enable iLBC de/encoding via libilbc [no]
    
      --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
    
      --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
      --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
      --enable-libopencv       enable video filtering via libopencv [no]
    
      --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
    
      --enable-libopus         enable Opus decoding via libopus [no]
    
      --enable-libpulse        enable Pulseaudio input via libpulse [no]
    
      --enable-librtmp         enable RTMP[E] support via librtmp [no]
    
      --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
      --enable-libspeex        enable Speex de/encoding via libspeex [no]
    
      --enable-libtheora       enable Theora encoding via libtheora [no]
    
      --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
    
      --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
    
      --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
      --enable-libvpx          enable VP8 de/encoding via libvpx [no]
    
      --enable-libx264         enable H.264 encoding via x264 [no]
    
      --enable-libxavs         enable AVS encoding via xavs [no]
    
      --enable-libxvid         enable Xvid encoding via xvidcore,
                               native MPEG-4/Xvid encoder exists [no]
    
      --enable-openssl         enable openssl [no]
    
      --enable-zlib            enable zlib [autodetect]
    
    Advanced options (experts only):
      --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
      --enable-cross-compile   assume a cross-compiler is used
      --sysroot=PATH           root of cross-build tree
      --sysinclude=PATH        location of cross-build system headers
      --target-os=OS           compiler targets OS [$target_os]
      --target-exec=CMD        command to run executables on target
      --target-path=DIR        path to view of build directory on target
    
      --toolchain=NAME         set tool defaults according to NAME
    
      --nm=NM                  use nm tool
    
      --ar=AR                  use archive tool AR [$ar_default]
    
      --as=AS                  use assembler AS [$as_default]
      --cc=CC                  use C compiler CC [$cc_default]
    
      --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
    
      --ld=LD                  use linker LD
      --host-cc=HOSTCC         use host C compiler HOSTCC
      --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
    
      --host-ld=HOSTLD         use host linker HOSTLD
    
      --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
      --host-libs=HLIBS        use libs HLIBS when linking for host
    
      --host-os=OS             compiler host OS [$target_os]
    
      --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
      --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
      --extra-libs=ELIBS       add ELIBS [$ELIBS]
      --extra-version=STRING   version string suffix []
    
      --optflags=OPTFLAGS      override optimization-related compiler flags
    
      --build-suffix=SUFFIX    library name suffix []
    
      --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
    
      --arch=ARCH              select architecture [$arch]
      --cpu=CPU                select the minimum required CPU (affects
                               instruction selection, may crash on older CPUs)
    
      --enable-pic             build position-independent code
      --enable-sram            allow use of on-chip SRAM
    
      --enable-thumb           compile for Thumb instruction set
    
      --disable-symver         disable symbol versioning
      --enable-hardcoded-tables use hardcoded tables instead of runtime generation
      --disable-safe-bitstream-reader
                               disable buffer boundary checking in bitreaders
                               (faster, but may crash)
      --enable-memalign-hack   emulate memalign, interferes with memory debuggers
    
      --enable-lto             use link-time optimization
    
    
    Optimization options (experts only):
    
      --disable-asm            disable all assembler optimizations
    
      --disable-altivec        disable AltiVec optimizations
      --disable-amd3dnow       disable 3DNow! optimizations
      --disable-amd3dnowext    disable 3DNow! extended optimizations
      --disable-mmx            disable MMX optimizations
    
      --disable-mmxext         disable MMXEXT optimizations
    
      --disable-sse            disable SSE optimizations
    
      --disable-sse2           disable SSE2 optimizations
      --disable-sse3           disable SSE3 optimizations
    
      --disable-ssse3          disable SSSE3 optimizations
    
      --disable-sse4           disable SSE4 optimizations
      --disable-sse42          disable SSE4.2 optimizations
    
      --disable-avx            disable AVX optimizations
    
      --disable-fma4           disable FMA4 optimizations
    
      --disable-armv5te        disable armv5te optimizations
      --disable-armv6          disable armv6 optimizations
      --disable-armv6t2        disable armv6t2 optimizations
      --disable-armvfp         disable ARM VFP optimizations
    
      --disable-neon           disable NEON optimizations
    
      --disable-vis            disable VIS optimizations
    
      --disable-inline-asm     disable use of inline assembler
    
      --disable-yasm           disable use of yasm assembler
    
    
    Developer options (useful when working on Libav itself):
    
      --disable-debug          disable debugging symbols
      --enable-debug=LEVEL     set the debug level [$debuglevel]
      --disable-optimizations  disable compiler optimizations
      --enable-extra-warnings  enable more compiler warnings
    
      --samples=PATH           location of test samples for FATE, if not set use
    
                               \$LIBAV_SAMPLES at make invocation time.
    
      --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                               should be used only for debugging purposes)
    
      --enable-random          randomly enable/disable components
      --disable-random
      --enable-random=LIST     randomly enable/disable specific components or
      --disable-random=LIST    component groups. LIST is a comma-separated list
                               of NAME[:PROB] entries where NAME is a component
                               (group) and PROB the probability associated with
                               NAME (default 0.5).
      --random-seed=VALUE      seed value for --enable/disable-random
    
    
    NOTE: Object files are built at the place where configure is launched.
    EOF
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        log BEGIN $1
    
        pr -n -t $1 >> $logfile
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        log END $1
    }
    
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        log "$@"
    
    warn(){
        log "WARNING: $*"
        WARNINGS="${WARNINGS}WARNING: $*\n"
    }
    
    
    If you think configure made a mistake, make sure you are using the latest
    
    version from Git.  If the latest version fails, report the problem to the
    
    libav-user@libav.org mailing list or IRC #libav on irc.freenode.net.
    
    Rerun configure with logging enabled (do not use --disable-logging), and
    include the log this produces with your report.
    
            cat <<EOF
    
    Include the log file "$logfile" produced by configure as this will help
    solving the problem.
    
    # Avoid locale weirdness, besides we really just want to translate ASCII.
    
        echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
    
    tolower(){
    
        echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
    
    c_escape(){
        echo "$*" | sed 's/["\\]/\\\0/g'
    }
    
    
    sh_quote(){
        v=$(echo "$1" | sed "s/'/'\\\\''/g")
    
        test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
    
    cleanws(){
        echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
    }
    
    
            eval "case $v in $pat) echo $v ;; esac"
    
    filter_out(){
        pat=$1
        shift
        for v; do
            eval "case $v in $pat) ;; *) echo $v ;; esac"
        done
    }
    
    
        for v; do eval $m; done
    
    add_suffix(){
        suffix=$1
        shift
        for v; do echo ${v}${suffix}; done
    }
    
    
    set_all(){
        value=$1
        shift
        for var in $*; do
            eval $var=$value
        done
    }
    
    
    set_weak(){
        value=$1
        shift
        for var; do
            eval : \${$var:=$value}
        done
    }
    
    
    set_safe(){
        var=$1
        shift
        eval $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')='$*'
    }
    
    get_safe(){
        eval echo \$$(echo "$1" | sed 's/[^A-Za-z0-9_]/_/g')
    }
    
    
    pushvar(){
        for var in $*; do
            eval level=\${${var}_level:=0}
            eval ${var}_${level}="\$$var"
            eval ${var}_level=$(($level+1))
        done
    }
    
    popvar(){
        for var in $*; do
            eval level=\${${var}_level:-0}
            test $level = 0 && continue
            eval level=$(($level-1))
            eval $var="\${${var}_${level}}"
            eval ${var}_level=$level
            eval unset ${var}_${level}
        done
    }
    
    
    enable(){
        set_all yes $*
    }
    
    disable(){
        set_all no $*
    }
    
    
    enable_weak(){
        set_weak yes $*
    }
    
    disable_weak(){
        set_weak no $*
    }
    
    
        for var; do
            enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
        done
    
        for var; do
            disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
        done
    
    do_enable_deep(){
        for var; do
            enabled $var && continue
            eval sel="\$${var}_select"
    
            eval sgs="\$${var}_suggest"
            pushvar var sgs
    
            popvar sgs
            enable_deep_weak $sgs
    
            popvar var
        done
    }
    
    enable_deep(){
        do_enable_deep $*
        enable $*
    }
    
    
    enable_deep_weak(){
        do_enable_deep $*
        enable_weak $*
    }
    
    
        test "${1#!}" = "$1" && op== || op=!=
        eval test "x\$${1#!}" $op "xyes"
    
        test "${1#!}" = "$1" && op== || op=!=
        eval test "x\$${1#!}" $op "xno"
    
    enabled_all(){
        for opt; do
            enabled $opt || return 1
        done
    }
    
    
    disabled_all(){
        for opt; do
            disabled $opt || return 1
        done
    }
    
    
    enabled_any(){
        for opt; do
            enabled $opt && return 0
        done
    }
    
    
    disabled_any(){
        for opt; do
            disabled $opt && return 0
        done
    
    set_default(){
        for opt; do
    
            eval : \${$opt:=\$${opt}_default}
    
    is_in(){
        value=$1
        shift
        for var in $*; do
            [ $var = $value ] && return 0
        done
        return 1
    }
    
    
            enabled ${cfg}_checking && die "Circular dependency for $cfg."
            disabled ${cfg}_checking && continue
            enable ${cfg}_checking
    
    
            eval dep_all="\$${cfg}_deps"
            eval dep_any="\$${cfg}_deps_any"
    
            eval dep_sel="\$${cfg}_select"
    
            eval dep_sgs="\$${cfg}_suggest"
    
            eval dep_ifa="\$${cfg}_if"
            eval dep_ifn="\$${cfg}_if_any"
    
            pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
            check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
            popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
    
            [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
            [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
    
    Måns Rullgård's avatar
    Måns Rullgård committed
            enabled_all  $dep_all || disable $cfg
            enabled_any  $dep_any || disable $cfg
    
            disabled_any $dep_sel && disable $cfg
    
            if enabled $cfg; then
                eval dep_extralibs="\$${cfg}_extralibs"
                test -n "$dep_extralibs" && add_extralibs $dep_extralibs
    
                enable_deep $dep_sel
    
                enable_deep_weak $dep_sgs
    
            disable ${cfg}_checking
    
    print_config(){
        pfx=$1
    
        map 'eval echo "$v \${$v:-no}"' "$@" |
        awk "BEGIN { split(\"$files\", files) }
            {
                c = \"$pfx\" toupper(\$1);
                v = \$2;
                sub(/yes/, 1, v);
                sub(/no/,  0, v);
                for (f in files) {
                    file = files[f];
                    if (file ~ /\\.h\$/) {
                        printf(\"#define %s %d\\n\", c, v) >>file;
                    } else if (file ~ /\\.asm\$/) {
                        printf(\"%%define %s %d\\n\", c, v) >>file;
                    } else if (file ~ /\\.mak\$/) {
                        n = +v ? \"\" : \"!\";
                        printf(\"%s%s=yes\\n\", n, c) >>file;
                    }
                }
            }"
    
    print_enabled(){
    
        test x"$1" = x-n && end=" " && shift || end="\n"
    
        suf=$1
        shift
        for v; do
            enabled $v && printf "%s$end" ${v%$suf};
        done
    }
    
    
    prepend(){
        var=$1
        shift
        eval "$var=\"$* \$$var\""
    }
    
    
        append CPPFLAGS "$@"
    
        append CFLAGS $($cflags_filter "$@")
    
        append ASFLAGS $($asflags_filter "$@")
    
        append LDFLAGS $($ldflags_filter "$@")
    
        prepend extralibs $($ldflags_filter "$@")
    
    add_host_cflags(){
        append host_cflags $($host_cflags_filter "$@")
    }
    
    add_host_ldflags(){
        append host_ldflags $($host_ldflags_filter "$@")
    }
    
    
    add_compat(){
        append compat_objs $1
        shift
        map 'add_cppflags -D$v' "$@"
    }
    
    
        log "$@"
    
    cc_o(){
        eval printf '%s\\n' $CC_O
    }
    
    
    cc_e(){
        eval printf '%s\\n' $CC_E
    }
    
    
        check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
    
        check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
    
    as_o(){
        eval printf '%s\\n' $AS_O
    }
    
    
    check_as(){
        log check_as "$@"
        cat > $TMPC
        log_file $TMPC
    
        check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPC
    
    check_inline_asm(){
        log check_inline_asm "$@"
    
        disable $name
        check_as "$@" <<EOF && enable $name
    
    void foo(void){ __asm__ volatile($code); }
    
    Loren Merritt's avatar
    Loren Merritt committed
    check_yasm(){
        log check_yasm "$@"
        echo "$1" > $TMPS
        log_file $TMPS
        shift 1
        check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
    }
    
    
    ld_o(){
        eval printf '%s\\n' $LD_O
    }
    
    
        flags=$(filter_out '-l*' "$@")
        libs=$(filter '-l*' "$@")
    
        check_cc $($cflags_filter $flags) || return
    
        flags=$($ldflags_filter $flags)
        libs=$($ldflags_filter $libs)
    
        check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
    
    check_code(){
        log check_code "$@"
        check=$1
        headers=$2
        code=$3
        shift 3
        {
            for hdr in $headers; do
                echo "#include <$hdr>"
            done
            echo "int main(void) { $code; return 0; }"
        } | check_$check "$@"
    }
    
    
    check_cppflags(){
        log check_cppflags "$@"
    
        check_cc "$@" <<EOF && append CPPFLAGS "$@"
    
    check_cflags(){
    
        set -- $($cflags_filter "$@")
    
        check_cc "$@" <<EOF && append CFLAGS "$@"
    
    test_ldflags(){
        log test_ldflags "$@"
        check_ld "$@" <<EOF
    
    check_ldflags(){
        log check_ldflags "$@"
        test_ldflags "$@" && add_ldflags "$@"
    }
    
    
    check_header(){
    
        disable_safe $header
        check_cpp "$@" <<EOF && enable_safe $header
    
    #include <$header>
    int x;
    EOF
    }
    
    check_func(){
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        disable $func
        check_ld "$@" <<EOF && enable $func
    
    extern int $func();
    
    check_mathfunc(){
    
        log check_mathfunc "$@"
    
        narg=$2
        shift 2
        test $narg = 2 && args="f, g" || args="f"
    
        disable $func
        check_ld "$@" <<EOF && enable $func
    #include <math.h>
    
    float foo(float f, float g) { return $func($args); }
    
    int main(void){ return 0; }
    
    check_func_headers(){
        log check_func_headers "$@"
    
        {
            for hdr in $headers; do
                echo "#include <$hdr>"
            done
            for func in $funcs; do
                echo "long check_$func(void) { return (long) $func; }"
            done
            echo "int main(void) { return 0; }"
        } | check_ld "$@" && 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
    }
    
    
    check_lib(){
        log check_lib "$@"
        header="$1"
        func="$2"
        shift 2
    
        check_header $header && check_func $func "$@" && add_extralibs "$@"
    
    check_lib2(){
        log check_lib2 "$@"
        headers="$1"
    
        check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
    
    check_pkg_config(){
        log check_pkg_config "$@"
        pkg="$1"
        headers="$2"
        funcs="$3"
        shift 3
        $pkg_config --exists $pkg || return
        pkg_cflags=$($pkg_config --cflags $pkg)
        pkg_libs=$($pkg_config --libs $pkg)
        check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
            set_safe ${pkg}_cflags $pkg_cflags   &&
            set_safe ${pkg}_libs   $pkg_libs
    }
    
    
        check_ld "$@" && { 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);
    }
    
    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
    
    check_type(){
        log check_type "$@"
        headers=$1
        type=$2
        shift 2
    
        check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
    
    check_struct(){
        log check_type "$@"
        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}"
    
    require(){
        name="$1"
        header="$2"
        func="$3"
        shift 3
        check_lib $header $func "$@" || die "ERROR: $name not found"
    
    require2(){
        name="$1"
        headers="$2"
        func="$3"
        shift 3
        check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
    }
    
    
    require_pkg_config(){
        pkg="$1"
        check_pkg_config "$@" || die "ERROR: $pkg not found"
        add_cflags    $(get_safe ${pkg}_cflags)
        add_extralibs $(get_safe ${pkg}_libs)
    }
    
    
    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_cflags(){
        log check_host_cflags "$@"
    
        set -- $($host_cflags_filter "$@")
    
        check_host_cc "$@" <<EOF && append host_cflags "$@"
    int x;
    EOF
    }
    
    
    apply(){
        file=$1
        shift
        "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
    }
    
    
        cmp -s "$1" "$2" && 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.
    
    
    COMPONENT_LIST="
        bsfs
        decoders
        demuxers
        encoders
    
    Vitor Sessak's avatar
    Vitor Sessak committed
        filters
    
    PROGRAM_LIST="
        avconv
        avplay
        avprobe
        avserver
    "
    
    
    CONFIG_LIST="
        $COMPONENT_LIST
    
    Justin Ruggles's avatar
    Justin Ruggles committed
        avresample
    
    Laurent Aimar's avatar
    Laurent Aimar committed
        dxva2