#!/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
    ext_tx
    tx64x64
    ext_intra
    filter_intra
    intra_edge
    ext_intra_mod
    intrabc
    interintra
    wedge
    compound_segment
    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
    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 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 loopfilter_level
      soft_enable deblock_13tap
    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 ext_intra_mod && enable_feature intra_edge
    enabled intra_edge && enable_feature ext_intra
    enabled ncobmc_adapt_weight && enable_feature motion_var
    enabled ext_comp_refs && enable_feature one_sided_compound
    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
    enabled loopfilter_level && enable_feature parallel_deblocking
    enabled loopfilter_level && enable_feature ext_delta_q

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