#!/bin/sh

# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/bash is.
if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then
    POSIX_SHELL="true"
    export POSIX_SHELL
    exec /usr/bin/env bash $0 "$@"
fi
unset POSIX_SHELL # clear it so if we invoke other scripts, they run as bash as well

msg() {
    echo "configure: $*"
}

step_msg() {
    msg
    msg "$1"
    msg
}

warn() {
    echo "configure: WARNING: $1"
}

err() {
    echo "configure: error: $1"
    exit 1
}

run() {
    msg "$@"
    "$@"
}

need_ok() {
    if [ $? -ne 0 ]
    then
        err "$1"
    fi
}

need_cmd() {
    if command -v $1 >/dev/null 2>&1
    then msg "found program '$1'"
    else err "program '$1' is missing, please install it"
    fi
}

make_dir() {
    if [ ! -d $1 ]
    then
        run mkdir -p $1
    fi
}

copy_if_changed() {
    if cmp -s $1 $2
    then
        msg "leaving $2 unchanged"
    else
        run cp -f $1 $2
        chmod u-w $2 # make copied artifact read-only
    fi
}

move_if_changed() {
    if cmp -s $1 $2
    then
        msg "leaving $2 unchanged"
    else
        run mv -f $1 $2
        chmod u-w $2 # make moved artifact read-only
    fi
}

putvar() {
    local T
    eval T=\$$1
    eval TLEN=\${#$1}
    if [ $TLEN -gt 35 ]
    then
        printf "configure: %-20s := %.35s ...\n" $1 "$T"
    else
        printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
    fi
    printf "%-20s := %s\n" $1 "$T" >>config.tmp
}

putpathvar() {
    local T
    eval T=\$$1
    eval TLEN=\${#$1}
    if [ $TLEN -gt 35 ]
    then
        printf "configure: %-20s := %.35s ...\n" $1 "$T"
    else
        printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
    fi
    if [ -z "$T" ]
    then
        printf "%-20s := \n" $1 >>config.tmp
    else
        printf "%-20s := \"%s\"\n" $1 "$T" >>config.tmp
    fi
}

probe() {
    local V=$1
    shift
    local P
    local T
    for P
    do
        T=$(command -v $P 2>&1)
        if [ $? -eq 0 ]
        then
            VER0=$($P --version 2>/dev/null \
                |  grep -o '[vV]\?[0-9][0-9.][a-z0-9.-]*' | head -1 )
            if [ $? -eq 0 -a "x${VER0}" != "x" ]
            then
              VER="($VER0)"
            else
              VER=""
            fi
            break
        else
            VER=""
            T=""
        fi
    done
    eval $V=\$T
    putpathvar $V "$VER"
}

probe_need() {
    local V=$1
    probe $*
    eval VV=\$$V
    if [ -z "$VV" ]
    then
        err "needed, but unable to find any of: $*"
    fi
}

validate_opt () {
    for arg in $CFG_CONFIGURE_ARGS
    do
        isArgValid=0
        for option in $BOOL_OPTIONS
        do
            if test --disable-$option = $arg
            then
                isArgValid=1
            fi
            if test --enable-$option = $arg
            then
                isArgValid=1
            fi
        done
        for option in $VAL_OPTIONS
        do
            if echo "$arg" | grep -q -- "--$option="
            then
                isArgValid=1
            fi
        done
        if [ "$arg" = "--help" ]
        then
            echo
            echo "No more help available for Configure options,"
            echo "check the Wiki or join our IRC channel"
            break
        else
            if test $isArgValid -eq 0
            then
                err "Option '$arg' is not recognized"
            fi
        fi
    done
}

# `valopt OPTION_NAME DEFAULT DOC` extracts a string-valued option
# from command line, using provided default value for the option if
# not present, and saves it to the generated config.mk.
#
# `valopt_nosave` is much the same, except that it does not save the
# result to config.mk (instead the script should use `putvar` itself
# later on to save it).  `valopt_core` is the core upon which the
# other two are built.

valopt_core() {
    VAL_OPTIONS="$VAL_OPTIONS $2"

    local SAVE=$1
    local OP=$2
    local DEFAULT=$3
    shift
    shift
    shift
    local DOC="$*"
    if [ $HELP -eq 0 ]
    then
        local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
        local V="CFG_${UOP}"
        local V_PROVIDED="${V}_PROVIDED"
        eval $V="$DEFAULT"
        for arg in $CFG_CONFIGURE_ARGS
        do
            if echo "$arg" | grep -q -- "--$OP="
            then
                val=$(echo "$arg" | cut -f2 -d=)
                eval $V=$val
                eval $V_PROVIDED=1
            fi
        done
        if [ "$SAVE" = "save" ]
        then
            putvar $V
        fi
    else
        if [ -z "$DEFAULT" ]
        then
            DEFAULT="<none>"
        fi
        OP="${OP}=[${DEFAULT}]"
        printf "    --%-30s %s\n" "$OP" "$DOC"
    fi
}

valopt_nosave() {
    valopt_core nosave "$@"
}

valopt() {
    valopt_core save "$@"
}

# `opt OPTION_NAME DEFAULT DOC` extracts a boolean-valued option from
# command line, using the provided default value (0/1) for the option
# if not present, and saves it to the generated config.mk.
#
# `opt_nosave` is much the same, except that it does not save the
# result to config.mk (instead the script should use `putvar` itself
# later on to save it).  `opt_core` is the core upon which the other
# two are built.

opt_core() {
    BOOL_OPTIONS="$BOOL_OPTIONS $2"

    local SAVE=$1
    local OP=$2
    local DEFAULT=$3
    shift
    shift
    shift
    local DOC="$*"
    local FLAG=""

    if [ $DEFAULT -eq 0 ]
    then
        FLAG="enable"
        DEFAULT_FLAG="disable"
    else
        FLAG="disable"
        DEFAULT_FLAG="enable"
        DOC="don't $DOC"
    fi

    if [ $HELP -eq 0 ]
    then
        for arg in $CFG_CONFIGURE_ARGS
        do
            if [ "$arg" = "--${FLAG}-${OP}" ]
            then
                OP=$(echo $OP | tr 'a-z-' 'A-Z_')
                FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
                local V="CFG_${FLAG}_${OP}"
                local V_PROVIDED="CFG_${FLAG}_${OP}_PROVIDED"
                eval $V=1
                eval $V_PROVIDED=1
                if [ "$SAVE" = "save" ]
                then
                   putvar $V
                fi
            elif [ "$arg" = "--${DEFAULT_FLAG}-${OP}" ]
            then
                OP=$(echo $OP | tr 'a-z-' 'A-Z_')
                DEFAULT_FLAG=$(echo $DEFAULT_FLAG | tr 'a-z' 'A-Z')
                local V_PROVIDED="CFG_${DEFAULT_FLAG}_${OP}_PROVIDED"
                eval $V_PROVIDED=1
            fi
        done
    else
        if [ -n "$META" ]
        then
            OP="$OP=<$META>"
        fi
        printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
     fi
}

opt_nosave() {
    opt_core nosave "$@"
}

opt() {
    opt_core save "$@"
}

envopt() {
    local NAME=$1
    local V="CFG_${NAME}"
    eval VV=\$$V

    # If configure didn't set a value already, then check environment.
    #
    # (It is recommended that the configure script always check the
    # environment before setting any values to envopt variables; see
    # e.g.  how CFG_CC is handled, where it first checks `-z "$CC"`,
    # and issues msg if it ends up employing that provided value.)
    if [ -z "$VV" ]
    then
        eval $V=\$$NAME
        eval VV=\$$V
    fi

    # If script or environment provided a value, save it.
    if [ -n "$VV" ]
    then
        putvar $V
    fi
}

enable_if_not_disabled() {
    local OP=$1
    local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
    local ENAB_V="CFG_ENABLE_$UOP"
    local EXPLICITLY_DISABLED="CFG_DISABLE_${UOP}_PROVIDED"
    eval VV=\$$EXPLICITLY_DISABLED
    if [ -z "$VV" ]; then
        eval $ENAB_V=1
    fi
}

to_gnu_triple() {
    case $1 in
        i686-pc-windows-gnu) echo i686-w64-mingw32 ;;
        x86_64-pc-windows-gnu) echo x86_64-w64-mingw32 ;;
        *) echo $1 ;;
    esac
}

