#!/bin/sh
#
# MythTV configure script, based on the FFmpeg configure script
#
# 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.
LC_ALL=C
export LC_ALL

# 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
E1="$?"

(: ${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."
    echo "This configure script requires a POSIX-compatible shell"
    echo "such as bash or ksh."
    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 MythTV."
    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
    exit 1
fi

test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH

show_help(){
    cat <<EOF
Usage: configure [options]
Options: [defaults in brackets after descriptions]

Standard options:
  --help                   print this message
  --previous               use previous configure parameters if possible
  --compile-type=CTYPE     one of release, profile, debug [$compile_type]
                           NOTE: profile is for sampling profilers
  --prefix=PREFIX          install in PREFIX [$prefix]
  --runprefix=PREFIX       prefix to be used at runtime (e.g. .. or /myth/latest)
  --libdir-name=LIBNAME    search/install libraries in PREFIX/LIBNAME [$libdir_name]
  --disable-ccache         disable compiler cache (ccache)
  --disable-distcc         disable distributed compilation (distcc)

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
  --cc=CC                  use C compiler CC [$cc_default]
  --cxx=CXX                use C++ compiler CXX [$cxx_default]
  --ld=LD                  use linker LD
  --qmake=QMAKE            use specified qmake [$qmake_default]
  --qmakespecs=PATH        use specified mkspecs
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
  --extra-cxxflags=ECXFLAGS add ECXXFLAGS to list of flags for C++ compile
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
  --disable-symbol-visibility disables symbol visibility options
  --arch=ARCH              select architecture [$arch]
  --tune=CPU               tune instruction usage for a particular CPU [$tune]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
  --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-yasm           disable use of yasm assembler
  --enable-pic             build position-independent code
  --enable-proc-opt        enable processor specific compilation

  --disable-audio-oss      disable OSS audio support
  --disable-audio-alsa     disable ALSA audio support
  --disable-audio-jack     disable JACK audio support
  --disable-audio-pulseoutput disable PulseAudio audio output support
  --enable-valgrind        disables timeouts for valgrind memory debugging
  --disable-lirc           disable lirc support (Infrared Remotes)
  --disable-joystick-menu  disable joystick menu
  --disable-libcec         disable libCEC device support
  --libcec-path=HDRLOC     location of directory containing
                           'libcec/cec.h', not the directory
                           with 'cec.h' [$libcec_path_default]
  --firewire-sdk           specify location for mac FireWire SDK [mac only]
  --disable-firewire       disable support for FireWire cable boxes
  --disable-hdhomerun      disable support for HDHomeRun boxes
  --disable-ceton          disable support for Ceton cards
  --disable-v4l2           disable Video4Linux support
  --disable-ivtv           disable ivtv support (PVR-x50) req. v4l2 support
  --disable-hdpvr          disable HD-PVR support
  --disable-dvb            disable DVB support
  --dvb-path=HDRLOC        location of directory containing
                           'linux/dvb/frontend.h', not the
                           directory with frontend.h [$dvb_path_default]
  --disable-asi            disable support for ASI recorder
  --disable-x11            disable X11 support
  --x11-path=X11LOC        location of X11 include files [$x11_path_default]
  --disable-xrandr         disable X11 resolution switching
  --disable-xv             disable XVideo   (X11 video output accel.)
  --disable-vdpau          disable NVidia VDPAU hardware acceleration.
  --disable-crystalhd      disable Broadcom CrystalHD hardware decoder support
  --disable-vaapi          disable VAAPI hardware accelerated video decoding
  --disable-dxva2          disable hardware accelerated decoding on windows
  --disable-opengl-video   disable OpenGL based video display
  --disable-quartz-video   disable Mac OS X CoreVideo based video display
  --disable-libass         disable libass SSA/ASS subtitle support

  --enable-mac-bundle      produce standalone OS X apps (e.g. mythfrontend.app)

  --disable-libxml2        disable libxml2 support (disc metadata)
  --libxml2-path=HDRLOC    location of directory containing
                           'libxml/parser.h', not the
                           directory with parser.h [$libxml2_path_default]
  --disable-libdns-sd      disable DNS Service Discovery (Bonjour/Zeroconf/Avahi)
  --disable-libcrypto      disable use of the OpenSSL cryptographic library

  --with-bindings=LIST     install the bindings specified in the
                           comma-separated list
                           Supported bindings: perl, python, php
                           comma-separated list
  --python=PATH            Force a specific python executable to use [$python_default]
  --perl-config-opts=OPTS  Additional options to pass when generating
                           Makefile.perl for building Perl bindings.
  --disable-mythlogserver  Do not use mythlogserver logging daemon facility

External codec library options (used for mythffmpeg and streaming transcode):
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
  --enable-libfaac         enable AAC encoding via libfaac [no]
  --enable-libx264         enable H.264 encoding via x264 [no]
  --enable-libvpx          enable VP8 encoding via libvpx [no]
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
  --enable-sdl             enable Simple DirectMedia Layer (required for ffplay)
EOF

#following is ffmpeg's configure help text
<<EOF
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]
  --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
  --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

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
  --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-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

Hardware accelerators:
  --disable-dxva2          disable DXVA2 code [autodetect]
  --disable-vaapi          disable VAAPI code [autodetect]
  --enable-vda             enable VDA code
  --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:
  --enable-avisynth        enable reading of AVISynth script files [no]
  --disable-bzlib          disable bzlib [autodetect]
  --enable-fontconfig      enable fontconfig
  --enable-frei0r          enable frei0r video filtering
  --enable-gnutls          enable gnutls [no]
  --disable-iconv          disable iconv [autodetect]
  --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
  --enable-libass          enable libass subtitles rendering [no]
  --enable-libbluray       enable BluRay reading using libbluray [no]
  --enable-libcaca         enable textual display using libcaca
  --enable-libcelt         enable CELT decoding via libcelt [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-libflite        enable flite (voice synthesis) support via libflite [no]
  --enable-libfreetype     enable libfreetype [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]
  --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 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-libsoxr         enable Include libsoxr resampling [no]
  --enable-libspeex        enable Speex de/encoding via libspeex [no]
  --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-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-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-x11grab         enable X11 grabbing [no]
  --disable-zlib           disable 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 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]
  --cxx=CXX                use C compiler CXX [$cxx_default]
  --dep-cc=DEPCC           use dependency generator DEPCC [$cc_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-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]
  --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=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
  --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-vfp            disable 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
  --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):
  --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.
  --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-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
  exit 0
}

quotes='""'

log(){
    echo "$@" >> $logfile
}

log_file(){
    log BEGIN $1
    pr -n -t $1 >> $logfile
    log END $1
}

echolog(){
    log "$@"
    echo "$@"
}

warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

die(){
    echolog "$@"
    cat <<EOF

If you think configure made a mistake, make sure that you are using the latest
version of MythTV from git.  If the latest version fails, report the problem to the
mythtv-dev@mythtv.org mailing list or IRC #mythtv on irc.freenode.net
EOF
    if disabled logging; then
        cat <<EOF
Rerun configure with logging enabled (do not use --disable-logging), and
include the log this produces with your report.
EOF
    else
        cat <<EOF
Include the log file "$logfile" produced by configure as this will help
solving the problem.
EOF
    fi
    exit 1
}

# Avoid locale weirdness, besides we really just want to translate ASCII.
toupper(){
    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'"
    echo "$v"
}

cleanws(){
    echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
}

filter(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) echo $v ;; esac"
    done
}

filter_out(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) ;; *) echo $v ;; esac"
    done
}

map(){
    m=$1
    shift
    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")='$*'
}

get_safe(){
    eval echo \$$(sanitize_var_name "$1")
}

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 $*
}

enable_safe(){
    for var; do
        enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
}

disable_safe(){
    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
        enable_deep $sel
        popvar sgs
        enable_deep_weak $sgs
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

enable_deep_weak(){
    do_enable_deep $*
    enable_weak $*
}

enabled(){
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
}

disabled(){
    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
    return 1
}

set_default(){
    for opt; do
        eval : \${$opt:=\$${opt}_default}
    done
}

is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

do_check_deps(){
    for cfg; do
        cfg="${cfg#!}"
        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking
        append allopts $cfg

        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; }
        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
        fi

        disable ${cfg}_checking
    done
}

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
    files=$2
    shift 2
    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(){
    suf=$1
    shift
    for v; do
        enabled $v && printf "%s\n" ${v%$suf};
    done
}

append(){
    var=$1
    shift
    eval "$var=\"\$$var $*\""
}

prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

add_cppflags(){
    append CPPFLAGS "$@"
}

add_cflags(){
    append CFLAGS $($cflags_filter "$@")
}

add_cxxflags(){
    append ECXXFLAGS "$@"
}

add_asflags(){
    append ASFLAGS $($asflags_filter "$@")
}

add_ldflags(){
    append LDFLAGS $($ldflags_filter "$@")
}

add_extralibs(){
    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' "$@"
}

check_cmd(){
    log "$@"
    "$@" >> $logfile 2>&1
}

cc_o(){
    eval printf '%s\\n' $CC_O
}

cc_e(){
    eval printf '%s\\n' $CC_E
}

check_cc(){
    log check_cc "$@"
    cat > $TMPC
    log_file $TMPC
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
}

check_cxx(){
    log check_cxx "$@"
    cat > $TMPCPP
    log_file $TMPCPP
    check_cmd $cxx $CPPFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
}

check_ecxx(){
    log check_cxx "$@"
    cat > $TMPCPP
    log_file $TMPCPP
    check_cmd $cxx $CPPFLAGS $CXXFLAGS $ECXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
}

check_cpp(){
    log check_cpp "$@"
    cat > $TMPC
    log_file $TMPC
    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 "$@"
    name="$1"
    code="$2"
    shift 2
    disable $name
    check_cc "$@" <<EOF && enable $name
void foo(void){ __asm__ volatile($code); }
EOF
}

check_insn(){
    log check_insn "$@"
    check_inline_asm ${1}_inline "\"$2\""
    echo "$2" | check_as && enable ${1}_external || disable ${1}_external
}

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
}

check_ld(){
    log check_ld "$@"
    type=$1
    shift 1
    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
}

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 "$@"
int x;
EOF
}

check_cflags(){
    log check_cflags "$@"
    set -- $($cflags_filter "$@")
    check_cc "$@" <<EOF && append CFLAGS "$@"
int x;
EOF
}

check_cxxflags(){
    log check_cxxflags "$@"
    check_cxx "$@" <<EOF && add_cxxflags "$@" || echolog "WARNING! An unknown C++ compiler flag in: \"$@\". Option(s) will be ignored."
class X {};
int x;
EOF
}

test_ldflags(){
    log test_ldflags "$@"
    check_ld "cc" "$@" <<EOF
int main(void){ return 0; }
EOF
}

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

check_header(){
    log check_header "$@"
    header=$1
    shift
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
#include <$header>
int x;
EOF
}

check_func(){
    log check_func "$@"
    func=$1
    shift
    disable $func
    check_ld "cc" "$@" <<EOF && enable $func
extern int $func();
int main(void){ $func(); }
EOF
}

check_mathfunc(){
    log check_mathfunc "$@"
    func=$1
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
    disable $func
    check_ld "cc" "$@" <<EOF && enable $func
#include <math.h>
float foo(float f, float g) { return $func($args); }
int main(void){ return (int) foo; }
EOF
}

check_func_headers(){
    log check_func_headers "$@"
    headers=$1
    funcs=$2
    shift 2
    {
        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 "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 "$@" <<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"
    funcs="$2"
    shift 2
    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
}

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
}

check_exec(){
    check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
}

check_exec_crash(){
    code=$(cat)

    # 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(void){
    $code
}
int (*func_ptr)(void) = func;
int main(void){
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
    return func_ptr();
}
EOF
}

check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
    disable_safe "$type"
    check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
}

check_struct(){
    log check_struct "$@"
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
    check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_safe "${struct}_${member}"
}

check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
    check_code ld "$headers" "$builtin" "cc" "$@" && enable "$name"
}

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_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)
}

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_cppflags(){
    log check_host_cppflags "$@"
    check_host_cc "$@" <<EOF && append host_cppflags "$@"
int x;
EOF
}

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

apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

cp_if_changed(){
    cmp -s "$1" "$2" && echo "$2 is unchanged" && return
    mkdir -p "$(dirname $2)"
    $cp_f "$1" "$2"
}

# MythTV Custom Tests
disable_bindings_python(){
    echo "WARNING: disabling Python bindings; missing $1"
    disable bindings_python
}

disable_bindings_perl(){
    echo "WARNING: disabling Perl bindings; missing $1"
    disable bindings_perl
}

disable_bindings_php(){
    echo "WARNING: disabling PHP bindings; missing $1"
    disable bindings_php
}

append_uniq(){
    log append_uniq "$@"
    var=$1
    shift
for value; do
eval tmpvar='$'$var
        echo "$tmpvar" | grep -q ".$value" || append $var $value
    done
}

add_cxxppflags(){
    append CXXPPFLAGS $($cxxppflags_filter "$@")
}

check_python(){
    log check_python
    check_cmd $python <<EOF
import sys
if sys.version_info < (2,6):
    sys.exit(1)
EOF
}

check_py_lib(){
    log check_py_lib "$@"
    lib=${1}
    check_cmd $python <<EOF
import sys
try:
    import $lib
except:
    sys.exit(1)
sys.exit(0)
EOF
}

check_pl_lib(){
    log check_pl_lib "$@"
    check_cmd perl -e "use ${1};"
}

check_ld_cxx(){
    log check_ld_cxx "$@"
    flags=''
    libs=''
    for f; do
        test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f"
    done
    check_cxx $($cflags_filter $flags) || return
    check_cmd $cxx $LDFLAGS $flags -o $TMPE $TMPO $extralibs $libs
}

check_cxxppflags(){
    log check_cxxppflags "$@"
    set -- $($filter_cxxppflags "$@")
    check_cxx "$@" <<EOF && append CXXPPFLAGS "$@"
int x;
EOF
}

check_libx(){
    log check_libx "$@"
    libvar="$1"
    headers="$2"
    func="$3"
    shift 3
    check_func_headers "$headers" $func "$@" && append_uniq $libvar "$@"
}

check_exec_cxx(){
    check_ld_cxx "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
}

check_foo_config(){
    cfg=$1
    pkg=$2
    header=$3
    func=$4
    shift 4
    disable $cfg
    check_cmd ${pkg}-config --version
    err=$?
    if test "$err" = 0; then
        backup_cflags=$CFLAGS
        temp_extralibs=$(${pkg}-config --libs)
        add_cflags $(${pkg}-config --cflags)
        check_lib "$@" $header $func $temp_extralibs && enable $cfg
        CFLAGS=$backup_cflags
    fi
    return $err
}

x86_mmx_cpus="pentium-mmx,pentium2,pentium3,pentium3m,pentium-m"
x86_mmx_cpus="$x86_mmx_cpus,pentium4,pentium4m,prescott"
x86_mmx_cpus="$x86_mmx_cpus,athlon,athlon-xp,athlon-tbird,athlon-4,athlon-mp,"
x86_mmx_cpus="$x86_mmx_cpus,c3,c3-2,k6,k6-2,k6-3"

x86_cpus="i386,i486,i586,i686,pentium,pentiumpro,${x86_mmx_cpus}"

x86_64_cpus="x86-64,athlon64,k8,opteron,athlon64-sse3,k8-sse3,opteron-sse3"
x86_64_cpus="$x86_64_cpus,barcelona,athlon-fx,nocona,core2"

is_x86_cpu() {
    expr ",${x86_cpus}," : ".*,$1," > /dev/null
}

is_x86_64_cpu() {
    expr ",${x86_64_cpus}," : ".*,$1," > /dev/null
}

is_x86_mmx() {
    expr ",${x86_mmx_cpus}," : ".*,$1," > /dev/null || is_x86_64_cpu "$1"
}


# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
    filters
    hwaccels
    indevs
    muxers
    outdevs
    parsers
    protocols
"

EXTERNAL_LIBRARY_LIST="
    avisynth
    bzlib
    crystalhd
    fontconfig
    frei0r
    gnutls
    iconv
    libaacplus
    libass
    libbluray
    libcaca
    libcdio
    libcelt
    libdc1394
    libfaac
    libfdk_aac
    libflite
    libfreetype
    libgsm
    libiec61883
    libilbc
    libmodplug
    libmp3lame
    libnut
    libopencore_amrnb
    libopencore_amrwb
    libopencv
    libopenjpeg
    libopus
    libpulse
    librtmp
    libschroedinger
    libsoxr
    libspeex
    libstagefright_h264
    libtheora
    libtwolame
    libutvideo
    libv4l2
    libvo_aacenc
    libvo_amrwbenc
    libvorbis
    libvpx
    libx264
    libxavs
    libxvid
    openal
    openssl
    x11grab
    zlib
"

DOCUMENT_LIST="
    doc
    htmlpages
    manpages
    podpages
    txtpages
"

HWACCEL_LIST="
    dxva2
    vaapi
    vda
    vdpau
"

LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
    postproc
    swresample
    swscale
"

PROGRAM_LIST="
    ffplay
    ffprobe
    ffserver
    ffmpeg
"

CONFIG_LIST="
    $COMPONENT_LIST
    $DOCUMENT_LIST
    $EXTERNAL_LIBRARY_LIST
    $HWACCEL_LIST
    $LIBRARY_LIST
    $PROGRAM_LIST
    dct
    dwt
    fast_unaligned
    fft
    ftrapv
    gpl
    gray
    hardcoded_tables
    incompatible_fork_abi
    lsp
    lzo
    mdct
    memalign_hack
    memory_poisoning
    network
    nonfree
    pic
    rdft
    runtime_cpudetect
    safe_bitstream_reader
    shared
    small
    sram
    static
    swscale_alpha
    thumb
    version3
    xmm_clobber_test
"

THREADS_LIST='
    pthreads
    w32threads
    os2threads
'

ARCH_LIST='
    aarch64
    alpha
    arm
    avr32
    avr32_ap
    avr32_uc
    bfin
    ia64
    m68k
    mips
    mips64
    parisc
    ppc
    ppc64
    s390
    sh4
    sparc
    sparc64
    tilegx
    tilepro
    tomi
    x86
    x86_32
    x86_64
'

ARCH_EXT_LIST_ARM='
    armv5te
    armv6
    armv6t2
    neon
    vfp
    vfpv3
'

ARCH_EXT_LIST_X86='
    amd3dnow
    amd3dnowext
    avx
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
'

ARCH_EXT_LIST="
    $ARCH_EXT_LIST_ARM
    $ARCH_EXT_LIST_X86
    altivec
    ppc4xx
    vis
    mipsfpu
    mips32r2
    mipsdspr1
    mipsdspr2
"

HAVE_LIST_CMDLINE='
    inline_asm
    symver
    yasm
'

HAVE_LIST_PUB='
    bigendian
    fast_unaligned
    incompatible_fork_abi
'

MATH_FUNCS="
    atanf
    atan2f
    cbrt
    cbrtf
    cosf
    exp2
    exp2f
    expf
    isinf
    isnan
    ldexpf
    llrint
    llrintf
    log2
    log2f
    log10f
    lrint
    lrintf
    powf
    rint
    round
    roundf
    sinf
    trunc
    truncf
"

HAVE_LIST="
    $ARCH_EXT_LIST
    $(add_suffix _external $ARCH_EXT_LIST)
    $(add_suffix _inline   $ARCH_EXT_LIST)
    $HAVE_LIST_CMDLINE
    $HAVE_LIST_PUB
    $THREADS_LIST
    $MATH_FUNCS
    access
    aligned_malloc
    aligned_stack
    alsa_asoundlib_h
    altivec_h
    arpa_inet_h
    asm_mod_q
    asm_mod_y
    asm_types_h
    attribute_may_alias
    attribute_packed
    cdio_paranoia_h
    cdio_paranoia_paranoia_h
    clock_gettime
    closesocket
    cmov
    CommandLineToArgvW
    cpunop
    CryptGenRandom
    dcbzl
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_bktr_ioctl_bt848_h
    dev_video_meteor_ioctl_meteor_h
    direct_h
    dlfcn_h
    dlopen
    dos_paths
    dxva_h
    ebp_available
    ebx_available
    fast_64bit
    fast_clz
    fast_cmov
    fcntl
    fork
    getaddrinfo
    gethrtime
    getopt
    GetProcessAffinityMask
    GetProcessMemoryInfo
    GetProcessTimes
    GetSystemTimeAsFileTime
    getrusage
    getservbyport
    gettimeofday
    glob
    gnu_as
    gsm_h
    ibm_asm
    inet_aton
    io_h
    isatty
    jack_port_get_latency_range
    kbhit
    ldbrx
    libdc1394_1
    libdc1394_2
    local_aligned_16
    local_aligned_8
    localtime_r
    loongson
    lzo1x_999_compress
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
    makeinfo
    malloc_h
    MapViewOfFile
    memalign
    mkstemp
    mm_empty
    mmap
    mprotect
    msvcrt
    nanosleep
    openjpeg_1_5_openjpeg_h
    PeekNamedPipe
    perl
    pod2man
    poll_h
    posix_memalign
    pthread_cancel
    rdtsc
    rsync_contimeout
    sched_getaffinity
    sdl
    sdl_video_size
    SetConsoleTextAttribute
    setmode
    setrlimit
    Sleep
    sndio_h
    socklen_t
    soundcard_h
    strerror_r
    struct_addrinfo
    struct_group_source_req
    struct_ip_mreq_source
    struct_ipv6_mreq
    struct_pollfd
    struct_rusage_ru_maxrss
    struct_sctp_event_subscribe
    struct_sockaddr_in6
    struct_sockaddr_sa_len
    struct_sockaddr_storage
    struct_v4l2_frmivalenum_discrete
    symver_asm_label
    symver_gnu_asm
    sysconf
    sysctl
    sys_mman_h
    sys_param_h
    sys_resource_h
    sys_select_h
    sys_soundcard_h
    sys_time_h
    sys_videoio_h
    termios_h
    texi2html
    threads
    unistd_h
    usleep
    vfp_args
    VirtualAlloc
    windows_h
    winsock2_h
    xform_asm
    xmm_clobbers
