#!/bin/bash
##
##  configure.sh
##
##  This script is sourced by the main configure script and contains
##  utility functions and other common bits that aren't strictly libvpx
##  related.
##
##  This build system is based in part on the FFmpeg configure script.
##


#
# Logging / Output Functions
#
die_unknown(){
    echo "Unknown option \"$1\"."
    echo "See $0 --help for available options."
    clean_temp_files
    exit 1
}


die() {
    echo "$@"
    echo
    echo "Configuration failed. This could reflect a misconfiguration of your"
    echo "toolchains, improper options selected, or another problem. If you"
    echo "don't see any useful error messages above, the next step is to look"
    echo "at the configure error log file ($logfile) to determine what"
    echo "configure was trying to do when it died."
    clean_temp_files
    exit 1
}


log(){
    echo "$@" >>$logfile
}


log_file(){
    log BEGIN $1
    pr -n -t $1 >>$logfile
    log END $1
}


log_echo() {
    echo "$@"
    log "$@"
}


fwrite () {
    outfile=$1
    shift
    echo "$@" >> ${outfile}
}


show_help_pre(){
    for opt in ${CMDLINE_SELECT}; do
        opt2=`echo $opt | sed -e 's;_;-;g'`
        if enabled $opt; then
            eval "toggle_${opt}=\"--disable-${opt2}\""
        else
            eval "toggle_${opt}=\"--enable-${opt2} \""
        fi
    done

    cat <<EOF
Usage: configure [options]
Options:

Build options:
  --help                      print this message
  --log=yes|no|FILE           file configure log is written to [config.err]
  --target=TARGET             target platform tuple [generic-gnu]
  --cpu=CPU                   optimize for a specific cpu rather than a family
  --extra-cflags=ECFLAGS      add ECFLAGS to CFLAGS [$CFLAGS]
  ${toggle_extra_warnings}    emit harmless warnings (always non-fatal)
  ${toggle_werror}            treat warnings as errors, if possible
                              (not available with all compilers)
  ${toggle_optimizations}     turn on/off compiler optimization flags
  ${toggle_pic}               turn on/off Position Independent Code
  ${toggle_ccache}            turn on/off compiler cache
  ${toggle_debug}             enable/disable debug mode
  ${toggle_gprof}             enable/disable gprof profiling instrumentation
  ${toggle_gcov}              enable/disable gcov coverage instrumentation

Install options:
  ${toggle_install_docs}      control whether docs are installed
  ${toggle_install_bins}      control whether binaries are installed
  ${toggle_install_libs}      control whether libraries are installed
  ${toggle_install_srcs}      control whether sources are installed


EOF
}


show_help_post(){
    cat <<EOF


NOTES:
    Object files are built at the place where configure is launched.

    All boolean options can be negated. The default value is the opposite
    of that shown above. If the option --disable-foo is listed, then
    the default value for foo is enabled.

Supported targets:
EOF
  show_targets ${all_platforms}
  echo
  exit 1
}


show_targets() {
    while [ -n "$*" ]; do
        if [ "${1%%-*}" = "${2%%-*}" ]; then
            if [ "${2%%-*}" = "${3%%-*}" ]; then
                printf "    %-24s %-24s %-24s\n" "$1" "$2" "$3"
                shift; shift; shift
            else
                printf "    %-24s %-24s\n" "$1" "$2"
                shift; shift
            fi
        else
            printf "    %-24s\n" "$1"
            shift
        fi
    done
}


show_help() {
    show_help_pre
    show_help_post
}

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


is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}


add_cflags() {
    CFLAGS="${CFLAGS} $@"
    CXXFLAGS="${CXXFLAGS} $@"
}


add_cflags_only() {
    CFLAGS="${CFLAGS} $@"
}


add_cxxflags_only() {
    CXXFLAGS="${CXXFLAGS} $@"
}


add_ldflags() {
    LDFLAGS="${LDFLAGS} $@"
}


add_asflags() {
    ASFLAGS="${ASFLAGS} $@"
}


add_extralibs() {
    extralibs="${extralibs} $@"
}

#
# Boolean Manipulation Functions
#
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

enabled(){
    eval test "x\$$1" = "xyes"
}

disabled(){
    eval test "x\$$1" = "xno"
}


soft_enable() {
    for var in $*; do
        if ! disabled $var; then
            log_echo "  enabling $var"
            enable $var
        fi
    done
}

soft_disable() {
    for var in $*; do
        if ! enabled $var; then
            log_echo "  disabling $var"
            disable $var
        fi
    done
}


#
# Text Processing Functions
#
toupper(){
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
}


tolower(){
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
}