# Prints the absolute path of a directory to stdout
abs_path() {
    local _path="$1"
    # Unset CDPATH because it causes havok: it makes the destination unpredictable
    # and triggers 'cd' to print the path to stdout. Route `cd`'s output to /dev/null
    # for good measure.
    (unset CDPATH && cd "$_path" > /dev/null && pwd)
}

msg "looking for configure programs"
need_cmd cmp
need_cmd mkdir
need_cmd printf
need_cmd cut
need_cmd head
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
need_cmd uname
need_cmd date
need_cmd tr
need_cmd sed
need_cmd file
need_cmd make

msg "inspecting environment"

CFG_OSTYPE=$(uname -s)
CFG_CPUTYPE=$(uname -m)

if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
then
    # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
    # instead.
    if sysctl hw.optional.x86_64 | grep -q ': 1'
    then
        CFG_CPUTYPE=x86_64
    fi
fi

# The goal here is to come up with the same triple as LLVM would,
# at least for the subset of platforms we're willing to target.

case $CFG_OSTYPE in

    Linux)
        CFG_OSTYPE=unknown-linux-gnu
        ;;

    FreeBSD)
        CFG_OSTYPE=unknown-freebsd
        ;;

    DragonFly)
        CFG_OSTYPE=unknown-dragonfly
        ;;

    Bitrig)
        CFG_OSTYPE=unknown-bitrig
        ;;

    OpenBSD)
        CFG_OSTYPE=unknown-openbsd
       ;;

    NetBSD)
	    CFG_OSTYPE=unknown-netbsd
	    ;;

    Darwin)
        CFG_OSTYPE=apple-darwin
        ;;

    SunOS)
        CFG_OSTYPE=sun-solaris
        CFG_CPUTYPE=$(isainfo -n)
        ;;

    MINGW*)
        # msys' `uname` does not print gcc configuration, but prints msys
        # configuration. so we cannot believe `uname -m`:
        # msys1 is always i686 and msys2 is always x86_64.
        # instead, msys defines $MSYSTEM which is MINGW32 on i686 and
        # MINGW64 on x86_64.
        CFG_CPUTYPE=i686
        CFG_OSTYPE=pc-windows-gnu
        if [ "$MSYSTEM" = MINGW64 ]
        then
            CFG_CPUTYPE=x86_64
        fi
        ;;

    MSYS*)
        CFG_OSTYPE=pc-windows-gnu
        ;;

# Thad's Cygwin identifiers below

#   Vista 32 bit
    CYGWIN_NT-6.0)
        CFG_OSTYPE=pc-windows-gnu
        CFG_CPUTYPE=i686
        ;;

#   Vista 64 bit
    CYGWIN_NT-6.0-WOW64)
        CFG_OSTYPE=pc-windows-gnu
        CFG_CPUTYPE=x86_64
        ;;

#   Win 7 32 bit
    CYGWIN_NT-6.1)
        CFG_OSTYPE=pc-windows-gnu
        CFG_CPUTYPE=i686
        ;;

#   Win 7 64 bit
    CYGWIN_NT-6.1-WOW64)
        CFG_OSTYPE=pc-windows-gnu
        CFG_CPUTYPE=x86_64
        ;;

#   Win 8 # uname -s on 64-bit cygwin does not contain WOW64, so simply use uname -m to detect arch (works in my install)
    CYGWIN_NT-6.3)
    	CFG_OSTYPE=pc-windows-gnu
    	;;
# We do not detect other OS such as XP/2003 using 64 bit using uname.
# If we want to in the future, we will need to use Cygwin - Chuck's csih helper in /usr/lib/csih/winProductName.exe or alternative.
    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
        CFG_CPUTYPE=i686
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

    armv7l)
        CFG_CPUTYPE=arm
        CFG_OSTYPE="${CFG_OSTYPE}eabihf"
        ;;

    aarch64)
        CFG_CPUTYPE=aarch64
        ;;

    powerpc | ppc)
        CFG_CPUTYPE=powerpc
        ;;

    powerpc64 | ppc64)
        CFG_CPUTYPE=powerpc64
        ;;

    powerpc64le | ppc64le)
        CFG_CPUTYPE=powerpc64le
        ;;

    x86_64 | x86-64 | x64 | amd64)
        CFG_CPUTYPE=x86_64
        ;;

    *)
        err "unknown CPU type: $CFG_CPUTYPE"
esac

# Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
then
    # $SHELL does not exist in standard 'sh', so probably only exists
    # if configure is running in an interactive bash shell. /usr/bin/env
    # exists *everywhere*.
    BIN_TO_PROBE="$SHELL"
    if [ ! -r "$BIN_TO_PROBE" ]; then
        if [ -r "/usr/bin/env" ]; then
            BIN_TO_PROBE="/usr/bin/env"
        else
            warn "Cannot check if the userland is i686 or x86_64"
        fi
    fi
    file -L "$BIN_TO_PROBE" | grep -q "x86[_-]64"
    if [ $? != 0 ]; then
        msg "i686 userland on x86_64 Linux kernel"
        CFG_CPUTYPE=i686
    fi
fi


DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"

CFG_SRC_DIR="$(abs_path $(dirname $0))/"
CFG_SRC_DIR_RELATIVE="$(dirname $0)/"
CFG_BUILD_DIR="$(pwd)/"
CFG_SELF="$0"
CFG_CONFIGURE_ARGS="$@"


