Skip to content
Snippets Groups Projects
configure 167 KiB
Newer Older
# Libav configure script
Diego Biurrun's avatar
Diego Biurrun committed
# Copyright (c) 2000-2002 Fabrice Bellard
# Copyright (c) 2005-2008 Diego Biurrun
# Copyright (c) 2005-2008 Mans Rullgard
# Prevent locale nonsense from breaking basic text processing.
# make sure we are running under a compatible shell
# try to make this part work with most shells

try_exec(){
    echo "Trying shell $1"
    type "$1" > /dev/null 2>&1 && exec "$@"
unset foo
(: ${foo%%bar}) 2> /dev/null
(: ${foo?}) 2> /dev/null
E2="$?"

if test "$E1" != 0 || test "$E2" = 0; then
    echo "Broken shell detected.  Trying alternatives."
    export FF_CONF_EXEC
    if test "0$FF_CONF_EXEC" -lt 1; then
        FF_CONF_EXEC=1
        try_exec bash "$0" "$@"
    fi
    if test "0$FF_CONF_EXEC" -lt 2; then
        FF_CONF_EXEC=2
        try_exec ksh "$0" "$@"
    fi
    if test "0$FF_CONF_EXEC" -lt 3; then
        FF_CONF_EXEC=3
        try_exec /usr/xpg4/bin/sh "$0" "$@"
    fi
    echo "No compatible shell script interpreter found."
Diego Biurrun's avatar
Diego Biurrun committed
    echo "This configure script requires a POSIX-compatible shell"
    echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
    echo "Instead, install a working POSIX-compatible shell."
    echo "Disabling this configure test will create a broken Libav."
    if test "$BASH_VERSION" = '2.04.0(1)-release'; then
        echo "This bash version ($BASH_VERSION) is broken on your platform."
        echo "Upgrade to a later version if available."
    fi
test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH

    cat <<EOF
Usage: configure [options]
Options: [defaults in brackets after descriptions]

Help options:
  --help                   print this message
  --quiet                  Suppress showing informative output
  --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 [avbuild/config.log]
  --disable-logging        do not log configure debug information
  --prefix=PREFIX          install in PREFIX [$prefix_default]
  --bindir=DIR             install binaries in DIR [PREFIX/bin]
  --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
  --docdir=DIR             install documentation in DIR [PREFIX/share/doc/libav]
  --libdir=DIR             install libs in DIR [PREFIX/lib]
  --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
  --incdir=DIR             install includes in DIR [PREFIX/include]
  --mandir=DIR             install man page in DIR [PREFIX/share/man]
  --enable-rpath           use rpath when linking programs (USE WITH CARE)
Licensing options:
  --enable-gpl             allow use of GPL code, the resulting libs
                           and binaries will be under GPL [no]
  --enable-version3        upgrade (L)GPL to version 3 [no]
  --enable-nonfree         allow use of nonfree code, the resulting libs
                           and binaries will be unredistributable [no]

Configuration options:
  --disable-static         do not build static libraries [no]
  --enable-shared          build shared libraries [no]
  --enable-small           optimize for size instead of speed
  --enable-runtime-cpudetect detect CPU capabilities at runtime (bigger binary)
  --enable-gray            enable full grayscale support (slower color)
  --disable-swscale-alpha  disable alpha channel support in swscale
  --disable-all            disable building components, libraries and programs
Program options:
  --disable-programs       do not build command line programs
  --disable-avconv         disable avconv build
Anton Khirnov's avatar
Anton Khirnov committed
  --disable-avplay         disable avplay build
  --disable-avprobe        disable avprobe build
Anton Khirnov's avatar
Anton Khirnov committed
  --disable-avserver       deprecated, does nothing

Component options:
  --disable-doc            do not build documentation
  --disable-pod2man        do not build manual pages
  --disable-texi2html      do not build HTML documentation
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
  --disable-avformat       disable libavformat build
  --disable-avutil         disable libavutil build
  --disable-swscale        disable libswscale build
  --disable-avfilter       disable video filter support [no]
Justin Ruggles's avatar
Justin Ruggles committed
  --disable-avresample     disable libavresample build [no]
  --disable-pthreads       disable pthreads [auto]
  --disable-w32threads     disable Win32 threads [auto]
  --disable-network        disable network support [no]
  --disable-dct            disable DCT code
  --disable-error-resilience disable error resilience code
  --disable-lsp            disable LSP code
  --disable-lzo            disable LZO decoder code
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
  --disable-fft            disable FFT code
  --disable-faan           disable floating point AAN (I)DCT code
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:

  Using any of the following switches will allow Libav to link to the
  corresponding external library. All the components depending on that library
  will become enabled, if all their other dependencies are met and they are not
  explicitly disabled. E.g. --enable-libwavpack will enable linking to
  libwavpack and allow the libwavpack encoder to be built, unless it is
  specifically disabled with --disable-encoder=libwavpack.

  Note that only the system libraries are auto-detected. All the other external
  libraries must be explicitly enabled.

  Also note that the following help text describes the purpose of the libraries
  themselves, not all their features will necessarily be usable by Libav.

  --enable-avisynth          video frameserver
  --enable-avxsynth          Linux version of AviSynth
  --enable-bzlib             bzip2 compression [autodetect]
  --enable-frei0r            video filtering plugins
  --enable-gnutls            crypto
  --enable-libbs2b           Bauer stereophonic-to-binaural DSP
  --enable-libcdio           audio CD input
  --enable-libdc1394         IEEE 1394/Firewire camera input
  --enable-libdcadec         DCA audio decoding
  --enable-libfaac           AAC audio encoding
  --enable-libfdk-aac        AAC audio encoding/decoding
  --enable-libfontconfig     font configuration and management
  --enable-libfreetype       font rendering
  --enable-libgsm            GSM audio encoding/decoding
  --enable-libhdcd           HDCD decoding filter
  --enable-libilbc           ILBC audio encoding/decoding
  --enable-libjack           JACK audio sound server
  --enable-libkvazaar        HEVC video encoding
  --enable-libmp3lame        MP3 audio encoding
  --enable-libopencore-amrnb AMR-NB audio encoding/decoding
  --enable-libopencore-amrwb AMR-WB audio decoding
  --enable-libopencv         computer vision
  --enable-libopenh264       H.264 video encoding/decoding
  --enable-libopenjpeg       JPEG 2000 image encoding/decoding
  --enable-libopus           Opus audio encoding/decoding
  --enable-libpulse          Pulseaudio sound server
  --enable-librtmp           RTMP streaming
  --enable-libschroedinger   Dirac video encoding/decoding
  --enable-libsnappy         snappy compression
  --enable-libspeex          Speex audio encoding/decoding
  --enable-libtheora         Theora video encoding/decoding
  --enable-libtwolame        MP2 audio encoding
  --enable-libvo-aacenc      AAC audio encoding
  --enable-libvo-amrwbenc    AMR-WB audio encoding
  --enable-libvorbis         Vorbis audio encoding/decoding
  --enable-libvpx            VP* video encoding/decoding
  --enable-libwavpack        Wavpack audio encoding/decoding
  --enable-libwebp           WebP image encoding/decoding
  --enable-libx264           H.264 video encoding
  --enable-libx265           HEVC video encoding
  --enable-libxavs           Chinese AVS video encoding
  --enable-libxcb            X window system protocol communication
  --enable-libxcb-shm        X11 shm communication [auto]
  --enable-libxcb-xfixes     X11 mouse rendering [auto]
  --enable-libxvid           MPEG-4 ASP video encoding
  --enable-openssl           crypto
  --enable-zlib              compression [autodetect]
  The following libraries provide various hardware acceleration features:
  --enable-cuda    Nvidia CUDA (dynamically linked)
  --enable-d3d11va Microsoft Direct3D 11 video acceleration [auto]
  --enable-dxva2   Microsoft DirectX 9 video acceleration [auto]
  --enable-libmfx  Intel MediaSDK (AKA Quick Sync Video)
  --enable-libnpp  Nvidia CUDA processing
  --enable-mmal    Broadcom Multi-Media Abstraction Layer (Raspberry Pi)
  --enable-nvenc   Nvidia video encoding
  --enable-omx     OpenMAX IL
  --enable-omx-rpi OpenMAX IL for Raspberry Pi
  --enable-vaapi   Video Acceleration API (mainly Unix/Intel)
  --enable-vda     Apple Video Decode Acceleration [auto]
  --enable-vdpau   Nvidia Video Decode and Presentation API for Unix [auto]

Toolchain options:
  --arch=ARCH              select architecture [$arch]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
  --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
  --enable-cross-compile   assume a cross-compiler is used
  --sysroot=PATH           root of cross-build tree
  --sysinclude=PATH        location of cross-build system headers
  --target-os=OS           compiler targets OS [$target_os]
  --target-exec=CMD        command to run executables on target
  --target-path=DIR        path to view of build directory on target
  --target-samples=DIR     path to samples directory on target
  --toolchain=NAME         set tool defaults according to NAME
  --nm=NM                  use nm tool
  --ar=AR                  use archive tool AR [$ar_default]
  --as=AS                  use assembler AS [$as_default]
  --cc=CC                  use C compiler CC [$cc_default]
Luca Barbato's avatar
Luca Barbato committed
  --objcc=OCC              use ObjC compiler OCC [$cc_default]
  --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
  --ld=LD                  use linker LD
  --x86asmexe=X86ASM       use x86 assembler X86ASM
  --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
  --pkg-config-flags=FLAGS pass additional flags to pkgconf []
  --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]