#
# Temporary File Functions
#
source_path=${0%/*}
enable source_path_used
if test -z "$source_path" -o "$source_path" = "." ; then
    source_path="`pwd`"
    disable source_path_used
fi

if test ! -z "$TMPDIR" ; then
    TMPDIRx="${TMPDIR}"
elif test ! -z "$TEMPDIR" ; then
    TMPDIRx="${TEMPDIR}"
else
    TMPDIRx="/tmp"
fi
TMP_H="${TMPDIRx}/vpx-conf-$$-${RANDOM}.h"
TMP_C="${TMPDIRx}/vpx-conf-$$-${RANDOM}.c"
TMP_O="${TMPDIRx}/vpx-conf-$$-${RANDOM}.o"
TMP_X="${TMPDIRx}/vpx-conf-$$-${RANDOM}.x"
TMP_ASM="${TMPDIRx}/vpx-conf-$$-${RANDOM}.asm"

clean_temp_files() {
    rm -f ${TMP_C} ${TMP_H} ${TMP_O} ${TMP_X} ${TMP_ASM}
}

#
# Toolchain Check Functions
#
check_cmd() {
    enabled external_build && return
    log "$@"
    "$@" >>${logfile} 2>&1
}

check_cc() {
    log check_cc "$@"
    cat >${TMP_C}
    log_file ${TMP_C}
    check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
}

check_cxx() {
    log check_cxx "$@"
    cat >${TMP_C}
    log_file ${TMP_C}
    check_cmd ${CXX} ${CXXFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
}

check_cpp() {
    log check_cpp "$@"
    cat > ${TMP_C}
    log_file ${TMP_C}
    check_cmd ${CC} ${CFLAGS} "$@" -E -o ${TMP_O} ${TMP_C}
}

check_ld() {
    log check_ld "$@"
    check_cc $@ \
        && check_cmd ${LD} ${LDFLAGS} "$@" -o ${TMP_X} ${TMP_O} ${extralibs}
}

check_header(){
    log check_header "$@"
    header=$1
    shift
    var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
    disable $var
    check_cpp "$@" <<EOF && enable $var
#include "$header"
int x;
EOF
}


check_cflags() {
    log check_cflags "$@"
    check_cc "$@" <<EOF
int x;
EOF
}

check_cxxflags() {
    log check_cxxflags "$@"

    # Catch CFLAGS that trigger CXX warnings
    case "$CXX" in
      *g++*) check_cxx -Werror "$@" <<EOF
int x;
EOF
      ;;
      *) check_cxx "$@" <<EOF
int x;
EOF
      ;;
    esac
}

check_add_cflags() {
    check_cxxflags "$@" && add_cxxflags_only "$@"
    check_cflags "$@" && add_cflags_only "$@"
}

check_add_asflags() {
    log add_asflags "$@"
    add_asflags "$@"
}

check_add_ldflags() {
    log add_ldflags "$@"
    add_ldflags "$@"
}

check_asm_align() {
    log check_asm_align "$@"
    cat >${TMP_ASM} <<EOF
section .rodata
align 16
EOF
    log_file ${TMP_ASM}
    check_cmd ${AS} ${ASFLAGS} -o ${TMP_O} ${TMP_ASM}
    readelf -WS ${TMP_O} >${TMP_X}
    log_file ${TMP_X}
    if ! grep -q '\.rodata .* 16$' ${TMP_X}; then
        die "${AS} ${ASFLAGS} does not support section alignment (nasm <=2.08?)"
    fi
}

write_common_config_banner() {
    print_webm_license config.mk "##" ""
    echo '# This file automatically generated by configure. Do not edit!' >> config.mk
    echo "TOOLCHAIN := ${toolchain}" >> config.mk

    case ${toolchain} in
        *-linux-rvct)
            echo "ALT_LIBC := ${alt_libc}" >> config.mk
            ;;
    esac
}

write_common_config_targets() {
    for t in ${all_targets}; do
        if enabled ${t}; then
            if enabled universal || enabled child; then
                fwrite config.mk "ALL_TARGETS += ${t}-${toolchain}"
            else
                fwrite config.mk "ALL_TARGETS += ${t}"
            fi
        fi
    true;
    done
true
}

write_common_target_config_mk() {
    local CC=${CC}
    local CXX=${CXX}
    enabled ccache && CC="ccache ${CC}"
    enabled ccache && CXX="ccache ${CXX}"
    print_webm_license $1 "##" ""

    cat >> $1 << EOF
# This file automatically generated by configure. Do not edit!
SRC_PATH="$source_path"
SRC_PATH_BARE=$source_path
BUILD_PFX=${BUILD_PFX}
TOOLCHAIN=${toolchain}
ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}

CC=${CC}
CXX=${CXX}
AR=${AR}
LD=${LD}
AS=${AS}
STRIP=${STRIP}
NM=${NM}

CFLAGS  = ${CFLAGS}
CXXFLAGS  = ${CXXFLAGS}
ARFLAGS = -rus\$(if \$(quiet),c,v)
LDFLAGS = ${LDFLAGS}
ASFLAGS = ${ASFLAGS}
extralibs = ${extralibs}
AS_SFX    = ${AS_SFX:-.asm}
EXE_SFX   = ${EXE_SFX}
RTCD_OPTIONS = ${RTCD_OPTIONS}
EOF

    if enabled rvct; then cat >> $1 << EOF
fmt_deps = sed -e 's;^__image.axf;\${@:.d=.o} \$@;' #hide
EOF
    else cat >> $1 << EOF
fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\${@:.d=.o} \$@;'
EOF
    fi

    print_config_mk ARCH   "${1}" ${ARCH_LIST}
    print_config_mk HAVE   "${1}" ${HAVE_LIST}
    print_config_mk CONFIG "${1}" ${CONFIG_LIST}
    print_config_mk HAVE   "${1}" gnu_strip

    enabled msvs && echo "CONFIG_VS_VERSION=${vs_version}" >> "${1}"

}


write_common_target_config_h() {
    print_webm_license ${TMP_H} "/*" " */"
    cat >> ${TMP_H} << EOF
/* This file automatically generated by configure. Do not edit! */
#ifndef VPX_CONFIG_H
#define VPX_CONFIG_H
#define RESTRICT    ${RESTRICT}
#define INLINE      ${INLINE}
EOF
    print_config_h ARCH   "${TMP_H}" ${ARCH_LIST}
    print_config_h HAVE   "${TMP_H}" ${HAVE_LIST}
    print_config_h CONFIG "${TMP_H}" ${CONFIG_LIST}
    echo "#endif /* VPX_CONFIG_H */" >> ${TMP_H}
    mkdir -p `dirname "$1"`
    cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
}