"

# options emitted with CONFIG_ prefix but not available on the command line
CONFIG_EXTRA="
    aandcttables
    ac3dsp
    audio_frame_queue
    error_resilience
    gcrypt
    golomb
    gplv3
    h264chroma
    h264dsp
    h264pred
    h264qpel
    huffman
    lgplv3
    lpc
    mpegaudio
    mpegaudiodsp
    mpegvideo
    mpegvideoenc
    nettle
    rangecoder
    rtpdec
    rtpenc_chain
    sinewin
    videodsp
    vp3dsp
"

MYTHTV_CONFIG_LIST='
    backend
    bindings_perl
    bindings_python
    bindings_php
    crystalhd
    cygwin
    darwin
    disable_mmx_for_debugging
    dvb
    firewire
    frontend
    hdhomerun
    ceton
    hdpvr
    ivtv
    asi
    joystick_menu
    libcec
    libcrypto
    libdns_sd
    libfftw3
    libmpeg2external
    libxml2
    libudf
    lirc
    mheg
    opengl
    opengl_video
    qtwebkit
    qtscript
    qtdbus
    quartz_video
    sdl
    taglib
    v4l2
    v4l1
    valgrind
    x11
    xrandr
    xv
    profiletype
    debugtype
    mythlogserver
'

MYTHTV_HAVE_LIST='
    byteswap_h
    cpu_clips_negative
    cpu_clips_positive
    fe_can_2g_modulation
    ftime
    getifaddrs
    gettimeofday
    posix_fadvise
    libudev
    libuuid
    stdint_h
    sync_file_range
    sys_endian_h
'

MYTHTV_LIST='
    audio_pulse
    audio_pulseoutput
    audio_alsa
    audio_jack
    audio_oss
    ffmpeg_pthreads
    mac_bundle
    proc_opt
    silent_cc
    symbol_visibility
'

USING_LIST='
    appleremote
    bindings_perl
    bindings_python
    bindings_php
    darwin_da
    mythtranscode
    dxva2
    opengl
    opengles
    vaapi
    vdpau
'

CMDLINE_SELECT="
    $ARCH_EXT_LIST
    $CONFIG_LIST
    $HAVE_LIST_CMDLINE
    $THREADS_LIST
    asm
    coverage
    cross_compile
    debug
    extra_warnings
    logging
    lto
    optimizations
    stripping
    $MYTHTV_LIST
    $MYTHTV_CONFIG_LIST
"

PATHS_LIST='
    bindir
    datadir
    incdir
    libdir
    mandir
    prefix
    shlibdir
'

MYTHTV_PATHS_LIST='
    dvb_path
    libcec_path
    runprefix
    x11_path
    libxml2_path
    firewiresdk_path
'

MYTHTV_CMDLINE_SET='
    logging
    python
    qmake
    qmakespecs
    samples
    source_path
'

CMDLINE_SET="
    $PATHS_LIST
    ar
    arch
    as
    assert_level
    build_suffix
    cc
    cpu
    cross_prefix
    cxx
    dep_cc
    extra_version
    host_cc
    host_cflags
    host_ld
    host_ldflags
    host_libs
    host_os
    install
    ld
    logfile
    malloc_prefix
    nm
    optflags
    pkg_config
    progs_suffix
    random_seed
    samples
    strip
    sysinclude
    sysroot
    target_exec
    target_os
    target_path
    toolchain
    valgrind
    yasmexe
    $MYTHTV_PATHS_LIST
    $MYTHTV_CMDLINE_SET
"

CMDLINE_APPEND="
    extra_cflags
    extra_cxxflags
    host_cppflags
"

# code dependency declarations

# architecture extensions

armv5te_deps="arm"
armv6_deps="arm"
armv6t2_deps="arm"
neon_deps="arm"
vfp_deps="arm"
vfpv3_deps="vfp"

map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM

mipsfpu_deps="mips"
mips32r2_deps="mips"
mipsdspr1_deps="mips"
mipsdspr2_deps="mips"

altivec_deps="ppc"
ppc4xx_deps="ppc"

vis_deps="sparc"

x86_64_suggest="cmov fast_cmov"

amd3dnow_deps="mmx"
amd3dnowext_deps="amd3dnow"
mmx_deps="x86"
mmxext_deps="mmx"
sse_deps="mmxext"
sse2_deps="sse"
sse3_deps="sse2"
ssse3_deps="sse3"
sse4_deps="ssse3"
sse42_deps="sse4"
avx_deps="sse42"
fma4_deps="avx"

mmx_external_deps="yasm"
mmx_inline_deps="inline_asm"
mmx_suggest="mmx_external mmx_inline"

for ext in $(filter_out mmx $ARCH_EXT_LIST_X86); do
    eval dep=\$${ext}_deps
    eval ${ext}_external_deps='"${dep}_external"'
    eval ${ext}_inline_deps='"${dep}_inline"'
    eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
done

aligned_stack_if_any="ppc x86"
fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
fast_clz_if_any="alpha avr32 mips ppc x86"
fast_unaligned_if_any="ppc x86"

inline_asm_deps="!tms470"
need_memalign="altivec neon sse"

symver_if_any="symver_asm_label symver_gnu_asm"

log2_deps="!msvcrt"

# subsystems
dct_select="rdft"
mdct_select="fft"
rdft_select="fft"
mpegaudio_select="mpegaudiodsp"
mpegaudiodsp_select="dct"
mpegvideo_select="error_resilience videodsp h264chroma"
mpegvideoenc_select="mpegvideo"

# decoders / encoders
aac_decoder_select="mdct sinewin"
aac_encoder_select="audio_frame_queue mdct sinewin"
aac_latm_decoder_select="aac_decoder aac_latm_parser"
ac3_decoder_select="mdct ac3dsp ac3_parser"
ac3_encoder_select="mdct ac3dsp"
ac3_fixed_encoder_select="mdct ac3dsp"
alac_encoder_select="lpc"
amrnb_decoder_select="lsp"
amrwb_decoder_select="lsp"
amv_encoder_select="aandcttables"
atrac1_decoder_select="mdct sinewin"
atrac3_decoder_select="mdct"
binkaudio_dct_decoder_select="mdct rdft dct sinewin"
binkaudio_rdft_decoder_select="mdct rdft sinewin"
cavs_decoder_select="golomb h264chroma mpegvideo"
comfortnoise_encoder_select="lpc"
cook_decoder_select="mdct sinewin"
cscd_decoder_select="lzo"
cscd_decoder_suggest="zlib"
dca_decoder_select="mdct"
dirac_decoder_select="dwt golomb videodsp"
dnxhd_encoder_select="aandcttables mpegvideoenc"
dxa_decoder_select="zlib"
eac3_decoder_select="ac3_decoder"
eac3_encoder_select="ac3_encoder"
eamad_decoder_select="aandcttables error_resilience mpegvideo"
eatgq_decoder_select="aandcttables"
eatqi_decoder_select="aandcttables error_resilience mpegvideo"
exr_decoder_select="zlib"
ffv1_decoder_select="golomb rangecoder"
ffv1_encoder_select="rangecoder"
ffvhuff_encoder_select="huffman"
flac_decoder_select="golomb"
flac_encoder_select="golomb lpc"
flashsv_decoder_select="zlib"
flashsv_encoder_select="zlib"
flashsv2_encoder_select="zlib"
flashsv2_decoder_select="zlib"
flv_decoder_select="h263_decoder"
flv_encoder_select="h263_encoder"
fraps_decoder_select="huffman"
h261_decoder_select="error_resilience mpegvideo"
h261_encoder_select="aandcttables mpegvideoenc"
h263_decoder_select="error_resilience h263_parser mpegvideo"
h263_encoder_select="aandcttables error_resilience mpegvideoenc"
h263i_decoder_select="h263_decoder"
h263p_encoder_select="h263_encoder"
h264_decoder_select="golomb h264chroma h264dsp h264pred h264qpel videodsp"
huffyuv_encoder_select="huffman"
iac_decoder_select="fft mdct sinewin"
imc_decoder_select="fft mdct sinewin"
jpegls_decoder_select="golomb"
jpegls_encoder_select="golomb"
ljpeg_encoder_select="aandcttables mpegvideoenc"
loco_decoder_select="golomb"
mdec_decoder_select="error_resilience mpegvideo"
mjpeg_encoder_select="aandcttables mpegvideoenc"
mlp_decoder_select="mlp_parser"
mp1_decoder_select="mpegaudio"
mp1float_decoder_select="mpegaudio"
mp2_decoder_select="mpegaudio"
mp2float_decoder_select="mpegaudio"
mp3_decoder_select="mpegaudio"
mp3adu_decoder_select="mpegaudio"
mp3adufloat_decoder_select="mpegaudio"
mp3float_decoder_select="mpegaudio"
mp3on4_decoder_select="mpegaudio"
mp3on4float_decoder_select="mpegaudio"
mpc7_decoder_select="mpegaudiodsp"
mpc8_decoder_select="mpegaudiodsp"
mpeg_vdpau_decoder_select="vdpau mpegvideo_decoder"
#mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
#mpeg_xvmc_decoder_select="mpegvideo_decoder"
mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder"
mpeg1_vdpau_hwaccel_select="vdpau mpeg1video_decoder"
mpeg1video_decoder_select="error_resilience mpegvideo"
mpeg1video_encoder_select="aandcttables error_resilience mpegvideoenc"
mpeg2video_decoder_select="error_resilience mpegvideo"
mpeg2video_encoder_select="aandcttables error_resilience mpegvideoenc"
mpeg4_decoder_select="h263_decoder mpeg4video_parser"
mpeg4_encoder_select="h263_encoder"
msmpeg4v1_decoder_select="h263_decoder"
msmpeg4v1_encoder_select="h263_encoder"
msmpeg4v2_decoder_select="h263_decoder"
msmpeg4v2_encoder_select="h263_encoder"
msmpeg4v3_decoder_select="h263_decoder"
msmpeg4v3_encoder_select="h263_encoder"
mss2_decoder_select="vc1_decoder"
nellymoser_decoder_select="mdct sinewin"
nellymoser_encoder_select="audio_frame_queue mdct sinewin"
nuv_decoder_select="lzo"
png_decoder_select="zlib"
png_encoder_select="zlib"
qcelp_decoder_select="lsp"
qdm2_decoder_select="mdct rdft mpegaudiodsp"
ra_144_encoder_select="audio_frame_queue lpc"
ralf_decoder_select="golomb"
rv10_decoder_select="h263_decoder"
rv10_encoder_select="h263_encoder"
rv20_decoder_select="h263_decoder"
rv20_encoder_select="h263_encoder"
rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo"
rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo"
shorten_decoder_select="golomb"
sipr_decoder_select="lsp"
snow_decoder_select="dwt h264qpel rangecoder"
snow_encoder_select="aandcttables dwt h264qpel error_resilience mpegvideoenc rangecoder"
sonic_decoder_select="golomb"
sonic_encoder_select="golomb"
sonic_ls_encoder_select="golomb"
svq1_decoder_select="error_resilience mpegvideo"
svq1_encoder_select="aandcttables error_resilience mpegvideoenc"
svq3_decoder_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel mpegvideo"
svq3_decoder_suggest="zlib"
theora_decoder_select="vp3_decoder"
tiff_decoder_suggest="zlib"
tiff_encoder_suggest="zlib"
truehd_decoder_select="mlp_parser"
tscc_decoder_select="zlib"
twinvq_decoder_select="mdct lsp sinewin"
utvideo_encoder_select="huffman"
vc1_decoder_select="h263_decoder h264chroma h264qpel"
vc1image_decoder_select="vc1_decoder"
vorbis_decoder_select="mdct"
vorbis_encoder_select="mdct"
vp3_decoder_select="vp3dsp videodsp"
vp5_decoder_select="h264chroma vp3dsp videodsp"
vp6_decoder_select="h264chroma huffman vp3dsp videodsp"
vp6a_decoder_select="vp6_decoder"
vp6f_decoder_select="vp6_decoder"
vp8_decoder_select="h264pred videodsp"
wmapro_decoder_select="mdct sinewin"
wmav1_decoder_select="mdct sinewin"
wmav1_encoder_select="mdct sinewin"
wmav2_decoder_select="mdct sinewin"
wmav2_encoder_select="mdct sinewin"
wmavoice_decoder_select="lsp rdft dct mdct sinewin"
wmv1_decoder_select="h263_decoder"
wmv1_encoder_select="h263_encoder"
wmv2_decoder_select="h263_decoder"
wmv2_encoder_select="h263_encoder"
wmv3_decoder_select="vc1_decoder"
wmv3image_decoder_select="wmv3_decoder"
zerocodec_decoder_select="zlib"
zlib_decoder_select="zlib"
zlib_encoder_select="zlib"
zmbv_decoder_select="zlib"
zmbv_encoder_select="zlib"

# hardware accelerators
crystalhd_deps="libcrystalhd_libcrystalhd_if_h"
dxva2_deps="dxva2api_h"
vaapi_deps="va_va_h"
vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"

h263_vaapi_hwaccel_deps="vaapi"
h263_vaapi_hwaccel_select="h263_decoder"
h263_vdpau_hwaccel_deps="vdpau"
h263_vdpau_hwaccel_select="h263_decoder"
h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
h264_dxva2_hwaccel_deps="dxva2"
h264_dxva2_hwaccel_select="h264_decoder"
h264_vaapi_hwaccel_deps="vaapi"
h264_vaapi_hwaccel_select="h264_decoder"
h264_vda_decoder_deps="vda"
h264_vda_decoder_select="h264_decoder"
h264_vda_hwaccel_deps="vda"
h264_vda_hwaccel_select="h264_decoder"
h264_vdpau_decoder_deps="vdpau"
h264_vdpau_decoder_select="h264_decoder"
h264_vdpau_hwaccel_deps="vdpau"
h264_vdpau_hwaccel_select="h264_decoder"
mpeg_vdpau_decoder_deps="vdpau"
mpeg_vdpau_decoder_select="mpegvideo_decoder"
mpeg1_vdpau_decoder_deps="vdpau"
mpeg1_vdpau_decoder_select="mpeg1video_decoder"
mpeg1_vdpau_hwaccel_deps="vdpau"
mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
mpeg2_crystalhd_decoder_select="crystalhd"
mpeg2_dxva2_hwaccel_deps="dxva2"
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
mpeg2_vaapi_hwaccel_deps="vaapi"
mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
mpeg2_vdpau_hwaccel_deps="vdpau"
mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
mpeg4_crystalhd_decoder_select="crystalhd"
mpeg4_vaapi_hwaccel_deps="vaapi"
mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
mpeg4_vdpau_decoder_deps="vdpau"
mpeg4_vdpau_decoder_select="mpeg4_decoder"
mpeg4_vdpau_hwaccel_deps="vdpau"
mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
msmpeg4_crystalhd_decoder_select="crystalhd"
vc1_crystalhd_decoder_select="crystalhd"
vc1_dxva2_hwaccel_deps="dxva2"
vc1_dxva2_hwaccel_select="vc1_decoder"
vc1_vaapi_hwaccel_deps="vaapi"
vc1_vaapi_hwaccel_select="vc1_decoder"
vc1_vdpau_decoder_deps="vdpau"
vc1_vdpau_decoder_select="vc1_decoder"
vc1_vdpau_hwaccel_deps="vdpau"
vc1_vdpau_hwaccel_select="vc1_decoder"
wmv3_crystalhd_decoder_select="crystalhd"
wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"

# parsers
h264_parser_select="golomb h264chroma h264dsp h264pred h264qpel videodsp"
mpeg4video_parser_select="error_resilience mpegvideo"
mpegvideo_parser_select="error_resilience mpegvideo"
vc1_parser_select="error_resilience mpegvideo"

# external libraries
libaacplus_encoder_deps="libaacplus"
libcelt_decoder_deps="libcelt"
libfaac_encoder_deps="libfaac"
libfaac_encoder_select="audio_frame_queue"
libfdk_aac_encoder_deps="libfdk_aac"
libfdk_aac_encoder_select="audio_frame_queue"
libgsm_decoder_deps="libgsm"
libgsm_encoder_deps="libgsm"
libgsm_ms_decoder_deps="libgsm"
libgsm_ms_encoder_deps="libgsm"
libilbc_decoder_deps="libilbc"
libilbc_encoder_deps="libilbc"
libmodplug_demuxer_deps="libmodplug"
libmp3lame_encoder_deps="libmp3lame"
libmp3lame_encoder_select="audio_frame_queue"
libopencore_amrnb_decoder_deps="libopencore_amrnb"
libopencore_amrnb_encoder_deps="libopencore_amrnb"
libopencore_amrnb_encoder_select="audio_frame_queue"
libopencore_amrwb_decoder_deps="libopencore_amrwb"
libopenjpeg_decoder_deps="libopenjpeg"
libopenjpeg_encoder_deps="libopenjpeg"
libopus_decoder_deps="libopus"
libopus_encoder_deps="libopus"
libopus_encoder_select="audio_frame_queue"
libschroedinger_decoder_deps="libschroedinger"
libschroedinger_encoder_deps="libschroedinger"
libspeex_decoder_deps="libspeex"
libspeex_encoder_deps="libspeex"
libspeex_encoder_select="audio_frame_queue"
libstagefright_h264_decoder_deps="libstagefright_h264"
libtheora_encoder_deps="libtheora"
libtwolame_encoder_deps="libtwolame"
libvo_aacenc_encoder_deps="libvo_aacenc"
libvo_aacenc_encoder_select="audio_frame_queue"
libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
libvorbis_decoder_deps="libvorbis"
libvorbis_encoder_deps="libvorbis"
libvorbis_encoder_select="audio_frame_queue"
libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx"
libx264_encoder_deps="libx264"
libx264rgb_encoder_deps="libx264"
libxavs_encoder_deps="libxavs"
libxvid_encoder_deps="libxvid"
libutvideo_decoder_deps="libutvideo"
libutvideo_encoder_deps="libutvideo"

# demuxers / muxers
ac3_demuxer_select="ac3_parser"
asf_stream_muxer_select="asf_muxer"
avisynth_demuxer_deps="avisynth"
dirac_demuxer_select="dirac_parser"
dts_demuxer_select="dca_parser"
dtshd_demuxer_select="dca_parser"
eac3_demuxer_select="ac3_parser"
f4v_muxer_select="mov_muxer"
flac_demuxer_select="flac_parser"
ipod_muxer_select="mov_muxer"
ismv_muxer_select="mov_muxer"
libnut_demuxer_deps="libnut"
libnut_muxer_deps="libnut"
matroska_audio_muxer_select="matroska_muxer"
matroska_demuxer_suggest="bzlib lzo zlib"
mov_demuxer_suggest="zlib"
mov_muxer_select="rtpenc_chain"
mp3_demuxer_select="mpegaudio_parser"
mp4_muxer_select="mov_muxer"
mpegts_muxer_select="adts_muxer latm_muxer mpegvideo"
mpegtsraw_demuxer_select="mpegts_demuxer"
mxf_d10_muxer_select="mxf_muxer"
ogg_demuxer_select="golomb"
psp_muxer_select="mov_muxer"
rtp_demuxer_select="sdp_demuxer"
rtp_muxer_select="mpegvideo"
rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
rtsp_demuxer_select="http_protocol rtpdec"
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
sap_demuxer_select="sdp_demuxer"
sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
sdp_demuxer_select="rtpdec"
smoothstreaming_muxer_select="ismv_muxer"
spdif_muxer_select="aac_parser"
tak_demuxer_select="tak_parser"
tg2_muxer_select="mov_muxer"
tgp_muxer_select="mov_muxer"
vobsub_demuxer_select="mpegps_demuxer"
w64_demuxer_deps="wav_demuxer"
w64_muxer_deps="wav_muxer"

# indevs / outdevs
alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
alsa_outdev_deps="alsa_asoundlib_h"
bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
caca_outdev_deps="libcaca"
dshow_indev_deps="IBaseFilter"
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
dv1394_indev_deps="dv1394 dv_demuxer"
fbdev_indev_deps="linux_fb_h"
iec61883_indev_deps="libiec61883"
jack_indev_deps="jack_jack_h sem_timedwait"
lavfi_indev_deps="avfilter"
libcdio_indev_deps="libcdio"
libdc1394_indev_deps="libdc1394"
libv4l2_indev_deps="libv4l2"
openal_indev_deps="openal"
oss_indev_deps_any="soundcard_h sys_soundcard_h"
oss_outdev_deps_any="soundcard_h sys_soundcard_h"
pulse_indev_deps="libpulse"
sdl_outdev_deps="sdl"
sndio_indev_deps="sndio_h"
sndio_outdev_deps="sndio_h"
v4l_indev_deps="linux_videodev_h"
v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
vfwcap_indev_extralibs="-lavicap32"
x11grab_indev_deps="x11grab"

# protocols
bluray_protocol_deps="libbluray"
ffrtmpcrypt_protocol_deps="!librtmp_protocol"
ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
ffrtmpcrypt_protocol_select="tcp_protocol"
ffrtmphttp_protocol_deps="!librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol"
gopher_protocol_select="network"
httpproxy_protocol_select="tcp_protocol"
http_protocol_select="tcp_protocol"
https_protocol_select="tls_protocol"
librtmp_protocol_deps="librtmp"
librtmpe_protocol_deps="librtmp"
librtmps_protocol_deps="librtmp"
librtmpt_protocol_deps="librtmp"
librtmpte_protocol_deps="librtmp"
mmsh_protocol_select="http_protocol"
mmst_protocol_select="network"
rtmp_protocol_deps="!librtmp_protocol"
rtmp_protocol_select="tcp_protocol"
rtmpe_protocol_select="ffrtmpcrypt_protocol"
rtmps_protocol_deps="!librtmp_protocol"
rtmps_protocol_select="tls_protocol"
rtmpt_protocol_select="ffrtmphttp_protocol"
rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
rtp_protocol_select="udp_protocol"
sctp_protocol_deps="struct_sctp_event_subscribe"
sctp_protocol_select="network"
srtp_protocol_select="rtp_protocol"
tcp_protocol_select="network"
tls_protocol_deps_any="openssl gnutls"
tls_protocol_select="tcp_protocol"
udp_protocol_select="network"

