#!/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() {
    probe $*
    local V=$1
    shift
    eval VV=\$$V
    if [ -z "$VV" ]
    then
        err "$V 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 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 local-rebuild 0 "assume local-rust matches the current version, for rebuilds; implies local-rust, and is implied if local-rust already matches the current version"
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 1 "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"
opt ninja 0 "build LLVM using the Ninja generator (for MSVC, requires building in the correct environment)"

# 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 musl-root "/usr/local" "MUSL root installation directory"
valopt extra-filename "" "Additional data that is hashed and passed to the -C extra-filename flag"

if [ -e ${CFG_SRC_DIR}.git ]
then
    valopt release-channel "dev" "the name of the release channel to build"
else
    # If we have no git directory then we are probably a tarball distribution
    # and should default to stable channel - Issue 28322
    probe CFG_GIT          git
    msg "git: no git directory. Changing default release channel to stable"
    valopt release-channel "stable" "the name of the release channel to build"
fi

# 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_DISABLE_ORBIT" ]; then putvar CFG_DISABLE_ORBIT; fi

step_msg "looking for build programs"

probe_need CFG_CURL curl
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

if [ -n "$CFG_ENABLE_NINJA" ]
then
  probe CFG_NINJA            ninja
  if [ -z "$CFG_NINJA" ]
  then
    # On Debian and Fedora, the `ninja` binary is an IRC bot, so the build tool was
    # renamed. Handle this case.
    probe CFG_NINJA            ninja-build
  fi
fi

# For building LLVM
probe_need CFG_CMAKE cmake

# 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

# --enable-local-rebuild implies --enable-local-rust too
if [ -n "$CFG_ENABLE_LOCAL_REBUILD" ]
then
    if [ -z "$CFG_ENABLE_LOCAL_RUST" ]
    then
        CFG_ENABLE_LOCAL_RUST=1
        putvar CFG_ENABLE_LOCAL_RUST
    fi
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.[7-8]*)
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
            err "bad LLVM version: $LLVM_VERSION, need >=3.7"
            ;;
    esac

    if "$CFG_LLVM_ROOT/bin/llvm-mc" -help | grep -- "-relocation-model"; then
        msg "found older llvm-mc"
        CFG_LLVM_MC_HAS_RELOCATION_MODEL=1
        putvar CFG_LLVM_MC_HAS_RELOCATION_MODEL
    fi
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 | arm-*-musleabi)
            if [ ! -f $CFG_MUSL_ROOT/lib/libc.a ]
            then
                err "musl libc $CFG_MUSL_ROOT/lib/libc.a not found"
            fi
            ;;

        *-msvc)
            # 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 [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ]
then
    # 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 -S mingw-w64-x86_64-python2
"
    fi