case "${CFG_SRC_DIR}" in
    *\ * )
        err "The path to the rust source directory contains spaces, which is not supported"
        ;;
    *)
        ;;
esac


OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
    echo
    echo "Usage: $CFG_SELF [options]"
    echo
    echo "Options:"
    echo
else
    msg "recreating config.tmp"
    echo '' >config.tmp

    step_msg "processing $CFG_SELF args"
fi

BOOL_OPTIONS=""
VAL_OPTIONS=""

opt debug 0 "debug mode; disables optimization unless \`--enable-optimize\` given"
opt valgrind 0 "run tests with valgrind (memcheck by default)"
opt helgrind 0 "run tests with helgrind instead of memcheck"
opt valgrind-rpass 1 "run rpass-valgrind tests with valgrind"
opt docs     1 "build standard library documentation"
opt compiler-docs     0 "build compiler documentation"
opt optimize-tests 1 "build tests with optimizations"
opt debuginfo-tests 0 "build tests with debugger metadata"
opt libcpp 1 "build with llvm with libc++ instead of libstdc++ when using clang"
opt llvm-assertions 0 "build LLVM with assertions"
opt debug-assertions 0 "build with debugging assertions"
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
opt rpath 1 "build rpaths into rustc itself"
opt stage0-landing-pads 1 "enable landing pads during bootstrap with stage0"
# This is used by the automation to produce single-target nightlies
opt dist-host-only 0 "only install bins for the host architecture"
opt inject-std-version 1 "inject the current compiler version of libstd into programs"
opt llvm-version-check 1 "check if the LLVM version is supported, build anyway"
opt rustbuild 0 "use the rust and cargo based build system"
opt orbit 0 "get MIR where it belongs - everywhere; most importantly, in orbit"
opt codegen-tests 1 "run the src/test/codegen tests"
opt option-checking 1 "complain about unrecognized options in this configure script"

# Optimization and debugging options. These may be overridden by the release channel, etc.
opt_nosave optimize 1 "build optimized rust code"
opt_nosave optimize-cxx 1 "build optimized C++ code"
opt_nosave optimize-llvm 1 "build optimized LLVM"
opt_nosave llvm-assertions 0 "build LLVM with assertions"
opt_nosave debug-assertions 0 "build with debugging assertions"
opt_nosave debuginfo 0 "build with debugger metadata"
opt_nosave debug-jemalloc 0 "build jemalloc with --enable-debug --enable-fill"

valopt localstatedir "/var/lib" "local state directory"
valopt sysconfdir "/etc" "install system configuration files"

valopt datadir "${CFG_PREFIX}/share" "install data"
valopt infodir "${CFG_PREFIX}/share/info" "install additional info"
valopt llvm-root "" "set LLVM root"
valopt python "" "set path to python"
valopt jemalloc-root "" "set directory where libjemalloc_pic.a is located"
valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
valopt android-cross-path "" "Android NDK standalone path (deprecated)"
valopt i686-linux-android-ndk "" "i686-linux-android NDK standalone path"
valopt arm-linux-androideabi-ndk "" "arm-linux-androideabi NDK standalone path"
valopt armv7-linux-androideabi-ndk "" "armv7-linux-androideabi NDK standalone path"
valopt aarch64-linux-android-ndk "" "aarch64-linux-android NDK standalone path"
valopt nacl-cross-path  "" "NaCl SDK path (Pepper Canary is recommended). Must be absolute!"
valopt release-channel "dev" "the name of the release channel to build"
valopt musl-root "/usr/local" "MUSL root installation directory"
valopt extra-filename "" "Additional data that is hashed and passed to the -C extra-filename flag"

# Used on systems where "cc" and "ar" are unavailable
valopt default-linker "cc" "the default linker"
valopt default-ar     "ar" "the default ar"

# Many of these are saved below during the "writing configuration" step
# (others are conditionally saved).
opt_nosave manage-submodules 1 "let the build manage the git submodules"
opt_nosave clang 0 "prefer clang to gcc for building the runtime"
opt_nosave jemalloc 1 "build liballoc with jemalloc"
opt elf-tls 1 "elf thread local storage on platforms where supported"

valopt_nosave prefix "/usr/local" "set installation prefix"
valopt_nosave local-rust-root "/usr/local" "set prefix for local rust binary"
valopt_nosave host "${CFG_BUILD}" "GNUs ./configure syntax LLVM host triples"
valopt_nosave target "${CFG_HOST}" "GNUs ./configure syntax LLVM target triples"
valopt_nosave mandir "${CFG_PREFIX}/share/man" "install man pages in PATH"

# On Windows this determines root of the subtree for target libraries.
# Host runtime libs always go to 'bin'.
valopt libdir "${CFG_PREFIX}/lib" "install libraries"