Luca Barbato's avatar
Luca Barbato committed
  --extra-objcflags=FLAGS  add FLAGS to OBJCFLAGS [$CFLAGS]
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
  --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [$LDEXEFLAGS]
  --extra-libs=ELIBS       add ELIBS [$ELIBS]
  --extra-version=STRING   version string suffix []
  --optflags=OPTFLAGS      override optimization-related compiler flags
  --enable-pic             build position-independent code
  --enable-thumb           compile for Thumb instruction set
  --enable-lto             use link-time optimization
  --env="ENV=override"     override the environment variables

Advanced options (experts only):
  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
  --custom-allocator=NAME  use a supported custom allocator
  --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-sram            allow use of on-chip SRAM

Optimization options (experts only):
  --disable-asm            disable all assembly optimizations
  --disable-altivec        disable AltiVec optimizations
  --disable-vsx            disable VSX optimizations
  --disable-power8         disable POWER8 optimizations
  --disable-amd3dnow       disable 3DNow! optimizations
  --disable-amd3dnowext    disable 3DNow! extended optimizations
  --disable-mmx            disable MMX optimizations
  --disable-mmxext         disable MMXEXT optimizations
  --disable-sse            disable SSE optimizations
  --disable-sse2           disable SSE2 optimizations
  --disable-sse3           disable SSE3 optimizations
  --disable-ssse3          disable SSSE3 optimizations
  --disable-sse4           disable SSE4 optimizations
  --disable-sse42          disable SSE4.2 optimizations
  --disable-avx            disable AVX optimizations
  --disable-xop            disable XOP optimizations
  --disable-fma3           disable FMA3 optimizations
  --disable-fma4           disable FMA4 optimizations
  --disable-avx2           disable AVX2 optimizations
  --disable-armv5te        disable armv5te optimizations
  --disable-armv6          disable armv6 optimizations
  --disable-armv6t2        disable armv6t2 optimizations
  --disable-vfp            disable VFP optimizations
  --disable-neon           disable NEON optimizations
  --disable-inline-asm     disable use of inline assembly
  --disable-x86asm         disable use of standalone x86 assembly
