Skip to content
Snippets Groups Projects
configure 181 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
    
    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
    
      --fatal-warnings         fail if any configure warning is generated
    
      --prefix=PREFIX          install in PREFIX [$prefix]
      --bindir=DIR             install binaries in DIR [PREFIX/bin]
    
      --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
    
      --docdir=DIR             install documentation in DIR [PREFIX/share/doc/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]
    
      --enable-rpath           use rpath to allow installing libraries in paths
                               not part of the dynamic linker search path
    
                               use rpath when linking programs [USE WITH CARE]
    
    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
    
      --disable-runtime-cpudetect disable detecting cpu capabilities at runtime (smaller binary)
    
      --enable-gray            enable full grayscale support (slower color)
      --disable-swscale-alpha  disable alpha channel support in swscale
    
      --disable-all            disable building components, libraries and programs
    
      --enable-incompatible-libav-abi enable incompatible Libav fork ABI [no]
    
      --enable-raise-major     increase major version numbers in sonames [no]
    
    Program options:
      --disable-programs       do not build command line programs
    
      --disable-ffmpeg         disable ffmpeg build
      --disable-ffplay         disable ffplay build
      --disable-ffprobe        disable ffprobe build
      --disable-ffserver       disable ffserver build
    
    Documentation options:
    
      --disable-doc            do not build documentation
    
      --disable-htmlpages      do not build HTML documentation pages
      --disable-manpages       do not build man documentation pages
      --disable-podpages       do not build POD documentation pages
      --disable-txtpages       do not build text documentation pages
    
    Component options:
    
      --disable-avdevice       disable libavdevice build
      --disable-avcodec        disable libavcodec build
      --disable-avformat       disable libavformat build
    
      --disable-avutil         disable libavutil 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 libavfilter build
    
      --enable-avresample      enable libavresample build [no]
    
      --disable-pthreads       disable pthreads [auto]
    
      --disable-w32threads     disable Win32 threads [auto]
    
      --disable-os2threads     disable OS/2 threads [auto]
    
      --disable-network        disable network support [no]
    
      --disable-dct            disable DCT code
    
      --disable-dwt            disable DWT code
    
      --disable-error-resilience disable error resilience 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
    
      --disable-faan           disable floating point AAN (I)DCT code
    
      --disable-pixelutils     disable pixel utils in libavutil
    
      --disable-dxva2          disable DXVA2 code [autodetect]
    
      --disable-vaapi          disable VAAPI code [autodetect]
    
      --disable-vda            disable VDA code [autodetect]
    
      --disable-vdpau          disable 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:
    
    Diego Biurrun's avatar
    Diego Biurrun committed
      --enable-avisynth        enable reading of AviSynth script files [no]
    
      --disable-bzlib          disable bzlib [autodetect]
    
      --enable-fontconfig      enable fontconfig, useful for drawtext filter [no]
      --enable-frei0r          enable frei0r video filtering [no]
      --enable-gnutls          enable gnutls, needed for https support
                               if openssl is not used [no]
    
      --disable-iconv          disable iconv [autodetect]
    
      --enable-ladspa          enable LADSPA audio filtering [no]
    
      --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
    
      --enable-libass          enable libass subtitles rendering,
                               needed for subtitles and ass filter [no]
    
    Petri Hintukainen's avatar
    Petri Hintukainen committed
      --enable-libbluray       enable BluRay reading using libbluray [no]
    
      --enable-libbs2b         enable bs2b DSP library [no]
    
      --enable-libcaca         enable textual display using libcaca [no]
    
      --enable-libcelt         enable CELT decoding via libcelt [no]
    
      --enable-libcdio         enable audio CD grabbing with libcdio [no]
    
      --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                               and libraw1394 [no]
    
      --enable-libfaac         enable AAC encoding via libfaac [no]
    
      --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
    
      --enable-libflite        enable flite (voice synthesis) support via libflite [no]
    
      --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
      --enable-libfribidi      enable libfribidi, improves drawtext filter [no]
    
    wm4's avatar
    wm4 committed
      --enable-libgme          enable Game Music Emu via libgme [no]
    
      --enable-libgsm          enable GSM de/encoding via libgsm [no]
    
      --enable-libiec61883     enable iec61883 via libiec61883 [no]
    
      --enable-libilbc         enable iLBC de/encoding via libilbc [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-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 de/encoding via libopus [no]
    
      --enable-libpulse        enable Pulseaudio input via libpulse [no]
    
      --enable-libquvi         enable quvi input via libquvi [no]
    
      --enable-librtmp         enable RTMP[E] support via librtmp [no]
    
      --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
    
      --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
    
      --enable-libsmbclient    enable Samba protocol via libsmbclient [no]
    
      --enable-libsoxr         enable Include libsoxr resampling [no]
    
      --enable-libspeex        enable Speex de/encoding via libspeex [no]
    
      --enable-libssh          enable SFTP protocol via libssh [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-libtwolame      enable MP2 encoding via libtwolame [no]
    
      --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
    
      --enable-libv4l2         enable libv4l2/v4l-utils [no]
    
      --enable-libvidstab      enable video stabilization using vid.stab [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]
    
      --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
    
      --enable-libwavpack      enable wavpack encoding via libwavpack [no]
    
    Justin Ruggles's avatar
    Justin Ruggles committed
      --enable-libwebp         enable WebP encoding via libwebp [no]
    
      --enable-libx264         enable H.264 encoding via x264 [no]
    
    Derek Buitenhuis's avatar
    Derek Buitenhuis committed
      --enable-libx265         enable HEVC encoding via x265 [no]
    
      --enable-libxavs         enable AVS encoding via xavs [no]
    
    Carl Eugen Hoyos's avatar
    Carl Eugen Hoyos committed
      --enable-libxcb          enable X11 grabbing using XCB [auto]
    
      --enable-libxcb-shm      enable X11 grabbing shm communication [auto]
      --enable-libxcb-xfixes   enable X11 grabbing mouse rendering [auto]
    
      --enable-libxcb-shape    enable X11 grabbing shape rendering [auto]
    
      --enable-libxvid         enable Xvid encoding via xvidcore,
                               native MPEG-4/Xvid encoder exists [no]
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
      --enable-libzmq          enable message passing via libzmq [no]
    
      --enable-libzvbi         enable teletext support via libzvbi [no]
    
      --disable-lzma           disable lzma [autodetect]
    
      --enable-decklink        enable Blackmagick DeckLink I/O support [no]
    
      --enable-nvenc           enable NVIDIA NVENC support [no]
    
      --enable-openal          enable OpenAL 1.1 capture support [no]
    
      --enable-opencl          enable OpenCL code
    
    Lukasz Marek's avatar
    Lukasz Marek committed
      --enable-opengl          enable OpenGL rendering [no]
    
      --enable-openssl         enable openssl, needed for https support
                               if gnutls is not used [no]
    
      --disable-sdl            disable sdl [autodetect]
    
      --enable-x11grab         enable X11 grabbing (legacy) [no]
    
      --disable-xlib           disable xlib [autodetect]
    
      --disable-zlib           disable zlib [autodetect]
    
    Toolchain options:
      --arch=ARCH              select architecture [$arch]
      --cpu=CPU                select the minimum required CPU (affects
                               instruction selection, may crash on older CPUs)
    
      --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
    
      --progs-suffix=SUFFIX    program name suffix []
    
      --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
    
      --target-samples=DIR     path to samples directory on target
    
      --tempprefix=PATH        force fixed dir/prefix instead of mktemp for checks
    
      --toolchain=NAME         set tool defaults according to NAME
    
      --nm=NM                  use nm tool NM [$nm_default]
    
      --ar=AR                  use archive tool AR [$ar_default]
    
      --as=AS                  use assembler AS [$as_default]
    
      --windres=WINDRES        use windows resource compiler WINDRES [$windres_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]
    
      --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
    
      --ld=LD                  use linker LD [$ld_default]
    
      --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
    
      --pkg-config-flags=FLAGS pass additional flags to pkgconf []
    
      --ranlib=RANLIB          use ranlib RANLIB [$ranlib_default]
    
      --doxygen=DOXYGEN        use DOXYGEN to generate API doc [$doxygen_default]
    
      --host-cc=HOSTCC         use host C compiler HOSTCC
      --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
    
      --host-cppflags=HCPPFLAGS use HCPPFLAGS 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]
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
      --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
    
      --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
    
      --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [$LDEXEFLAGS]
    
      --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 []
    
      --enable-pic             build position-independent code
    
      --enable-thumb           compile for Thumb instruction set
    
      --enable-lto             use link-time optimization
    
    Advanced options (experts only):
      --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
    
      --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
    
      --sws-max-filter-size=N  the max filter size swscale uses [$sws_max_filter_size_default]
    
    
    Optimization options (experts only):
    
      --disable-asm            disable all assembly 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-xop            disable XOP optimizations
    
      --disable-fma3           disable FMA3 optimizations
    
      --disable-fma4           disable FMA4 optimizations
    
      --disable-avx2           disable AVX2 optimizations
    
      --disable-armv5te        disable armv5te optimizations
      --disable-armv6          disable armv6 optimizations
      --disable-armv6t2        disable armv6t2 optimizations
    
      --disable-vfp            disable VFP optimizations
    
      --disable-neon           disable NEON optimizations
    
      --disable-inline-asm     disable use of inline assembly
      --disable-yasm           disable use of nasm/yasm assembly
    
      --disable-mips32r2       disable MIPS32R2 optimizations
      --disable-mipsdspr1      disable MIPS DSP ASE R1 optimizations
      --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
      --disable-mipsfpu        disable floating point MIPS optimizations
    
      --disable-fast-unaligned consider unaligned accesses slow
    
    Developer options (useful when working on FFmpeg 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
    
      --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.
    
      --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
    
      --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
    
      --enable-ftrapv          Trap arithmetic overflows
    
      --samples=PATH           location of test samples for FATE, if not set use
                               \$FATE_SAMPLES at make invocation time.
    
      --enable-neon-clobber-test check NEON registers for clobbering (should be
                               used only for debugging purposes)
    
      --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
    
    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.
    
            cat <<EOF
    
    Include the log file "$logfile" produced by configure as this will help
    
    Lou Logan's avatar
    Lou Logan committed
    solve 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/ *$//;s/\\r//g'
    
            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
    }
    
    
    sanitize_var_name(){
        echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
    }
    
    
    set_safe(){
        var=$1
        shift
    
        eval $(sanitize_var_name "$var")='$*'
    
        eval echo \$$(sanitize_var_name "$1")
    
        for pvar in $*; do
            eval level=\${${pvar}_level:=0}
            eval ${pvar}_${level}="\$$pvar"
            eval ${pvar}_level=$(($level+1))
    
        for pvar in $*; do
            eval level=\${${pvar}_level:-0}
    
            test $level = 0 && continue
            eval level=$(($level-1))
    
            eval $pvar="\${${pvar}_${level}}"
            eval ${pvar}_level=$level
            eval unset ${pvar}_${level}
    
    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(){
    
        for var; do
            disabled $var && continue
            pushvar var
            do_enable_deep $var
            popvar var
            enable_weak $var
        done
    
        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
    
            do_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
    
                enable_deep $dep_sel
    
                enable_deep_weak $dep_sgs
    
            disable ${cfg}_checking
    
    check_deps(){
        unset allopts
    
        do_check_deps "$@"
    
        for cfg in $allopts; do
            enabled $cfg || continue
            eval dep_extralibs="\$${cfg}_extralibs"
            test -n "$dep_extralibs" && add_extralibs $dep_extralibs
        done
    }
    
    
    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;
    
                    } else if (file ~ /\\.texi\$/) {
                        pre = -v ? \"\" : \"@c \";
                        yesno = \$2;
                        c2 = tolower(c);
                        gsub(/_/, \"-\", c2);
                        printf(\"%s@set %s %s\\n\", pre, c2, yesno) >>file;
    
    print_enabled(){
        suf=$1
        shift
        for v; do
    
            enabled $v && printf "%s\n" ${v%$suf};
    
    prepend(){
        var=$1
        shift
        eval "$var=\"$* \$$var\""
    }
    
    
    unique(){
        var=$1
        uniq_list=""
        for tok in $(eval echo \$$var); do
            uniq_list="$(filter_out $tok $uniq_list) $tok"
        done
        eval "$var=\"${uniq_list}\""
    }
    
    
        append CPPFLAGS "$@"
    
        append CFLAGS $($cflags_filter "$@")
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
    add_cxxflags(){
    
        append CXXFLAGS $($cflags_filter "$@")
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
    }
    
    
        append ASFLAGS $($asflags_filter "$@")
    
        append LDFLAGS $($ldflags_filter "$@")
    
    add_ldexeflags(){
        append LDEXEFLAGS $($ldflags_filter "$@")
    }
    
    
    add_stripflags(){
    
        append ASMSTRIPFLAGS "$@"
    
        prepend extralibs $($ldflags_filter "$@")
    
    add_host_cppflags(){
        append host_cppflags "$@"
    }
    
    
    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 "$@"
    
    check_stat(){
        log check_stat "$@"
        stat "$1" >> $logfile 2>&1
    }
    
    
    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
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
    check_cxx(){
        log check_cxx "$@"
        cat > $TMPCPP
        log_file $TMPCPP
    
        check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
    
    Mohamed Naufal's avatar
    Mohamed Naufal committed
    }
    
    
    check_oc(){
        log check_oc "$@"
        cat > $TMPM
        log_file $TMPM
    
        check_cmd $cc -Werror=missing-prototypes $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPM
    
        check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
    
    as_o(){
        eval printf '%s\\n' $AS_O
    }
    
    
    check_as(){
        log check_as "$@"
    
        cat > $TMPS
        log_file $TMPS
        check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
    
    check_inline_asm(){
        log check_inline_asm "$@"
    
        check_cc "$@" <<EOF && enable $name
    
    void foo(void){ __asm__ volatile($code); }
    
    check_insn(){
        log check_insn "$@"
        check_inline_asm ${1}_inline "\"$2\""
        echo "$2" | check_as && enable ${1}_external || disable ${1}_external
    }
    
    
    Loren Merritt's avatar
    Loren Merritt committed
    check_yasm(){
        log check_yasm "$@"
        echo "$1" > $TMPS
        log_file $TMPS
        shift 1
    
        check_cmd $yasmexe $YASMFLAGS -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' $@)
    
        check_$type $($cflags_filter $flags) || return
    
        flags=$($ldflags_filter $flags)
        libs=$($ldflags_filter $libs)
    
        check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
    
    print_include(){
        hdr=$1
        test "${hdr%.h}" = "${hdr}" &&
            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
    }
    
    
    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
    
    #include <$header>
    int x;
    EOF
    }
    
    
    check_header_oc(){
        log check_header_oc "$@"
    
        {
           echo "#include <$header>"
           echo "int main(void) { return 0; }"
    
        } | check_oc && check_stat "$TMPO" && enable_safe $headers