third_party/aom/configure
author Emilio Cobos Álvarez <emilio@crisal.io>
Fri, 01 Jun 2018 18:30:30 +0200
changeset 420970 bb85c5ee5afc151be0d07ecc48318dc69cfef446
parent 417763 6d66620306926bdbd126069f54fb341f30bea2ea
child 426408 96c61b1dd0a1ecbc37fd4e257ff0bdff6f56df8b
permissions -rwxr-xr-x
Bug 1466168: Remove mozilla::Forward in favor of std::forward. r=froydnj Same approach as the other bug, mostly replacing automatically by removing 'using mozilla::Forward;' and then: s/mozilla::Forward/std::forward/ s/Forward</std::forward</ The only file that required manual fixup was TestTreeTraversal.cpp, which had a class called TestNodeForward with template parameters :) MozReview-Commit-ID: A88qFG5AccP

#!/bin/sh
##
##  configure
##
##  This script is the front-end to the build system. It provides a similar
##  interface to standard configure scripts with some extra bits for dealing
##  with toolchains that differ from the standard POSIX interface and
##  for extracting subsets of the source tree. In theory, reusable parts
##  of this script were intended to live in build/make/configure.sh,
##  but in practice, the line is pretty blurry.
##
##  This build system is based in part on the FFmpeg configure script.
##