process_common_cmdline() {
    for opt in "$@"; do
        optval="${opt#*=}"
        case "$opt" in
        --child) enable child
        ;;
        --log*)
        logging="$optval"
        if ! disabled logging ; then
            enabled logging || logfile="$logging"
        else
            logfile=/dev/null
        fi
        ;;
        --target=*) toolchain="${toolchain:-${optval}}"
        ;;
        --force-target=*) toolchain="${toolchain:-${optval}}"; enable force_toolchain
        ;;
        --cpu)
        ;;
        --cpu=*) tune_cpu="$optval"
        ;;
        --extra-cflags=*)
        extra_cflags="${optval}"
        ;;
        --enable-?*|--disable-?*)
        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
        if echo "${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null; then
            [ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
        elif [ $action = "disable" ] && ! disabled $option ; then
          echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
            die_unknown $opt
        elif [ $action = "enable" ] && ! enabled $option ; then
          echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
            die_unknown $opt
        fi
        $action $option
        ;;
        --require-?*)
        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
        if echo "${ARCH_EXT_LIST}" none | grep "^ *$option\$" >/dev/null; then
            RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
        else
            die_unknown $opt
        fi
        ;;
        --force-enable-?*|--force-disable-?*)
        eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
        $action $option
        ;;
        --libc=*)
        [ -d "${optval}" ] || die "Not a directory: ${optval}"
        disable builtin_libc
        alt_libc="${optval}"
        ;;
        --as=*)
        [ "${optval}" = yasm -o "${optval}" = nasm -o "${optval}" = auto ] \
            || die "Must be yasm, nasm or auto: ${optval}"
        alt_as="${optval}"
        ;;
        --prefix=*)
        prefix="${optval}"
        ;;
        --libdir=*)
        libdir="${optval}"
        ;;
        --sdk-path=*)
        [ -d "${optval}" ] || die "Not a directory: ${optval}"
        sdk_path="${optval}"
        ;;
        --libc|--as|--prefix|--libdir|--sdk-path)
        die "Option ${opt} requires argument"
        ;;
        --help|-h) show_help
        ;;
        *) die_unknown $opt
        ;;
        esac
    done
}

process_cmdline() {
    for opt do
        optval="${opt#*=}"
        case "$opt" in
        *) process_common_cmdline $opt
        ;;
        esac
    done
}


post_process_common_cmdline() {
    prefix="${prefix:-/usr/local}"
    prefix="${prefix%/}"
    libdir="${libdir:-${prefix}/lib}"
    libdir="${libdir%/}"
    if [ "${libdir#${prefix}}" = "${libdir}" ]; then
        die "Libdir ${libdir} must be a subdirectory of ${prefix}"
    fi
}