# filters
aconvert_filter_deps="swresample"
amovie_filter_deps="avcodec avformat"
aresample_filter_deps="swresample"
ass_filter_deps="libass"
asyncts_filter_deps="avresample"
atempo_filter_deps="avcodec rdft"
blackframe_filter_deps="gpl"
boxblur_filter_deps="gpl"
colormatrix_filter_deps="gpl"
cropdetect_filter_deps="gpl"
decimate_filter_deps="gpl avcodec"
delogo_filter_deps="gpl"
deshake_filter_deps="avcodec"
drawtext_filter_deps="libfreetype"
ebur128_filter_deps="gpl"
flite_filter_deps="libflite"
frei0r_filter_deps="frei0r dlopen"
frei0r_filter_extralibs='$ldl'
frei0r_src_filter_deps="frei0r dlopen"
frei0r_src_filter_extralibs='$ldl'
geq_filter_deps="gpl"
histeq_filter_deps="gpl"
hqdn3d_filter_deps="gpl"
hue_filter_deps="gpl"
kerndeint_filter_deps="gpl"
movie_filter_deps="avcodec avformat"
mp_filter_deps="gpl avcodec swscale inline_asm"
mptestsrc_filter_deps="gpl"
negate_filter_deps="lut_filter"
noise_filter_deps="gpl"
resample_filter_deps="avresample"
ocv_filter_deps="libopencv"
pan_filter_deps="swresample"
pp_filter_deps="gpl postproc"
removelogo_filter_deps="avcodec avformat swscale"
scale_filter_deps="swscale"
smartblur_filter_deps="gpl swscale"
showspectrum_filter_deps="avcodec rdft"
stereo3d_filter_deps="gpl"
subtitles_filter_deps="avformat avcodec libass"
super2xsai_filter_deps="gpl"
tinterlace_filter_deps="gpl"
yadif_filter_deps="gpl"
pixfmts_super2xsai_test_deps="super2xsai_filter"
tinterlace_merge_test_deps="tinterlace_filter"
tinterlace_pad_test_deps="tinterlace_filter"

# libraries
avcodec_deps="avutil"
avdevice_deps="avutil avcodec avformat"
avfilter_deps="avutil"
avformat_deps="avutil avcodec"
avresample_deps="avutil"
postproc_deps="avutil gpl"
swscale_deps="avutil"

# programs
ffmpeg_deps="avcodec avfilter avformat swscale swresample"
ffmpeg_select="ffbuffersink_filter format_filter aformat_filter
               setpts_filter null_filter anull_filter ffabuffersink_filter"
ffplay_deps="avcodec avformat swscale swresample sdl"
ffplay_select="ffbuffersink_filter rdft crop_filter"
ffprobe_deps="avcodec avformat"
ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
ffserver_extralibs='$ldl'

# mythtv dependencies
audio_oss_deps_any="soundcard_h sys_soundcard_h"
dvb_deps="backend"
firewire_deps="backend"
ivtv_deps="backend v4l2"
hdpvr_deps="backend v4l2"
hdhomerun_deps="backend"
ceton_deps="backend"
mpegtsraw_demuxer_deps="merge_libavformat_mpegts_c"
mythtranscode_deps="backend frontend"
opengl_deps_any="agl_h GL_gl_h GLES2_gl2_h darwin windows x11"
opengles_deps="GLES2_gl2_h"
opengl_video_deps="opengl"
v4l2_deps="backend linux_videodev2_h"
v4l1_deps="backend v4l2 linux_videodev_h"
xrandr_deps="x11"
xv_deps="x11"
asi_deps="backend"

<<EOF
# documentation
podpages_deps="perl"
manpages_deps="perl pod2man"
htmlpages_deps="texi2html"
txtpages_deps="makeinfo"
doc_deps_any="manpages htmlpages podpages txtpages"

EOF

# default parameters

pre_logfile="config.ep"
logfile="$pre_logfile"
compile_type="profile"

# installation paths
prefix_default="/usr/local"
bindir_default='${prefix}/bin'
datadir_default='${prefix}/share/mythtv'
incdir_default='$(prefix)/include/mythtv'
libdir_default='${prefix}/lib'
mandir_default='${prefix}/share/man'
shlibdir_default="$libdir_default"

libdir_name='lib'

# toolchain
ar_default="ar"
cc_default="gcc"
cxx_default="g++"
host_cc_default="gcc"
cp_f="cp -f"
install="install"
ln_s="ln -s -f"
nm_default="nm -g"
objformat="elf"
pkg_config_default=pkg-config
ranlib="ranlib"
strip_default="strip"
yasmexe_default="yasm"

nogas=":"

# MythTV toolchain
ccache="yes"
distcc="yes"
qmake_default="qmake"
qmakespecs_default=""
python_default="python"

# machine
arch_default=$(uname -m)
cpu="generic"
processor=`uname -p 2>/dev/null`
processor_flags=""
tune="generic"

if test -f /proc/cpuinfo ; then
    if test x"$processor" = x"" -o x"$processor" = x"$arch_default" -o \
            x"$processor" = x"unknown" ; then
        processor=`cat /proc/cpuinfo | grep "model name" | head -n 1`
    fi
    processor_flags=`cat /proc/cpuinfo | grep "flags" | head -n 1`
fi

# Mac OS X equivalent
if test -f /usr/bin/hostinfo ; then
    arch=`arch`
    if test x"$arch" = x"ppc" -o x"$arch" = x"ppc64" ; then
        processor=`/usr/bin/hostinfo | grep "Processor type:"`
        processor=${processor#Processor type: *}
        processor=${processor% (*}
        tune=$processor
    else
            # 10.4 only:
            processor=`/usr/sbin/sysctl -n machdep.cpu.model_string 2>/dev/null`
            if test x"$processor" = x"" ; then
                # On 10.5, this contains the type of CPU also:
                processor=`/usr/sbin/sysctl -n machdep.cpu.brand_string`
            fi
            processor_flags=`/usr/sbin/sysctl -n machdep.cpu.features`
            processor_flags=`echo $processor_flags | tr "[A-Z]" "[a-z]"`
    fi
fi

# OS
target_os_default=$(tolower $(uname -s))
host_os=$target_os_default

# configurable options
enable $PROGRAM_LIST
#enable $DOCUMENT_LIST
enable $(filter_out avresample $LIBRARY_LIST)
enable stripping

enable asm
enable debug
#enable doc
enable optimizations
enable runtime_cpudetect
enable safe_bitstream_reader
#enable static
enable swscale_alpha

# Enable hwaccels by default.
enable dxva2 vaapi vdpau

# mythtv settings
enable shared
enable gpl

CONFIG_DEFINES=""
CONFIG_INCLUDEPATH=""
PROFILEFLAGS=""

audio_pulse="default"
audio_pulseoutput="default"
audio_alsa="default"
audio_jack="default"

enable audio_oss
enable bindings_perl
enable bindings_python
enable bindings_php
enable dvb
enable ffmpeg_pthreads
enable firewire
enable frontend
enable hdhomerun
enable ceton
enable hdpvr
enable ivtv
enable asi
enable lamemp3
enable libass
enable libcec
enable libcrypto
enable libdns_sd
enable libxml2
enable libudf
enable lirc
enable mheg
enable mythtranscode
enable opengl
enable opengles
enable opengl_video
enable quartz_video
enable symbol_visibility
enable v4l1
enable v4l2
enable x11
enable xrandr
enable xv
disable indevs
disable sdl
enable libfftw3
enable taglib
enable mythlogserver

# mythtv paths
dvb_path_default="${sysroot}/usr/include"
x11_path_default="${sysroot}/usr/X11R6/include"
libcec_path_default="${sysroot}/usr/include"
libxml2_path_default="${sysroot}/usr/include/libxml2"
firewiresdk_path_default=""

# build settings
SHFLAGS='-shared -Wl,-soname,$$(@F)'
FFSERVERLDFLAGS=-Wl,-E
LIBPREF="libmyth"
LIBSUF=".a"
FULLNAME='$(NAME)$(BUILDSUF)'
LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
SLIBPREF="libmyth"
SLIBSUF=".so"
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

asflags_filter=echo
cflags_filter=echo
ldflags_filter=echo
cxxppflags_filter=echo

AS_C='-c'
AS_O='-o $@'
CC_C='-c'
CC_E='-E -o $@'
CC_O='-o $@'
CXX_C='-c'
CXX_O='-o $@'
LD_O='-o $@'
LD_LIB='-l%'
LD_PATH='-L'
HOSTCC_C='-c'
HOSTCC_O='-o $@'
HOSTLD_O='-o $@'

host_cflags='-O3 -g -Wall'
host_cppflags='-D_ISOC99_SOURCE -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112'
host_libs='-lm'
host_cflags_filter=echo
host_ldflags_filter=echo

target_path='$(CURDIR)'

# since the object filename is not given with the -MM flag, the compiler
# is only able to print the basename, and we must add the path ourselves
DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
DEPFLAGS='-MM'

# find source path
source_path="$(dirname "$0")"
enable source_path_used
if test -f configure; then
    source_path="$(pwd)"
    disable source_path_used
else
    source_path="$(cd "$source_path"; pwd)"
    echo "$source_path" | grep -q '[[:blank:]]' &&
        die "Out of tree builds are impossible with whitespace in source path."
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
fi

for v in "$@"; do
    r=${v#*=}
    l=${v%"$r"}
    r=$(sh_quote "$r")
    FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
    MYTHTV_CONFIGURATION="${MYTHTV_CONFIGURATION# } ${v}"
done

find_things(){
    thing=$1
    pattern=$2
    file=$source_path/$3
    sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
}

ENCODER_LIST=$(find_things  encoder  ENC      external/FFmpeg/libavcodec/allcodecs.c)
DECODER_LIST=$(find_things  decoder  DEC      external/FFmpeg/libavcodec/allcodecs.c)
HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  external/FFmpeg/libavcodec/allcodecs.c)
PARSER_LIST=$(find_things   parser   PARSER   external/FFmpeg/libavcodec/allcodecs.c)
BSF_LIST=$(find_things      bsf      BSF      external/FFmpeg/libavcodec/allcodecs.c)
MUXER_LIST=$(find_things    muxer    _MUX     external/FFmpeg/libavformat/allformats.c)
DEMUXER_LIST=$(find_things  demuxer  DEMUX    external/FFmpeg/libavformat/allformats.c)
OUTDEV_LIST=$(find_things   outdev   OUTDEV   external/FFmpeg/libavdevice/alldevices.c)
INDEV_LIST=$(find_things    indev    _IN      external/FFmpeg/libavdevice/alldevices.c)
PROTOCOL_LIST=$(find_things protocol PROTOCOL external/FFmpeg/libavformat/allformats.c)
FILTER_LIST=$(find_things   filter   FILTER   external/FFmpeg/libavfilter/allfilters.c)

ALL_COMPONENTS="
    $BSF_LIST
    $DECODER_LIST
    $DEMUXER_LIST
    $ENCODER_LIST
    $FILTER_LIST
    $HWACCEL_LIST
    $INDEV_LIST
    $MUXER_LIST
    $OUTDEV_LIST
    $PARSER_LIST
    $PROTOCOL_LIST
"

for n in $COMPONENT_LIST; do
    v=$(toupper ${n%s})_LIST
    eval enable \$$v
    eval ${n}_if_any="\$$v"
done

enable $ARCH_EXT_LIST

die_unknown(){
    echo "Unknown option \"$1\"."
    echo "See $0 --help for available options."
    exit 1
}

print_3_columns() {
    cat | tr ' ' '\n' | sort | pr -r -3 -t
}

show_list() {
    suffix=_$1
    shift
    echo $* | sed s/$suffix//g | print_3_columns
    exit 0
}

rand_list(){
    IFS=', '
    set -- $*
    unset IFS
    for thing; do
        comp=${thing%:*}
        prob=${thing#$comp}
        prob=${prob#:}
        is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
        echo "prob ${prob:-0.5}"
        printf '%s\n' $comp
    done
}

do_random(){
    action=$1
    shift
    random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
    $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
}

if [ -e config.log ] ; then
    PCONF=$(tail -n 1 config.log | grep configure | sed 's/.\/configure//g')
    for opt in "$@" ; do
        if test x"$opt" != x"--prev" -a x"$opt" != x"--previous" ; then
            OTHOPT="${OTHOPT# }${opt}"
        fi
        if test x"$opt" = x"--prev" -o x"$opt" = x"--previous" ; then
            if test x"$PCONF" != "--prev" ; then
                PREV="yes";
            fi
        fi
    done
    if test x"$PREV" = x"yes"; then
        echo "Options: $PCONF $OTHOPT"
        ./configure $PCONF $OTHOPT
        exit
    fi
fi

for opt do
    optval="${opt#*=}"
    case "$opt" in
#Myth options
        --compile-type=*) compile_type=$optval
        ;;
        --libdir-name=*) libdir_name=$optval
        ;;
        --extra-cxxflags=*) add_cxxflags $optval
        ;;
        --firewire-sdk=*) firewiresdk_path="${optval}"
        ;;
        --arch=*) arch=$optval && enable cpu_override
        ;;
        --cpu=*) cpu=$optval && enable cpu_override
        ;;
        --tune=*) tune=$optval
        ;;
        --disable-ccache) disable ccache
        ;;
        --disable-distcc) disable distcc
        ;;
        --enable-quartz-video) enable quartz_video
        ;;
        --disable-quartz-video) disable quartz_video
        ;;
# disabled due to abuse in Gentoo ebuild
        --disable-frontend)
        ;;
# disabled due to abuse in Gentoo ebuild
        --disable-backend)
        ;;
        --enable-mac-bundle) enable mac_bundle
        ;;
        --disable-mythlogserver) disable mythlogserver
        ;;
        --previous|--prev)
            echo "No history of previous configure parameters."
        ;;
        --with-bindings=*)
            tmp_bindings=`echo ${optval} | sed -e 's/,/ /g'`
            for binding in ${tmp_bindings} ; do
                if test x"${binding}" = x"perl"; then
                    bindings_perl="yes"
                fi
                if test x"${binding}" = x"python"; then
                    bindings_python="yes"
                fi
                if test x"${binding}" = x"php"; then
                    bindings_php="yes"
                fi
            done
        ;;
        --without-bindings=*)
            tmp_bindings=`echo ${optval} | sed -e 's/,/ /g'`
            for binding in ${tmp_bindings} ; do
                if test x"${binding}" = x"perl"; then
                    bindings_perl="no"
                fi
                if test x"${binding}" = x"python"; then
                    bindings_python="no"
                fi
                if test x"${binding}" = x"php"; then
                    bindings_php="no"
                fi
            done
        ;;
        --perl-config-opts=*)
          PERL_CONFIG_OPTS=`echo ${optval}`
        ;;
#FFmpeg original
        --extra-ldflags=*)
            add_ldflags $optval
        ;;
        --extra-libs=*)
            add_extralibs $optval
        ;;
        --disable-devices)
            disable $INDEV_LIST $OUTDEV_LIST
        ;;
        --enable-debug=*)
            debuglevel="$optval"
        ;;
        --disable-programs)
            disable $PROGRAM_LIST
        ;;
        --disable-everything)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
        ;;
        --disable-all)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
            disable $LIBRARY_LIST $PROGRAM_LIST doc
        ;;
        --enable-random|--disable-random)
            action=${opt%%-random}
            do_random ${action#--} $COMPONENT_LIST
        ;;
        --enable-random=*|--disable-random=*)
            action=${opt%%-random=*}
            do_random ${action#--} $optval
        ;;
        --enable-*=*|--disable-*=*)
            eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
            is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
            eval list=\$$(toupper $thing)_LIST
            name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
            list=$(filter "$name" $list)
            [ "$list" = "" ] && warn "Option $opt did not match anything"
            $action $list
        ;;
        --enable-?*|--disable-?*)
            eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
            if is_in $option $COMPONENT_LIST; then
                test $action = disable && action=unset
                eval $action \$$(toupper ${option%s})_LIST
            elif is_in $option $CMDLINE_SELECT; then
                $action $option
            else
                die_unknown $opt
            fi
        ;;
        --list-*)
            NAME="${opt#--list-}"
            is_in $NAME $COMPONENT_LIST || die_unknown $opt
            NAME=${NAME%s}
            eval show_list $NAME \$$(toupper $NAME)_LIST
        ;;
        --help|-h) show_help
        ;;
        --fatal-warnings) enable fatal_warnings
        ;;
        *)
            optname="${opt%%=*}"
            optname="${optname#--}"
            optname=$(echo "$optname" | sed 's/-/_/g')
            if is_in $optname $CMDLINE_SET; then
                eval $optname='$optval'
            elif is_in $optname $CMDLINE_APPEND; then
                append $optname "$optval"
            else
                die_unknown $opt
            fi
        ;;
    esac
done


#setting default runtime prefix and libdir
if test -n "${prefix}"; then
    runprefix_default=${prefix}
    libdir_default="${prefix}/${libdir_name}"
    shlibdir_default="${prefix}/${libdir_name}"
else
    runprefix_default=${prefix_default}
    libdir_default="${prefix_default}/${libdir_name}"
    shlibdir_default="${prefix_default}/${libdir_name}"
fi

if enabled_any cpu_override cross_compile || test x"$tune" != x"generic" &&
    enabled proc_opt; then
    echo "Warning! --enable-proc-opt shouldn't be used with --arch, --cpu or --tune"
    echo "Disabling it now."
    disable proc_opt
fi

enabled proc_opt && disable runtime_cpudetect && cpu="host"

disabled logging && logfile=/dev/null

echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
set >> $logfile

test -n "$cross_prefix" && enable cross_compile

if enabled cross_compile; then
    test -n "$arch" && test -n "$target_os" ||
        die "Must specify target arch and OS when cross-compiling"
fi

ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
cxx_default="${cross_prefix}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
ranlib="${cross_prefix}${ranlib}"
strip_default="${cross_prefix}${strip_default}"

sysinclude_default="${sysroot}/usr/include"

case "$toolchain" in
    clang-asan)
        cc_default="clang"
        add_cflags  -faddress-sanitizer
        add_ldflags -faddress-sanitizer
    ;;
    clang-tsan)
        cc_default="clang"
        add_cflags  -fthread-sanitizer
        add_ldflags -fthread-sanitizer
    ;;
    msvc)
        cc_default="c99wrap cl"
        ld_default="c99wrap link"
        nm_default="dumpbin -symbols"
        ar_default="lib"
        target_os_default="win32"
    ;;
    ?*)
        die "Unknown toolchain $toolchain"
    ;;
esac

set_default arch cc cxx pkg_config strip sysinclude target_os yasmexe
enabled cross_compile || host_cc_default=$cc
set_default host_cc

if ! $pkg_config --version >/dev/null 2>&1; then
    warn "$pkg_config not found, library detection may fail."
    pkg_config=false
fi

set_default qmake qmakespecs python yasmexe

exesuf() {
    case $1 in
        mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
    esac
}

EXESUF=$(exesuf $target_os)
HOSTEXESUF=$(exesuf $host_os)

# set temporary file name
: ${TMPDIR:=$TEMPDIR}
: ${TMPDIR:=$TMP}
: ${TMPDIR:=/tmp}

if ! check_cmd mktemp -u XXXXXX; then
    # simple replacement for missing mktemp
    # NOT SAFE FOR GENERAL USE
    mktemp(){
        echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
    }
fi

tmpfile(){
    tmp=$(mktemp -u "${TMPDIR}/mythtv_conf.XXXXXXXX")$2 &&
        (set -C; exec > $tmp) 2>/dev/null ||
        die "Unable to create temporary file in $TMPDIR."
    append TMPFILES $tmp
    eval $1=$tmp
}

trap 'rm -f -- $TMPFILES' EXIT
trap exit HUP INT TERM

tmpfile TMPASM .asm
tmpfile TMPC  .c
tmpfile TMPCPP .cpp
tmpfile TMPE  $EXESUF
tmpfile TMPH  .h
tmpfile TMPO  .o
tmpfile TMPS  .S
tmpfile TMPSH .sh
tmpfile TMPV  .ver
tmpfile TMPMAK .mak
tmpfile TMPPRO .pro

unset -f mktemp

chmod +x $TMPE

# make sure we can execute files in $TMPDIR
cat > $TMPSH 2>> $logfile <<EOF
#! /bin/sh
EOF
chmod +x $TMPSH >> $logfile 2>&1
if ! $TMPSH >> $logfile 2>&1; then
    cat <<EOF
Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
variable to another directory and make sure that it is not mounted noexec.
EOF
    die "Sanity test failed."
fi

ccc_flags(){
    for flag; do
        case $flag in
            -std=c99)           echo -c99                       ;;
            -mcpu=*)            echo -arch ${flag#*=}           ;;
            -mieee)             echo -ieee                      ;;
            -O*|-fast)          echo $flag                      ;;
            -fno-math-errno)    echo -assume nomath_errno       ;;
            -g)                 echo -g3                        ;;
            -Wall)              echo -msg_enable level2         ;;
            -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
            -Wl,*)              echo $flag                      ;;
            -f*|-W*)                                            ;;
            *)                  echo $flag                      ;;
        esac
   done
}

msvc_flags(){
    for flag; do
        case $flag in
            -fomit-frame-pointer) echo -Oy ;;
            -g)                   echo -Z7 ;;
            -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389 \
                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
                                       -wd4554 \
                                       -wd4996 -wd4273 ;;
            -std=c99)             ;;
            -fno-math-errno)      ;;
            -fno-common)          ;;
            -fno-signed-zeros)    ;;
            -fPIC)                ;;
            -lz)                  echo zlib.lib ;;
            -lavifil32)           echo vfw32.lib ;;
            -lavicap32)           echo vfw32.lib user32.lib ;;
            -l*)                  echo ${flag#-l}.lib ;;
            *)                    echo $flag ;;
        esac
    done
}