case "$CFG_LIBDIR" in
    "$CFG_PREFIX"/*) CAT_INC=2;;
    "$CFG_PREFIX"*)  CAT_INC=1;;
    *)
        err "libdir must begin with the prefix. Use --prefix to set it accordingly.";;
esac

CFG_LIBDIR_RELATIVE=`echo ${CFG_LIBDIR} | cut -c$((${#CFG_PREFIX}+${CAT_INC}))-`

if [ $HELP -eq 1 ]
then
    echo
    exit 0
fi

# Validate Options
if [ -z "$CFG_DISABLE_OPTION_CHECKING" ]
then
    step_msg "validating $CFG_SELF args"
    validate_opt
fi

# Validate the release channel, and configure options
case "$CFG_RELEASE_CHANNEL" in
    nightly )
	msg "overriding settings for $CFG_RELEASE_CHANNEL"
	CFG_ENABLE_LLVM_ASSERTIONS=1
	;;
    dev | beta | stable)
	;;
    *)
        err "release channel must be 'dev', 'nightly', 'beta' or 'stable'"
        ;;
esac

# Adjust perf and debug options for debug mode
if [ -n "$CFG_ENABLE_DEBUG" ]; then
    msg "debug mode enabled, setting performance options"
    if [ -z "$CFG_ENABLE_OPTIMIZE_PROVIDED" ]; then
        msg "optimization not explicitly enabled, disabling optimization"
        CFG_DISABLE_OPTIMIZE=1
        CFG_DISABLE_OPTIMIZE_CXX=1
    fi

    # Set following variables to 1 unless setting already provided
    enable_if_not_disabled debug-assertions
    enable_if_not_disabled debug-jemalloc
    enable_if_not_disabled debuginfo
    enable_if_not_disabled llvm-assertions
fi

# OK, now write the debugging options
if [ -n "$CFG_DISABLE_OPTIMIZE" ]; then putvar CFG_DISABLE_OPTIMIZE; fi
if [ -n "$CFG_DISABLE_OPTIMIZE_CXX" ]; then putvar CFG_DISABLE_OPTIMIZE_CXX; fi
if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]; then putvar CFG_DISABLE_OPTIMIZE_LLVM; fi
if [ -n "$CFG_ENABLE_LLVM_ASSERTIONS" ]; then putvar CFG_ENABLE_LLVM_ASSERTIONS; fi
if [ -n "$CFG_ENABLE_DEBUG_ASSERTIONS" ]; then putvar CFG_ENABLE_DEBUG_ASSERTIONS; fi
if [ -n "$CFG_ENABLE_DEBUGINFO" ]; then putvar CFG_ENABLE_DEBUGINFO; fi
if [ -n "$CFG_ENABLE_DEBUG_JEMALLOC" ]; then putvar CFG_ENABLE_DEBUG_JEMALLOC; fi

if [ -n "$CFG_ENABLE_ORBIT" ]; then putvar CFG_ENABLE_ORBIT; fi

step_msg "looking for build programs"

probe_need CFG_CURLORWGET  curl wget
if [ -z "$CFG_PYTHON_PROVIDED" ]; then
    probe_need CFG_PYTHON      python2.7 python2 python
fi

python_version=$($CFG_PYTHON -V 2>&1)
if [ $(echo $python_version | grep -c '^Python 2\.7') -ne 1 ]; then
    err "Found $python_version, but Python 2.7 is required"
fi

# If we have no git directory then we are probably a tarball distribution
# and shouldn't attempt to load submodules
if [ ! -e ${CFG_SRC_DIR}.git ]
then
    probe CFG_GIT          git
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
    probe_need CFG_GIT     git
fi

# Use `md5sum` on GNU platforms, or `md5 -q` on BSD
probe CFG_MD5              md5
probe CFG_MD5SUM           md5sum
if [ -n "$CFG_MD5" ]
then
    CFG_HASH_COMMAND="$CFG_MD5 -q | cut -c 1-8"
elif [ -n "$CFG_MD5SUM" ]
then
    CFG_HASH_COMMAND="$CFG_MD5SUM | cut -c 1-8"
else
    err 'could not find one of: md5 md5sum'
fi
putvar CFG_HASH_COMMAND

probe CFG_CLANG            clang++
probe CFG_CCACHE           ccache
probe CFG_GCC              gcc
probe CFG_LD               ld
probe CFG_VALGRIND         valgrind
probe CFG_PERF             perf
probe CFG_ISCC             iscc
probe CFG_ANTLR4           antlr4
probe CFG_GRUN             grun
probe CFG_FLEX             flex
probe CFG_BISON            bison
probe CFG_GDB              gdb
probe CFG_LLDB             lldb

# On MacOS X, invoking `javac` pops up a dialog if the JDK is not
# installed. Since `javac` is only used if `antlr4` is available,
# probe for it only in this case.
if [ -n "$CFG_ANTLR4" ]
then
   probe CFG_JAVAC            javac
fi

# the valgrind rpass tests will fail if you don't have a valgrind, but they're
# only disabled if you opt out.
if [ -z "$CFG_VALGRIND" ]
then
    # If the user has explicitly asked for valgrind tests, then fail
    if [ -n "$CFG_ENABLE_VALGRIND" ] && [ -n "$CFG_ENABLE_VALGRIND_PROVIDED" ]
    then
        err "No valgrind present, but valgrind tests explicitly requested"
    else
        CFG_DISABLE_VALGRIND_RPASS=1
        putvar CFG_DISABLE_VALGRIND_RPASS
    fi
fi

if [ -n "$CFG_GDB" ]
then
    # Store GDB's version
    CFG_GDB_VERSION=$($CFG_GDB --version 2>/dev/null | head -1)
    putvar CFG_GDB_VERSION
fi

if [ -n "$CFG_LLDB" ]
then
    # Store LLDB's version
    CFG_LLDB_VERSION=$($CFG_LLDB --version 2>/dev/null | head -1)
    putvar CFG_LLDB_VERSION

    # If CFG_LLDB_PYTHON_DIR is not already set from the outside and valid, try to read it from
    # LLDB via the -P commandline options.
    if [ -z "$CFG_LLDB_PYTHON_DIR" ] || [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
    then
        CFG_LLDB_PYTHON_DIR=$($CFG_LLDB -P)

        # If CFG_LLDB_PYTHON_DIR is not a valid directory, set it to something more readable
        if [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
        then
            CFG_LLDB_PYTHON_DIR="LLDB_PYTHON_DIRECTORY_NOT_FOUND"
        fi

        putvar CFG_LLDB_PYTHON_DIR
    fi
fi

# LLDB tests on OSX require /usr/bin/python, not something like Homebrew's
# /usr/local/bin/python. We're loading a compiled module for LLDB tests which is
# only compatible with the system.
case $CFG_BUILD in
    *-apple-darwin)
        CFG_LLDB_PYTHON=/usr/bin/python
        ;;
    *)
        CFG_LLDB_PYTHON=$CFG_PYTHON
        ;;
esac
putvar CFG_LLDB_PYTHON

step_msg "looking for target specific programs"

probe CFG_ADB        adb

BIN_SUF=
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ]
then
    BIN_SUF=.exe
fi

if [ -n "$CFG_ENABLE_LOCAL_RUST" ]
then
    system_rustc=$(which rustc)
    if [ -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
    then
        : # everything already configured
    elif [ -n "$system_rustc" ]
    then
        # we assume that rustc is in a /bin directory
        CFG_LOCAL_RUST_ROOT=${system_rustc%/bin/rustc}
    else
        err "no local rust to use"
    fi

    CMD="${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF}"
    LRV=`$CMD --version`
    if [ $? -ne 0 ]
    then
        step_msg "failure while running $CMD --version"
        exit 1
    fi
    step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
    putvar CFG_LOCAL_RUST_ROOT
fi

# Force bitrig to build with clang; gcc doesn't like us there
if [ $CFG_OSTYPE = unknown-bitrig ]
then
    step_msg "on Bitrig, forcing use of clang"
    CFG_ENABLE_CLANG=1
fi

# default gcc version under OpenBSD maybe too old, try using egcc, which is a
# gcc version from ports
if [ $CFG_OSTYPE = unknown-openbsd ]
then
    if [ $("$CFG_GCC" --version 2>&1 | grep -c ' 4\.[0-6]') -ne 0 ]; then
        step_msg "older GCC found, try with egcc instead"

        # probe again but using egcc
        probe CFG_GCC egcc

        # and use egcc/eg++ for CC/CXX too if it was found
        # (but user setting has priority)
        if [ -n "$CFG_GCC" ]; then
            CC="${CC:-egcc}"
            CXX="${CXX:-eg++}"
        fi
    fi
fi

# OS X 10.9, gcc is actually clang. This can cause some confusion in the build
# system, so if we find that gcc is clang, we should just use clang directly.
if [ $CFG_OSTYPE = apple-darwin -a -z "$CFG_ENABLE_CLANG" ]
then
    CFG_OSX_GCC_VERSION=$("$CFG_GCC" --version 2>&1 | grep "Apple LLVM version")
    if [ $? -eq 0 ]
    then
        step_msg "on OS X >=10.9, forcing use of clang"
        CFG_ENABLE_CLANG=1
    else
        if [ $("$CFG_GCC" --version 2>&1 | grep -c ' 4\.[0-6]') -ne 0 ]; then
            step_msg "older GCC found, using clang instead"
            CFG_ENABLE_CLANG=1
        else
            # on OS X, with xcode 5 and newer, certain developers may have
            # cc, gcc and g++ point to a  mixture of clang and gcc
            # if so, this will create very strange build errors
            # this last stanza is to detect some such problems and save the future rust
            # contributor some time solving that issue.
            # this detection could be generalized to other OSes aside from OS X
            # but the issue seems most likely to happen on OS X

            chk_cc () {
                $1 --version 2> /dev/null | grep -q $2
            }
            # check that gcc, cc and g++ all point to the same compiler.
            # note that for xcode 5, g++ points to clang, not clang++
            if !((chk_cc gcc clang  && chk_cc g++ clang) ||
                (chk_cc gcc gcc  &&( chk_cc g++ g++ || chk g++ gcc))); then
                err "the gcc and g++ in your path point to different compilers.
    Check which versions are in your path with gcc --version and g++ --version.
    To resolve this problem, either fix your PATH  or run configure with --enable-clang"
            fi

        fi
    fi
fi

# If the clang isn't already enabled, check for GCC, and if it is missing, turn
# on clang as a backup.
if [ -z "$CFG_ENABLE_CLANG" ]
then
  CFG_GCC_VERSION=$("$CFG_GCC" --version 2>&1)
  if [ $? -ne 0 ]
  then
    step_msg "GCC not installed, will try using Clang"
    CFG_ENABLE_CLANG=1
  fi
fi

# Okay, at this point, we have made up our minds about whether we are
# going to force CFG_ENABLE_CLANG or not; save the setting if so.
if [ -n "$CFG_ENABLE_CLANG" ]
then
    putvar CFG_ENABLE_CLANG
fi

if [ -z "$CFG_DISABLE_LIBCPP" -a -n "$CFG_ENABLE_CLANG" ]
then
    CFG_USING_LIBCPP="1"
else
    CFG_USING_LIBCPP="0"
fi

# Same with jemalloc.  save the setting here.
if [ -n "$CFG_DISABLE_JEMALLOC" ]
then
    putvar CFG_DISABLE_JEMALLOC
fi

if [ -n "$CFG_LLVM_ROOT" -a -z "$CFG_DISABLE_LLVM_VERSION_CHECK" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
    LLVM_VERSION=$($LLVM_CONFIG --version)

    case $LLVM_VERSION in
        (3.[6-8]*)
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
            err "bad LLVM version: $LLVM_VERSION, need >=3.6"
            ;;
    esac
fi

# Even when the user overrides the choice of CC, still try to detect
# clang to disable some clang-specific warnings.  We here draw a
# distinction between:
#
#  CFG_ENABLE_CLANG : passed --enable-clang, or host "requires" clang,
#  CFG_USING_CLANG : compiler (clang / gcc / $CC) looks like clang.
#
# This distinction is important because there are some safeguards we
# would prefer to skip when merely CFG_USING_CLANG is set; but when
# CFG_ENABLE_CLANG is set, that indicates that we are opting into
# running such safeguards.

if [ -n "$CC" ]
then
    msg "skipping compiler inference steps; using provided CC=$CC"
    CFG_CC="$CC"

    CFG_OSX_CC_VERSION=$("$CFG_CC" --version 2>&1 | grep "clang")
    if [ $? -eq 0 ]
    then
        step_msg "note, user-provided CC looks like clang; CC=$CC."
        CFG_USING_CLANG=1
        putvar CFG_USING_CLANG
    fi
else
    if [ -n "$CFG_ENABLE_CLANG" ]
    then
        if [ -z "$CFG_CLANG" ]
        then
            err "clang requested but not found"
        fi
        CFG_CC="$CFG_CLANG"
        CFG_USING_CLANG=1
        putvar CFG_USING_CLANG
    else
        CFG_CC="gcc"
    fi
fi

if [ -n "$CFG_ENABLE_CLANG" ]
then
    case "$CC" in
        (''|*clang)
        if [ -z "$CC" ]
        then
            CFG_CC="clang"
            CFG_CXX="clang++"
        fi
    esac
fi

if [ -n "$CFG_ENABLE_CCACHE" ]
then
    if [ -z "$CFG_CCACHE" ]
    then
        err "ccache requested but not found"
    fi

    CFG_CC="ccache $CFG_CC"
fi

if [ -z "$CC" -a -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
then
    err "either clang or gcc is required"
fi

# All safeguards based on $CFG_ENABLE_CLANG should occur before this
# point in the script; after this point, script logic should inspect
# $CFG_USING_CLANG rather than $CFG_ENABLE_CLANG.

# Set CFG_{CC,CXX,CPP,CFLAGS,CXXFLAGS,LDFLAGS}
envopt CC
envopt CXX
envopt CPP
envopt CFLAGS
envopt CXXFLAGS
envopt LDFLAGS

# stdc++ name in use
# used to manage non-standard name (on OpenBSD for example)
program_transform_name=$($CFG_CC -v 2>&1 | sed -n "s/.*--program-transform-name='\([^']*\)'.*/\1/p")
CFG_STDCPP_NAME=$(echo "stdc++" | sed "${program_transform_name}")
putvar CFG_STDCPP_NAME