#source_path="`dirname \"$0\"`"
source_path=${0%/*}
. "${source_path}/build/make/configure.sh"

show_help(){
    show_help_pre
    cat << EOF
Advanced options:
  ${toggle_libs}                  libraries
  ${toggle_examples}              examples
  ${toggle_analyzer}              analyzer
  ${toggle_docs}                  documentation
  ${toggle_unit_tests}            unit tests
  ${toggle_tools}                 tools
  ${toggle_decode_perf_tests}     build decoder perf tests with unit tests
  ${toggle_encode_perf_tests}     build encoder perf tests with unit tests
  --cpu=CPU                       tune for the specified CPU (ARM: cortex-a8, X86: sse3)
  --libc=PATH                     path to alternate libc
  --size-limit=WxH                max size to allow in the decoder
  --as={yasm|nasm|auto}           use specified assembler [auto, yasm preferred]
  --sdk-path=PATH                 path to root of sdk (android builds only)
  ${toggle_codec_srcs}            in/exclude codec library source code
  ${toggle_debug_libs}            in/exclude debug version of libraries
  ${toggle_static_msvcrt}         use static MSVCRT (VS builds only)
  ${toggle_highbitdepth}          enable 16-bit generic pixel pipeline (used by high bitdepth profiles)
  ${toggle_lowbitdepth}           enable 8-bit optimized pixel pipeline
  ${toggle_av1}                  AV1 codec support
  ${toggle_internal_stats}        output of encoder internal stats for debug, if supported (encoders)
  ${toggle_postproc}              postprocessing
  ${toggle_multithread}           multithreaded encoding and decoding
  ${toggle_spatial_resampling}    spatial sampling (scaling) support
  ${toggle_realtime_only}         enable this option while building for real-time encoding
  ${toggle_coefficient_range_checking}
                                  enable decoder to check if intermediate
                                  transform coefficients are in valid range
  ${toggle_runtime_cpu_detect}    runtime cpu detection
  ${toggle_shared}                shared library support
  ${toggle_static}                static library support
  ${toggle_small}                 favor smaller size over speed
  ${toggle_postproc_visualizer}   macro block / block level visualizers
  ${toggle_webm_io}               enable input from and output to WebM container
  ${toggle_libyuv}                enable libyuv
  ${toggle_accounting}            enable bit accounting
  ${toggle_inspection}            enable bitstream inspection

Codecs:
  Codecs can be selectively enabled or disabled individually, or by family:
      --disable-<codec>
  is equivalent to:
      --disable-<codec>-encoder
      --disable-<codec>-decoder

  Codecs available in this distribution:
EOF
#restore editor state '

    family="";
    last_family="";
    c="";
    str="";
    for c in ${CODECS}; do
        family=${c%_*}
        if [ "${family}" != "${last_family}" ]; then
            [ -z "${str}" ] || echo "${str}"
            str="$(printf '    %10s:' ${family})"
        fi
        str="${str} $(printf '%10s' ${c#*_})"
        last_family=${family}
    done
    echo "${str}"
    show_help_post
}

##
## BEGIN APPLICATION SPECIFIC CONFIGURATION
##

# all_platforms is a list of all supported target platforms. Maintain
# alphabetically by architecture, generic-gnu last.
all_platforms="${all_platforms} arm64-darwin-gcc"
all_platforms="${all_platforms} arm64-linux-gcc"
all_platforms="${all_platforms} armv7-android-gcc"   #neon Cortex-A8
all_platforms="${all_platforms} armv7-darwin-gcc"    #neon Cortex-A8
all_platforms="${all_platforms} armv7-linux-rvct"    #neon Cortex-A8
all_platforms="${all_platforms} armv7-linux-gcc"     #neon Cortex-A8
all_platforms="${all_platforms} armv7-none-rvct"     #neon Cortex-A8
all_platforms="${all_platforms} armv7-win32-vs12"
all_platforms="${all_platforms} armv7-win32-vs14"
all_platforms="${all_platforms} armv7-win32-vs15"
all_platforms="${all_platforms} armv7s-darwin-gcc"
all_platforms="${all_platforms} armv8-linux-gcc"
all_platforms="${all_platforms} mips32-linux-gcc"
all_platforms="${all_platforms} mips64-linux-gcc"
all_platforms="${all_platforms} sparc-solaris-gcc"
all_platforms="${all_platforms} x86-android-gcc"
all_platforms="${all_platforms} x86-darwin8-gcc"
all_platforms="${all_platforms} x86-darwin8-icc"
all_platforms="${all_platforms} x86-darwin9-gcc"
all_platforms="${all_platforms} x86-darwin9-icc"
all_platforms="${all_platforms} x86-darwin10-gcc"
all_platforms="${all_platforms} x86-darwin11-gcc"
all_platforms="${all_platforms} x86-darwin12-gcc"
all_platforms="${all_platforms} x86-darwin13-gcc"
all_platforms="${all_platforms} x86-darwin14-gcc"
all_platforms="${all_platforms} x86-darwin15-gcc"
all_platforms="${all_platforms} x86-darwin16-gcc"
all_platforms="${all_platforms} x86-iphonesimulator-gcc"
all_platforms="${all_platforms} x86-linux-gcc"
all_platforms="${all_platforms} x86-linux-icc"
all_platforms="${all_platforms} x86-os2-gcc"
all_platforms="${all_platforms} x86-solaris-gcc"
all_platforms="${all_platforms} x86-win32-gcc"
all_platforms="${all_platforms} x86-win32-vs12"
all_platforms="${all_platforms} x86-win32-vs14"
all_platforms="${all_platforms} x86-win32-vs15"
all_platforms="${all_platforms} x86_64-android-gcc"
all_platforms="${all_platforms} x86_64-darwin9-gcc"
all_platforms="${all_platforms} x86_64-darwin10-gcc"
all_platforms="${all_platforms} x86_64-darwin11-gcc"
all_platforms="${all_platforms} x86_64-darwin12-gcc"
all_platforms="${all_platforms} x86_64-darwin13-gcc"
all_platforms="${all_platforms} x86_64-darwin14-gcc"
all_platforms="${all_platforms} x86_64-darwin15-gcc"
all_platforms="${all_platforms} x86_64-darwin16-gcc"
all_platforms="${all_platforms} x86_64-iphonesimulator-gcc"
all_platforms="${all_platforms} x86_64-linux-gcc"
all_platforms="${all_platforms} x86_64-linux-icc"
all_platforms="${all_platforms} x86_64-solaris-gcc"
all_platforms="${all_platforms} x86_64-win64-gcc"
all_platforms="${all_platforms} x86_64-win64-vs12"
all_platforms="${all_platforms} x86_64-win64-vs14"
all_platforms="${all_platforms} x86_64-win64-vs15"
all_platforms="${all_platforms} generic-gnu"

# all_targets is a list of all targets that can be configured
# note that these should be in dependency order for now.
all_targets="libs examples docs tools"

# all targets available are enabled, by default.
for t in ${all_targets}; do
    [ -f "${source_path}/${t}.mk" ] && enable_feature ${t}
done

if ! diff --version >/dev/null; then
  die "diff missing: Try installing diffutils via your package manager."
fi

if ! perl --version >/dev/null; then
    die "Perl is required to build"
fi


if [ "`cd \"${source_path}\" && pwd`" != "`pwd`" ]; then
  # test to see if source_path already configured
  if [ -f "${source_path}/aom_config.h" ]; then
    die "source directory already configured; run 'make distclean' there first"
  fi
fi

# check installed doxygen version
doxy_version=$(doxygen --version 2>/dev/null)
doxy_major=${doxy_version%%.*}
if [ ${doxy_major:-0} -ge 1 ]; then
    doxy_version=${doxy_version#*.}
    doxy_minor=${doxy_version%%.*}
    doxy_patch=${doxy_version##*.}

    [ $doxy_major -gt 1 ] && enable_feature doxygen
    [ $doxy_minor -gt 5 ] && enable_feature doxygen
    [ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable_feature doxygen
fi

# disable codecs when their source directory does not exist
[ -d "${source_path}/av1" ] || disable_codec av1

# install everything except the sources, by default. sources will have
# to be enabled when doing dist builds, since that's no longer a common
# case.
enabled doxygen && enable_feature install_docs
enable_feature install_bins
enable_feature install_libs

enable_feature static
enable_feature optimizations
enable_feature dependency_tracking
enable_feature spatial_resampling
enable_feature multithread
enable_feature os_support
enable_feature highbitdepth

CODECS="
    av1_encoder
    av1_decoder
"
CODEC_FAMILIES="
    av1
"

ARCH_LIST="
    arm
    mips
    x86
    x86_64
"
ARCH_EXT_LIST_X86="
    mmx
    sse
    sse2
    sse3
    ssse3
    sse4_1
    avx
    avx2
"
ARCH_EXT_LIST="
    neon
    neon_asm

    mips32
    dspr2
    msa
    mips64

    ${ARCH_EXT_LIST_X86}
"
HAVE_LIST="
    ${ARCH_EXT_LIST}
    aom_ports
    fexcept
    pthread_h
    unistd_h
    wxwidgets
"
EXPERIMENT_LIST="
    fp_mb_stats
    cdef
    cdef_singlepass
    var_tx
    rect_tx
    rect_tx_ext
    tpl_mv
    dual_filter
    convolve_round
    compound_round
    ext_tx
    tx64x64
    ext_intra
    intra_interp
    filter_intra
    intra_edge
    intrabc
    interintra
    wedge
    compound_segment
    ext_refs
    global_motion
    new_quant
    supertx
    ans
    loop_restoration
    striped_loop_restoration
    ext_partition
    ext_partition_types
    ext_partition_types_ab
    unpoison_partition_ctx
    ext_tile
    motion_var
    ncobmc
    warped_motion
    q_adapt_probs
    inter_stats_only
    palette_delta_encoding
    rawbits
    kf_ctx
    pvq
    cfl
    xiphrc
    dct_only
    daala_tx
    daala_dct4
    daala_dct8
    daala_dct16
    daala_dct32
    daala_dct64
    cb4x4
    chroma_2x2
    chroma_sub8x8
    frame_size
    ext_delta_q
    adapt_scan
    parallel_deblocking
    deblock_13tap
    loopfiltering_across_tiles
    tempmv_signaling
    rd_debug
    reference_buffer
    coef_interleave
    entropy_stats
    masked_tx
    dependent_horztiles
    dist_8x8
    palette_throughput
    ref_adapt
    lv_map
    ctx1d
    txk_sel
    mv_compress
    segment_zeromv
    frame_superres
    new_multisymbol
    compound_singleref
    aom_qm
    one_sided_compound
    ext_comp_refs
    smooth_hv
    var_refs
    lgt
    lgt_from_pred
    sbl_symbol
    ncobmc_adapt_weight
    bgsprite
    var_tx_no_tx_mode
    mrc_tx
    lpf_direct
    loopfilter_level
    no_frame_context_signaling
    txmg
    max_tile
    hash_me
    colorspace_headers
    mfmv
    frame_marker
    jnt_comp
    frame_sign_bias
    ext_skip
    obu
    amvr
    lpf_sb
    opt_ref_mv
    tmv
    restrict_compressed_hdr
    horzonly_frame_superres
"
CONFIG_LIST="
    dependency_tracking
    external_build
    install_docs
    install_bins
    install_libs
    install_srcs
    debug
    gprof
    gcov
    rvct
    gcc
    msvs
    pic
    big_endian

    codec_srcs
    debug_libs

    runtime_cpu_detect
    postproc
    multithread
    internal_stats
    ${CODECS}
    ${CODEC_FAMILIES}
    static_msvcrt
    spatial_resampling
    realtime_only
    shared
    static
    small
    postproc_visualizer
    os_support
    unit_tests
    webm_io
    libyuv
    accounting
    inspection
    decode_perf_tests
    encode_perf_tests
    bitstream_debug
    symbolrate
    coefficient_range_checking
    lowbitdepth
    highbitdepth
    experimental
    size_limit
    ${EXPERIMENT_LIST}
    analyzer
"
CMDLINE_SELECT="
    dependency_tracking
    external_build
    extra_warnings
    werror
    install_docs
    install_bins
    install_libs
    install_srcs
    debug
    gprof
    gcov
    pic
    optimizations
    ccache
    runtime_cpu_detect
    thumb

    libs
    examples
    analyzer
    docs
    tools
    libc
    as
    size_limit
    codec_srcs
    debug_libs

    postproc
    multithread
    internal_stats
    ${CODECS}
    ${CODEC_FAMILIES}
    static_msvcrt
    spatial_resampling
    realtime_only
    shared
    static
    small
    postproc_visualizer
    unit_tests
    webm_io
    libyuv
    accounting
    inspection
    decode_perf_tests
    encode_perf_tests
    coefficient_range_checking
    bitstream_debug
    symbolrate
    lowbitdepth
    highbitdepth
    experimental
    adopted_experiments
    colorspace_headers
"

process_cmdline() {
    for opt do
        optval="${opt#*=}"
        case "$opt" in
        --disable-codecs)
          for c in ${CODEC_FAMILIES}; do disable_codec $c; done
          ;;
        --enable-?*|--disable-?*)
        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
        if is_in ${option} ${EXPERIMENT_LIST}; then
            if enabled experimental; then
                ${action}_feature $option
            else
                log_echo "Ignoring $opt -- not in experimental mode."
            fi
        elif is_in ${option} "${CODECS} ${CODEC_FAMILIES}"; then
            ${action}_codec ${option}
        else
            process_common_cmdline $opt
        fi
        ;;
        *) process_common_cmdline "$opt"
        ;;
        esac
    done
}

post_process_cmdline() {
    c=""

    # Enable all detected codecs, if they haven't been disabled
    for c in ${CODECS}; do soft_enable $c; done

    # Enable the codec family if any component of that family is enabled
    for c in ${CODECS}; do
        enabled $c && enable_feature ${c%_*}
    done

    # Set the {en,de}coders variable if any algorithm in that class is enabled
    for c in ${CODECS}; do
        enabled ${c} && enable_feature ${c##*_}s
    done

    enable_feature cb4x4

    # Enable adopted experiments by default
    soft_enable adopted_experiments
    if enabled adopted_experiments; then
      soft_enable chroma_sub8x8
      soft_enable rect_tx
      soft_enable global_motion
      soft_enable ext_tx
      soft_enable cdef
      soft_enable ext_intra
      soft_enable intra_edge
      soft_enable mv_compress
      soft_enable ext_refs
      soft_enable dual_filter
      soft_enable motion_var
      soft_enable warped_motion
      soft_enable var_tx
      soft_enable wedge
      soft_enable compound_segment
      soft_enable interintra
      soft_enable one_sided_compound
      soft_enable convolve_round
      soft_enable aom_qm
      soft_enable dist_8x8
      soft_enable cdef_singlepass
      soft_enable loop_restoration

      # Provisional adopted
      soft_enable reference_buffer
      soft_enable loopfiltering_across_tiles
      soft_enable palette_throughput
      soft_enable smooth_hv
      soft_enable tempmv_signaling
      soft_enable ext_comp_refs
      soft_enable ext_delta_q
      soft_enable parallel_deblocking
    fi

    # Enable low-bitdepth pixel pipeline by default
    soft_enable lowbitdepth

    # Enable LBD/HBD txfm consistency tool
    soft_enable txmg

    # Fix up experiment dependencies
    enabled pvq && disable_feature chroma_2x2
    enabled pvq && disable_feature rect_tx
    enabled pvq && disable_feature ext_tx
    enabled pvq && disable_feature var_tx
    enabled pvq && disable_feature highbitdepth
    enabled pvq && disable_feature lgt
    enabled pvq && disable_feature mrc_tx
    enabled lv_map && disable_feature mrc_tx
    enabled supertx && disable_feature mrc_tx
    enabled coef_interleave && disable_feature mrc_tx
    enabled pvq && disable_feature palette_throughput
    enabled mrc_tx && enable_feature ext_tx
    enabled mrc_tx && enable_feature var_tx
    enabled txk_sel && soft_enable lv_map
    enabled ctx1d && soft_enable lv_map
    enabled ctx1d && soft_enable ext_tx
    enabled compound_round && soft_enable convolve_round
    enabled intra_edge && enable_feature ext_intra
    enabled chroma_2x2 && disable_feature chroma_sub8x8
    enabled chroma_sub8x8 && enable_feature cb4x4
    enabled ncobmc_adapt_weight && enable_feature motion_var
    enabled bgsprite && enable_feature global_motion
    enabled ext_comp_refs && enable_feature ext_refs
    enabled ext_comp_refs && enable_feature one_sided_compound
    enabled rect_tx_ext && enable_feature rect_tx
    enabled lgt_from_pred && enable_feature ext_tx
    enabled lgt_from_pred && disable_feature mrc_tx
    enabled cfl && enable_feature smooth_hv
    enabled cdef_singlepass && enable_feature cdef
    enabled new_multisymbol && enable_feature restrict_compressed_hdr
    enabled mfmv && enable_feature frame_marker
    enabled jnt_comp && enable_feature frame_marker
    enabled frame_sign_bias && enable_feature frame_marker
    enabled txmg && enable_feature highbitdepth
    enabled ext_skip && enable_feature frame_marker
    enabled ext_skip && enable_feature ext_refs
    enabled horzonly_frame_superres && enable_feature frame_superres

    if enabled rawbits && enabled ans; then
      log_echo "rawbits requires not ans, so disabling rawbits"
      disable_feature rawbits
    fi
    if enabled daala_tx; then
      enable_feature daala_dct4
      enable_feature daala_dct8
      enable_feature daala_dct16
      enable_feature daala_dct32
      enable_feature daala_dct64
    fi
    if enabled daala_dct64 && ! enabled tx64x64; then
      log_echo "daala_dct64 requires tx64x64, so disabling daala_dct64"
      disable_feature daala_dct64
    fi
    if enabled daala_dct4 || enabled daala_dct8 || enabled daala_dct16 ||
        enabled daala_dct32 || enabled daala_dct64; then
      disable_feature lgt
      enable_feature lowbitdepth
    fi
    if enabled var_tx_no_tx_mode && ! enabled var_tx; then
      log_echo "var_tx_no_tx_mode requires var_tx, so disabling var_tx_no_tx_mode"
      disable_feature var_tx_no_tx_mode
    fi
    if enabled ext_partition_types; then
      if enabled fp_mb_stats; then
        log_echo "ext_partition_types not compatible with fp_mb_stats;"
        log_echo "disabling fp_mb_stats"
        disable_feature fp_mb_stats
      fi
      if enabled supertx; then
        log_echo "ext_partition_types not compatible with supertx;"
        log_echo "disabling supertx"
        disable_feature supertx
      fi
      if ! enabled rect_tx; then
        log_echo "ext_partition_types requires rect_tx;"
        log_echo "enabling rect_tx;"
        enable_feature rect_tx
      fi
    fi
    # Enable accounting and inspection when building the analyzer
    if enabled analyzer; then
      soft_enable accounting
      soft_enable inspection
    fi
    # Enable hash_me if amvr is enabled
    if enabled amvr; then
      log_echo "amvr requires hash_me"
      enable_feature hash_me
    fi

    if enabled striped_loop_restoration && ! enabled loop_restoration ; then
      log_echo "striped_loop_restoration requires loop_restoration"
      log_echo "enable loop_restoration"
      enable_feature loop_restoration
    fi
    if enabled striped_loop_restoration && enabled frame_superres ; then
      log_echo "striped_loop_restoration not compatible with frame_superres"
      log_echo "disabling striped_loop_restoration"
      disable_feature striped_loop_restoration
    fi
}

process_targets() {
    enabled child || write_common_config_banner
    write_common_target_config_h ${BUILD_PFX}aom_config.h
    write_common_config_targets

    # Calculate the default distribution name, based on the enabled features
    cf=""
    DIST_DIR=aom
    for cf in $CODEC_FAMILIES; do
        if enabled ${cf}_encoder && enabled ${cf}_decoder; then
            DIST_DIR="${DIST_DIR}-${cf}"
        elif enabled ${cf}_encoder; then
            DIST_DIR="${DIST_DIR}-${cf}cx"
        elif enabled ${cf}_decoder; then
            DIST_DIR="${DIST_DIR}-${cf}dx"
        fi
    done
    enabled debug_libs && DIST_DIR="${DIST_DIR}-debug"
    enabled codec_srcs && DIST_DIR="${DIST_DIR}-src"
    ! enabled postproc && DIST_DIR="${DIST_DIR}-nopost"
    ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt"
    ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs"
    DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}"
    case "${tgt_os}" in
    win*) enabled static_msvcrt && DIST_DIR="${DIST_DIR}mt" || DIST_DIR="${DIST_DIR}md"
          DIST_DIR="${DIST_DIR}-${tgt_cc}"
          ;;
    esac
    if [ -f "${source_path}/build/make/version.sh" ]; then
        ver=`"$source_path/build/make/version.sh" --bare "$source_path"`
        DIST_DIR="${DIST_DIR}-${ver}"
        VERSION_STRING=${ver}
        ver=${ver%%-*}
        VERSION_PATCH=${ver##*.}
        ver=${ver%.*}
        VERSION_MINOR=${ver##*.}
        ver=${ver#v}
        VERSION_MAJOR=${ver%.*}
    fi
    enabled child || cat <<EOF >> config.mk

PREFIX=${prefix}
ifeq (\$(MAKECMDGOALS),dist)
DIST_DIR?=${DIST_DIR}
else
DIST_DIR?=\$(DESTDIR)${prefix}
endif
LIBSUBDIR=${libdir##${prefix}/}

VERSION_STRING=${VERSION_STRING}

VERSION_MAJOR=${VERSION_MAJOR}
VERSION_MINOR=${VERSION_MINOR}
VERSION_PATCH=${VERSION_PATCH}

CONFIGURE_ARGS=${CONFIGURE_ARGS}
EOF
    enabled child || echo "CONFIGURE_ARGS?=${CONFIGURE_ARGS}" >> config.mk

    #
    # Write makefiles for all enabled targets
    #
    for tgt in libs examples docs tools solution; do
        tgt_fn="$tgt-$toolchain.mk"

        if enabled $tgt; then
            echo "Creating makefiles for ${toolchain} ${tgt}"
            write_common_target_config_mk $tgt_fn ${BUILD_PFX}aom_config.h
            #write_${tgt}_config
        fi
    done

}

process_detect() {
    if enabled shared; then
        # Can only build shared libs on a subset of platforms. Doing this check
        # here rather than at option parse time because the target auto-detect
        # magic happens after the command line has been parsed.
        case "${tgt_os}" in
        linux|os2|darwin*|iphonesimulator*)
            # Supported platforms
            ;;
        *)
            if enabled gnu; then
                echo "--enable-shared is only supported on ELF; assuming this is OK"
            else
                die "--enable-shared only supported on ELF, OS/2, and Darwin for now"
            fi
            ;;
        esac
    fi
    if [ -z "$CC" ] || enabled external_build; then
        echo "Bypassing toolchain for environment detection."
        enable_feature external_build
        check_header() {
            log fake_check_header "$@"
            header=$1
            shift
            var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
            disable_feature $var
            # Headers common to all environments
            case $header in
                stdio.h)
                    true;
                ;;
                *)
                    result=false
                    for d in "$@"; do
                        [ -f "${d##-I}/$header" ] && result=true && break
                    done
                    ${result:-true}
            esac && enable_feature $var

            # Specialize windows and POSIX environments.
            case $toolchain in
                *-win*-*)
                    # Don't check for any headers in Windows builds.
                    false
                ;;
                *)
                    case $header in
                        pthread.h) true;;
                        unistd.h) true;;
                        *) false;;
                    esac && enable_feature $var
            esac
            enabled $var
        }
        check_ld() {
            true
        }
    fi
    check_header stdio.h || die "Unable to invoke compiler: ${CC} ${CFLAGS}"
    check_ld <<EOF || die "Toolchain is unable to link executables"
int main(void) {return 0;}
EOF
    # check system headers
    check_header pthread.h
    check_header unistd.h # for sysconf(3) and friends.

    check_header aom/aom_integer.h -I${source_path} && enable_feature aom_ports

    check_ld <<EOF && enable_feature fexcept
#define _GNU_SOURCE
#include <fenv.h>
int main(void) { (void)feenableexcept(FE_DIVBYZERO | FE_INVALID); return 0; }
EOF
}

process_toolchain() {
    process_common_toolchain

    # Enable some useful compiler flags
    if enabled gcc; then
        enabled werror && check_add_cflags -Werror
        check_add_cflags -Wall
        check_add_cflags -Wdisabled-optimization
        check_add_cflags -Wfloat-conversion
        check_add_cflags -Wpointer-arith
        check_add_cflags -Wtype-limits
        check_add_cflags -Wvla
        check_add_cflags -Wimplicit-function-declaration
        check_add_cflags -Wuninitialized
        check_add_cflags -Wunused
        check_add_cflags -Wsign-compare
        check_add_cflags -Wstring-conversion
        check_add_cflags -Wlogical-op
        check_add_cflags -Wstack-usage=320000
        # Enabling the following warning (in combination with -Wunused above)
        # for C++ generates errors in third_party code including googletest and
        # libyuv. So enable it only for C code.
        check_cflags "-Wextra" && add_cflags_only "-Wextra"
        # Enabling the following warning for C++ generates some useless warnings
        # about some function parameters shadowing class member function names.
        # So, only enable this warning for C code.
        check_cflags "-Wshadow" && add_cflags_only "-Wshadow"
        if enabled mips || [ -z "${INLINE}" ]; then
          enabled extra_warnings || check_add_cflags -Wno-unused-function
        fi
        # gtest makes heavy use of undefined pre-processor symbols
        check_cflags "-Wundef" && add_cflags_only "-Wundef"
        # Avoid this warning for third_party C++ sources. Some reorganization
        # would be needed to apply this only to test/*.cc.
        check_cflags -Wshorten-64-to-32 && add_cflags_only -Wshorten-64-to-32
    fi

    if enabled icc; then
        enabled werror && check_add_cflags -Werror
        check_add_cflags -Wall
        check_add_cflags -Wpointer-arith

        # ICC has a number of floating point optimizations that we disable
        # in favor of deterministic output WRT to other compilers
        add_cflags -fp-model precise
    fi

    if enabled analyzer; then
      soft_enable wxwidgets
      if ! wx-config --version > /dev/null; then
        die "Couldn't find wx-config"
      fi

      add_cxxflags_only $(wx-config --cppflags)
      add_extralibs $(wx-config --libs)
    fi

    # Enable extra, harmless warnings. These might provide additional insight
    # to what the compiler is doing and why, but in general, but they shouldn't
    # be treated as fatal, even if we're treating warnings as errors.
    GCC_EXTRA_WARNINGS="
        -Wdisabled-optimization
        -Winline
    "
    enabled gcc && EXTRA_WARNINGS="${GCC_EXTRA_WARNINGS}"
    RVCT_EXTRA_WARNINGS="
        --remarks
    "
    enabled rvct && EXTRA_WARNINGS="${RVCT_EXTRA_WARNINGS}"
    if enabled extra_warnings; then
        for w in ${EXTRA_WARNINGS}; do
            check_add_cflags ${w}
            enabled gcc && enabled werror && check_add_cflags -Wno-error=${w}
        done
    fi

    # ccache only really works on gcc toolchains
    enabled gcc || soft_disable ccache

    # Enable the postbuild target if building for visual studio.
    case "$tgt_cc" in
        vs*) enable_feature msvs
             enable_feature solution
             vs_version=${tgt_cc##vs}
             VCPROJ_SFX=vcxproj
             gen_vcproj_cmd=${source_path}/build/make/gen_msvs_vcxproj.sh
             enabled werror && gen_vcproj_cmd="${gen_vcproj_cmd} --enable-werror"
             all_targets="${all_targets} solution"
             INLINE="__inline"
        ;;
    esac

    # Other toolchain specific defaults
    case $toolchain in x86*) soft_enable postproc;; esac

    if enabled postproc_visualizer; then
        enabled postproc || die "postproc_visualizer requires postproc to be enabled"
    fi

    # Enable unit tests by default if we have a working C++ compiler.
    case "$toolchain" in
        *-vs*)
            soft_enable unit_tests
            soft_enable webm_io
            soft_enable libyuv
        ;;
        *-android-*)
            soft_enable webm_io
            soft_enable libyuv
            # GTestLog must be modified to use Android logging utilities.
        ;;
        *-darwin-*)
            # iOS/ARM builds do not work with gtest. This does not match
            # x86 targets.
        ;;
        *-iphonesimulator-*)
            soft_enable webm_io
            soft_enable libyuv
        ;;
        *-win*)
            # Some mingw toolchains don't have pthread available by default.
            # Treat these more like visual studio where threading in gtest
            # would be disabled for the same reason.
            check_cxx "$@" <<EOF && soft_enable unit_tests
int z;
EOF
            check_cxx "$@" <<EOF && soft_enable webm_io
int z;
EOF
            check_cxx "$@" <<EOF && soft_enable libyuv
int z;
EOF
        ;;
        *)
            enabled pthread_h && check_cxx "$@" <<EOF && soft_enable unit_tests
int z;
EOF
            check_cxx "$@" <<EOF && soft_enable webm_io
int z;
EOF
            check_cxx "$@" <<EOF && soft_enable libyuv
int z;
EOF
        ;;
    esac
    # libwebm needs to be linked with C++ standard library
    enabled webm_io && LD=${CXX}

    # append any user defined extra cflags
    if [ -n "${extra_cflags}" ] ; then
        check_add_cflags ${extra_cflags} || \
        die "Requested extra CFLAGS '${extra_cflags}' not supported by compiler"
    fi
    if [ -n "${extra_cxxflags}" ]; then
        check_add_cxxflags ${extra_cxxflags} || \
        die "Requested extra CXXFLAGS '${extra_cxxflags}' not supported by compiler"
    fi
}


##
## END APPLICATION SPECIFIC CONFIGURATION
##
CONFIGURE_ARGS="$@"
process "$@"
print_webm_license ${BUILD_PFX}aom_config.c "/*" " */"
cat <<EOF >> ${BUILD_PFX}aom_config.c
#include "aom/aom_codec.h"
static const char* const cfg = "$CONFIGURE_ARGS";
const char *aom_codec_build_config(void) {return cfg;}
EOF