Developer options (useful when working on Libav itself):
  --disable-debug          disable debugging symbols
  --enable-debug=LEVEL     set the debug level [$debuglevel]
  --disable-optimizations  disable compiler optimizations
  --enable-extra-warnings  enable more compiler warnings
  --samples=PATH           location of test samples for FATE, if not set use
                           \$LIBAV_SAMPLES at make invocation time.
  --enable-neon-clobber-test check NEON registers for clobbering (should be
                           used only for debugging purposes)
  --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                           should be used only for debugging purposes)
  --enable-random          randomly enable/disable components
  --disable-random
  --enable-random=LIST     randomly enable/disable specific components or
  --disable-random=LIST    component groups. LIST is a comma-separated list
                           of NAME[:PROB] entries where NAME is a component
                           (group) and PROB the probability associated with
                           NAME (default 0.5).
  --random-seed=VALUE      seed value for --enable/disable-random
  --disable-valgrind-backtrace do not print a backtrace under Valgrind
                           (only applies to --disable-optimizations builds)
  --ignore-tests=TESTS     comma-separated list (without "fate-" prefix
                           in the name) of tests whose result is ignored

NOTE: Object files are built at the place where configure is launched.
EOF
Måns Rullgård's avatar
Måns Rullgård committed
    log BEGIN $1
    i=1
    while read line; do
        printf '%5s   %s\n' "${i}" "${line}"
        i=$(($i+1))
    done < $1 >> $logfile