post_process_cmdline() {
    true;
}

setup_gnu_toolchain() {
        CC=${CC:-${CROSS}gcc}
        CXX=${CXX:-${CROSS}g++}
        AR=${AR:-${CROSS}ar}
        LD=${LD:-${CROSS}${link_with_cc:-ld}}
        AS=${AS:-${CROSS}as}
    STRIP=${STRIP:-${CROSS}strip}
    NM=${NM:-${CROSS}nm}
        AS_SFX=.s
        EXE_SFX=
}

process_common_toolchain() {
    if [ -z "$toolchain" ]; then
        gcctarget="${CHOST:-$(gcc -dumpmachine 2> /dev/null)}"

        # detect tgt_isa
        case "$gcctarget" in
            armv6*)
                tgt_isa=armv6
                ;;
            armv7*-hardfloat*)
                tgt_isa=armv7
                float_abi=hard
                ;;
            armv7*)
                tgt_isa=armv7
                float_abi=softfp
                ;;
            armv5te*)
                tgt_isa=armv5te
                ;;
            *x86_64*|*amd64*)
                tgt_isa=x86_64
                ;;
            *i[3456]86*)
                tgt_isa=x86
                ;;
            *powerpc64*)
                tgt_isa=ppc64
                ;;
            *powerpc*)
                tgt_isa=ppc32
                ;;
            *sparc*)
                tgt_isa=sparc
                ;;
        esac

        # detect tgt_os
        case "$gcctarget" in
            *darwin8*)
                tgt_isa=universal
                tgt_os=darwin8
                ;;
            *darwin9*)
                tgt_isa=universal
                tgt_os=darwin9
                ;;
            *darwin10*)
                tgt_isa=x86_64
                tgt_os=darwin10
                ;;
            *darwin11*)
                tgt_isa=x86_64
                tgt_os=darwin11
                ;;
            *darwin12*)
                tgt_isa=x86_64
                tgt_os=darwin12
                ;;
            x86_64*mingw32*)
                tgt_os=win64
                ;;
            *mingw32*|*cygwin*)
                [ -z "$tgt_isa" ] && tgt_isa=x86
                tgt_os=win32
                ;;
            *linux*|*bsd*)
                tgt_os=linux
                ;;
            *solaris2.10)
                tgt_os=solaris
                ;;
            *os2*)
                tgt_os=os2
                ;;
        esac

        if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
            toolchain=${tgt_isa}-${tgt_os}-gcc
        fi
    fi

    toolchain=${toolchain:-generic-gnu}

    is_in ${toolchain} ${all_platforms} || enabled force_toolchain \
        || die "Unrecognized toolchain '${toolchain}'"

    enabled child || log_echo "Configuring for target '${toolchain}'"

    #
    # Set up toolchain variables
    #
    tgt_isa=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $1}')
    tgt_os=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $2}')
    tgt_cc=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $3}')

    # Mark the specific ISA requested as enabled
    soft_enable ${tgt_isa}
    enable ${tgt_os}
    enable ${tgt_cc}

    # Enable the architecture family
    case ${tgt_isa} in
        arm*) enable arm;;
        mips*) enable mips;;
    esac

    # PIC is probably what we want when building shared libs
    enabled shared && soft_enable pic

    # Handle darwin variants. Newer SDKs allow targeting older
    # platforms, so find the newest SDK available.
    case ${toolchain} in
        *-darwin*)
            if [ -z "${DEVELOPER_DIR}" ]; then
                DEVELOPER_DIR=`xcode-select -print-path 2> /dev/null`
                [ $? -ne 0 ] && OSX_SKIP_DIR_CHECK=1
            fi
            if [ -z "${OSX_SKIP_DIR_CHECK}" ]; then
                OSX_SDK_ROOTS="${DEVELOPER_DIR}/SDKs"
                OSX_SDK_VERSIONS="MacOSX10.4u.sdk MacOSX10.5.sdk MacOSX10.6.sdk"
                OSX_SDK_VERSIONS="${OSX_SDK_VERSIONS} MacOSX10.7.sdk"
                for v in ${OSX_SDK_VERSIONS}; do
                    if [ -d "${OSX_SDK_ROOTS}/${v}" ]; then
                        osx_sdk_dir="${OSX_SDK_ROOTS}/${v}"
                    fi
                done
            fi
            ;;
    esac

    if [ -d "${osx_sdk_dir}" ]; then
        add_cflags  "-isysroot ${osx_sdk_dir}"
        add_ldflags "-isysroot ${osx_sdk_dir}"
    fi

    case ${toolchain} in
        *-darwin8-*)
            add_cflags  "-mmacosx-version-min=10.4"
            add_ldflags "-mmacosx-version-min=10.4"
            ;;
        *-darwin9-*)
            add_cflags  "-mmacosx-version-min=10.5"
            add_ldflags "-mmacosx-version-min=10.5"
            ;;
        *-darwin10-*)
            add_cflags  "-mmacosx-version-min=10.6"
            add_ldflags "-mmacosx-version-min=10.6"
            ;;
        *-darwin11-*)
            add_cflags  "-mmacosx-version-min=10.7"
            add_ldflags "-mmacosx-version-min=10.7"
            ;;
        *-darwin12-*)
            add_cflags  "-mmacosx-version-min=10.8"
            add_ldflags "-mmacosx-version-min=10.8"
            ;;
    esac

    # Handle Solaris variants. Solaris 10 needs -lposix4
    case ${toolchain} in
        sparc-solaris-*)
            add_extralibs -lposix4
            disable fast_unaligned
            ;;
        *-solaris-*)
            add_extralibs -lposix4
            ;;
    esac

    # Process ARM architecture variants
    case ${toolchain} in
    arm*)
        # on arm, isa versions are supersets
        case ${tgt_isa} in
        armv7)
            soft_enable neon
            soft_enable media
            soft_enable edsp
            soft_enable fast_unaligned
            ;;
        armv6)
            soft_enable media
            soft_enable edsp
            soft_enable fast_unaligned
            ;;
        armv5te)
            soft_enable edsp
            disable fast_unaligned
            ;;
        esac

        asm_conversion_cmd="cat"

        case ${tgt_cc} in
        gcc)
            CROSS=${CROSS:-arm-none-linux-gnueabi-}
            link_with_cc=gcc
            setup_gnu_toolchain
            arch_int=${tgt_isa##armv}
            arch_int=${arch_int%%te}
            check_add_asflags --defsym ARCHITECTURE=${arch_int}
            tune_cflags="-mtune="
            if [ ${tgt_isa} == "armv7" ]; then
                [ -z "${float_abi}" ] && float_abi=softfp
                check_add_cflags  -march=armv7-a -mfloat-abi=${float_abi}
                check_add_asflags -march=armv7-a -mfloat-abi=${float_abi}

                if enabled neon
                then
                    check_add_cflags -mfpu=neon #-ftree-vectorize
                    check_add_asflags -mfpu=neon
                fi

                if [ -z "${tune_cpu}" ]; then
                    tune_cpu=cortex-a8
                fi
            else
                check_add_cflags -march=${tgt_isa}
                check_add_asflags -march=${tgt_isa}
            fi

            enabled debug && add_asflags -g
            asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
            ;;
        rvct)
            CC=armcc
            AR=armar
            AS=armasm
            LD=${source_path}/build/make/armlink_adapter.sh
            STRIP=arm-none-linux-gnueabi-strip
            NM=arm-none-linux-gnueabi-nm
            tune_cflags="--cpu="
            tune_asflags="--cpu="
            if [ -z "${tune_cpu}" ]; then
                if [ ${tgt_isa} == "armv7" ]; then
                    if enabled neon
                    then
                        check_add_cflags --fpu=softvfp+vfpv3
                        check_add_asflags --fpu=softvfp+vfpv3
                    fi
                    check_add_cflags --cpu=Cortex-A8
                    check_add_asflags --cpu=Cortex-A8
                else
                    check_add_cflags --cpu=${tgt_isa##armv}
                    check_add_asflags --cpu=${tgt_isa##armv}
                fi
            fi
            arch_int=${tgt_isa##armv}
            arch_int=${arch_int%%te}
            check_add_asflags --pd "\"ARCHITECTURE SETA ${arch_int}\""
            enabled debug && add_asflags -g
            add_cflags --gnu
            add_cflags --enum_is_int
            add_cflags --wchar32
        ;;
        esac

        case ${tgt_os} in
        none*)
            disable multithread
            disable os_support
            ;;

        android*)
            SDK_PATH=${sdk_path}
            COMPILER_LOCATION=`find "${SDK_PATH}" \
                               -name "arm-linux-androideabi-gcc*" -print -quit`
            TOOLCHAIN_PATH=${COMPILER_LOCATION%/*}/arm-linux-androideabi-
            CC=${TOOLCHAIN_PATH}gcc
            CXX=${TOOLCHAIN_PATH}g++
            AR=${TOOLCHAIN_PATH}ar
            LD=${TOOLCHAIN_PATH}gcc
            AS=${TOOLCHAIN_PATH}as
            STRIP=${TOOLCHAIN_PATH}strip
            NM=${TOOLCHAIN_PATH}nm

            if [ -z "${alt_libc}" ]; then
                alt_libc=`find "${SDK_PATH}" -name arch-arm -print | \
                          awk '{n = split($0,a,"/"); \
                                split(a[n-1],b,"-"); \
                                print $0 " " b[2]}' | \
                          sort -g -k 2 | \
                          awk '{ print $1 }' | tail -1`
            fi

            add_cflags "--sysroot=${alt_libc}"
            add_ldflags "--sysroot=${alt_libc}"

            # linker flag that routes around a CPU bug in some
            # Cortex-A8 implementations (NDK Dev Guide)
            add_ldflags "-Wl,--fix-cortex-a8"

            enable pic
            soft_enable realtime_only
            if [ ${tgt_isa} == "armv7" ]; then
                soft_enable runtime_cpu_detect
            fi
            if enabled runtime_cpu_detect; then
                add_cflags "-I${SDK_PATH}/sources/android/cpufeatures"
            fi
          ;;

        darwin*)
            if [ -z "${sdk_path}" ]; then
                SDK_PATH=`xcode-select -print-path 2> /dev/null`
                SDK_PATH=${SDK_PATH}/Platforms/iPhoneOS.platform/Developer
            else
                SDK_PATH=${sdk_path}
            fi
            TOOLCHAIN_PATH=${SDK_PATH}/usr/bin
            CXX=${TOOLCHAIN_PATH}/g++
            CC=${TOOLCHAIN_PATH}/gcc
            AR=${TOOLCHAIN_PATH}/ar
            LD=${TOOLCHAIN_PATH}/arm-apple-darwin10-llvm-gcc-4.2
            AS=${TOOLCHAIN_PATH}/as
            STRIP=${TOOLCHAIN_PATH}/strip
            NM=${TOOLCHAIN_PATH}/nm
            AS_SFX=.s

            # ASFLAGS is written here instead of using check_add_asflags
            # because we need to overwrite all of ASFLAGS and purge the
            # options that were put in above
            ASFLAGS="-version -arch ${tgt_isa} -g"

            add_cflags -arch ${tgt_isa}
            add_ldflags -arch_only ${tgt_isa}

            if [ -z "${alt_libc}" ]; then
                alt_libc=${SDK_PATH}/SDKs/iPhoneOS5.1.sdk
            fi

            add_cflags  "-isysroot ${alt_libc}"

            # Add the paths for the alternate libc
            for d in usr/include; do
                try_dir="${alt_libc}/${d}"
                [ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
            done

            for d in lib usr/lib usr/lib/system; do
                try_dir="${alt_libc}/${d}"
                [ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
            done

            asm_conversion_cmd="${source_path}/build/make/ads2gas_apple.pl"
         ;;

        linux*)
            enable linux
            if enabled rvct; then
                # Check if we have CodeSourcery GCC in PATH. Needed for
                # libraries
                hash arm-none-linux-gnueabi-gcc 2>&- || \
                  die "Couldn't find CodeSourcery GCC from PATH"

                # Use armcc as a linker to enable translation of
                # some gcc specific options such as -lm and -lpthread.
                LD="armcc --translate_gcc"

                # create configuration file (uses path to CodeSourcery GCC)
                armcc --arm_linux_configure --arm_linux_config_file=arm_linux.cfg

                add_cflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
                add_asflags --no_hide_all --apcs=/interwork
                add_ldflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
                enabled pic && add_cflags --apcs=/fpic
                enabled pic && add_asflags --apcs=/fpic
                enabled shared && add_cflags --shared
            fi
        ;;

        esac
    ;;
    mips*)
        link_with_cc=gcc
        setup_gnu_toolchain
        tune_cflags="-mtune="
        if enabled dspr2; then
            check_add_cflags -mips32r2 -mdspr2
            disable fast_unaligned
        fi
        check_add_cflags -march=${tgt_isa}
        check_add_asflags -march=${tgt_isa}
        check_add_asflags -KPIC
    ;;
    ppc*)
        enable ppc
        bits=${tgt_isa##ppc}
        link_with_cc=gcc
        setup_gnu_toolchain
        add_asflags -force_cpusubtype_ALL -I"\$(dir \$<)darwin"
        soft_enable altivec
        enabled altivec && add_cflags -maltivec

        case "$tgt_os" in
        linux*)
            add_asflags -maltivec -mregnames -I"\$(dir \$<)linux"
        ;;
        darwin*)
            darwin_arch="-arch ppc"
            enabled ppc64 && darwin_arch="${darwin_arch}64"
            add_cflags  ${darwin_arch} -m${bits} -fasm-blocks
            add_asflags ${darwin_arch} -force_cpusubtype_ALL -I"\$(dir \$<)darwin"
            add_ldflags ${darwin_arch} -m${bits}
            enabled altivec && add_cflags -faltivec
        ;;
        esac
    ;;
    x86*)
        bits=32
        enabled x86_64 && bits=64
        check_cpp <<EOF && bits=x32
#ifndef __ILP32__
#error "not x32"
#endif
EOF

        case  ${tgt_os} in
            win*)
                enabled gcc && add_cflags -fno-common
                ;;
            solaris*)
                CC=${CC:-${CROSS}gcc}
                CXX=${CXX:-${CROSS}g++}
                LD=${LD:-${CROSS}gcc}
                CROSS=${CROSS:-g}
                ;;
            os2)
                AS=${AS:-nasm}
                ;;
        esac

        AS="${alt_as:-${AS:-auto}}"
        case  ${tgt_cc} in
            icc*)
                CC=${CC:-icc}
                LD=${LD:-icc}
                setup_gnu_toolchain
                add_cflags -use-msasm -use-asm
                add_ldflags -i-static
                enabled x86_64 && add_cflags -ipo -no-prec-div -static -xSSE2 -axSSE2
                enabled x86_64 && AR=xiar
                case ${tune_cpu} in
                    atom*)
                        tune_cflags="-x"
                        tune_cpu="SSE3_ATOM"
                    ;;
                    *)
                        tune_cflags="-march="
                    ;;
                esac
            ;;
            gcc*)
                add_cflags -m${bits}
                add_ldflags -m${bits}
                link_with_cc=gcc
                tune_cflags="-march="
                setup_gnu_toolchain
                #for 32 bit x86 builds, -O3 did not turn on this flag
                enabled optimizations && check_add_cflags -fomit-frame-pointer
            ;;
            vs*)
                # When building with Microsoft Visual Studio the assembler is
                # invoked directly. Checking at configure time is unnecessary.
                # Skip the check by setting AS arbitrarily
                AS=msvs
            ;;
        esac

        soft_enable runtime_cpu_detect
        soft_enable mmx
        soft_enable sse
        soft_enable sse2
        soft_enable sse3
        soft_enable ssse3
        # We can't use 'check_cflags' until the compiler is configured and CC is
        # populated.
        if enabled gcc && ! disabled sse4_1 && ! check_cflags -msse4; then
            RTCD_OPTIONS="${RTCD_OPTIONS}--disable-sse4_1 "
        else
            soft_enable sse4_1
        fi

        case "${AS}" in
            auto|"")
                which nasm >/dev/null 2>&1 && AS=nasm
                which yasm >/dev/null 2>&1 && AS=yasm
                [ "${AS}" = auto -o -z "${AS}" ] \
                    && die "Neither yasm nor nasm have been found"
            ;;
        esac
        log_echo "  using $AS"
        [ "${AS##*/}" = nasm ] && add_asflags -Ox
        AS_SFX=.asm
        case  ${tgt_os} in
            win32)
                add_asflags -f win32
                enabled debug && add_asflags -g cv8
                EXE_SFX=.exe
            ;;
            win64)
                add_asflags -f x64
                enabled debug && add_asflags -g cv8
                EXE_SFX=.exe
            ;;
            linux*|solaris*|android*)
                add_asflags -f elf${bits}
                enabled debug && [ "${AS}" = yasm ] && add_asflags -g dwarf2
                enabled debug && [ "${AS}" = nasm ] && add_asflags -g
                [ "${AS##*/}" = nasm ] && check_asm_align
            ;;
            darwin*)
                add_asflags -f macho${bits}
                enabled x86 && darwin_arch="-arch i386" || darwin_arch="-arch x86_64"
                add_cflags  ${darwin_arch}
                add_ldflags ${darwin_arch}
                # -mdynamic-no-pic is still a bit of voodoo -- it was required at
                # one time, but does not seem to be now, and it breaks some of the
                # code that still relies on inline assembly.
                # enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
                enabled icc && ! enabled pic && add_cflags -fno-pic
            ;;
            os2)
                add_asflags -f aout
                enabled debug && add_asflags -g
                EXE_SFX=.exe
            ;;
            *) log "Warning: Unknown os $tgt_os while setting up $AS flags"
            ;;
        esac
    ;;
    universal*|*-gcc|generic-gnu)
        link_with_cc=gcc
        enable gcc
    setup_gnu_toolchain
    ;;
    esac

    # Try to enable CPU specific tuning
    if [ -n "${tune_cpu}" ]; then
        if [ -n "${tune_cflags}" ]; then
            check_add_cflags ${tune_cflags}${tune_cpu} || \
                die "Requested CPU '${tune_cpu}' not supported by compiler"
        fi
    if [ -n "${tune_asflags}" ]; then
            check_add_asflags ${tune_asflags}${tune_cpu} || \
                die "Requested CPU '${tune_cpu}' not supported by assembler"
        fi
    if [ -z "${tune_cflags}${tune_asflags}" ]; then
            log_echo "Warning: CPU tuning not supported by this toolchain"
        fi
    fi

    enabled debug && check_add_cflags -g && check_add_ldflags -g
    enabled gprof && check_add_cflags -pg && check_add_ldflags -pg
    enabled gcov &&
        check_add_cflags -fprofile-arcs -ftest-coverage &&
        check_add_ldflags -fprofile-arcs -ftest-coverage

    if enabled optimizations; then
        if enabled rvct; then
            enabled small && check_add_cflags -Ospace || check_add_cflags -Otime
        else
            enabled small && check_add_cflags -O2 ||  check_add_cflags -O3
        fi
    fi

    # Position Independent Code (PIC) support, for building relocatable
    # shared objects
    enabled gcc && enabled pic && check_add_cflags -fPIC

    # Work around longjmp interception on glibc >= 2.11, to improve binary
    # compatibility. See http://code.google.com/p/webm/issues/detail?id=166
    enabled linux && check_add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

    # Check for strip utility variant
    ${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable gnu_strip

    # Try to determine target endianness
    check_cc <<EOF
    unsigned int e = 'O'<<24 | '2'<<16 | 'B'<<8 | 'E';
EOF
    [ -f "${TMP_O}" ] && od -A n -t x1 "${TMP_O}" | tr -d '\n' |
        grep '4f *32 *42 *45' >/dev/null 2>&1 && enable big_endian

    # Try to find which inline keywords are supported
    check_cc <<EOF && INLINE="inline"
    static inline function() {}
EOF
    check_cc <<EOF && INLINE="__attribute__((always_inline))"
    static __attribute__((always_inline)) function() {}
EOF

    # Almost every platform uses pthreads.
    if enabled multithread; then
        case ${toolchain} in
            *-win*-vs*);;
            *-android-gcc);;
            *) check_header pthread.h && add_extralibs -lpthread
        esac
    fi

    # only for MIPS platforms
    case ${toolchain} in
        mips*)
            if enabled dspr2; then
                if enabled big_endian; then
                    echo "dspr2 optimizations are available only for little endian platforms"
                    disable dspr2
                fi
            fi
        ;;
    esac

    # glibc needs these
    if enabled linux; then
        add_cflags -D_LARGEFILE_SOURCE
        add_cflags -D_FILE_OFFSET_BITS=64
    fi

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