pgi_flags(){
    for flag; do
        case $flag in
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
            -fomit-frame-pointer) echo -Mnoframe ;;
            -g)                   echo -gopt ;;
            *)                    echo $flag ;;
        esac
    done
}

suncc_flags(){
    for flag; do
        case $flag in
            -march=*|-mcpu=*)
                case "${flag#*=}" in
                    native)                   echo -xtarget=native       ;;
                    v9|niagara)               echo -xarch=sparc          ;;
                    ultrasparc)               echo -xarch=sparcvis       ;;
                    ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
                    i586|pentium)             echo -xchip=pentium        ;;
                    i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
                    pentium3*|c3-2)           echo -xtarget=pentium3     ;;
                    pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
                    pentium4*)          echo -xtarget=pentium4           ;;
                    prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
                    *-sse3)             echo -xarch=sse3                 ;;
                    core2)              echo -xarch=ssse3 -xchip=core2   ;;
                    corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
                    corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
                    amdfam10|barcelona)       echo -xtarget=barcelona    ;;
                    bdver*)                   echo -xarch=avx            ;;
                    athlon-4|athlon-[mx]p)    echo -xarch=ssea           ;;
                    k8|opteron|athlon64|athlon-fx)
                                              echo -xarch=sse2a          ;;
                    athlon*)                  echo -xarch=pentium_proa   ;;
                esac
                ;;
            -std=c99)             echo -xc99              ;;
            -fomit-frame-pointer) echo -xregs=frameptr    ;;
            -fPIC)                echo -KPIC -xcode=pic32 ;;
            -W*,*)                echo $flag              ;;
            -f*-*|-W*|-mimpure-text)                      ;;
            -shared)              echo -G                 ;;
            *)                    echo $flag              ;;
        esac
    done
}

tms470_flags(){
    for flag; do
        case $flag in
            -march=*|-mcpu=*)
                case "${flag#*=}" in
                    armv7-a|cortex-a*)      echo -mv=7a8 ;;
                    armv7-r|cortex-r*)      echo -mv=7r4 ;;
                    armv7-m|cortex-m*)      echo -mv=7m3 ;;
                    armv6*|arm11*)          echo -mv=6   ;;
                    armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
                                            echo -mv=5e  ;;
                    armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
                esac
                ;;
            -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
            -mfpu=vfp)      echo --float_support=vfpv2        ;;
            -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
            -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
            -msoft-float)   echo --float_support=vfplib       ;;
            -O[0-3]|-mf=*)  echo $flag                        ;;
            -g)             echo -g -mn                       ;;
            -pds=*)         echo $flag                        ;;
            -D*|-I*)        echo $flag                        ;;
            --gcc|--abi=*)  echo $flag                        ;;
            -me)            echo $flag                        ;;
        esac
    done
}

probe_cc(){
    pfx=$1
    _cc=$2

    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
    unset _ld_o _ldflags _ld_lib _ld_path
    unset _depflags _DEPCMD _DEPFLAGS
    _flags_filter=echo

    if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
        _type=llvm_gcc
        gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
        _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -v 2>&1 | grep -qi ^gcc; then
        _type=gcc
        gcc_version=$($_cc --version | head -n1)
        gcc_basever=$($_cc -dumpversion)
        gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
        gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
        _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
        if ! $_cc -dumpversion | grep -q '^2\.'; then
            _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        fi
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc --version 2>/dev/null | grep -q ^icc; then
        _type=icc
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
        _cflags_noopt='-O1'
    elif $_cc -v 2>&1 | grep -q xlc; then
        _type=xlc
        _ident=$($_cc -qversion 2>/dev/null | head -n1)
        _cflags_speed='-O5'
        _cflags_size='-O5 -qcompact'
    elif $_cc -V 2>/dev/null | grep -q Compaq; then
        _type=ccc
        _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
        _DEPFLAGS='-M'
        _cflags_speed='-fast'
        _cflags_size='-O1'
        _flags_filter=ccc_flags
    elif $_cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then
        test -d "$sysroot" || die "No valid sysroot specified."
        _type=armcc
        _ident=$($_cc --vsn | head -n1)
        armcc_conf="$PWD/armcc.conf"
        $_cc --arm_linux_configure                 \
             --arm_linux_config_file="$armcc_conf" \
             --configure_sysroot="$sysroot"        \
             --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
             die "Error creating armcc configuration file."
        $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
        _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
        as_default="${cross_prefix}gcc"
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
        _type=tms470
        _ident=$($_cc -version | head -n1 | tr -s ' ')
        _flags='--gcc --abi=eabi -me'
        _cc_e='-ppl -fe=$@'
        _cc_o='-fe=$@'
        _depflags='-ppa -ppd=$(@:.o=.d)'
        _cflags_speed='-O3 -mf=5'
        _cflags_size='-O3 -mf=2'
        _flags_filter=tms470_flags
    elif $_cc -v 2>&1 | grep -q clang; then
        _type=clang
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -V 2>&1 | grep -q Sun; then
        _type=suncc
        _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
        _DEPFLAGS='-xM1 -xc99'
        _ldflags='-std=c99'
        _cflags_speed='-O5'
        _cflags_size='-O5 -xspace'
        _flags_filter=suncc_flags
    elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
        _type=pathscale
        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O2'
        _cflags_size='-Os'
        _flags_filter='filter_out -Wdisabled-optimization'
    elif $_cc -v 2>&1 | grep -q Open64; then
        _type=open64
        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O2'
        _cflags_size='-Os'
        _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
    elif $_cc -V 2>&1 | grep -q Portland; then
        _type=pgi
        _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
        _cflags_noopt="-O1"
        _flags_filter=pgi_flags
    elif $_cc 2>&1 | grep -q Microsoft; then
        _type=msvc
        _ident=$($cc 2>&1 | head -n1)
        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
        _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
        _cflags_speed="-O2"
        _cflags_size="-O1"
        # Nonstandard output options, to avoid msys path conversion issues, relies on wrapper to remap it
        if $_cc 2>&1 | grep -q Linker; then
            _ld_o='-out $@'
        else
            _ld_o='-Fe$@'
        fi
        _cc_o='-Fo $@'
        _cc_e='-P -Fi $@'
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        _flags='-nologo'
        _cflags='-D_USE_MATH_DEFINES -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
        if [ $pfx = hostcc ]; then
            append _cflags -Dsnprintf=_snprintf
        fi
        disable stripping
    fi

    eval ${pfx}_type=\$_type
    eval ${pfx}_ident=\$_ident
}

set_ccvars(){
    eval ${1}_C=\${_cc_c-\${${1}_C}}
    eval ${1}_E=\${_cc_e-\${${1}_E}}
    eval ${1}_O=\${_cc_o-\${${1}_O}}

    if [ -n "$_depflags" ]; then
        eval ${1}_DEPFLAGS=\$_depflags
    else
        eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
        eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
        eval DEP${1}FLAGS=\$_flags
    fi
}

probe_cc cc "$cc"
cflags_filter=$_flags_filter
cflags_speed=$_cflags_speed
cflags_size=$_cflags_size
cflags_noopt=$_cflags_noopt
add_cflags $_flags $_cflags
cc_ldflags=$_ldflags
set_ccvars CC

probe_cc hostcc "$host_cc"
host_cflags_filter=$_flags_filter
add_host_cflags  $_flags $_cflags
set_ccvars HOSTCC

test -n "$cc_type" && enable $cc_type ||
    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"


if $cxx -v 2>&1 | grep -qi ^gcc; then
    cxx_type=gxx
    gxx_version=$($cxx -dumpversion)
elif $cxx --version 2>/dev/null | grep -q Intel; then
    cxx_type=icpc
    gxx_version="AV_STRINGIFY(__INTEL_COMPILER)"
    cxx_ident=$($cxx --version | head -n1)
    icpc_version=$($cxx -dumpversion)
    speed_cxxflags='-O3'
    size_cxxflags='-Os'
    noopt_cxxflags='-O1'
elif $cxx --version 2>/dev/null | grep -q clang; then
    cxx_type=clangxx
    gxx_version="AV_STRINGIFY(__CLANG_COMPILER)"
    cxx_ident=$($cxx --version | head -n1)
    clangxx_version=$($cxx -dumpversion)
    speed_cxxflags='-O3'
    size_cxxflags='-Os'
    noopt_cxxflags='-O1'
fi

test -n "$cxx_type" && enable $cxx_type ||
    warn "Unknown C++ compiler $cxx, unable to select optimal CXXFLAGS"

: ${as_default:=$cc}
: ${dep_cc_default:=$cc}
: ${ld_default:=$cc}
: ${host_ld_default:=$host_cc}
set_default ar as dep_cc ld host_ld

probe_cc as "$as"
asflags_filter=$_flags_filter
add_asflags $_flags $_cflags
set_ccvars AS

probe_cc ld "$ld"
ldflags_filter=$_flags_filter
add_ldflags $_flags $_ldflags
test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
LD_O=${_ld_o-$LD_O}
LD_LIB=${_ld_lib-$LD_LIB}
LD_PATH=${_ld_path-$LD_PATH}

probe_cc hostld "$host_ld"
host_ldflags_filter=$_flags_filter
add_host_ldflags $_flags $_ldflags
HOSTLD_O=${_ld_o-$HOSTLD_O}

if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
    probe_cc depcc "$dep_cc"
    CCDEP=${_DEPCMD:-$DEPCMD}
    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
    DEPCCFLAGS=$_flags
fi

if $ar 2>&1 | grep -q Microsoft; then
    arflags="-nologo"
    ar_o='-out:$@'
elif $ar 2>&1 | grep -q 'Texas Instruments'; then
    arflags="rq"
    ar_o='$@'
else
    arflags="rc"
    ar_o='$@'
fi

add_cflags $extra_cflags
#add_cxxflags $extra_cxxflags
add_asflags $extra_cflags

if test -n "$sysroot"; then
    case "$cc_type" in
        gcc|llvm_gcc|clang)
            add_cppflags --sysroot="$sysroot"
            add_ldflags --sysroot="$sysroot"
            add_cxxppflags --sysroot="$sysroot"
        ;;
        tms470)
            add_cppflags -I"$sysinclude"
            add_ldflags  --sysroot="$sysroot"
            add_cxxppflags -I"$sysinclude"
        ;;
    esac
fi

if test "$cpu" = host; then
    enabled cross_compile && die "--cpu=host makes no sense when cross-compiling."

    case "$cc_type" in
        gcc|llvm_gcc)
            check_native(){
                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
                sed -n "/cc1.*$1=/{
                            s/.*$1=\\([^ ]*\\).*/\\1/
                            p
                            q
                        }" $TMPE
            }
            cpu=$(check_native -march || check_native -mcpu)
        ;;
    esac

    if test "${cpu:-host}" = host ; then
        enable proc_opt_old
        cpu="$arch"
    fi

    test "${cpu:-host}" = host && die "--cpu=host not supported with compiler $cc"
fi

# Deal with common $arch aliases
case "$arch" in
    aarch64|arm64)
        arch="aarch64"
    ;;
    arm*|iPad*)
        arch="arm"
    ;;
    mips*|IP*)
        arch="mips"
    ;;
    parisc*|hppa*)
        arch="parisc"
    ;;
    "Power Macintosh"|ppc*|powerpc*)
        arch="ppc"
    ;;
    s390|s390x)
        arch="s390"
    ;;
    sh4|sh)
        arch="sh4"
    ;;
    sun4u|sparc*)
        arch="sparc"
    ;;
    tilegx|tile-gx)
        arch="tilegx"
    ;;
    i[3-6]86|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
        arch="x86"
    ;;
esac

is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
enable $arch

# if no tune setting and we know cpu class look at $processor
if enabled proc_opt_old; then
# first try to tune based on processor info
# Intel i3, i5, i7 processors (EMT64T capable)
   if expr "$processor" : ".*Intel(R).*Core(TM) i[357] CPU.*" > /dev/null ; then
       cpu="core2"
# EM64T era Intel Xeon
   elif expr "$processor" : ".*Intel(R) Xeon(R) CPU.*51[1-6][08]" > /dev/null ; then
       cpu="core2"
   elif expr "$processor" : ".*Intel(R) Xeon(R) CPU.*54[0-9][025]" > /dev/null ; then
       cpu="core2"
   elif expr "$processor" : ".*Intel(R) Xeon(R) CPU.*33[2567]0" > /dev/null ; then
       cpu="core2"
   elif expr "$processor" : ".*Intel(R) Xeon(R) CPU.*X32[123]0" > /dev/null ; then
       cpu="core2"
# Various Intel Duo processors (EMT64T capable)
   elif expr "$processor" : ".*Intel(R).*Core(TM)2.*CPU" > /dev/null ; then
       cpu="core2"
   elif expr "$processor" : "*.Pentium(R) 5 CPU" > /dev/null ; then
       cpu="nocona"
# EM64T compatible Intel Celeron
   elif expr "$processor" : ".*Celeron(R) D CPU" > /dev/null ; then
       cpu="nocona"
       enable small
# Intel Core2 Duo
   elif expr "$processor" : ".*Genuine.*Intel.*CPU.*2160" > /dev/null ; then
       cpu="core2"
# Intel Atom
   elif expr "$processor" : ".*Intel(R) Atom(TM)" > /dev/null ; then
       cpu="nocona"
       enable small
# Reportedly Intel Duo, but we assume 32 bit P3 due to generic name
   elif expr "$processor" : ".*Genuine.*Intel.*CPU" > /dev/null ; then
       cpu="pentium3"
# Pentium-M derivative in AppleTV, assume 32 bit P3 due to generic name
   elif expr "$processor" : ".*Genuine.*Intel.*processor" > /dev/null ; then
       cpu="pentium3"
# P4
   elif expr "$processor" : ".*Xeon(TM) CPU" > /dev/null ; then
       cpu="pentium4"
   elif expr "$processor" : ".*XEON(TM) CPU" > /dev/null ; then
       cpu="pentium4"
   elif expr "$processor" : ".*XEON(TM) MP CPU" > /dev/null ; then
       cpu="pentium4"
   elif expr "$processor" : "pentium4" > /dev/null ; then
       cpu="pentium4"
   elif expr "$processor" : ".*Pentium(R) [4D]" > /dev/null ; then
       cpu="pentium4"
   elif expr "$processor" : ".*Celeron(R) CPU" > /dev/null ; then
       cpu="pentium4"
       enable small
# P6, which includes Intel Core
   elif expr "$processor" : ".*Intel P6 Family" > /dev/null ; then
       cpu="pentium4"
# P3
   elif expr "$processor" : "pentium3" > /dev/null ; then
       cpu="pentium3"
   elif expr "$processor" : ".*Pentium.* III" > /dev/null ; then
       cpu="pentium3"
   elif expr "$processor" : ".*Coppermine" > /dev/null ; then
       cpu="pentium3"
       enable small
   elif expr "$processor" : ".*Celeron(TM) CPU" > /dev/null ; then
       cpu="pentium3"
       enable small
   elif expr "$processor" : ".*Pentium(R) M" > /dev/null ; then
       cpu="pentium3"
   elif expr "$processor" : ".*Celeron(R) M processor" > /dev/null ; then
       cpu="pentium3"
       enable small
# P2
   elif expr "$processor" : "pentium2" > /dev/null ; then
       cpu="pentium2"
   elif expr "$processor" : ".*Mendocino" > /dev/null ; then
       cpu="pentium2"
       enable small
   elif expr "$processor" : ".*Klamath" > /dev/null ; then
       cpu="pentium2"
       enable small
   elif expr "$processor" : ".*Deschutes" > /dev/null ; then
       cpu="pentium2"
       enable small
   elif expr "$processor" : ".*Pentium II" > /dev/null ; then
       cpu="pentium2"
       enable small
# AMD Turion
   elif expr "$processor" : ".*AMD Turion(tm) 64" > /dev/null ; then
       cpu="k8"
# AMD Geode NX
   elif expr "$processor" : ".*AMD Geode(tm) NX" > /dev/null ; then
       cpu="athlon"
       enable small
# Athlon 64
   elif expr "$processor" : ".*AMD Athlon(tm) II" > /dev/null ; then
       cpu="k8"
   elif expr "$processor" : ".*AMD Athlon(tm) 64" > /dev/null ; then
       cpu="k8"
   elif expr "$processor" : ".*AMD Athlon(tm) Dual Core" > /dev/null ; then
       cpu="k8"
   elif expr "$processor" : ".*Athlon LE-16" > /dev/null ; then
       cpu="k8"
# AMD Phenom
   elif expr "$processor" : ".*AMD Phenom(tm)" > /dev/null ; then
       cpu="barcelona"
# AMD Opteron
   elif expr "$processor" : ".*AMD Opteron(tm)" >/dev/null ; then
       cpu="k8"
# Athlon MP
   elif expr "$processor" : ".*AMD Athlon(tm) MP.*" > /dev/null ; then
       cpu="athlon-mp"
# Athlon XP
   elif expr "$processor" : "athlon-xp" > /dev/null ; then
       cpu="athlon-xp"
   elif expr "$processor" : ".*AMD Athlon(tm) XP" > /dev/null ; then
       cpu="athlon-xp"
   elif expr "$processor" : ".*AMD Sempron(tm)" > /dev/null ; then
       cpu="athlon-xp"
# Athlon
   elif expr "$processor" : "athlon" > /dev/null ; then
       cpu="athlon"
   elif expr "$processor" : ".*AMD Athlon(..)" > /dev/null ; then
       cpu="athlon"
   elif expr "$processor" : ".*AMD Duron(..)" > /dev/null ; then
       cpu="athlon"
       enable small
# K6
   elif expr "$processor" : ".*AMD-K6(tm) 3D" > /dev/null ; then
       cpu="k6"
       enable small
# Transmeta Crusoe
   elif expr "$processor" : ".*Crusoe(m) Processor TM5600" > /dev/null ; then
       cpu="pentium2"
# c3-2
   elif expr "$processor" : ".*VIA Esther" > /dev/null ; then
       cpu="c3-2"
       enable small
   elif expr "$processor" : ".*VIA Nehemiah" > /dev/null ; then
       cpu="c3-2"
       enable small
# c3
   elif expr "$processor" : ".*VIA.*Ezra" > /dev/null ; then
       cpu="c3"
       enable small
   elif expr "$processor" : ".*VIA Samuel" > /dev/null ; then
       cpu="c3"
       enable small
# if no known processor info, tune base on uname -m info
   else
       enable proc_error_msg
   fi
fi

if enabled proc_error_msg; then
    UNAME_M_INFO=` uname -m 2> /dev/null`
    UNAME_P_INFO=` uname -p 2> /dev/null`
    PROC_INFO=`cat /proc/cpuinfo | grep "model name" | head -n 1 | sed s/"\t"//g 2>/dev/null`
    PROC_FLAG=`cat /proc/cpuinfo | grep "flags" | head -n 1 | sed s/"\t"//g 2>/dev/null`
    echo ""
    echo " *** WARNING *** "
    echo " Your CPU was not detected properly:"
    echo "   uname -m: $UNAME_M_INFO"
    echo "   uname -p: $UNAME_P_INFO"
    echo " $PROC_INFO"
    echo "      $PROC_FLAG"
    echo ""
    echo " If you are using a recent checkout from "
    echo "   http://svn.mythtv.org/svn/trunk/mythtv "
    echo " please e-mail the above to mythtv-users@mythtv.org"
    echo " With the subject \"configure did not detect my cpu\""
    echo ""
fi

if test $target_os = "darwin"; then
     # Apple GCC doesn't support march=core2 yet:
    if test $cpu = "core2"; then
        cpu="nocona"
    fi
    # Core Duo might be identified as march=pentium3, which errors:
    # ...MachineExceptions.h:... error: '__m128i' does not name a type
    # ...MachineExceptions.h:... error: '__m128i' does not name a type
    if test $cpu = "pentium3"; then
        cpu=prescott
    fi
fi

# Add processor-specific flags
if enabled aarch64; then

    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
        ;;
        *)
            cpuflags="-mcpu=$cpu"
        ;;
    esac

elif enabled alpha; then

    cpuflags="-mcpu=$cpu"

elif enabled arm; then

    check_arm_arch() {
        check_cpp_condition stddef.h \
            "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
            $cpuflags
    }

    probe_arm_arch() {
        if   check_arm_arch 4;        then echo armv4;
        elif check_arm_arch 4T;       then echo armv4t;
        elif check_arm_arch 5;        then echo armv5;
        elif check_arm_arch 5E;       then echo armv5e;
        elif check_arm_arch 5T;       then echo armv5t;
        elif check_arm_arch 5TE;      then echo armv5te;
        elif check_arm_arch 5TEJ;     then echo armv5te;
        elif check_arm_arch 6;        then echo armv6;
        elif check_arm_arch 6J;       then echo armv6j;
        elif check_arm_arch 6K;       then echo armv6k;
        elif check_arm_arch 6Z;       then echo armv6z;
        elif check_arm_arch 6ZK;      then echo armv6zk;
        elif check_arm_arch 6T2;      then echo armv6t2;
        elif check_arm_arch 7;        then echo armv7;
        elif check_arm_arch 7A  7_A;  then echo armv7-a;
        elif check_arm_arch 7R  7_R;  then echo armv7-r;
        elif check_arm_arch 7M  7_M;  then echo armv7-m;
        elif check_arm_arch 7EM 7E_M; then echo armv7-m;
        elif check_arm_arch 8A  8_A;  then echo armv8-a;
        fi
    }

    [ "$cpu" = generic ] && cpu=$(probe_arm_arch)

    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
            subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
        ;;
        *)
            cpuflags="-mcpu=$cpu"
            case $cpu in
                cortex-a*)                               subarch=armv7a  ;;
                cortex-r*)                               subarch=armv7r  ;;
                cortex-m*)                 enable thumb; subarch=armv7m  ;;
                arm11*)                                  subarch=armv6   ;;
                arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
                armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
                *)                             subarch=$(probe_arm_arch) ;;
            esac
        ;;
    esac

    case "$subarch" in
        armv5t*)    enable fast_clz                ;;
        armv[6-8]*) enable fast_clz fast_unaligned ;;
    esac