# a little post-processing of various config values
CFG_PREFIX=${CFG_PREFIX%/}
CFG_MANDIR=${CFG_MANDIR%/}
CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
CFG_SUPPORTED_TARGET=""
for target_file in ${CFG_SRC_DIR}mk/cfg/*.mk; do
  CFG_SUPPORTED_TARGET="${CFG_SUPPORTED_TARGET} $(basename "$target_file" .mk)"
done

# copy build-triples to host-triples so that builds are a subset of hosts
V_TEMP=""
for i in $CFG_BUILD $CFG_HOST;
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
CFG_HOST=$V_TEMP

# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
for i in $CFG_HOST $CFG_TARGET;
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
CFG_TARGET=$V_TEMP

# check target-specific tool-chains
for i in $CFG_TARGET
do
    L_CHECK=false
    for j in $CFG_SUPPORTED_TARGET
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

    if [ $L_CHECK = false ]
    then
        err "unsupported target triples \"$i\" found"
    fi

    case $i in
        *android*)
            case $i in
                armv7-linux-androideabi)
                    cmd_prefix="arm-linux-androideabi"
                    ;;
                *)
                    cmd_prefix=$i
                    ;;
            esac

            upper_snake_target=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
            eval ndk=\$"CFG_${upper_snake_target}_NDK"
            if [ -z "$ndk" ]
            then
                ndk=$CFG_ANDROID_CROSS_PATH
                eval "CFG_${upper_snake_target}_NDK"=$CFG_ANDROID_CROSS_PATH
                warn "generic/default Android NDK option is deprecated (use --$i-ndk option instead)"
            fi

            # Perform a basic sanity check of the NDK
            for android_ndk_tool in "$ndk/bin/$cmd_prefix-gcc" "$ndk/bin/$cmd_prefix-g++" "$ndk/bin/$cmd_prefix-ar"
            do
                if [ ! -f $android_ndk_tool ]
                then
                    err "NDK tool $android_ndk_tool not found (bad or missing --$i-ndk option?)"
                fi
            done
            ;;
        *-unknown-nacl)
	    if [ -z "$CFG_NACL_CROSS_PATH" ]
	    then
		err "I need the NaCl SDK path! (use --nacl-cross-path)"
	    fi
	    ;;
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;


        x86_64-*-musl)
            if [ ! -f $CFG_MUSL_ROOT/lib/libc.a ]
            then
                err "musl libc $CFG_MUSL_ROOT/lib/libc.a not found"
            fi
            ;;

        *-msvc)
            # There are some MSYS python builds which will auto-translate
            # windows-style paths to MSYS-style paths in Python itself.
            # Unfortunately this breaks LLVM's build system as somewhere along
            # the line LLVM prints a path into a file from Python and then CMake
            # later tries to interpret that path. If Python prints a MSYS path
            # and CMake tries to use it as a Windows path, you're gonna have a
            # Bad Time.
            #
            # Consequently here we try to detect when that happens and print an
            # error if it does.
            if $CFG_PYTHON -c 'import sys; print sys.argv[1]' `pwd` | grep '^/' > /dev/null
            then
                err "

python is silently translating windows paths to MSYS paths \
and the build will fail if this python is used.

Either an official python install must be used or an \
alternative python package in MinGW must be used.

If you are building under msys2 try installing the mingw-w64-x86_64-python2 \
package instead of python2:

$ pacman -R python2 && pacman -S mingw-w64-x86_64-python2
"
            fi

            # MSVC requires cmake because that's how we're going to build LLVM
            probe_need CFG_CMAKE cmake

            # There are three builds of cmake on windows: MSVC, MinGW and Cygwin
            # The Cygwin build does not have generators for Visual Studio, so
            # detect that here and error.
            if ! "$CFG_CMAKE" --help | sed -n '/^Generators/,$p' | grep 'Visual Studio' > /dev/null
            then
                err "

cmake does not support Visual Studio generators.

This is likely due to it being an msys/cygwin build of cmake, \
rather than the required windows version, built using MinGW \
or Visual Studio.

If you are building under msys2 try installing the mingw-w64-x86_64-cmake \
package instead of cmake:

$ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake
"
            fi

            # Use the REG program to figure out where VS is installed
            # We need to figure out where cl.exe and link.exe are, so we do some
            # munging and some probing here. We also look for the default
            # INCLUDE and LIB variables for MSVC so we can set those in the
            # build system as well.
            install=$(cmd //c reg QUERY \
                       'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0' \
                       -v InstallDir)
            if [ -z "$install" ]; then
              install=$(cmd //c reg QUERY \
                         'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\12.0' \
                         -v InstallDir)
            fi
            need_ok "couldn't find visual studio install root"
            CFG_MSVC_ROOT=$(echo "$install" | grep InstallDir | sed 's/.*REG_SZ[ ]*//')
            CFG_MSVC_ROOT=$(dirname "$CFG_MSVC_ROOT")
            CFG_MSVC_ROOT=$(dirname "$CFG_MSVC_ROOT")
            putvar CFG_MSVC_ROOT

            case $i in
                x86_64-*)
                    bits=x86_64
                    msvc_part=amd64
                    ;;
                i*86-*)
                    bits=i386
                    msvc_part=
                    ;;
                *)
                    err "can only target x86 targets for MSVC"
                    ;;
            esac
            bindir="${CFG_MSVC_ROOT}/VC/bin"
            if [ -n "$msvc_part" ]; then
                bindir="$bindir/$msvc_part"
            fi
            eval CFG_MSVC_BINDIR_$bits="\"$bindir\""
            eval CFG_MSVC_CL_$bits="\"$bindir/cl.exe\""
            eval CFG_MSVC_LIB_$bits="\"$bindir/lib.exe\""
            eval CFG_MSVC_LINK_$bits="\"$bindir/link.exe\""

            vcvarsall="${CFG_MSVC_ROOT}/VC/vcvarsall.bat"
            include_path=$(cmd //V:ON //c "$vcvarsall" $msvc_part \& echo !INCLUDE!)
            need_ok "failed to learn about MSVC's INCLUDE"
            lib_path=$(cmd //V:ON //c "$vcvarsall" $msvc_part \& echo !LIB!)
            need_ok "failed to learn about MSVC's LIB"

            eval CFG_MSVC_INCLUDE_PATH_${bits}="\"$include_path\""
            eval CFG_MSVC_LIB_PATH_${bits}="\"$lib_path\""

            putvar CFG_MSVC_BINDIR_${bits}
            putvar CFG_MSVC_CL_${bits}
            putvar CFG_MSVC_LIB_${bits}
            putvar CFG_MSVC_LINK_${bits}
            putvar CFG_MSVC_INCLUDE_PATH_${bits}
            putvar CFG_MSVC_LIB_PATH_${bits}
            ;;

        *)
            ;;
    esac
done

if [ -n "$CFG_PERF" ]
then
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

if [ -z "$CFG_ENABLE_RUSTBUILD" ]; then

  step_msg "making directories"

  for i in \
      doc doc/std doc/extra \
      dl tmp dist
  do
      make_dir $i
  done

  for t in $CFG_HOST
  do
      make_dir $t/llvm
  done

  for t in $CFG_HOST
  do
      make_dir $t/rustllvm
  done

  for t in $CFG_TARGET
  do
    make_dir $t/rt
    for s in 0 1 2 3
    do
      make_dir $t/rt/stage$s
      make_dir $t/rt/jemalloc
      make_dir $t/rt/compiler-rt
      for i in                                          \
        isaac sync test \
        arch/i386 arch/x86_64 arch/arm arch/aarch64 arch/mips arch/powerpc
      do
        make_dir $t/rt/stage$s/$i
      done
    done
  done

  for h in $CFG_HOST
  do
      for t in $CFG_TARGET
      do
          # host bin dir stage0
          make_dir $h/stage0/bin

          # host lib dir stage0
          make_dir $h/stage0/lib

          # host test dir stage0
          make_dir $h/stage0/test

          # target bin dir stage0
          make_dir $h/stage0/lib/rustlib/$t/bin

          # target lib dir stage0
          make_dir $h/stage0/lib/rustlib/$t/lib

          for i in 1 2 3
          do
              # host bin dir
              make_dir $h/stage$i/bin

              # host lib dir
              make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE

              # host test dir
              make_dir $h/stage$i/test

              # target bin dir
              make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/bin

              # target lib dir
              make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/lib
          done
      done

      make_dir $h/test/run-pass
      make_dir $h/test/run-pass-valgrind
      make_dir $h/test/run-pass-fulldeps
      make_dir $h/test/run-fail
      make_dir $h/test/run-fail-fulldeps
      make_dir $h/test/compile-fail
      make_dir $h/test/parse-fail
      make_dir $h/test/compile-fail-fulldeps
      make_dir $h/test/bench
      make_dir $h/test/perf
      make_dir $h/test/pretty
      make_dir $h/test/debuginfo-gdb
      make_dir $h/test/debuginfo-lldb
      make_dir $h/test/codegen
      make_dir $h/test/codegen-units
      make_dir $h/test/rustdoc
  done

fi

# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ] && [ -z $CFG_ENABLE_RUSTBUILD ]
then
    cd ${CFG_SRC_DIR}

    msg "git: submodule sync"
    "${CFG_GIT}" submodule sync

    msg "git: submodule init"
    "${CFG_GIT}" submodule init

    # Disable submodules that we're not using
    if [ -n "${CFG_LLVM_ROOT}" ]; then
        msg "git: submodule deinit src/llvm"
        "${CFG_GIT}" submodule deinit src/llvm
    fi
    if [ -n "${CFG_JEMALLOC_ROOT}" ]; then
        msg "git: submodule deinit src/jemalloc"
        "${CFG_GIT}" submodule deinit src/jemalloc
    fi

    msg "git: submodule update"
    "${CFG_GIT}" submodule update
    need_ok "git failed"

    msg "git: submodule foreach sync"
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
    need_ok "git failed"

    msg "git: submodule foreach update"
    "${CFG_GIT}" submodule update --recursive
    need_ok "git failed"

    # NB: this is just for the sake of getting the submodule SHA1 values
    # and status written into the build log.
    msg "git: submodule status"
    "${CFG_GIT}" submodule status --recursive

    msg "git: submodule clobber"
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
    need_ok "git failed"
    "${CFG_GIT}" submodule foreach --recursive git checkout .
    need_ok "git failed"

    cd ${CFG_BUILD_DIR}
fi

# Do a sanity check that the submodule source exists. Because GitHub
# automatically publishes broken tarballs that can't be disabled, and
# people download them and try to use them.
if [ ! -e "${CFG_SRC_DIR}/src/liblibc" ]; then
    err "some submodules are missing. Is this a broken tarball?

If you downloaded this tarball from the GitHub release pages at
https://github.com/rust-lang/rust/releases,
then please delete it and instead download the source from
https://www.rust-lang.org/downloads.html"

fi

# Configure llvm, only if necessary
step_msg "looking at LLVM"
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
for t in $CFG_HOST
do
    do_reconfigure=1
    is_msvc=0
    case "$t" in
        (*-msvc)
        is_msvc=1
        ;;
    esac

    if [ -n "$CFG_ENABLE_RUSTBUILD" ]
    then
        msg "not configuring LLVM, rustbuild in use"
        do_reconfigure=0
    elif [ -z $CFG_LLVM_ROOT ]
    then
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
        if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
        else
            LLVM_DBG_OPTS="--enable-optimized"
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Release
        fi
        if [ -z "$CFG_ENABLE_LLVM_ASSERTIONS" ]
        then
            LLVM_ASSERTION_OPTS="--disable-assertions"
        else
            LLVM_ASSERTION_OPTS="--enable-assertions"

            # Apparently even if we request assertions be enabled for MSVC,
            # LLVM's CMake build system ignore this and outputs in `Release`
            # anyway.
            if [ ${is_msvc} -eq 0 ]; then
                LLVM_INST_DIR=${LLVM_INST_DIR}+Asserts
            fi
        fi
    else
        msg "not reconfiguring LLVM, external LLVM root"
        # The user is using their own LLVM
        LLVM_BUILD_DIR=
        LLVM_INST_DIR=$CFG_LLVM_ROOT
        do_reconfigure=0
        # Check that LLVm FileCheck is available. Needed for the tests
        if [ -z "$CFG_DISABLE_CODEGEN_TESTS" ]; then
            need_cmd $LLVM_INST_DIR/bin/FileCheck
        fi
    fi

    if [ ${do_reconfigure} -ne 0 ]
    then
    # because git is hilarious, it might have put the module index
    # in a couple places.
        index1="${CFG_SRC_DIR}.git/modules/src/llvm/index"
        index2="${CFG_SRC_DIR}src/llvm/.git/index"
        for index in ${index1} ${index2}
        do
            config_status="${LLVM_BUILD_DIR}/config.status"
            if test -e ${index} -a \
                    -e ${config_status} -a \
                    ${config_status} -nt ${index}
            then
                msg "not reconfiguring LLVM, config.status is fresh"
                do_reconfigure=0
            fi
        done
    fi

    # We need the generator later on for compiler-rt even if LLVM's not built
    if [ ${is_msvc} -ne 0 ]
    then
        case "$CFG_MSVC_ROOT" in
            *14.0*)
                generator="Visual Studio 14 2015"
                ;;
            *12.0*)
                generator="Visual Studio 12 2013"
                ;;
            *)
                err "can't determine generator for LLVM cmake"
                ;;
        esac
        case "$t" in
            x86_64-*)
                generator="$generator Win64"
                ;;
            i686-*)
                ;;
            *)
                err "can only build LLVM for x86 platforms"
                ;;
        esac
        CFG_CMAKE_GENERATOR=$generator
        putvar CFG_CMAKE_GENERATOR
    fi

    if [ ${do_reconfigure} -ne 0 ] && [ ${is_msvc} -ne 0 ]
    then
        msg "configuring LLVM for $t with cmake"

        CMAKE_ARGS="-DLLVM_INCLUDE_TESTS=OFF"
        if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]; then
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug"
        else
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release"
        fi
        if [ -z "$CFG_ENABLE_LLVM_ASSERTIONS" ]
        then
            CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_ASSERTIONS=OFF"
        else
            CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_ASSERTIONS=ON"
        fi

        msg "configuring LLVM with:"
        msg "$CMAKE_ARGS"

        (cd $LLVM_BUILD_DIR && "$CFG_CMAKE" $CFG_LLVM_SRC_DIR \
                                            -G "$CFG_CMAKE_GENERATOR" \
                                            $CMAKE_ARGS)
        need_ok "LLVM cmake configure failed"
    fi

    if [ ${do_reconfigure} -ne 0 ] && [ ${is_msvc} -eq 0 ]
    then
        # LLVM's configure doesn't recognize the new Windows triples yet
        gnu_t=$(to_gnu_triple $t)

        msg "configuring LLVM for $gnu_t"

        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,aarch64,mips,powerpc"
        LLVM_BUILD="--build=$gnu_t"
        LLVM_HOST="--host=$gnu_t"
        LLVM_TARGET="--target=$gnu_t"

        # Disable unused LLVM features
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"

        # Use win32 native thread/lock apis instead of pthread wrapper.
        # (llvm's configure tries to find pthread first, so we have to disable it explicitly.)
        # Also note that pthreads works badly on mingw-w64 systems: #8996
        case "$CFG_BUILD" in
            (*-windows-gnu)
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

        case "$CFG_CC" in
            ("ccache clang")
            LLVM_CXX_32="ccache clang++ -Qunused-arguments"
            LLVM_CC_32="ccache clang -Qunused-arguments"

            LLVM_CXX_64="ccache clang++ -Qunused-arguments"
            LLVM_CC_64="ccache clang -Qunused-arguments"
            ;;
            ("clang")
            LLVM_CXX_32="clang++ -Qunused-arguments"
            LLVM_CC_32="clang -Qunused-arguments"

            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
            ;;
            ("ccache gcc")
            LLVM_CXX_32="ccache g++"
            LLVM_CC_32="ccache gcc"

            LLVM_CXX_64="ccache g++"
            LLVM_CC_64="ccache gcc"
            ;;
            ("gcc")
            LLVM_CXX_32="g++"
            LLVM_CC_32="gcc"

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
            ;;

            (*)
            msg "inferring LLVM_CXX/CC from CXX/CC = $CXX/$CC"
            if [ -n "$CFG_ENABLE_CCACHE" ]
            then
                if [ -z "$CFG_CCACHE" ]
                then
                    err "ccache requested but not found"
                fi

                LLVM_CXX_32="ccache $CXX"
                LLVM_CC_32="ccache $CC"

                LLVM_CXX_64="ccache $CXX"
                LLVM_CC_64="ccache $CC"
            else
                LLVM_CXX_32="$CXX"
                LLVM_CC_32="$CC"

                LLVM_CXX_64="$CXX"
                LLVM_CC_64="$CC"
            fi

            ;;
        esac

        case "$CFG_CPUTYPE" in
            (x86*)
                LLVM_CXX_32="$LLVM_CXX_32 -m32"
                LLVM_CC_32="$LLVM_CC_32 -m32"

                LLVM_CFLAGS_32="-m32"
                LLVM_CXXFLAGS_32="-m32"
                LLVM_LDFLAGS_32="-m32"

                LLVM_CFLAGS_64=""
                LLVM_CXXFLAGS_64=""
                LLVM_LDFLAGS_64=""

                LLVM_CXX_32="$LLVM_CXX_32 -m32"
                LLVM_CC_32="$LLVM_CC_32 -m32"
                ;;

            (*)
                LLVM_CFLAGS_32=""
                LLVM_CXXFLAGS_32=""
                LLVM_LDFLAGS_32=""

                LLVM_CFLAGS_64=""
                LLVM_CXXFLAGS_64=""
                LLVM_LDFLAGS_64=""
                ;;
        esac

        if echo $t | grep -q x86_64
        then
            LLVM_CXX=$LLVM_CXX_64
            LLVM_CC=$LLVM_CC_64
            LLVM_CFLAGS=$LLVM_CFLAGS_64
            LLVM_CXXFLAGS=$LLVM_CXXFLAGS_64
            LLVM_LDFLAGS=$LLVM_LDFLAGS_64
        else
            LLVM_CXX=$LLVM_CXX_32
            LLVM_CC=$LLVM_CC_32
            LLVM_CFLAGS=$LLVM_CFLAGS_32
            LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32
            LLVM_LDFLAGS=$LLVM_LDFLAGS_32
        fi

        CXX=$LLVM_CXX
        CC=$LLVM_CC
        CFLAGS="$CFLAGS $LLVM_CFLAGS"
        CXXFLAGS="$CXXFLAGS $LLVM_CXXFLAGS"
        LDFLAGS="$LDFLAGS $LLVM_LDFLAGS"

        if [ "$CFG_USING_LIBCPP" != "0" ]; then
            LLVM_OPTS="$LLVM_OPTS --enable-libcpp"
        fi

        LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"

        msg "configuring LLVM with:"
        msg "$LLVM_FLAGS"

        export CXX
        export CC
        export CFLAGS
        export CXXFLAGS
        export LDFLAGS

        cd $LLVM_BUILD_DIR
        case $CFG_SRC_DIR in
            /* | [a-z]:* | [A-Z]:*)
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
                ;;
            *)
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"

        cd $CFG_BUILD_DIR
    fi

    # Construct variables for LLVM build and install directories for
    # each target. These will be named
    # CFG_LLVM_BUILD_DIR_${target_triple} but all the hyphens in
    # target_triple will be converted to underscore, because bash
    # variables can't contain hyphens. The makefile will then have to
    # convert back.
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
    eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'"
    eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'"
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_SRC_DIR_RELATIVE
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
putvar CFG_PREFIX
putvar CFG_HOST
putvar CFG_TARGET
putvar CFG_LIBDIR_RELATIVE
putvar CFG_DISABLE_MANAGE_SUBMODULES
putvar CFG_AARCH64_LINUX_ANDROID_NDK
putvar CFG_ARM_LINUX_ANDROIDEABI_NDK
putvar CFG_ARMV7_LINUX_ANDROIDEABI_NDK
putvar CFG_I686_LINUX_ANDROID_NDK
putvar CFG_NACL_CROSS_PATH
putvar CFG_MANDIR
putvar CFG_USING_LIBCPP

# Avoid spurious warnings from clang by feeding it original source on
# ccache-miss rather than preprocessed input.
if [ -n "$CFG_ENABLE_CCACHE" ] && [ -n "$CFG_USING_CLANG" ]
then
    CFG_CCACHE_CPP2=1
    putvar CFG_CCACHE_CPP2
fi

if [ -n "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


putvar CFG_LLVM_SRC_DIR

for t in $CFG_HOST
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done

if [ -n "$CFG_ENABLE_RUSTBUILD" ]
then
    INPUT_MAKEFILE=src/bootstrap/mk/Makefile.in
else
    INPUT_MAKEFILE=Makefile.in
fi

msg
copy_if_changed ${CFG_SRC_DIR}${INPUT_MAKEFILE} ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
touch config.stamp

if [ -z "$CFG_ENABLE_DEBUG" ]; then
    step_msg "configured in release mode. for development consider --enable-debug"
else
    step_msg "complete"
fi

msg "run \`make help\`"
msg