process_toolchain() {
    process_common_toolchain
}

print_config_mk() {
    local prefix=$1
    local makefile=$2
    shift 2
    for cfg; do
        upname="`toupper $cfg`"
        if enabled $cfg; then
            echo "${prefix}_${upname}=yes" >> $makefile
        fi
    done
}

print_config_h() {
    local prefix=$1
    local header=$2
    shift 2
    for cfg; do
        upname="`toupper $cfg`"
        if enabled $cfg; then
            echo "#define ${prefix}_${upname} 1" >> $header
        else
            echo "#define ${prefix}_${upname} 0" >> $header
        fi
    done
}

print_webm_license() {
    local destination=$1
    local prefix=$2
    local suffix=$3
    shift 3
    cat <<EOF > ${destination}
${prefix} Copyright (c) 2011 The WebM project authors. All Rights Reserved.${suffix}
${prefix} ${suffix}
${prefix} Use of this source code is governed by a BSD-style license${suffix}
${prefix} that can be found in the LICENSE file in the root of the source${suffix}
${prefix} tree. An additional intellectual property rights grant can be found${suffix}
${prefix} in the file PATENTS.  All contributing project authors may${suffix}
${prefix} be found in the AUTHORS file in the root of the source tree.${suffix}
EOF
}

process_targets() {
    true;
}

process_detect() {
    true;
}

enable logging
logfile="config.err"
self=$0
process() {
    cmdline_args="$@"
    process_cmdline "$@"
    if enabled child; then
        echo "# ${self} $@" >> ${logfile}
    else
        echo "# ${self} $@" > ${logfile}
    fi
    post_process_common_cmdline
    post_process_cmdline
    process_toolchain
    process_detect
    process_targets

    OOT_INSTALLS="${OOT_INSTALLS}"
    if enabled source_path_used; then
    # Prepare the PWD for building.
    for f in ${OOT_INSTALLS}; do
            install -D ${source_path}/$f $f
    done
    fi
    cp ${source_path}/build/make/Makefile .

    clean_temp_files
    true
}