elif enabled avr32; then

    case $cpu in
        ap7[02]0[0-2])
            subarch="avr32_ap"
            cpuflags="-mpart=$cpu"
        ;;
        ap)
            subarch="avr32_ap"
            cpuflags="-march=$cpu"
        ;;
        uc3[ab]*)
            subarch="avr32_uc"
            cpuflags="-mcpu=$cpu"
        ;;
        uc)
            subarch="avr32_uc"
            cpuflags="-march=$cpu"
        ;;
    esac

elif enabled bfin; then

    cpuflags="-mcpu=$cpu"

elif enabled mips; then

    cpuflags="-march=$cpu"

    case $cpu in
        24kc)
            disable mipsfpu
            disable mipsdspr1
            disable mipsdspr2
        ;;
        24kf*)
            disable mipsdspr1
            disable mipsdspr2
        ;;
        24kec|34kc|1004kc)
            disable mipsfpu
            disable mipsdspr2
        ;;
        24kef*|34kf*|1004kf*)
            disable mipsdspr2
        ;;
        74kc)
            disable mipsfpu
        ;;
    esac

elif enabled ppc; then

    case $(tolower $cpu) in
        601|ppc601|powerpc601)
            cpuflags="-mcpu=601"
            disable altivec
        ;;
        603*|ppc603*|powerpc603*)
            cpuflags="-mcpu=603"
            disable altivec
        ;;
        604*|ppc604*|powerpc604*)
            cpuflags="-mcpu=604"
            disable altivec
        ;;
        g3|75*|ppc75*|powerpc75*)
            cpuflags="-mcpu=750"
            disable altivec
        ;;
        g4|745*|ppc745*|powerpc745*)
            cpuflags="-mcpu=7450"
        ;;
        74*|ppc74*|powerpc74*)
            cpuflags="-mcpu=7400"
        ;;
        g5|970|ppc970|powerpc970)
            cpuflags="-mcpu=970"
        ;;
        power[3-7]*)
            cpuflags="-mcpu=$cpu"
        ;;
        cell)
            cpuflags="-mcpu=cell"
            enable ldbrx
        ;;
        e500mc)
            cpuflags="-mcpu=e500mc"
            disable altivec
        ;;
        e500v2)
            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
            disable altivec
        ;;
        e500)
            cpuflags="-mcpu=8540 -mhard-float"
            disable altivec
        ;;
    esac

elif enabled sparc; then

    case $cpu in
        cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
            cpuflags="-mcpu=$cpu"
            disable vis
        ;;
        ultrasparc*|niagara[234])
            cpuflags="-mcpu=$cpu"
        ;;
    esac

elif enabled x86; then

    case $cpu in
        i[345]86|pentium)
            cpuflags="-march=$cpu"
            disable mmx
        ;;
        # targets that do NOT support conditional mov (cmov)
        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
            cpuflags="-march=$cpu"
            disable cmov
        ;;
        # targets that do support conditional mov (cmov)
        i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|corei7*|amdfam10|barcelona|atom|bdver*)
            cpuflags="-march=$cpu"
            enable cmov
            enable fast_cmov
        ;;
        # targets that do support conditional mov but on which it's slow
        pentium4|pentium4m|prescott|nocona)
            cpuflags="-march=$cpu"
            enable cmov
            disable fast_cmov
        ;;
    esac

fi


# if architecture specific flags don't work blank them
if test -n "$cpuflags"; then
    tmp_cpuflags="$cpuflags"
    check_cc $cpuflags <<EOF || cpuflags=""
int main( void ) { return 0; }
EOF
    if test -z "$cpuflags"; then
        if enabled cpu_override || enabled proc_opt || test x"$tune" != x"generic"; then
            echo "ERROR: CPU specific ./configure options failed compile test"
            echo "       Removing CPU specific compilation options. ($tmp_cpuflags)"
            echo ""
        fi
    fi
fi

if [ "$cpu" != generic ]; then
    add_cflags  $cpuflags
    add_asflags $cpuflags
    add_cxxflags $cpuflags
fi

# compiler sanity check
check_exec <<EOF
int main(void){ return 0; }
EOF
if test "$?" != 0; then
    echo "$cc is unable to create an executable file."
    echo "Check your ECFLAGS: [$ECFLAGS]"
    if test -z "$cross_prefix" && ! enabled cross_compile ; then
        echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
        echo "Only do this if you know what cross compiling means."
    fi
    die "C compiler test failed."
fi

add_cppflags -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112
#add_cxxflags -D__STDC_CONSTANT_MACROS

# C++ compiler sanity check
check_exec_cxx <<EOF
int main(void){ return 0; }
EOF
if test "$?" != 0; then
    echo "$cxx is unable to create an executable file."
    echo "Check your ECXXFLAGS: [$ECXXFLAGS]"
    if test -z "$cross_prefix" && ! enabled cross_compile ; then
        echo "If $cxx is a cross-compiler, use the --enable-cross-compile option."
        echo "Only do this if you know what cross compiling means."
    fi
    die "C++ compiler test failed."
fi

check_cflags -std=c99
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
#include <stdlib.h>
EOF
check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
#include <stdlib.h>
EOF
check_cxx -D_FILE_OFFSET_BITS=64 <<EOF && add_cxxppflags -D_FILE_OFFSET_BITS=64
#include <stdlib.h>
EOF
check_cxx -D_LARGEFILE_SOURCE <<EOF && add_cxxppflags -D_LARGEFILE_SOURCE
#include <stdlib.h>
EOF

check_host_cflags -std=c99
check_host_cflags -Wall

check_64bit(){
    arch32=$1
    arch64=$2
    expr=$3
    check_code cc "" "int test[2*($expr) - 1]" &&
        subarch=$arch64 || subarch=$arch32
}

case "$arch" in
    aarch64|alpha|ia64)
        spic=$shared
    ;;
    mips)
        check_64bit mips mips64 '_MIPS_SIM > 1'
        spic=$shared
    ;;
    parisc)
        check_64bit parisc parisc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
    ppc)
        check_64bit ppc ppc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
    sparc)
        check_64bit sparc sparc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
    x86)
        check_64bit x86_32 x86_64 'sizeof(void *) > 4'
        if test "$subarch" = "x86_64"; then
            spic=$shared
        fi
    ;;
    ppc)
        check_cc <<EOF && subarch="ppc64"
        int test[(int)sizeof(char*) - 7];
EOF
    ;;
esac

enable $subarch
enabled spic && enable pic

# OS specific
case $target_os in
    haiku)
        prefix_default="/boot/common"
        network_extralibs="-lnetwork"
        host_libs=
        ;;
    sunos)
        FFSERVERLDFLAGS=""
        SHFLAGS='-shared -Wl,-h,$$(@F)'
        enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
        network_extralibs="-lsocket -lnsl"
        add_cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
        # When using suncc to build, the Solaris linker will mark
        # an executable with each instruction set encountered by
        # the Solaris assembler.  As our libraries contain their own
        # guards for processor-specific code, instead suppress
        # generation of the HWCAPS ELF section on Solaris x86 only.
        enabled_all suncc x86 && echo "hwcap_1 = OVERRIDE;" > mapfile && add_ldflags -Wl,-M,mapfile
        add_cxxppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
        nm_default='nm -P -g'
        ;;
    netbsd)
        disable symver
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
        enabled gcc || check_ldflags -Wl,-zmuldefs
        add_cppflags -D_XOPEN_SOURCE=600
        add_cxxppflags -D_XOPEN_SOURCE=600
        ;;
    openbsd|bitrig)
        disable symver
        SHFLAGS='-shared'
        SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
        SLIB_INSTALL_LINKS=
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
        ;;
    dragonfly)
        disable symver
        ;;
    freebsd)
        append CCONFIG "freebsd"
        # Workaround compile errors from missing u_int/uint def
        CPPFLAGS=`echo $CPPFLAGS | sed 's/-D_POSIX_C_SOURCE=200112//'`
        disable ivtv
        enable backend
        ;;
    bsd/os)
        add_extralibs -lpoll -lgnugetopt
        strip="strip -d"
        ;;
    darwin)
        enable  appleremote
        enable  backend
        enable  darwin
        disable dvb
        disable v4l1
        disable v4l2
        disable x11
        # Workaround compile errors from missing u_int/uint def
        CFLAGS=`echo $CFLAGS | sed 's/-D_POSIX_C_SOURCE=200112//'`
        CPPFLAGS=`echo $CPPFLAGS | sed 's/-D_POSIX_C_SOURCE=200112//'`
        # Workaround compile errors from missing ru_maxrss
        add_cppflags -D_DARWIN_C_SOURCE

        ###### Standard ffmpeg configure stuff follows:
        gas="gas-preprocessor.pl $cc"
        enabled ppc && add_asflags -force_cpusubtype_ALL

        #Need to add @rpath in front of install name so test unit can use non-installed lib
        SHFLAGS='-headerpad_max_install_names -dynamiclib -Wl,-single_module -Wl,-install_name,@rpath/$(SLIBNAME),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
        enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
        strip="${strip} -x"
        add_ldflags -Wl,-dynamic,-search_paths_first
        SLIBSUF=".dylib"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
        FFSERVERLDFLAGS=-Wl,-bind_at_load
        objformat="macho"
        enabled x86_64 && objformat="macho64"
        enabled_any pic shared ||
            { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
        ;;
    mingw32*)
        enable  backend
        disable bindings_perl
        disable bindings_python
        disable bindings_php
        disable dv1394
        disable dvb
        disable ceton
        enable  memalign_hack
        disable mythtranscode
        disable network
        enable opengl
        if enabled wince; then
            disable protocols
        fi
        disable symver
        disable v4l1
        disable v4l2
        enable  windows
        disable x11
        disable qtdbus
        disable libuuid
        disable ffserver
        ###### Standard ffmpeg configure stuff follows:
        if test $target_os = "mingw32ce"; then
            disable network
        else
            target_os=mingw32
        fi
        LIBTARGET=i386
        if enabled x86_64; then
            LIBTARGET="i386:x86-64"
        elif enabled arm; then
            LIBTARGET=arm-wince
        fi
        shlibdir_default="$bindir_default"
        SLIBPREF="libmyth"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(NAME)-$(LIBMAJOR)$(SLIBSUF)'
        SLIB_EXTRA_CMD='-lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib)'
        SLIB_INSTALL_EXTRA_CMD='-install -m 644 $(SUBDIR)$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib) "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"; \
            install -m 644 $(SUBDIR)$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib) "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib)"; \
            install -d "$(LIBDIR)"; \
            install -m 644 $(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) "$(LIBDIR)/lib$(SLIBNAME:$(SLIBSUF)=.dll.a)"'
        SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"'
        SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.orig.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
        objformat="win32"
        ranlib=:
        enable dos_paths
        add_extralibs -lws2_32
        # Workaround compile errors due -std=c++98 incompatible system headers
        ECXXFLAGS=`echo $ECXXFLAGS | sed 's/-std=c++98//'`
        ;;
    win32|win64)
        if enabled shared; then
            # Link to the import library instead of the normal static library
            # for shared libs.
            LD_LIB='%.lib'
            # Cannot build shared and static libraries at the same time with
            # MSVC.
            disable static
        fi
        shlibdir_default="$bindir_default"
        SLIBPREF="libmyth"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
        SLIB_CREATE_DEF_CMD='makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
        SLIB_INSTALL_LINKS=
        SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
        SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
        SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
        objformat="win32"
        ranlib=:
        enable dos_paths
        ;;
    cygwin*)
        enable cygwin
        enable windows
        target_os=cygwin
        shlibdir_default="$bindir_default"
        SLIBPREF="cygmyth"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
        SLIB_INSTALL_LINKS=
        SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
        SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
        objformat="win32"
        enable dos_paths
        ;;
    *-dos|freedos|opendos)
        disable ffplay ffserver
        disable $INDEV_LIST $OUTDEV_LIST
        network_extralibs="-lsocket"
        objformat="coff"
        enable dos_paths
        add_cppflags -U__STRICT_ANSI__
        ;;
    linux)
        enable dv1394
        append CCONFIG "linux"
        enable backend
        ! disabled joystick_menu && enable joystick_menu
        enable libudev
        enable libuuid
        ;;
    irix*)
        target_os=irix
        ranlib="echo ignoring ranlib"
        ;;
    os/2*)
        strip="lxlite -CS"
        ln_s="cp -f"
        objformat="aout"
        add_cppflags -D_GNU_SOURCE
        add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
        FFSERVERLDFLAGS=""
        LIBSUF="_s.a"
        SLIBPREF="myth"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
            echo PROTMODE >> $(SUBDIR)$(NAME).def; \
            echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
            echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
            echo EXPORTS >> $(SUBDIR)$(NAME).def; \
            emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
            emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
        SLIB_INSTALL_EXTRA_CMD='install -m 644 $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib "$(LIBDIR)"'
        SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.a "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.lib'
        enable dos_paths
        enable_weak os2threads
        ;;
    gnu/kfreebsd)
        add_cppflags -D_BSD_SOURCE
        ;;
    gnu)
        ;;
    qnx)
        add_cppflags -D_QNX_SOURCE
        network_extralibs="-lsocket"
        ;;
    symbian)
        SLIBSUF=".dll"
        enable dos_paths
        add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
        add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
        add_ldflags -Wl,--target1-abs,--no-undefined \
                    -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
                    -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
        add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
                      -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
                      -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
        ;;
    osf1)
        add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
        FFSERVERLDFLAGS=
        ;;
    minix)
        ;;
    plan9)
        add_cppflags -D_C99_SNPRINTF_EXTENSION  \
                     -D_REENTRANT_SOURCE        \
                     -D_RESEARCH_SOURCE         \
                     -DFD_SETSIZE=96            \
                     -DHAVE_SOCK_OPTS
        add_compat strtod.o strtod=avpriv_strtod
        network_extralibs='-lbsd'
        exeobjs=compat/plan9/main.o
        disable ffserver
        cp_f='cp'
        ;;
    none)
        ;;
    *)
        die "Unknown OS '$target_os'."
        ;;
esac

# determine libc flavour

# uclibc defines __GLIBC__, so it needs to be checked before glibc.
if check_cpp_condition features.h "defined __UCLIBC__"; then
    libc_type=uclibc
    add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
elif check_cpp_condition features.h "defined __GLIBC__"; then
    libc_type=glibc
    add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
# MinGW headers can be installed on Cygwin, so check for newlib first.
elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
    libc_type=newlib
    add_cppflags -U__STRICT_ANSI__
elif check_header _mingw.h; then
    libc_type=mingw
    check_cpp_condition _mingw.h \
        "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) || \
            (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
        die "ERROR: MinGW runtime version must be >= 3.15."
    add_cppflags -U__STRICT_ANSI__
    if check_cpp_condition _mingw.h "defined(__MINGW64_VERSION_MAJOR) && \
            __MINGW64_VERSION_MAJOR < 3"; then
        add_compat msvcrt/snprintf.o
        add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
    fi
elif check_func_headers stdlib.h _get_doserrno; then
    libc_type=msvcrt
    add_compat strtod.o strtod=avpriv_strtod
    add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
                                 _snprintf=avpriv_snprintf  \
                                 vsnprintf=avpriv_vsnprintf
elif check_cpp_condition stddef.h "defined __KLIBC__"; then
    libc_type=klibc
fi

test -n "$libc_type" && enable $libc_type

# hacks for compiler/libc/os combinations

if enabled_all tms470 glibc; then
    CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
    add_cppflags -D__USER_LABEL_PREFIX__=
    add_cppflags -D__builtin_memset=memset
    add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED
    add_cflags   -pds=48    # incompatible redefinition of macro
fi

if enabled_all ccc glibc; then
    add_ldflags -Wl,-z,now  # calls to libots crash without this
fi

esc(){
    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
}

echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" >config.fate

check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic

set_default $PATHS_LIST
set_default nm

set_default $MYTHTV_PATHS_LIST
append CONFIG_INCLUDEPATH $sysinclude "${sysroot}${prefix}"

append CCONFIG "$compile_type"
if test x$compile_type = x"profile" ; then
    add_cflags   -DNDEBUG
    add_cxxflags -DNDEBUG
    enable debug
    disable stripping
    enable profiletype
elif test x$compile_type = x"debug"; then
    enable debug
    disable optimizations stripping
    enable debugtype
fi

enabled silent_cc && append CCONFIG "silent"

# we need to build at least one lib type
if ! enabled_any static shared; then
    cat <<EOF
At least one library type must be built.
Specify --enable-static to build the static libraries or --enable-shared to
build the shared libraries as well. To only build the shared libraries specify
--disable-static in addition to --enable-shared.
EOF
    exit 1;
fi

disabled static && LIBNAME=""

die_license_disabled() {
    enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
}

die_license_disabled_gpl() {
    enabled $1 || { enabled $2 && die "$2 is incompatible with the gpl and --enable-$1 is not specified."; }
}

#die_license_disabled gpl libcdio
#die_license_disabled gpl libutvideo
die_license_disabled gpl libx264
die_license_disabled gpl libxavs
die_license_disabled gpl libxvid
die_license_disabled gpl x11grab

die_license_disabled nonfree libaacplus
die_license_disabled nonfree libfaac
#enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
#enabled gpl && die_license_disabled_gpl nonfree openssl

die_license_disabled version3 libopencore_amrnb
die_license_disabled version3 libopencore_amrwb
die_license_disabled version3 libvo_aacenc
die_license_disabled version3 libvo_amrwbenc

enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }

disabled optimizations || check_cflags -fomit-frame-pointer
disabled optimizations || check_cxxflags -fomit-frame-pointer

enable_pic() {
    enable pic
    add_cppflags -DPIC
    add_cxxppflags -DPIC
    add_cflags   -fPIC
    add_cxxflags -fPIC
    add_asflags  -fPIC
}

is_qmake5(){
    $1 --version 2>&1 | egrep -q -e "Qt version 5\.[0-9]\.[0-9]"
}

is_qmake4(){
    $1 --version 2>&1 | egrep -q -e "Qt version 4\.[8-9]\.[0-9]"
}

if is_qmake5 $qmake || is_qmake5 qmake-qt5; then
    if is_qmake5 qmake-qt5; then
        qmake=qmake-qt5
    fi
    check_cxxflags -DQT_DISABLE_DEPRECATED_BEFORE
elif is_qmake4 $qmake || is_qmake4 qmake-qt4; then
    if is_qmake4 qmake-qt4; then
        qmake=qmake-qt4
    fi
else
    die "qmake for Qt4.8 or newer not found.\nPlease specify the correct qmake with --qmake="
fi

if test x"$qmakespecs" != x; then
    qmakeconf="$qmake -spec $qmakespecs"
else
    qmakeconf="$qmake"
fi

enabled pic && enable_pic

check_cc <<EOF || die "Symbol mangling check failed."
int ff_extern;
EOF
sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
extern_prefix=${sym%%ff_extern*}

check_cc <<EOF && enable_weak inline_asm
void foo(void) { __asm__ volatile ("" ::); }
EOF

_restrict=
for restrict_keyword in restrict __restrict__ __restrict; do
    check_cxx <<EOF && _restrict=$restrict_keyword && break
void foo(char * $restrict_keyword p);
EOF
done

check_cc <<EOF && enable attribute_packed
struct { int x; } __attribute__((packed)) x;
EOF

check_cc <<EOF && enable attribute_may_alias
union { int x; } __attribute__((may_alias)) x;
EOF

check_cc <<EOF || die "endian test failed"
unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian

if enabled alpha; then

    check_cflags -mieee

elif enabled arm; then

    check_cpp_condition stddef.h "defined __thumb__" && check_cc <<EOF && enable_weak thumb
float func(float a, float b){ return a+b; }
EOF

    enabled thumb && check_cflags -mthumb || check_cflags -marm
    nogas=die

    if     check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
        enable vfp_args
    elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
        case "${cross_prefix:-$cc}" in
            *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
            *) check_ld "cc" <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
__asm__ (".eabi_attribute 28, 1");
int main(void) { return 0; }
EOF
        esac
        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
    fi

    enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
    enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
    enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
    enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'

    [ $target_os = linux ] ||
        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
            $ARCH_EXT_LIST_ARM

    check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
    check_inline_asm asm_mod_y '"vmul.i32 d0, d0, %y0" :: "x"(0)'

    enabled_all armv6t2 shared !pic && enable_pic

elif enabled mips; then

    check_inline_asm loongson '"dmult.g $1, $2, $3"'
    enabled mips32r2  && add_cflags "-mips32r2" && add_asflags "-mips32r2" &&
     check_inline_asm mips32r2  '"rotr $t0, $t1, 1"'
    enabled mipsdspr1 && add_cflags "-mdsp" && add_asflags "-mdsp" &&
     check_inline_asm mipsdspr1 '"addu.qb $t0, $t1, $t2"'
    enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
     check_inline_asm mipsdspr2 '"absq_s.qb $t0, $t1"'
    enabled mipsfpu   && add_cflags "-mhard-float" && add_asflags "-mhard-float" &&
     check_inline_asm mipsfpu   '"madd.d $f0, $f2, $f4, $f6"'

elif enabled parisc; then

    if enabled gcc; then
        case $($cc -dumpversion) in
            4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
        esac
    fi

