Skip to content
Snippets Groups Projects
configure 114 KiB
Newer Older
  • Learn to ignore specific revisions
  • # FFmpeg 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 FFMPEG, DO NOT REPORT IT AS SUCH."
    
        echo "Instead, install a working POSIX-compatible shell."
    
        echo "Disabling this configure test will create a broken FFmpeg."
    
        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
    
    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/ffmpeg]
    
      --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-ffmpeg         disable ffmpeg build
      --disable-ffplay         disable ffplay build
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
      --disable-ffprobe        disable ffprobe build
    
      --disable-ffserver       disable ffserver build
    
      --disable-avdevice       disable libavdevice build
      --disable-avcodec        disable libavcodec build
      --disable-avformat       disable libavformat build
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
      --disable-swresample     disable libswresample build
    
      --disable-swscale        disable libswscale build
    
      --disable-postproc       disable libpostproc build
    
      --disable-avfilter       disable video filter support [no]
    
      --enable-avresample      enable libavresample build [no]
    
      --disable-pthreads       disable pthreads [auto]
    
      --disable-w32threads     disable Win32 threads [auto]
    
      --disable-os2threads     disable OS/2 threads [auto]
    
      --enable-x11grab         enable X11 grabbing [no]
      --disable-network        disable network support [no]
    
      --disable-dct            disable DCT 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 [autodetect]
    
      --enable-vda             enable VDA code   [autodetect]
    
      --enable-vdpau           enable VDPAU code [autodetect]
    
    
    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]
    
      --enable-fontconfig      enable fontconfig
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
      --enable-frei0r          enable frei0r video filtering
    
      --enable-gnutls          enable gnutls [no]
    
      --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
    
      --enable-libass          enable libass subtitles rendering [no]
    
    Petri Hintukainen's avatar
    Petri Hintukainen committed
      --enable-libbluray       enable BluRay reading using libbluray [no]
    
      --enable-libcelt         enable CELT decoding via libcelt [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-libcdio         enable audio CD grabbing with libcdio
    
      --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                               and libraw1394 [no]
      --enable-libfaac         enable FAAC support via libfaac [no]
    
      --enable-libfreetype     enable libfreetype [no]
    
      --enable-libgsm          enable GSM support via libgsm [no]
    
    Clément Bœsch's avatar
    Clément Bœsch committed
      --enable-libmodplug      enable ModPlug via libmodplug [no]
    
      --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
      --enable-libnut          enable NUT (de)muxing via libnut,
                               native (de)muxer exists [no]
    
      --enable-libopenjpeg     enable JPEG 2000 encoding/decoding via OpenJPEG [no]
    
      --enable-libpulse        enable Pulseaudio input via libpulse [no]
    
      --enable-librtmp         enable RTMP[E] support via librtmp [no]
    
      --enable-libschroedinger enable Dirac support via libschroedinger [no]
    
      --enable-libspeex        enable Speex support via libspeex [no]
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
      --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    
      --enable-libtheora       enable Theora encoding via libtheora [no]
    
      --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
    
      --enable-libv4l2         enable libv4l2/v4l-utils [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 en/decoding via libvorbis,
    
                               native implementation exists [no]
    
    James Zern's avatar
    James Zern committed
      --enable-libvpx          enable VP8 support 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-openal          enable OpenAL 1.1 capture support [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
    
      --nm=NM                  use nm tool NM [$nm_default]
    
      --ar=AR                  use archive tool AR [$ar_default]
    
      --as=AS                  use assembler AS [$as_default]
    
      --yasmexe=EXE            use yasm-compatible assembler EXE [$yasmexe_default]
    
      --cc=CC                  use C compiler CC [$cc_default]
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
      --cxx=CXX                use C compiler CXX [$cxx_default]
    
      --ld=LD                  use linker LD [$ld_default]
    
      --host-cc=HOSTCC         use host C compiler HOSTCC
      --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
      --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
      --host-libs=HLIBS        use libs HLIBS when linking for host
      --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
      --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
    
      --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
      --extra-libs=ELIBS       add ELIBS [$ELIBS]
      --extra-version=STRING   version string suffix []
    
      --optflags               override optimization-related compiler flags
    
      --build-suffix=SUFFIX    library name suffix []
    
      --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
    
      --progs-suffix=SUFFIX    program name suffix []
    
      --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
      --disable-symver         disable symbol versioning
      --disable-fastdiv        disable table-based division
      --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
    
    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-mmx2           disable MMX2 optimizations
      --disable-sse            disable SSE optimizations
      --disable-ssse3          disable SSSE3 optimizations
    
      --disable-avx            disable AVX optimizations
    
      --disable-armv5te        disable armv5te optimizations
      --disable-armv6          disable armv6 optimizations
      --disable-armv6t2        disable armv6t2 optimizations
      --disable-armvfp         disable ARM VFP optimizations
      --disable-mmi            disable MMI optimizations
    
      --disable-neon           disable NEON optimizations
    
      --disable-vis            disable VIS optimizations
      --disable-yasm           disable use of yasm assembler
    
      --postproc-version=V     build libpostproc version V.
                               Where V can be '$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO' or 'current'. [$postproc_version_default]
    
    Developer options (useful when working on FFmpeg itself):
    
    Reimar Döffinger's avatar
    Reimar Döffinger committed
      --enable-coverage        build with test coverage instrumentation
    
      --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
    
      --disable-stripping      disable stripping of executables and shared libraries
    
      --assert-level=level     0(default), 1 or 2, amount of assertion testing,
    
                               2 causes a slowdown at runtime.
    
      --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
                               leaks and errors, using the specified valgrind binary.
                               Cannot be combined with --target-exec
    
      --samples=PATH           location of test samples for FATE, if not set use
                               \$FATE_SAMPLES at make invocation time.
    
      --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                               should be used only for debugging purposes)
    
    
    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
    
    ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
    
    Rerun configure with logging enabled (do not use --disable-logging), and
    include the log this produces with your report.
    
    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
    
    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_h(){
        enabled $1 && v=1 || v=0
        echo "#define $2 $v"
    }
    
    print_config_mak(){
        enabled $1 && v= || v=!
        echo "$v$2=yes"
    }
    
    
    print_config_asm(){
    
        enabled $1 && v=1 || v=0
        echo "%define $2 $v"
    
    print_config(){
        pfx=$1
    
            for f in $files; do
                "print_config_${f##*.}" $cfg ${pfx}${ucname} >>$f
            done
    
    print_enabled(){
        test "$1" = -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 $($filter_cppflags "$@")
    
        append CFLAGS $($filter_cflags "$@")
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
    add_cxxflags(){
        append CXXFLAGS $($filter_cflags "$@")
    }
    
    
        append ASFLAGS $($filter_asflags "$@")
    
    add_ldflags(){
        append LDFLAGS "$@"
    }
    
    add_extralibs(){
    
        prepend extralibs "$@"
    
        log "$@"
    
        check_cmd $cc $CPPFLAGS $CFLAGS "$@" -c -o $TMPO $TMPC
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
    check_cxx(){
        log check_cxx "$@"
        cat > $TMPCPP
        log_file $TMPCPP
        check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" -c -o $TMPO $TMPCPP
    }
    
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        check_cmd $cc $CPPFLAGS $CFLAGS "$@" -E -o $TMPO $TMPC
    
    check_as(){
        log check_as "$@"
        cat > $TMPC
        log_file $TMPC
    
        check_cmd $as $CPPFLAGS $ASFLAGS "$@" -c -o $TMPO $TMPC
    
    check_asm(){
        log check_asm "$@"
        name="$1"
    
        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
    }
    
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
        type=$1
        shift 1
    
        flags=''
        libs=''
        for f; do
            test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f"
        done
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
        check_$type $($filter_cflags $flags) || return
    
        check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $libs $extralibs
    
    check_cppflags(){
        log check_cppflags "$@"
    
        set -- $($filter_cppflags "$@")
        check_cc "$@" <<EOF && append CPPFLAGS "$@"
    
    check_cflags(){
    
        set -- $($filter_cflags "$@")
        check_cc "$@" <<EOF && append CFLAGS "$@"
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
    check_cxxflags(){
        log check_cxxflags "$@"
        set -- $($filter_cflags "$@")
        check_cxx "$@" <<EOF && append CXXFLAGS "$@"
    int x;
    EOF
    }
    
    
    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 "$@"
    }
    
    
    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
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
        check_ld "cc" "$@" <<EOF && enable $func
    
    extern int $func();
    
    check_mathfunc(){
    
        log check_mathfunc "$@"
    
        func=$1
        shift
        disable $func
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
        check_ld "cc" "$@" <<EOF && enable $func
    
    #include <math.h>
    
    float foo(float f) { return $func(f); }
    
    int main(void){ return (int) foo; }
    
    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; }"
    
    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
    
        shift 2
        check_cpp $($filter_cppflags "$@") <<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 "$@"
    
    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 "$@"
        pkg="$1"
        headers="$2"
        funcs="$3"
        shift 3
    
        $pkg_config --exists $pkg 2>/dev/null || 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
    }
    
    
    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) = func;
    
    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
    
        incs=""
        for hdr in $headers; do
            incs="$incs
    #include <$hdr>"
        done
    
        check_cc "$@" <<EOF && enable_safe "$type"
    
    check_struct(){
        log check_type "$@"
        headers=$1
        struct=$2
        member=$3
        shift 3
        disable_safe "${struct}_${member}"
        incs=""
        for hdr in $headers; do
            incs="$incs
    #include <$hdr>"
        done
        check_cc "$@" <<EOF && enable_safe "${struct}_${member}"
    $incs
    const void *p = &(($struct *)0)->$member;
    EOF
    }
    
    
    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"
    }
    
    
    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"
    }
    
    
    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)
    }
    
    
    check_host_cc(){
        log check_host_cc "$@"
        cat > $TMPC
        log_file $TMPC
        check_cmd $host_cc $host_cflags "$@" -c -o $TMPO $TMPC
    }
    
    check_host_cflags(){
        log check_host_cflags "$@"
        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)"
        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