Måns Rullgård's avatar
Måns Rullgård committed
    log END $1
}

Måns Rullgård's avatar
Måns Rullgård committed
    log "$@"
warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

If you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
libav-tools@libav.org mailing list or IRC #libav on irc.freenode.net.
Rerun configure with logging enabled (do not use --disable-logging), and
include the log this produces with your report.
        cat <<EOF
Include the log file "$logfile" produced by configure as this will help
solving the problem.
# Avoid locale weirdness, besides we really just want to translate ASCII.
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
tolower(){
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
c_escape(){
    echo "$*" | sed 's/["\\]/\\\0/g'
}

sh_quote(){
    v=$(echo "$1" | sed "s/'/'\\\\''/g")
    test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
cleanws(){
    echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
}

        eval "case $v in $pat) printf '%s ' $v ;; esac"
filter_out(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) ;; *) printf '%s ' $v ;; esac"
    for v; do eval $m; done
add_suffix(){
    suffix=$1
    shift
    for v; do echo ${v}${suffix}; done
}

set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

set_weak(){
    value=$1
    shift
    for var; do
        eval : \${$var:=$value}
    done
}

sanitize_var_name(){
    echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
}

set_safe(){
    var=$1
    shift
    eval $(sanitize_var_name "$var")='$*'
    eval echo \$$(sanitize_var_name "$1")
    for pvar in $*; do
        eval level=\${${pvar}_level:=0}
        eval ${pvar}_${level}="\$$pvar"
        eval ${pvar}_level=$(($level+1))
    for pvar in $*; do
        eval level=\${${pvar}_level:-0}
        test $level = 0 && continue
        eval level=$(($level-1))
        eval $pvar="\${${pvar}_${level}}"
        eval ${pvar}_level=$level
        eval unset ${pvar}_${level}
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

enable_weak(){
    set_weak yes $*
}

disable_weak(){
    set_weak no $*
}

    for var; do
        enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
    for var; do
        disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
do_enable_deep(){
    for var; do
        enabled $var && continue
        eval sgs="\$${var}_suggest"
        pushvar var sgs
        popvar sgs
        enable_deep_weak $sgs
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

enable_deep_weak(){
    for var; do
        disabled $var && continue
        pushvar var
        do_enable_deep $var
        popvar var
        enable_weak $var
    done
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xno"
enabled_all(){
    for opt; do
        enabled $opt || return 1
    done
}

disabled_all(){
    for opt; do
        disabled $opt || return 1
    done
}

enabled_any(){
    for opt; do
        enabled $opt && return 0
    done
}

disabled_any(){
    for opt; do
        disabled $opt && return 0
    done
set_default(){
    for opt; do
        eval : \${$opt:=\$${opt}_default}
is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking
        eval dep_all="\$${cfg}_deps"
        eval dep_con="\$${cfg}_conflict"
        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_con dep_sel dep_sgs dep_ifa dep_ifn
        check_deps $dep_all $dep_any $dep_con $dep_sel $dep_sgs $dep_ifa $dep_ifn
        popvar cfg dep_all dep_any dep_con dep_sel dep_sgs dep_ifa dep_ifn
        [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
        [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
Måns Rullgård's avatar
Måns Rullgård committed
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
        disabled_all $dep_con || disable $cfg
        disabled_any $dep_sel && disable $cfg
        if enabled $cfg; then
            enable_deep $dep_sel
            enable_deep_weak $dep_sgs
            for dep in $dep_all $dep_any $dep_sgs; do
                # filter out library deps, these do not belong in extralibs
                is_in $dep $LIBRARY_LIST && continue
                enabled $dep && eval append ${cfg}_extralibs ${dep}_extralibs
            done
        disable ${cfg}_checking
print_config(){
    pfx=$1
    map 'eval echo "$v \${$v:-no}"' "$@" |
    awk "BEGIN { split(\"$files\", files) }
        {
            c = \"$pfx\" toupper(\$1);
            v = \$2;
            sub(/yes/, 1, v);
            sub(/no/,  0, v);
            for (f in files) {
                file = files[f];
                if (file ~ /\\.h\$/) {
                    printf(\"#define %s %d\\n\", c, v) >>file;
                } else if (file ~ /\\.asm\$/) {
                    printf(\"%%define %s %d\\n\", c, v) >>file;
                } else if (file ~ /\\.mak\$/) {
                    n = -v ? \"\" : \"!\";
                    printf(\"%s%s=yes\\n\", n, c) >>file;
                }
            }
        }"
print_enabled(){
    suf=$1
    shift
    for v; do
        enabled $v && printf "%s\n" ${v%$suf}
prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

unique(){
    var=$1
    uniq_list=""
    for tok in $(eval echo \$$var); do
        uniq_list="$(filter_out $tok $uniq_list) $tok"
    done
    eval "$var=\"${uniq_list}\""
}

resolve(){
    var=$1
    tmpvar=
    for entry in $(eval echo \$$var); do
        tmpvar="$tmpvar $(eval echo \$${entry})"
    done
    eval "$var=\"${tmpvar}\""
}

    append CPPFLAGS "$@"
    append CFLAGS $($cflags_filter "$@")
add_cflags_headers(){
    append CFLAGS_HEADERS $($cflags_filter "$@")
}

    append ASFLAGS $($asflags_filter "$@")
Luca Barbato's avatar
Luca Barbato committed
add_objcflags(){
    append OBJCFLAGS $($objcflags_filter "$@")
}

    append LDFLAGS $($ldflags_filter "$@")
add_ldexeflags(){
    append LDEXEFLAGS $($ldflags_filter "$@")
}

add_stripflags(){
    append STRIPFLAGS "$@"
}

    prepend extralibs $($ldflags_filter "$@")
add_host_cppflags(){
    append host_cppflags "$@"
}

add_host_cflags(){
    append host_cflags $($host_cflags_filter "$@")
}

add_host_ldflags(){
    append host_ldflags $($host_ldflags_filter "$@")
}

add_compat(){
    append compat_objs $1
    shift
    map 'add_cppflags -D$v' "$@"
}

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

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

    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
Luca Barbato's avatar
Luca Barbato committed
check_objcc(){
    log check_objcc "$@"
    cat > $TMPC
    log_file $TMPC
    check_cmd $objcc $CPPFLAGS $CFLAGS $OBJCFLAGS "$@" $OBJCC_C $(cc_o $TMPO) $TMPC
}

    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
as_o(){
    eval printf '%s\\n' $AS_O
}

check_as(){
    log check_as "$@"
    cat > $TMPS
    log_file $TMPS
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
check_inline_asm(){
    log check_inline_asm "$@"
    check_cc "$@" <<EOF && enable $name
void foo(void){ __asm__ volatile($code); }
check_insn(){
    log check_insn "$@"
    check_inline_asm ${1}_inline "\"$2\""
    echo "$2" | check_as && enable ${1}_external || disable ${1}_external
}

check_x86asm(){
    log check_x86asm "$@"
Loren Merritt's avatar
Loren Merritt committed
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
    check_cmd $x86asmexe $X86ASMFLAGS "$@" -o $TMPO $TMPS
ld_o(){
    eval printf '%s\\n' $LD_O
}

    flags=$(filter_out '-l*' "$@")
    libs=$(filter '-l*' "$@")
    check_cc $($cflags_filter $flags) || return
    flags=$($ldflags_filter $flags)
    libs=$($ldflags_filter $libs)
    check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
print_include(){
    hdr=$1
    test "${hdr%.h}" = "${hdr}" &&
        echo "#include $hdr"    ||
        echo "#include <$hdr>"
}

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

check_cppflags(){
    log check_cppflags "$@"
    check_cpp "$@" <<EOF && append CPPFLAGS "$@"
test_cflags(){
    log test_cflags "$@"
    set -- $($cflags_filter "$@")
check_cflags(){
    log check_cflags "$@"
    test_cflags "$@" && add_cflags "$@"
}

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

check_objcflags(){
Luca Barbato's avatar
Luca Barbato committed
    test_objcflags "$@" && add_objcflags "$@"
}

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

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

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

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

check_func(){
Måns Rullgård's avatar
Måns Rullgård committed
    disable $func
    check_ld "$@" <<EOF && enable $func
extern int $func();
check_mathfunc(){
    log check_mathfunc "$@"
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
    disable $func
    check_ld "$@" <<EOF && enable $func
#include <math.h>
float foo(float f, float g) { return $func($args); }
int main(void){ return 0; }
check_func_headers(){
    log check_func_headers "$@"
        done
        for func in $funcs; do
            echo "long check_$func(void) { return (long) $func; }"
        done
        echo "int main(void) { return 0; }"
    } | check_ld "$@" && enable $funcs && enable_safe $headers
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
    check_cpp "$@" <<EOF
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}