#!/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
    rect_tx
    rect_tx_ext
    tpl_mv
    dual_filter
    convolve_round
    compound_round
    ext_tx
    tx64x64
    ext_intra
    filter_intra
    intra_edge
    intrabc
    interintra
    wedge
    compound_segment
    global_motion
    new_quant
    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
    cfl
    xiphrc
    dct_only
    daala_tx
    daala_tx4
    daala_tx8
    daala_tx16
    daala_tx32
    daala_tx64
    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
    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
    ext_warped_motion
    horzonly_frame_superres
    simple_bwd_adapt
    eob_first
"
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 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 dual_filter
      soft_enable motion_var
      soft_enable warped_motion
      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 loop_restoration
      soft_enable ext_partition
      soft_enable ext_partition_types
      soft_enable new_multisymbol

      # 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
      soft_enable simple_bwd_adapt
      soft_enable loopfilter_level
    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 lv_map && disable_feature mrc_tx
    enabled eob_first && enable_feature lv_map
    enabled eob_first && enable_feature ext_tx
    enabled coef_interleave && disable_feature mrc_tx
    enabled mrc_tx && enable_feature ext_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 ncobmc_adapt_weight && enable_feature motion_var
    enabled bgsprite && enable_feature global_motion
    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 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 horzonly_frame_superres && enable_feature frame_superres
    enabled ext_warped_motion && enable_feature warped_motion

    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_tx4
      enable_feature daala_tx8
      enable_feature daala_tx16
      enable_feature daala_tx32
      enable_feature daala_tx64
    fi
    if enabled daala_tx64 && ! enabled tx64x64; then
      log_echo "daala_tx64 requires tx64x64, so disabling daala_tx64"
      disable_feature daala_tx64
    fi
    if enabled daala_tx4 || enabled daala_tx8 || enabled daala_tx16 ||
        enabled daala_tx32 || enabled daala_tx64; then
      disable_feature txmg
      disable_feature lgt
      enable_feature lowbitdepth
    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 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
    if enabled lpf_sb; then
      log_echo "lpf_sb can't work with loopfilter_level yet."
      log_echo "disabling loopfilter_level"
      disable_feature loopfilter_level
    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="__forceinline"
        ;;
    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
