#!/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_CC="${TMPDIRx}/vpx-conf-$$-${RANDOM}.cc"
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_CC} ${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_CC}
    log_file ${TMP_CC}
    check_cmd ${CXX} ${CXXFLAGS} "$@" -c -o ${TMP_O} ${TMP_CC}
}

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/iPhoneOS6.0.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 && disabled gprof && 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
}