elif enabled ppc; then

    enable local_aligned_8 local_aligned_16

    check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
    check_inline_asm ibm_asm   '"add 0, 0, 0"'
    check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
    check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'

    # AltiVec flags: The FSF version of GCC differs from the Apple version
    if enabled altivec; then
        nogas=warn
        check_cflags -maltivec -mabi=altivec &&
        { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
        check_cflags -faltivec
        check_cxxflags -maltivec -mabi=altivec &&
        { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
        check_cxxflags -faltivec

        # check if our compiler supports Motorola AltiVec C API
        check_cc <<EOF || disable altivec
$inc_altivec_h
int main(void) {
    vector signed int v1 = (vector signed int) { 0 };
    vector signed int v2 = (vector signed int) { 1 };
    v1 = vec_add(v1, v2);
    return 0;
}
EOF

        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
    fi

elif enabled sparc; then

    enabled vis && check_inline_asm vis '"pdist %f0, %f0, %f0"'

elif enabled x86; then

    check_builtin rdtsc    intrin.h   "__rdtsc()"
    check_builtin mm_empty mmintrin.h "_mm_empty()"

    enable local_aligned_8 local_aligned_16

    # check whether EBP is available on x86
    # As 'i' is stored on the stack, this program will crash
    # if the base pointer is used to access it because the
    # base pointer is cleared in the inline assembly code.
    check_exec_crash <<EOF && enable ebp_available
volatile int i=0;
__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
return i;
EOF

    # check whether EBX is available on x86
    check_inline_asm ebx_available '""::"b"(0)' &&
        check_inline_asm ebx_available '"":::"%ebx"'

    # check whether xmm clobbers are supported
    check_inline_asm xmm_clobbers '"":::"%xmm0"'

    # check whether binutils is new enough to compile SSSE3/MMXEXT
    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'

    if ! disabled_any asm mmx yasm; then
        if check_cmd $yasmexe --version; then
            enabled x86_64 && yasm_extra="-m amd64"
            yasm_debug="-g dwarf2"
        elif check_cmd nasm -v; then
            yasmexe=nasm
            yasm_debug="-g -F dwarf"
            enabled x86_64 && test "$objformat" = elf && objformat=elf64
        fi

        YASMFLAGS="-f $objformat $yasm_extra"
        enabled pic               && append YASMFLAGS "-DPIC"
        test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
        case "$objformat" in
            elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
        esac

        check_yasm "pextrd [eax], xmm0, 1" && enable yasm ||
            die "yasm not found, use --disable-yasm for a crippled build"
        check_yasm "vextractf128 xmm0, ymm0, 0"      || disable avx_external
        check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
        check_yasm "CPU amdnop" && enable cpunop
    fi

    case "$cpu" in
        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
            disable fast_clz
        ;;
    esac

fi

if enabled asm; then
    as=${gas:=$as}
    check_as <<EOF && enable gnu_as || \
        $nogas "GNU assembler not found, install gas-preprocessor"
.macro m n
\n: .int 0
.endm
m x
EOF
fi

check_ldflags -Wl,--as-needed

if check_func dlopen; then
    ldl=
elif check_func dlopen -ldl; then
    ldl=-ldl
fi

if ! disabled network; then
    check_type "sys/types.h sys/socket.h" socklen_t
    check_type netdb.h "struct addrinfo"
    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
    check_type netinet/in.h "struct sockaddr_in6"
    check_type poll.h "struct pollfd"
    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
    check_type netinet/sctp.h "struct sctp_event_subscribe"
    check_func getaddrinfo $network_extralibs
    check_func getservbyport $network_extralibs
    # Prefer arpa/inet.h over winsock2
    if check_header arpa/inet.h ; then
        check_func closesocket
    elif check_header winsock2.h ; then
        check_func_headers winsock2.h closesocket -lws2 &&
            network_extralibs="-lws2" ||
        { check_func_headers winsock2.h closesocket -lws2_32 &&
            network_extralibs="-lws2_32"; }
        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
        check_type ws2tcpip.h socklen_t
        check_type ws2tcpip.h "struct addrinfo"
        check_type ws2tcpip.h "struct group_source_req"
        check_type ws2tcpip.h "struct ip_mreq_source"
        check_type ws2tcpip.h "struct ipv6_mreq"
        check_type winsock2.h "struct pollfd"
        check_type ws2tcpip.h "struct sockaddr_in6"
        check_type ws2tcpip.h "struct sockaddr_storage"
        check_struct winsock2.h "struct sockaddr" sa_len
    else
        disable network
    fi
fi

# "CPU_CLIP" test for SRC / libsamplerate
# test positive wrap
check_exec -lm << EOF && enable cpu_clips_positive
    #define _ISOC9X_SOURCE  1
    #define _ISOC99_SOURCE  1
    #define __USE_ISOC99    1
    #define __USE_ISOC9X    1
    #include <math.h>
    int main (void)
    {	double	fval ;
        int k, ival ;

        fval = 1.0 * 0x7FFFFFFF ;
        for (k = 0 ; k < 100 ; k++)
        {
            ival = (lrint (fval)) >> 24 ;
            if (ival != 127)
                return 1 ;

            fval *= 1.2499999 ;
        } ;

        return 0 ;
    }
EOF

# test negative wrap
check_exec -lm << EOF && enable cpu_clips_negative
    #define	_ISOC9X_SOURCE	1
    #define _ISOC99_SOURCE  1
    #define __USE_ISOC99    1
    #define __USE_ISOC9X    1
    #include <math.h>
    int main (void)
    {
        double	fval ;
        int k, ival ;

        fval = -8.0 * 0x10000000 ;
        for (k = 0 ; k < 100 ; k++)
        {
            ival = (lrint (fval)) >> 24 ;
            if (ival != -128)
                return 1 ;

            fval *= 1.2499999 ;
        } ;

        return 0 ;
    }
EOF

# test for distcc
enabled distcc && check_cmd distcc --version || disable distcc
if enabled distcc; then
    XYZ=`which $cc`
    if test x"$XYZ" != x"" -a x"`ls -l $XYZ | grep distcc`" != x""; then
        distcc="symlink"
        distcc_txt=" $cc"
    fi
fi

# test for ccache
enabled ccache && check_cmd ccache -V || disable ccache
if enabled ccache; then
    XYZ=`which $cc`
    if test x"$XYZ" != x"" -a x"`ls -l $XYZ | grep ccache`" != x""; then
        ccache="symlink"
        ccache_txt=" $cc"
    fi
fi

# ccache should be used before distcc for better cache coherency
if enabled distcc; then
    if disabled ccache; then
        cc="distcc $cc"
        cxx="distcc $cxx"
    elif enabled ccache; then
        cc="ccache distcc $cc"
        cxx="ccache distcc $cxx"
    else
        disable distcc
        distcc_txt="t using distcc explicitly, since ccache symlink is present"
    fi
else
    if enabled ccache; then
        cc="ccache $cc"
        cxx="ccache $cxx"
    fi
fi

# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }

check_func  access
check_func  clock_gettime || { check_func clock_gettime -lrt && add_extralibs -lrt; }
check_func  fcntl
check_func  fork
check_func  gethrtime
check_func  getopt
check_func  getrusage
check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
check_func  gettimeofday
check_func  inet_aton $network_extralibs
check_func  isatty
check_func  localtime_r
check_func  ${malloc_prefix}memalign            && enable memalign
check_func  mkstemp
check_func  mmap
check_func  mprotect
check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
check_func  setrlimit
check_func  strerror_r
check_func  sched_getaffinity
check_func  sysconf
check_func  sysctl
check_func  usleep
check_func_headers conio.h kbhit
check_func_headers windows.h PeekNamedPipe
check_func_headers io.h setmode
check_func_headers lzo/lzo1x.h lzo1x_999_compress
check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
check_func_headers windows.h GetProcessAffinityMask
check_func_headers windows.h GetProcessTimes
check_func_headers windows.h GetSystemTimeAsFileTime
check_func_headers windows.h MapViewOfFile
check_func_headers windows.h SetConsoleTextAttribute
check_func_headers windows.h Sleep
check_func_headers windows.h VirtualAlloc
check_func_headers glob.h glob

check_header direct.h
check_header dlfcn.h
check_header dxva.h
check_header dxva2api.h -D_WIN32_WINNT=0x0600
check_header io.h
check_header libcrystalhd/libcrystalhd_if.h
check_header malloc.h
check_header poll.h
check_header sys/mman.h
check_header sys/param.h
check_header sys/resource.h
check_header sys/select.h
check_header sys/time.h
check_header termios.h
check_header unistd.h
check_header vdpau/vdpau.h
check_header vdpau/vdpau_x11.h
check_header VideoDecodeAcceleration/VDADecoder.h
check_header windows.h
#check_header X11/extensions/XvMClib.h
check_header asm/types.h

disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib

#Myth check for MYTHTV_HAVE_LIST
check_header byteswap.h
check_header sys/endian.h
check_header va/va.h
check_header va/va_x11.h
check_header va/va_glx.h
check_struct dxva2api.h DXVA_PictureParameters wDecodedPictureIndex
check_func posix_fadvise
check_func_headers sys/timeb.h ftime
check_func_headers "sys/types.h sys/socket.h ifaddrs.h" getifaddrs
check_func_headers sys/time.h gettimeofday

# check for VDA header
if ! disabled vda && ! enabled ppc; then
    check_header VideoDecodeAcceleration/VDADecoder.h && enable vda
fi

#End MythTV check

if ! disabled w32threads && ! enabled pthreads; then
    check_func_headers "windows.h process.h" _beginthreadex && enable w32threads
fi

enabled ffmpeg_pthreads && enable pthreads

# check for some common methods of building with pthread support
# do this before the optional library checks as some of them require pthreads
if ! disabled pthreads && ! enabled w32threads; then
    enable pthreads
    if check_func pthread_create; then
        :
    elif check_func pthread_create -pthread; then
        add_cflags -pthread
        add_cxxflags -pthread
        add_extralibs -pthread
    elif check_func pthread_create -pthreads; then
        add_cflags -pthreads
        add_cxxflags -pthreads
        add_extralibs -pthreads
    elif check_func pthread_create -lpthreadGC2; then
        add_extralibs -lpthreadGC2
    elif ! check_lib pthread.h pthread_create -lpthread; then
        disable pthreads ffmpeg_pthreads
    fi
fi

for thread in $THREADS_LIST; do
    if enabled $thread; then
        test -n "$thread_type" &&
            die "ERROR: Only one thread type must be selected." ||
            thread_type="$thread"
    fi
done

if enabled pthreads; then
  check_func pthread_cancel
fi

# Check for libuuid for zeromq
if enabled libuuid ; then
  check_lib uuid/uuid.h uuid_generate -luuid || disable libuuid
  if disabled libuuid ; then
    die "ERROR: can not find libuuid. (debian uuid-dev; RedHat libuuid-devel)"
  fi
fi

# Check for taglib for libmythmetadata
if enabled taglib; then
    taglib_minor="0"
    if test x`which taglib-config` != x"" ; then
        taglib_minor=`taglib-config --version | cut -d. -f2`
        if test x"$taglib_minor" = x"" ; then
            echo "Can't find taglib-config. Assuming 1.6 or later."
            taglib_minor="6"
        fi
        tagprefix=`taglib-config --prefix`
        tagincludes="-I${tagprefix}/include"
        taglibs=`taglib-config --libs`
    fi

    if test $taglib_minor -lt 6 || ! check_class_headers_cpp taglib/fileref.h TagLib::FileRef $tagincludes $taglibs -lstdc++; then
        die "ERROR: cannot find taglib 1.6 or later."
    fi
fi

# Attempt to use libudev for mediamonitor
enabled libudev && check_lib2 libudev.h udev_new -ludev || disable libudev

check_lib math.h sin -lm && LIBM="-lm"
disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd

atan2f_args=2
ldexpf_args=2
powf_args=2

for func in $MATH_FUNCS; do
    eval check_mathfunc $func \${${func}_args:-1}
done

# these are off by default, so fail if requested and not available
enabled avisynth   && require2 vfw32 "windows.h vfw.h" AVIFileInit -lavifil32
enabled fontconfig && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
enabled frei0r     && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
enabled gnutls     && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
enabled libiec61883 && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
enabled libaacplus && require  "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus
#enabled libass     && require_pkg_config libass ass/ass.h ass_library_init
enabled libbluray  && require libbluray libbluray/bluray.h bd_open -lbluray
enabled libcelt    && require libcelt celt/celt.h celt_decode -lcelt0 &&
                      { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
                        die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
enabled libcaca    && require_pkg_config caca caca.h caca_create_canvas
enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
enabled libfdk_aac && require  libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
enabled libflite   && require2 libflite "flite/flite.h" flite_init $flite_libs
enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
enabled libgsm     && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
                            check_lib "${gsm_hdr}" gsm_create -lgsm && break;
                        done || die "ERROR: libgsm not found"; }
enabled libilbc    && require  libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
enabled libmodplug && require  libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
enabled libmp3lame && require  "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
enabled libnut     && require  libnut libnut.h nut_demuxer_init -lnut
enabled libopencore_amrnb  && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
enabled libopencore_amrwb  && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
enabled libopencv  && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
enabled libopenjpeg && { check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg ||
                         check_lib openjpeg.h opj_version -lopenjpeg ||
                         die "ERROR: libopenjpeg not found"; }
enabled libopus    && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
enabled libsoxr    && require  libsoxr soxr.h soxr_create -lsoxr
enabled libspeex   && require  libspeex speex/speex.h speex_decoder_init -lspeex
enabled libstagefright_h264  && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static
enabled libtheora  && require  libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
enabled libtwolame && require  libtwolame twolame.h twolame_init -ltwolame &&
                      { check_lib twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
                        die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
enabled libutvideo    && require_cpp utvideo "stdint.h stdlib.h utvideo/utvideo.h utvideo/Codec.h" 'CCodec*' -lutvideo -lstdc++
enabled libv4l2    && require_pkg_config libv4l2 libv4l2.h v4l2_ioctl
enabled libvo_aacenc && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
enabled libvorbis  && require  libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
enabled libvpx     && {
    enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
                                die "ERROR: libvpx decoder version must be >=0.9.1"; }
    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
                                die "ERROR: libvpx encoder version must be >=0.9.7"; }
    enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder;  }
    enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
enabled libx264    && require  libx264 x264.h x264_encoder_encode -lx264 &&
                      { check_cpp_condition x264.h "X264_BUILD >= 118" ||
                        die "ERROR: libx264 must be installed and version must be >= 0.118."; }
enabled libxavs    && require  libxavs xavs.h xavs_encoder_encode -lxavs
enabled libxvid    && require  libxvid xvid.h xvid_global -lxvidcore
enabled openal     && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
                        check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
                        die "ERROR: openal not found"; } &&
                      { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
                        die "ERROR: openal must be installed and version must be 1.1 or compatible"; }
enabled openssl    && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto ||
                        check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
                        check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
                        die "ERROR: openssl not found"; }

if enabled gnutls; then
    { check_lib nettle/bignum.h nettle_mpz_get_str_256 -lnettle -lhogweed -lgmp && enable nettle; } ||
    { check_lib gcrypt.h gcry_mpi_new -lgcrypt && enable gcrypt; }
fi

if enabled libmpeg2external; then
    check_lib mpeg2dec/mpeg2.h mpeg2_init -lmpeg2 || disable libmpeg2external
    if disabled libmpeg2external; then
        die "Warning! No suitable external libmpeg2 found, use internal copy."
    fi
    disable mythtranscode
fi

# libdc1394 check
if enabled libdc1394; then
    { check_lib dc1394/dc1394.h dc1394_new -ldc1394 -lraw1394 &&
        enable libdc1394_2; } ||
    { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 &&
        enable libdc1394_1; } ||
    die "ERROR: No version of libdc1394 found "
fi

check_header stdint.h

# test for lrint in math.h
check_exec <<EOF && lrint=yes || lrint=no
#define _ISOC9X_SOURCE  1
#include <math.h>
int main( void ) { return (lrint(3.999f) > 0)?0:1; }
EOF

#test for round()
check_exec <<EOF && round=yes || round=no
#define _ISOC9X_SOURCE  1
#include <math.h>
int main( void ) { return (round(3.999f) > 0)?0:1; }
EOF

# test for sync_file_range (linux only system call since 2.6.17)
check_ld "cc" <<EOF #&& enable sync_file_range
#define _GNU_SOURCE
#include <fcntl.h>

int main(int argc, char **argv){
    sync_file_range(0,0,0,0);
    return 0;
}
EOF

# test for sizeof(int)
for sizeof in 1 2 4 8 16; do
    check_cc <<EOF && _sizeof_int=$sizeof && break
void foo(){switch (0) case 0: case (sizeof(int) == $sizeof):;}
EOF
done

# test for sizeof(long)
for sizeof in 1 2 4 8 16; do
  check_cc <<EOF && _sizeof_long=$sizeof && break
void foo(){switch (0) case 0: case (sizeof(long) == $sizeof):;}
EOF
done

check_foo_config freetype2 freetype ft2build.h FT_Init_FreeType

enabled freetype2 ||
    die "ERROR! You must have FreeType installed to compile MythTV."


##########################################
if enabled sdl ; then
    SDL_CONFIG="${cross_prefix}sdl-config"
    if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
        check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
        enable sdl &&
        check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
    else
      if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
        sdl_cflags=$("${SDL_CONFIG}" --cflags)
        sdl_libs=$("${SDL_CONFIG}" --libs)
        check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
        check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
        enable sdl &&
        check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
      fi
    fi
    enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
fi

texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
perl --version > /dev/null 2>&1 && enable perl || disable perl
pod2man --help > /dev/null 2>&1 && enable pod2man || disable pod2man
rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout

check_header linux/fb.h
check_header linux/videodev.h
check_header linux/videodev2.h
check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete

check_header sys/videoio.h

check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
# check that WM_CAP_DRIVER_CONNECT is defined to the proper value
# w32api 3.12 had it defined wrong
check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines

check_type "dshow.h" IBaseFilter

# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
{ check_header dev/bktr/ioctl_meteor.h &&
  check_header dev/bktr/ioctl_bt848.h; } ||
{ check_header machine/ioctl_meteor.h &&
  check_header machine/ioctl_bt848.h; } ||
{ check_header dev/video/meteor/ioctl_meteor.h &&
  check_header dev/video/bktr/ioctl_bt848.h; } ||
check_header dev/ic/bt8xx.h

check_header sndio.h
if check_struct sys/soundcard.h audio_buf_info bytes; then
    enable_safe sys/soundcard.h
else
    check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_safe sys/soundcard.h
    #include <sys/soundcard.h>
    audio_buf_info abc;
EOF
fi
check_header soundcard.h

enabled_any alsa_indev alsa_outdev && check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound

enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait &&
    check_func jack_port_get_latency_range -ljack

enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio

# PulseAudio probe
! disabled audio_pulse &&
    check_lib pulse/version.h pa_get_library_version -lpulse &&
    $(pkg-config --atleast-version=0.9.7 libpulse) &&
    enable  audio_pulse ||
    disable audio_pulse

# Enable Pulse Audio output iff not disabled and pulse audio is available
if ! enabled audio_pulse ; then
    disable audio_pulseoutput
elif ! disabled audio_pulseoutput ; then
    enable audio_pulseoutput
fi

# ALSA probe
! disabled audio_alsa &&
    check_lib alsa/asoundlib.h snd_asoundlib_version -lasound &&
    check_cpp_condition alsa/asoundlib.h "(defined(SND_PCM_NO_AUTO_RESAMPLE))" &&
    enable  audio_alsa ||
    { { ! enabled audio_alsa || die "ERROR: Alsa >= 1.0.16 required"; } &&
    disable audio_alsa; }

if enabled libcdio; then
    check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio || check_lib2 "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio
fi

# JACK probe
! disabled audio_jack &&
    check_lib jack/jack.h jack_client_new -ljack &&
    enable  audio_jack ||
    disable audio_jack

if enabled dxva2; then
    enabled dxva2api_h && enabled windows || disable dxva2
else
    disable dxva2
fi

enabled x11grab                                           &&
require X11 X11/Xlib.h XOpenDisplay -lX11                 &&
require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes

enabled vaapi &&
    check_lib va/va.h vaInitialize -lva ||
    disable vaapi

enabled vdpau &&
    check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
    disable vdpau

# Funny iconv installations are not unusual, so check it after all flags have been set
disabled iconv || check_func_headers iconv.h iconv || check_lib2 iconv.h iconv -liconv || disable iconv

enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
enabled debug && add_cxxflags -g"$debuglevel"

# add some useful compiler flags if supported
#check_cflags -Wdeclaration-after-statement
check_cflags -Wall
check_cflags -Wno-parentheses
disabled icc && check_cflags -Wno-switch
check_cflags -Wno-format-zero-length
! disabled optimizations && check_cflags -Wdisabled-optimization
check_cflags -Wpointer-arith
disabled icc && check_cflags -Wredundant-decls
check_cflags -Wno-pointer-sign
check_cflags -Wwrite-strings
check_cflags -Wtype-limits
check_cflags -Wundef
#-Wmissing-prototypes breaks zeromq compilation in universal mode
if [ "$target_os" != "darwin" ]; then
    check_cflags -Wmissing-prototypes
fi
check_cflags -Wno-pointer-to-int-cast
check_cflags -Wstrict-prototypes
enabled extra_warnings && check_cflags -Winline

# C++ Flags
check_cxxflags -Wall
check_cxxflags -Wpointer-arith
#needed for INT64_C in libs/libavformat under g++
check_cxxflags -D__STDC_CONSTANT_MACROS
check_cxxflags -D__STDC_LIMIT_MACROS

# add some linker flags
check_ldflags -Wl,--warn-common
check_ldflags '-Wl,-rpath-link,\${SRC_PATH_BARE}/external/FFmpeg/libpostproc:\${SRC_PATH_BARE}/external/FFmpeg/libswresample:\${SRC_PATH_BARE}/external/FFmpeg/libswscale:\${SRC_PATH_BARE}/external/FFmpeg/libavfilter:\${SRC_PATH_BARE}/external/FFmpeg/libavdevice:\${SRC_PATH_BARE}/external/FFmpeg/libavformat:\${SRC_PATH_BARE}/external/FFmpeg/libavcodec:\${SRC_PATH_BARE}/external/FFmpeg/libavutil:\${SRC_PATH_BARE}/external/FFmpeg/libavresample'
test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic

