#!/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_ext
    tpl_mv
    short_filter
    dual_filter
    convolve_round
    compound_round
    tx64x64
    ext_intra
    filter_intra
    intra_edge
    ext_intra_mod
    intrabc
    new_quant
    ans
    loop_restoration
    striped_loop_restoration
    ext_partition
    ext_partition_types
    ext_partition_types_ab
    unpoison_partition_ctx
    ext_tile
    ncobmc
    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
    frame_size
    ext_delta_q
    adapt_scan
    parallel_deblocking
    deblock_13tap
    loopfiltering_across_tiles
    tempmv_signaling
    rd_debug
    reference_buffer
    entropy_stats
    masked_tx
    dependent_horztiles
    dist_8x8
    palette_throughput
    ref_adapt
    lv_map
    ctx1d
    txk_sel
    mv_compress
    segment_globalmv
    frame_superres
    new_multisymbol
    compound_singleref
    aom_qm
    ext_qm
    ext_comp_refs
    bgsprite
    var_tx_no_tx_mode
    simplify_tx_mode
    mrc_tx
    loopfilter_level
    no_frame_context_signaling
    txmg
    max_tile
    hash_me
    colorspace_headers
    mfmv
    frame_marker
    jnt_comp
    frame_sign_bias
    ext_skip
    obu
    add_4bytes_obusize
    amvr
    lpf_sb
    opt_ref_mv
    tmv
    ext_warped_motion
    horzonly_frame_superres
    simple_bwd_adapt
    eob_first
    eighth_pel_mv_only
    mono_video
    q_segmentation
"
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 cdef
      soft_enable cdef_singlepass
      soft_enable ext_intra
      soft_enable intra_edge
      soft_enable mv_compress
      soft_enable dual_filter
      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 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
      soft_enable cfl
      soft_enable deblock_13tap
      soft_enable frame_marker
      soft_enable kf_ctx
      soft_enable striped_loop_restoration
      soft_enable ext_intra_mod
      soft_enable palette_delta_encoding
      soft_enable frame_size
    fi

    # Enable low-bitdepth pixel pipeline by default
    soft_enable lowbitdepth

    # Enable LBD/HBD txfm consistency tool
    soft_enable txmg

    # Enable using 8x8 TMV to realize the decoder speedup.
    soft_enable tmv

    # Fix up experiment dependencies
    enabled lv_map && disable_feature mrc_tx
    enabled eob_first && enable_feature lv_map
    enabled txk_sel && soft_enable lv_map
    enabled ctx1d && soft_enable lv_map
    enabled compound_round && soft_enable convolve_round
    enabled ext_intra_mod && enable_feature intra_edge
    enabled intra_edge && enable_feature ext_intra
    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 loopfilter_level && enable_feature parallel_deblocking
    enabled loopfilter_level && enable_feature ext_delta_q
    enabled striped_loop_restoration && enable_feature loop_restoration

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