fi

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
        LLVM_INST_DIR=$LLVM_BUILD_DIR
        # For some crazy reason the MSVC output dir is different than Unix
        if [ ${is_msvc} -ne 0 ]; then
            if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]
            then
                # Just use LLVM straight from its build directory to
                # avoid 'make install' time
                LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
            else
                LLVM_INST_DIR=$LLVM_BUILD_DIR/Release
            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 [ -n "$CFG_NINJA" ]
    then
        generator="Ninja"
    elif [ ${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
    else
        generator="Unix Makefiles"
    fi
    CFG_CMAKE_GENERATOR=$generator
    putvar CFG_CMAKE_GENERATOR

    msg "configuring LLVM for $t"

    LLVM_CFLAGS_32=""
    LLVM_CXXFLAGS_32=""
    LLVM_LDFLAGS_32=""
    LLVM_CFLAGS_64=""
    LLVM_CXXFLAGS_64=""
    LLVM_LDFLAGS_64=""

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

            LLVM_CXX_64="ccache"
            LLVM_CC_64="ccache"
            LLVM_CXX_64_ARG1="clang++"
            LLVM_CC_64_ARG1="clang"
            LLVM_CFLAGS_64="-Qunused-arguments"
            LLVM_CXXFLAGS_64="-Qunused-arguments"
            ;;
        ("clang")
            LLVM_CXX_32="clang++"
            LLVM_CC_32="clang"
            LLVM_CFLAGS_32="-Qunused-arguments"
            LLVM_CXXFLAGS_32="-Qunused-arguments"

            LLVM_CXX_64="clang++"
            LLVM_CC_64="clang"
            LLVM_CFLAGS_64="-Qunused-arguments"
            LLVM_CXXFLAGS_64="-Qunused-arguments"
            ;;
        ("ccache gcc")
            LLVM_CXX_32="ccache"
            LLVM_CC_32="ccache"
            LLVM_CXX_32_ARG1="clang++"
            LLVM_CC_32_ARG1="clang"

            LLVM_CXX_64="ccache"
            LLVM_CC_64="ccache"
            LLVM_CXX_64_ARG1="g++"
            LLVM_CC_64_ARG1="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"
                LLVM_CC_32="ccache"
                LLVM_CXX_32_ARG1="$CXX"
                LLVM_CC_32_ARG1="$CC"

                LLVM_CXX_64="ccache"
                LLVM_CC_64="ccache"
                LLVM_CXX_64_ARG1="$CXX"
                LLVM_CC_64_ARG1="$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_CFLAGS_32="$LLVM_CFLAGS_32 -m32"
            LLVM_CXXFLAGS_32="$LLVM_CXXFLAGS_32 -m32"
            LLVM_LDFLAGS_32="$LLVM_LDFLAGS_32 -m32"
            ;;
    esac

    if echo $t | grep -q x86_64
    then
        LLVM_CXX=$LLVM_CXX_64
        LLVM_CC=$LLVM_CC_64
        LLVM_CXX_ARG1=$LLVM_CXX_64_ARG1
        LLVM_CC_ARG1=$LLVM_CC_64_ARG1
        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_CXX_ARG1=$LLVM_CXX_32_ARG1
        LLVM_CC_ARG1=$LLVM_CC_32_ARG1
        LLVM_CFLAGS=$LLVM_CFLAGS_32
        LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32
        LLVM_LDFLAGS=$LLVM_LDFLAGS_32
    fi

    if [ "$CFG_USING_LIBCPP" != "0" ]; then
        CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_LIBCXX=ON"
    fi

    # Turn off things we don't need
    CMAKE_ARGS="$CMAKE_ARGS -DLLVM_INCLUDE_TESTS=OFF"
    CMAKE_ARGS="$CMAKE_ARGS -DLLVM_INCLUDE_EXAMPLES=OFF"
    CMAKE_ARGS="$CMAKE_ARGS -DLLVM_INCLUDE_DOCS=OFF"
    CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_ZLIB=OFF"
    CMAKE_ARGS="$CMAKE_ARGS -DWITH_POLY=OFF"
    CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_TERMINFO=OFF"
    CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_LIBEDIT=OFF"

    arch="$(echo "$t" | cut -d - -f 1)"

    if [ "$arch" = i686 ]; then
        CMAKE_ARGS="$CMAKE_ARGS -DLLVM_BUILD_32_BITS=ON"
    fi

    if [ "$t" != "$CFG_BUILD" ]; then
        # see http://llvm.org/docs/HowToCrossCompileLLVM.html
        CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CROSSCOMPILING=True"
        CMAKE_ARGS="$CMAKE_ARGS -DLLVM_TARGET_ARCH=$arch"
        CMAKE_ARGS="$CMAKE_ARGS -DLLVM_TABLEGEN=$CFG_BUILD_DIR/$CFG_BUILD/llvm/bin/llvm-tblgen"
        CMAKE_ARGS="$CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=$t"
    fi

    # MSVC handles compiler business itself
    if [ ${is_msvc} -eq 0 ]; then
        CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$LLVM_CC"
        CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER=$LLVM_CXX"
        CMAKE_ARGS="$CMAKE_ARGS '-DCMAKE_C_FLAGS=$LLVM_CFLAGS'"
        CMAKE_ARGS="$CMAKE_ARGS '-DCMAKE_CXX_FLAGS=$LLVM_CXXFLAGS'"
        if [ -n "$LLVM_CC_ARG1" ]; then
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER_ARG1=$LLVM_CC_ARG1"
        fi
        if [ -n "$LLVM_CXX_ARG1" ]; then
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER_ARG1=$LLVM_CXX_ARG1"
        fi
        # FIXME: What about LDFLAGS?
    fi

    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

    CMAKE_ARGS="$CMAKE_ARGS -DLLVM_TARGETS_TO_BUILD='X86;ARM;AArch64;Mips;PowerPC'"
    CMAKE_ARGS="$CMAKE_ARGS -G '$CFG_CMAKE_GENERATOR'"
    CMAKE_ARGS="$CMAKE_ARGS $CFG_LLVM_SRC_DIR"

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

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

        (cd $LLVM_BUILD_DIR && eval "\"$CFG_CMAKE\"" $CMAKE_ARGS)
        need_ok "LLVM cmake configure failed"
    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