enabled xmm_clobber_test &&
    check_ldflags -Wl,--wrap,avcodec_open2              \
                  -Wl,--wrap,avcodec_decode_audio4      \
                  -Wl,--wrap,avcodec_decode_video2      \
                  -Wl,--wrap,avcodec_decode_subtitle2   \
                  -Wl,--wrap,avcodec_encode_audio2      \
                  -Wl,--wrap,avcodec_encode_video       \
                  -Wl,--wrap,avcodec_encode_subtitle    \
                  -Wl,--wrap,sws_scale ||
    disable xmm_clobber_test

echo "X{};" > $TMPV
if test_ldflags -Wl,--version-script,$TMPV; then
    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
    check_cc <<EOF && enable symver_asm_label
void ff_foo(void) __asm__ ("av_foo@VERSION");
void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
EOF
    check_cc <<EOF && enable symver_gnu_asm
__asm__(".symver ff_foo,av_foo@VERSION");
void ff_foo(void) {}
EOF
fi

if [ -z "$optflags" ]; then
    if enabled small; then
        optflags=$cflags_size
    elif enabled optimizations; then
        optflags=$cflags_speed
    else
        optflags=$cflags_noopt
    fi
fi

check_optflags(){
    check_cflags "$@"
    enabled lto && check_ldflags "$@"
}


if enabled lto; then
    test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker"
    check_cflags  -flto
    check_ldflags -flto $cpuflags
fi

check_optflags $optflags
check_optflags -fno-math-errno
check_optflags -fno-signed-zeros

enabled ftrapv && check_cflags -ftrapv

if enabled dvb; then
    if test -f "$dvb_path"/linux/dvb/frontend.h ; then
        if test -f "$dvb_path"/../MAINTAINERS ; then
            echo "Warning: DVB location in kernel. May not compile."
        fi
    else
        KERNEL_RELEASE=`uname -r 2>/dev/null`
        if test x"$KERNEL_RELEASE" != x"" ; then
            dvb_path="${sysroot}/usr/src/linux-$KERNEL_RELEASE/include"
        else
            dvb_path="${sysroot}/usr/src/linux/include"
        fi

        if test -f "$dvb_path"/linux/dvb/frontend.h ; then
            if test -f "$dvb_path"/../MAINTAINERS ; then
                echo "Warning: DVB location in kernel. May not compile."
            fi
        else
            echo "DVB location needs to have linux/dvb/frontend.h [$dvb_path]"
            disable dvb
        fi
    fi
fi


enabled dvb && check_cc -I"$dvb_path" <<EOF && enable fe_can_2g_modulation
#include <linux/dvb/frontend.h>
int main(void) {
    if (FE_CAN_2G_MODULATION != 0x10000000)
        return 1;
    return 0;
}
EOF

enabled asi && check_cc <<EOF || disable asi
#include <dveo/asi.h>
#include <dveo/master.h>
int main(void) { return 1; }
EOF

# Check that all MythTV build "requirements" are met:
enabled lamemp3 && check_lib2 lame/lame.h lame_init -lmp3lame -lm ||
    die "ERROR! You must have the Lame MP3 encoding library installed to compile MythTV."

# Qt dependency checks
if test $target_os = mingw32 ; then
    qt_inc="-I`cd $(${qmake} -query QT_INSTALL_HEADERS); pwd`"
    qt_libs="-L`cd $(${qmake} -query QT_INSTALL_LIBS) ; pwd`"
else
    qt_inc="-I${sysroot}/$(${qmake} -query QT_INSTALL_HEADERS)"
    qt_libs="-L${sysroot}/$(${qmake} -query QT_INSTALL_LIBS)"
fi

if $(pkg-config --exists QtWebKit) ; then
    enable qtwebkit
else
    check_ecxx ${qt_inc} ${qt_inc}/QtCore <<EOF && enable qtwebkit
#include <QtWebKit/QtWebKit>
int main(void){ return 0; }
EOF
fi

enabled qtwebkit || die "Error! QtWebkit headers not found"

if $(pkg-config --exists QtScript) ; then
    enable qtscript
else
    check_ecxx ${qt_inc} <<EOF && enable qtscript
#include <QtScript/QtScript>
int main(void){ return 0; }
EOF
fi

enabled qtscript || die "Error! QtScript headers not found"

# Check if Qt was built with DBus support:
if ! disabled qtdbus; then
    if $(pkg-config --exists QtDBus) ; then
        enable qtdbus
    else
        check_ecxx ${qt_inc} <<EOF && enable qtdbus
#include <QtDBus/QtDBus>
#include <QtDBus/QDBusInterface>
int main(void)
{
    QDBusInterface test("org.kde.test", "/test", "org.kde.blah");
    return 0;
}
EOF
    fi
fi

# Disable OpenGL ES support if Qt does not support it
QTGL=$(pkg-config --list-all | grep Qt | grep OpenGL | awk '{print $1}')
if $(pkg-config --variable=qt_config $QTGL | grep -qv opengles2) ; then
    disable opengles
fi

if enabled firewire; then
    fwlibs=""
    check_libx fwlibs libavc1394/avc1394.h avc1394_transaction_block2 -lavc1394 && check_libx fwlibs libiec61883/iec61883.h iec61883_cmp_reconnect -liec61883 || disable firewire

    if test $target_os = darwin; then
        if [ -n "$firewiresdk_path" ] ; then
            mac_avc="$firewiresdk_path"
        else
            # This should pick the newest. e.g. FireWireSDK21 instead of 20
            # Unfortunately, the location keeps changing:
            #/Developer/FireWireSDK20/Examples/AVCVideoServices/Framework
            #/Developer/FireWireSDK21/Examples/Framework
            mac_avc=`find /Developer/FireWireSDK* -name Framework 2> /dev/null \
                    | tail -n 1`
        fi
        if test -d "$mac_avc" ; then
            firewire="yes"
        else
            echo Firewire being disabled. FireWire SDK missing
        fi
    fi
fi

enabled libfftw3 && check_lib2 fftw3.h fftw_init_threads -lfftw3_threads -lfftw3f -lfftw3 ||
    disable libfftw3

# ass_flush_events was added in 0.9.10
enabled libass && check_lib2 ass/ass.h ass_flush_events -lass || disable libass

if enabled libcec ; then
    check_cxx -I"$libcec_path" <<EOF || { disable libcec; }
#include <libcec/cec.h>
#include <iostream>
using namespace std;
using namespace CEC;
#include <libcec/cecloader.h>
int main(void) {
    if (CEC_LIB_VERSION_MAJOR < 1 || (CEC_LIB_VERSION_MAJOR == 1 &&
                                      CEC_LIB_VERSION_MINOR < 5))
        return 0;
    return (long) LibCecInit;
}
EOF
fi

enabled libcrypto && check_lib openssl/rsa.h RSA_new -lcrypto || disable libcrypto

if test $target_os != darwin ; then
    enabled libdns_sd && check_lib dns_sd.h DNSServiceRegister -ldns_sd || disable libdns_sd
fi

if enabled libxml2 ; then
   if pkg-config --exists libxml-2.0 ; then
        libxml2_path=`pkg-config --cflags-only-I libxml-2.0|sed -n "s/-I\([^ ]*\) *$/\1/p"`
   else
        disable libxml2
   fi
fi
enabled libxml2 && check_cc -I"$libxml2_path" <<EOF && add_extralibs "-lxml2" || disable libxml2
#include <libxml/xmlversion.h>
int main(void) {
    if (LIBXML_VERSION > 20600)
        return 1;
    return 0;
}
EOF

if enabled taglib; then
    taglib_include=`taglib-config --prefix`/include/taglib
    taglib_libs=`taglib-config --libs`
fi

enabled libudf && check_cc <<EOF || disable libudf
#include <cdio/udf.h>
int main(void){ return UDF_BLOCKSIZE > 0 ? 0 : 1; }
EOF

enabled x11 && check_lib X11/Xlib.h XQueryExtension -lX11 || disable x11
enabled xrandr && check_lib X11/extensions/Xrandr.h XRRSelectInput -lXrandr || disable xrandr
enabled xv && check_lib X11/extensions/Xv.h XvPutStill -lXv || disable xv

if enabled x11; then
    require libXxf86vm X11/extensions/xf86vmode.h XF86VidModeSetClientVersion -lXxf86vm
    require libXinerama X11/extensions/Xinerama.h XineramaQueryExtension -lXinerama
    require libXext X11/extensions/Xext.h XMissingExtension -lXext
fi

if enabled x11; then
    if disabled opengles; then
        # Qt was compiled without OpenGL ES support, so GLES2 isn't usable
        check_libx gl_lib GL/gl.h glBegin -lGL || check_libx gl_lib GL/gl.h glBegin -lopengl32 || disable opengl
    else
        # Qt was compiled with OpenGL ES support, so OpenGL support requires ES
        check_libx gl_lib GLES2/gl2.h glClear -lGLESv2 || disable opengl
    fi
fi

# Quartz video is Mac only and requires Carbon which is 32bit only
enabled quartz_video && test $target_os = darwin && check_cpp_condition QtCore/qglobal.h "!defined(QT_MAC_USE_COCOA)" || disable quartz_video

# CoreVideo in only available on Mac OS 10.4, or on 10.3 with QuickTime 7.
# This checks for it, and some other calls that the module needs
if test $target_os = darwin; then
    cat > $TMPC << EOF
#include <QuartzCore/CVDisplayLink.h>
#include <AGL/agl.h>
int main( void ) { return aglGetCGLContext(0,0L); }
EOF
    if $cc -o $TMPE $TMPC -framework AGL > /dev/null 2>&1; then
        mac_corevideo="yes"
    fi
fi

# Ubuntu Dapper installs NVIDIA GL headers to a weird location in order
# not to overwrite the headers installed from Mesa, etc. We need to
# add that path to include paths if that's the case.
if test -d ${sysroot}/usr/share/doc/nvidia-glx-dev/include; then
    append CONFIG_INCLUDEPATH "${sysroot}/usr/share/doc/nvidia-glx-dev/include"
fi

# Same for Debian Sid.
if test -d ${sysroot}/usr/share/nvidia/include/GL; then
    append CONFIG_INCLUDEPATH "${sysroot}/usr/share/nvidia/include"
fi

if test $target_os = darwin; then
    # So far, only OS X 10.4 has this as a non-private framework
    if test -d /System/Library/Frameworks/DiskArbitration.framework/Headers ; then
        darwin_da="yes"
    fi
fi

if [ -n "$optflags" ]; then
    add_cflags $optflags
elif enabled small; then
    add_cflags $cflags_size
elif enabled optimizations; then
    add_cflags $cflags_speed
else
    add_cflags $cflags_noopt
fi
check_cflags -fno-math-errno
check_cflags -fno-signed-zeros
check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
int x;
EOF


if enabled icc; then
    # Just warnings, no remarks
    check_cflags -w1
    # -wd: Disable following warnings
    # 144, 167, 556: -Wno-pointer-sign
    # 188: enumerated type mixed with another type
    # 1292: attribute "foo" ignored
    # 1419: external declaration in primary source file
    # 10006: ignoring unknown option -fno-signed-zeros
    # 10148: ignoring unknown option -Wno-parentheses
    # 10156: ignoring option '-W'; no argument required
    check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156
    # 11030: Warning unknown option --as-needed
    # 10156: ignoring option '-export'; no argument required
    check_ldflags -wd10156,11030
    # -wd: Disable the following warnings for MythTV
    # 177: function declared but never referenced (triggers on Q_OBJECT)
    # 592: variable is used before its value is set (triggers on (void)x;)
    # 913: ignoring invalid multibyte character sequence,
    #      icpc and g++ do the right thing for char 0x80-0xFF
    # 13200: ignore EMMS instruction required, filters do the right thing
    check_cflags -wd177,592,913,13200
    # -wd: Disable the following warnings for MythTV
    # 10159: ignore invalid argument for option '-m'
    check_ldflags -wd10159
    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
    enable ebp_available
    if enabled x86_32; then
        icc_version=$($cc -dumpversion)
        test ${icc_version%%.*} -ge 11 &&
            check_cflags -falign-stack=maintain-16-byte ||
            disable aligned_stack
    fi
elif enabled ccc; then
    # disable some annoying warnings
    add_cflags -msg_disable bitnotint
    add_cflags -msg_disable mixfuncvoid
    add_cflags -msg_disable nonstandcast
    add_cflags -msg_disable unsupieee
elif enabled gcc; then
    check_optflags -fno-tree-vectorize
    check_cflags -Werror=implicit-function-declaration
#    check_cflags -Werror=missing-prototypes
    check_cflags -Werror=return-type
    check_cflags -Werror=vla
elif enabled llvm_gcc; then
    check_cflags -mllvm -stack-alignment=16
elif enabled clang; then
    check_cflags -mllvm -stack-alignment=16
    check_cflags -Qunused-arguments
    check_cflags -Werror=implicit-function-declaration
#   check_cflags -Werror=missing-prototypes
    check_cflags -Werror=return-type
elif enabled armcc; then
    # 2523: use of inline assembler is deprecated
    add_cflags -W${armcc_opt},--diag_suppress=2523
    add_cflags -W${armcc_opt},--diag_suppress=1207
    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
elif enabled tms470; then
    add_cflags -pds=824 -pds=837
elif enabled pathscale; then
    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
elif enabled msvc; then
    enabled x86_32 && disable aligned_stack
fi

if enabled gxx; then
    if enabled symbol_visibility; then
        if expr "$gxx_version" : '4\.[2-9]' > /dev/null; then
            check_cxxflags -fvisibility-inlines-hidden
            append CCONFIG "use_hidesyms"
        else
            disable symbol_visibility
            warn "--enable-symbol-visibility requires gcc 4.2 or higher"
        fi
    fi
    if expr "$gxx_version" : '4\.[3-9]' > /dev/null; then
        check_cxxflags -Wmissing-declarations
    fi
    check_cxxflags -Wno-switch
    check_cxxflags -Woverloaded-virtual
    check_cxxflags -funit-at-a-time
elif enabled icpc; then
    # 177: function declared but never referenced (triggers on Q_OBJECT)
    # 192: icpc confused by Qt %0-%99 in strings
    # 592: variable is used before its value is set (triggers on (void)x;)
    # 913: ignoring invalid multibyte character sequence,
    #      icpc and g++ do the right thing for char 0x80-0xFF
    # 10181: ignore warning about -fomit-frame-pointer being ignored
    # 13200: ignore EMMS instruction required, RTjpegN.cpp does the right thing
    check_cxxflags -wd177,192,592,913,10181,13200
    check_cxxflags -std=c++11
elif enabled clangxx; then
    # The self assign warning triggers on headers that use x=x;
    # to suppress warnings about unused parameters.
    check_cxxflags -Wno-self-assign
    # The constant-logical-operand only gives use false positives
    # for constant logical operands meant to be optimized away.
    check_cxxflags -Wno-constant-logical-operand
    # Unfortunately clang's unused-value warning is smart enough to notice
    # that ZMQ_ASSERT expressions don't use the values unless it is a debug
    # build. So lets rely on other compilers to report on unused values.
    check_cxxflags -Wno-unused-value
    # clang complains about every unused -I unless you pass it this.
    check_cxxflags -Qunused-arguments
fi

# Check for python dependencies
if enabled bindings_python; then
    check_python               || disable_bindings_python "Python 2.6"
    check_py_lib MySQLdb       || disable_bindings_python "MySQLdb"
    check_py_lib lxml          || disable_bindings_python "lxml"
    check_py_lib urlgrabber    || disable_bindings_python "urlgrabber"
fi

# Check for perl dependencies
# Modules distributed in Perl core
if enabled bindings_perl; then
    check_pl_lib "ExtUtils::MakeMaker" ||
        disable_bindings_perl "ExtUtils::MakeMaker"
    check_pl_lib Config           || disable_bindings_perl Config
    check_pl_lib Exporter         || disable_bindings_perl Exporter
    check_pl_lib Fcntl            || disable_bindings_perl Fcntl
    check_pl_lib "File::Copy"     || disable_bindings_perl "File::Copy"
    check_pl_lib "Sys::Hostname"  || disable_bindings_perl "Sys::Hostname"
# Modules not distributed in Perl core
    check_pl_lib DBI              || disable_bindings_perl DBI
    check_pl_lib "DBD::mysql"     || disable_bindings_perl "DBD::mysql"
    check_pl_lib "HTTP::Request"  || disable_bindings_perl "HTTP::Request"
    check_pl_lib "LWP::UserAgent" || disable_bindings_perl "LWP::UserAgent"
    check_pl_lib "Net::UPnP::QueryResponse" ||
        disable_bindings_perl "Net::UPnP::QueryResponse"
    check_pl_lib "Net::UPnP::ControlPoint"  ||
        disable_bindings_perl "Net::UPnP::ControlPoint"
    check_pl_lib "IO::Socket::INET6"  ||
        disable_bindings_perl "IO::Socket::INET6"
fi

# Check for php dependencies
# are none at this time

case $target_os in
    osf1)
        enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
    ;;
    plan9)
        add_cppflags -Dmain=plan9_main
    ;;
esac

enabled_any $THREADS_LIST      && enable threads

enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }

check_deps $CONFIG_LIST       \
           $CONFIG_EXTRA      \
           $HAVE_LIST         \
           $ALL_COMPONENTS    \
           $MYTHTV_LIST       \
           $MYTHTV_CONFIG_LIST \
           $MYTHTV_HAVE_LIST  \
           $USING_LIST        \


if test $target_os = "haiku"; then
    disable memalign
    disable posix_memalign
fi

! enabled_any memalign posix_memalign aligned_malloc &&
    enabled_any $need_memalign && enable memalign_hack

# add_dep lib dep
# -> enable ${lib}_deps_${dep}
# -> add $dep to ${lib}_deps only once
add_dep() {
    lib=$1
    dep=$2
    enabled "${lib}_deps_${dep}" && return 0
    enable  "${lib}_deps_${dep}"
    prepend "${lib}_deps" $dep
}

# merge deps lib components
# merge all ${component}_deps into ${lib}_deps and ${lib}_deps_*
merge_deps() {
    lib=$1
    shift
    for comp in $*; do
        enabled $comp || continue
        eval "dep=\"\$${comp}_deps\""
        for d in $dep; do
            add_dep $lib $d
        done
    done
}

merge_deps libavfilter $FILTER_LIST

# Myth: we no longer support xvmc
disable mpeg_xvmc_decoder
disable mpeg_xvmc_vld_decoder

if enabled x86 && (disabled mmx && ! enabled disable_mmx_for_debugging); then
    die "ERROR: MMX disabled on x86, MythTV will be very slow.\n\tDisable this check with --enable-disable-mmx-for-debugging"
fi

enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }

echo "# Basic Settings"
echo "Compile type              $compile_type"
echo "Compiler cache            $ccache$ccache_txt"
echo "DistCC                    $distcc$distcc_txt"
echo "qmake                     $(which $qmake)"
echo "install prefix            $prefix"
echo "runtime prefix            $runprefix"
<<BLOCK_QUOTE
echo "source path               $source_path"
echo "C compiler                $cc"
echo "ARCH                      $arch ($cpu)"
BLOCK_QUOTE
if enabled cpu_override && test x"$cpu" != x"generic"; then
    echo "CPU                       $arch $subarch ($cpu)"
elif test x"$processor" != x"" ; then
    echo "CPU                       $arch $subarch ($processor)"
else
    echo "CPU                       $arch $subarch"
fi
<<BLOCK_QUOTE
if test "$build_suffix" != ""; then
    echo "build suffix              $build_suffix"
fi
if test "$extra_version" != ""; then
    echo "version string suffix     $extra_version"
fi
echo "big-endian                ${bigendian-no}"
echo "runtime cpu detection     ${runtime_cpudetect-no}"
BLOCK_QUOTE
if enabled x86; then
    echo "${yasmexe}                      ${yasm-no}"
    echo "MMX enabled               ${mmx-no}"
    echo "MMXEXT enabled            ${mmxext-no}"
    echo "3DNow! enabled            ${amd3dnow-no}"
    echo "3DNow! extended enabled   ${amd3dnowext-no}"
    echo "SSE enabled               ${sse-no}"
    echo "SSSE3 enabled             ${ssse3-no}"
    echo "AVX enabled               ${avx-no}"
    echo "FMA4 enabled              ${fma4-no}"
    echo "CMOV enabled              ${cmov-no}"
<<BLOCK_QUOTE
    echo "CMOV is fast              ${fast_cmov-no}"
    echo "EBX available             ${ebx_available-no}"
    echo "EBP available             ${ebp_available-no}"
    echo "10 operands supported     ${ten_operands-no}"
BLOCK_QUOTE
fi
if enabled arm; then
    echo "ARMv5TE enabled           ${armv5te-no}"
    echo "ARMv6 enabled             ${armv6-no}"
    echo "ARMv6T2 enabled           ${armv6t2-no}"
    echo "VFP enabled               ${vfp-no}"
    echo "NEON enabled              ${neon-no}"
    echo "THUMB enabled             ${thumb-no}"
fi
if enabled mips; then
    echo "MIPS FPU enabled          ${mipsfpu-no}"
    echo "MIPS32R2 enabled          ${mips32r2-no}"
    echo "MIPS DSP R1 enabled       ${mipsdspr1-no}"
    echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
fi
if enabled ppc; then
    echo "AltiVec enabled           ${altivec-no}"
    echo "PPC 4xx optimizations     ${ppc4xx-no}"
    echo "dcbzl available           ${dcbzl-no}"
fi
if enabled sparc; then
    echo "VIS enabled               ${vis-no}"
fi
<<BLOCK_QUOTE
echo "debug symbols             ${debug-no}"
echo "strip symbols             ${stripping-no}"
echo "optimize for size         ${small-no}"
echo "optimizations             ${optimizations-no}"
echo "static                    ${static-no}"
echo "shared                    ${shared-no}"
echo "postprocessing support    ${postproc-no}"
echo "new filter support        ${avfilter-no}"
echo "network support           ${network-no}"
echo "threading support         ${thread_type-no}"
echo "safe bitstream reader     ${safe_bitstream_reader-no}"
echo "SDL support               ${sdl-no}"
echo "texi2html enabled         ${texi2html-no}"
echo "perl enabled              ${perl-no}"
echo "pod2man enabled           ${pod2man-no}"
echo "makeinfo enabled          ${makeinfo-no}"
test -n "$random_seed" &&
    echo "random seed               ${random_seed}"
echo

echo "External libraries:"
print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
echo

for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
    echo "Enabled ${type}s:"
    eval list=\$$(toupper $type)_LIST
    print_enabled '_*' $list | print_3_columns
    echo
done

license="LGPL version 2.1 or later"
if enabled nonfree; then
    license="nonfree and unredistributable"
elif enabled gplv3; then
    license="GPL version 3 or later"
elif enabled lgplv3; then
    license="LGPL version 3 or later"
elif enabled gpl; then
    license="GPL version 2 or later"
fi

echo "License: $license"
BLOCK_QUOTE

echo
if enabled frontend; then
  echo "# Input Support"
  echo "Joystick menu             ${joystick_menu-no}"
  echo "lirc support              ${lirc-no}"
  echo "libCEC device support     ${libcec-no} [$libcec_path]"
  if test x"$target_os" = x"darwin" ; then
    echo "Apple Remote              ${appleremote-no}"
  fi
fi

#ignore
# build tree in object directory if source path is different from current one
if enabled source_path_used; then
    DIRS="
        doc
        libavcodec
        libavcodec/$arch
        libavdevice
        libavfilter
        libavformat
        libavutil
        libavutil/$arch
        libpostproc
        libswscale
        libswscale/$arch
        tests
        tools
    "
    FILES="
        Makefile
        common.mak
        subdir.mak
        doc/texi2pod.pl
        libavcodec/Makefile
        libavcodec/${arch}/Makefile
        libavdevice/Makefile
        libavfilter/Makefile
        libavformat/Makefile
        libavutil/Makefile
        libpostproc/Makefile
        libswscale/Makefile
    "
    map 'mkdir -p $v' $DIRS;
    map 'test -f "$source_path/$v" && $ln_s "$source_path/$v" $v' $FILES
fi

enabled stripping || strip="echo skipping strip"

config_files="$TMPH $TMPMAK"

if enabled backend; then
  echo "Video4Linux support       ${v4l2-no}"
  echo "ivtv support              ${ivtv-no}"
  echo "HD-PVR support            ${hdpvr-no}"
  echo "FireWire support          ${firewire-no}"
  echo "DVB support               ${dvb-no} [$dvb_path]"
  echo "DVB-S2 support            ${fe_can_2g_modulation-no}"
  echo "HDHomeRun support         ${hdhomerun-no}"
  echo "Ceton support             ${ceton-no}"
  echo "ASI support               ${asi-no}"
fi

if enabled frontend; then
  echo
  echo "# Sound Output Support"
  echo "PulseAudio support        ${audio_pulseoutput-no}"
  echo "OSS support               ${audio_oss-no}"
  echo "ALSA support              ${audio_alsa-no}"
  echo "JACK support              ${audio_jack-no}"
  if test x"$target_os" = x"mingw32" ; then
    echo "Windows (Windows audio)   yes"
    echo "Windows (DirectX)         yes"
  fi
  echo "libfftw3 support          ${libfftw3-no}"
  echo
  echo "# Video Output Support"
  echo "x11 support               ${x11-no}"
if enabled x11 ; then
  echo "xrandr support            ${xrandr-no}"
  echo "xv support                ${xv-no}"
  echo "VDPAU support             ${vdpau-no}"
  echo "VAAPI support             ${vaapi-no}"
  echo "CrystalHD support         ${crystalhd-no}"
fi
  echo "OpenGL video              ${opengl_video-no}"
  if test x"$target_os" = x"darwin" ; then
    echo "Quartz video              ${quartz_video-no}"
    echo "VDA support               ${vda-no}"
  fi
  if test x"$target_os" = x"mingw32" ; then
    echo "Windows (Direct3D)        yes"
    echo "DXVA2 support             ${dxva2-no}"
  fi
  echo "MHEG support              ${mheg}"
  echo "libass subtitle support   ${libass-no}"
  echo
fi

echo "# Misc Features"
echo "multi threaded libavcodec ${threads-no}"
if enabled frontend; then
  echo "libxml2 support           ${libxml2-no} [$libxml2_path]"
fi
echo "libdns_sd (Bonjour)       ${libdns_sd-no}"
echo "libcrypto                 ${libcrypto-no}"
echo "Frontend                  ${frontend-no}"
echo "Backend                   ${backend-no}"
echo "OpenGL ES 2.0             ${opengles-no}"
echo "mythlogserver             ${mythlogserver-no}"
echo

echo "# Bindings"
echo "bindings_perl             ${bindings_perl-no}"
if test x"$PERL_CONFIG_OPTS" != x""; then
  echo "Perl config options       $PERL_CONFIG_OPTS"
fi
echo "bindings_python           ${bindings_python-no}"
echo "bindings_php              ${bindings_php-no}"
echo ""

echo "# External Codec Options"
echo "mp3lame                   ${libmp3lame-no}"
echo "faac                      ${libfaac-no}"
echo "xvid                      ${libxvid-no}"
echo "x264                      ${libx264-no}"
echo "vpx                       ${libvpx-no}"
echo "SDL                       ${sdl-no}"
echo ""

MYTH_CONFIG_H=libs/libmythbase/mythconfig.h
MYTH_CONFIG_MAK=libs/libmythbase/mythconfig.mak
echo "Creating $MYTH_CONFIG_H and $MYTH_CONFIG_MAK"

date >> config.log
echo "   $0 $MYTHTV_CONFIGURATION" >> config.log

cat > $TMPMAK <<EOF
# Automatically generated by configure - do not modify!
FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
MYTHTV_CONFIG_MAK=1
PREFIX=$prefix
prefix=$prefix
LIBDIRNAME=$libdir_name
LIBDIR=$libdir
SHLIBDIR=$shlibdir
INCDIR=$incdir
BINDIR=$bindir
DATADIR=$datadir
MANDIR=$mandir
SRC_PATH="$source_path"
SRC_PATH_BARE=$source_path
BUILD_ROOT="$PWD"
CC_IDENT=$cc_ident
ARCH=$arch
CC=$cc
CXX=$cxx
AS=$as
QMAKE=$qmakeconf
QMAKE_CC=$cc
QMAKE_CXX=$cxx
QMAKE_LINK=$cxx
PYTHON=$python
LD=$ld
DEPCC=$dep_cc
DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
DEPAS=$as
DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
YASM=$yasmexe
DEPYASM=$yasmexe
AR=$ar
ARFLAGS=$arflags
AR_O=$ar_o
RANLIB=$ranlib
CP=cp -p
LN_S=$ln_s
STRIP=$strip
CPPFLAGS=$CPPFLAGS
CFLAGS=$CFLAGS
CXXFLAGS=$CXXFLAGS
ASFLAGS=$ASFLAGS
AS_C=$AS_C
AS_O=$AS_O
CC_C=$CC_C
CC_E=$CC_E
CC_O=$CC_O
CXX_C=$CXX_C
CXX_O=$CXX_O
LD_O=$LD_O
LD_LIB=$LD_LIB
LD_PATH=$LD_PATH
DLLTOOL=$dlltool
CXXPPFLAGS=$CXXPPFLAGS
ECXXFLAGS=$ECXXFLAGS
LDFLAGS=$LDFLAGS
LDFLAGS-ffserver=$FFSERVERLDFLAGS
#SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
YASMFLAGS=$YASMFLAGS
BUILDSUF=$build_suffix
PROGSSUF=$progs_suffix
FULLNAME=$FULLNAME
LIBPREF=$LIBPREF
LIBSUF=$LIBSUF
LIBNAME=$LIBNAME
SLIBPREF=$SLIBPREF
SLIBSUF=$SLIBSUF
EXESUF=$EXESUF
EXTRA_VERSION=$extra_version
CCDEP=$CCDEP
CXXDEP=$CXXDEP
CCDEP_FLAGS=$CCDEP_FLAGS
ASDEP=$ASDEP
ASDEP_FLAGS=$ASDEP_FLAGS
CC_DEPFLAGS=$CC_DEPFLAGS
AS_DEPFLAGS=$AS_DEPFLAGS
HOSTCC=$host_cc
HOSTLD=$host_ld
HOSTCFLAGS=$host_cflags
HOSTCPPFLAGS=$host_cppflags
HOSTEXESUF=$HOSTEXESUF
HOSTLDFLAGS=$host_ldflags
HOSTLIBS=$host_libs
DEPHOSTCC=$host_cc
DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
HOSTCCDEP=$HOSTCCDEP
HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
HOSTCC_C=$HOSTCC_C
HOSTCC_O=$HOSTCC_O
HOSTLD_O=$HOSTLD_O
TARGET_EXEC=$target_exec
TARGET_PATH=$target_path
LIBS-ffplay=$sdl_libs
CFLAGS-ffplay=$sdl_cflags
ZLIB=$($ldflags_filter -lz)
#LIB_INSTALL_EXTRA_CMD=$_LIB_INSTALL_EXTRA_CMD
EXTRALIBS=$extralibs $ldl
COMPAT_OBJS=$compat_objs
EXEOBJS=$exeobjs
INSTALL=$install
LIBTARGET=${LIBTARGET}
SLIBNAME=${SLIBNAME}
SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
SLIBNAME_QT=$(echo ${SLIBNAME} | sed 's/\$(\(\(FULL\)*NAME\))/\1/;s/\$(\([A-Z]*\))/$${\1}/g')
SLIBNAME_WITH_MAJOR_QT=$(echo ${SLIBNAME_WITH_MAJOR} | sed 's/\$(\(\(FULL\)*NAME\))/\1/;s/\$(\(LIBMAJOR\))/\1/;s/\$(\(SLIBNAME\))/$${\1_QT}/;s/\$(\([A-Z]*\))/$${\1}/g')
#SLIB_CREATE_DEF_CMD=$_{SLIB_CREATE_DEF_CMD}
#SLIB_EXTRA_CMD=$_{SLIB_EXTRA_CMD}
#SLIB_INSTALL_EXTRA_CMD=$_{SLIB_INSTALL_EXTRA_CMD}
#SLIB_UNINSTALL_EXTRA_CMD=$_{SLIB_UNINSTALL_EXTRA_CMD}
SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME}
SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
SAMPLES=$samples
EOF

get_version(){
    lcname=lib${1}
    name=$(toupper $lcname)
    file=$source_path/external/FFmpeg/$lcname/version.h
    eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> $TMPMAK
    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> $TMPMAK
    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> TMPMAK
}

map 'get_version $v' $LIBRARY_LIST

echo "RUNPREFIX=$runprefix" >> $TMPMAK
echo "SYSROOT=$sysroot" >> $TMPMAK

enabled audio_alsa        && append CCONFIG "using_alsa"
enabled audio_jack        && append CCONFIG "using_jack"
enabled audio_oss         && append CCONFIG "using_oss"
enabled audio_pulse       && append CCONFIG "using_pulse"
enabled audio_pulseoutput && append CCONFIG "using_pulseoutput"

if enabled darwin_da; then
  append CCONFIG "darwin_da"
  echo "SLIB_UNINSTALL_EXTRA_CMD=${SLIB_UNINSTALL_EXTRA_CMD}" >> $TMPMAK
fi

if enabled freetype2; then
    echo "FREETYPE_CFLAGS=`freetype-config --cflags`" >> $TMPMAK
    echo "FREETYPE_LIBS=`freetype-config --libs`" >> $TMPMAK
fi

if test $target_os = darwin; then
  # Qt, by default builds .app bundles everywhere. Prevent this.
  enabled mac_bundle || echo "CONFIG-=app_bundle" >> $TMPMAK
fi

cat > $TMPH <<EOF
/* Automatically generated by configure - do not modify! */
#ifndef MYTHTV_CONFIG_H
#define MYTHTV_CONFIG_H
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
#define FFMPEG_LICENSE "$(c_escape $license)"
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
#define av_restrict $_restrict
#define EXTERN_PREFIX "${extern_prefix}"
#define EXTERN_ASM ${extern_prefix}
#define SLIBSUF "$SLIBSUF"
#define HAVE_MMX2 HAVE_MMXEXT
#define ASMALIGN(ZEROBITS) ".p2align " #ZEROBITS "\\n\\t"
#define SIZEOF_INT $_sizeof_int
#define SIZEOF_LONG $_sizeof_long
EOF

test -n "$assert_level" &&
    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH

test -n "$malloc_prefix" &&
    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH

if enabled mac_corevideo; then
  append CCONFIG "using_corevideo"
fi

if enabled cygwin ; then
  echo "#ifndef llrint" >> $TMPH
  echo "#define llrint llrint  // make sure not to define twice" >> $TMPH
  echo "static inline long long int llrint (double x)" >> $TMPH
  echo "{" >> $TMPH
  echo "    long long int llrintres;" >> $TMPH
  echo "    asm" >> $TMPH
  echo "    (\"fistpll %0\"" >> $TMPH
  echo "    : \"=m\" (llrintres) : \"t\" (x) : \"st\");" >> $TMPH
  echo "    return llrintres;" >> $TMPH
  echo "}" >> $TMPH
  echo "#endif" >> $TMPH
fi

if enabled yasm; then
    append config_files $TMPASM
    printf '' >$TMPASM
fi

print_config ARCH_   "$config_files" $ARCH_LIST
print_config HAVE_   "$config_files" $HAVE_LIST
print_config HAVE_   "$config_files" $MYTHTV_HAVE_LIST
print_config CONFIG_ "$config_files" $CONFIG_LIST       \
                                     $CONFIG_EXTRA      \
                                     $ALL_COMPONENTS    \
                                     $MYTHTV_LIST       \
                                     $MYTHTV_CONFIG_LIST \


for opt in $MYTHTV_CONFIG_LIST $USING_LIST; do
    enabled $opt && append CCONFIG "using_$opt"
done

enabled threads && append CCONFIG "using_ffmpeg_threads"

if disabled frontend; then
    echo
    echo "WARNING: --disable-frontend is only intended to aid porting."
    echo "WARNING: THIS WILL BREAK THINGS. You are on your own now."
fi

if disabled backend; then
    echo
    echo "WARNING: --disable-backend is only intended to aid porting."
    echo "WARNING: You are on your own now."
fi

if enabled proc_opt; then
    echo
    echo "WARNING: When using --enable-proc-opt you must include the "
    echo "         output of ./configure along with any bug report."
fi

if enabled cpu_override; then
    echo
    echo "WARNING: When using --arch=X or --cpu=X you must include the "
    echo "         output of ./configure along with any bug report."
fi

echo # add a newline after any warnings.

if enabled mmx; then
  CONFIG_DEFINES="$CONFIG_DEFINES MMX"
  if enabled x86_32 ; then
    CONFIG_DEFINES="$CONFIG_DEFINES i386"
  fi
fi

if enabled firewire; then
  if test $target_os = darwin; then
      echo "CONFIG_MAC_AVC=$mac_avc" >> $TMPMAK
  else
      echo "CONFIG_FIREWIRE_LIBS=-lraw1394 -liec61883 -lavc1394 -lrom1394" >> $TMPMAK
  fi
fi

if enabled mheg; then
    append CCONFIG "using_mheg"
fi

if enabled libass; then
    append CCONFIG "using_libass"
fi

if enabled appleremote; then
  append CONFIG_DEFINES "USING_APPLEREMOTE"
fi

if enabled dvb; then
  append CONFIG_INCLUDEPATH "$dvb_path"
fi

if enabled libcec; then
  append CONFIG_DEFINES "using_libcec"
  append CONFIG_INCLUDEPATH "$libcec_path"
fi

if enabled libxml2; then
  if [ -d $libxml2_path ] ; then
    append CONFIG_INCLUDEPATH "$libxml2_path"
    append CCONFIG "using_libxml2"
  fi
fi

if enabled taglib; then
    echo "CONFIG_TAGLIB_INCLUDES=$taglib_include" >> $TMPMAK
    echo "CONFIG_TAGLIB_LIBS=$taglib_libs" >> $TMPMAK
fi

if enabled libudf; then
  append CCONFIG "using_libudf"
fi

if enabled x11; then
  if [ -d $x11_path ] ; then
    append CONFIG_INCLUDEPATH "$x11_path"
  fi
fi

if ! enabled darwin && enabled opengl; then
  echo "CONFIG_OPENGL_LIBS=$gl_lib $glu_lib" >> $TMPMAK
fi

if test x"$PERL_CONFIG_OPTS" != x"" ; then
  echo "PERL_CONFIG_OPTS=$PERL_CONFIG_OPTS" >> $TMPMAK
fi

if test x"$CCONFIG" != x"" ; then
  echo "CCONFIG=$CCONFIG" >> $TMPMAK
  echo "#define MYTH_BUILD_CONFIG \"$CCONFIG\"" >>$TMPH
fi

if test x"$CONFIG_DEFINES" != x"" ; then
  echo "CONFIG_DEFINES=$CONFIG_DEFINES" >> $TMPMAK
fi

if test x"$CONFIG_INCLUDEPATH" != x"" ; then
  echo "CONFIG_INCLUDEPATH=$CONFIG_INCLUDEPATH" >> $TMPMAK
fi

echo "#endif /* MYTHTV_CONFIG_H */" >> $TMPH

cat <<EOF >> $TMPMAK
# HACK: If Qt 4 and MythTV's installed library dirs are the same, remove the
#       -L from early in the link line, to ignore any old installed libmyth*
# Note: Qt uses QMAKE_INCDIR_QT to build an absolute path for include
#       directories, it cannot be modified.
QMAKE_LIBDIR_QT-=${sysroot}${libdir}
QMAKE_LIBDIR-=${sysroot}${libdir}
LATE_LIBS+=-L${sysroot}${libdir}
EOF

#echo "endif # FFMPEG_CONFIG_MAK" >> $TMPMAK

# Should be done on all platforms, but for the time being limit it to mac only
if enabled darwin; then
  echo "QMAKE_LFLAGS+=\"$LDFLAGS\"" >> $TMPMAK
fi

cp_if_changed $TMPH $MYTH_CONFIG_H

if ! test -L config.h ; then
  ${ln_s} $MYTH_CONFIG_H config.h
fi

if [ ! -e config.h ] ; then
  ${ln_s} $MYTH_CONFIG_H config.h
fi

cat $TMPMAK | sed -e 's/^!/#/' > $TMPPRO

cp_if_changed $TMPPRO $MYTH_CONFIG_MAK

if ! test -L config.mak ; then
  ${ln_s} $MYTH_CONFIG_MAK config.mak
fi

if [ ! -e config.mak ] ; then
  ${ln_s} $MYTH_CONFIG_MAK config.mak
fi


# create config.mak for external/FFmpeg
cat >  external/FFmpeg/config.mak <<EOF
ifndef FFMPEG_CONFIG_MAK
FFMPEG_CONFIG_MAK=1
SHFLAGS=$SHFLAGS
LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
SLIB_INSTALL_EXTRA_CMD=${SLIB_INSTALL_EXTRA_CMD}
SLIB_UNINSTALL_EXTRA_CMD=${SLIB_UNINSTALL_EXTRA_CMD}
EOF
# Strip out the old dirs that we are about to put back in.
sed -e '/^S?H?LIBDIR=.*$/d' -e '/^INCDIR=.*$/d' -e '/^BINDIR=.*$/d' -e '/^DATADIR=.*$/d' -e '/^MANDIR=.*$/d' $TMPMAK >> external/FFmpeg/config.mak
cat >> external/FFmpeg/config.mak <<EOF
LIBDIR=\$(INSTALL_ROOT)$libdir
SHLIBDIR=\$(INSTALL_ROOT)$shlibdir
INCDIR=\$(INSTALL_ROOT)$incdir
BINDIR=\$(INSTALL_ROOT)$bindir
DATADIR=\$(INSTALL_ROOT)$datadir
MANDIR=\$(INSTALL_ROOT)$mandir
CFLAGS=${CFLAGS} -w
endif # FFMPEG_CONFIG_MAK
EOF

# link config.h into external/FFmpeg
rm -f external/FFmpeg/config.h
(cd external/FFmpeg/ && ${ln_s} ../../$MYTH_CONFIG_H config.h)
touch external/FFmpeg/.config

enabled yasm && cp_if_changed $TMPASM external/FFmpeg/config.asm

# delete old myth config files in old location
if [ -e libs/libmyth/mythconfig.mak ] ; then
    rm -f libs/libmyth/mythconfig.mak
fi
if [ -e libs/libmyth/mythconfig.h ] ; then
    rm -f libs/libmyth/mythconfig.h
fi


cat > $TMPH <<EOF
/* Generated by ffconf */
#ifndef AVUTIL_AVCONFIG_H
#define AVUTIL_AVCONFIG_H
EOF
print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB

echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH

cp_if_changed $TMPH external/FFmpeg/libavutil/avconfig.h

<<BLOCKQUOTE
echo "config:$arch:$subarch:$cpu:$target_os:$cc_ident:$FFMPEG_CONFIGURATION" >config.fate
BLOCKQUOTE

if enabled mythlogserver; then
    # configure zeromq
    echo "Configuring zeromq..."
    (cd external/zeromq ; \
             ./configure --quiet --without-documentation --prefix=${prefix} \
                         --includedir=${prefix}/include/mythtv/zeromq)
    echo "Configuring nzmqt..."
    (cd external/nzmqt/src ; \
           ${qmakeconf} -o Makefile)
fi
echo "Configuring qjson..."
(cd external/qjson ; \
       ${qmakeconf} -o Makefile)
if ! disabled hdhomerun ; then
    echo "Configuring libhdhomerun..."
    (cd external/libhdhomerun; \
           ${qmakeconf} -o Makefile.lib CONFIG+=Makefile.lib; \
           ${qmakeconf} -o Makefile.app CONFIG+=Makefile.app)
fi
echo "Configuring libmythbluray..."
(cd external/libmythbluray ; \
       ${qmakeconf} -o Makefile)
echo "Configuring libsamplerate..."
(cd external/libsamplerate ; \
       ${qmakeconf} -o Makefile)


test -n "$WARNINGS" && printf "\n$WARNINGS" || exit 0
