diff --git a/src/etc/rustup.sh b/src/etc/rustup.sh new file mode 100644 index 0000000000000..4829e15fb0ffa --- /dev/null +++ b/src/etc/rustup.sh @@ -0,0 +1,476 @@ +#!/bin/sh +# Copyright 2014 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 or the MIT license +# , at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + + +msg() { + echo "rustup: $1" +} + +step_msg() { + msg + msg "$1" + msg +} + +warn() { + echo "rustup: WARNING: $1" +} + +err() { + echo "rustup: error: $1" + exit 1 +} + +need_ok() { + if [ $? -ne 0 ] + then + err "$1" + fi +} + + +putvar() { + local T + eval T=\$$1 + eval TLEN=\${#$1} + if [ $TLEN -gt 35 ] + then + printf "rustup: %-20s := %.35s ...\n" $1 "$T" + else + printf "rustup: %-20s := %s %s\n" $1 "$T" "$2" + fi +} + +probe() { + local V=$1 + shift + local P + local T + for P + do + T=$(which $P 2>&1) + if [ $? -eq 0 ] + then + VER0=$($P --version 2>/dev/null | head -1 \ + | sed -e 's/[^0-9]*\([vV]\?[0-9.]\+[^ ]*\).*/\1/' ) + if [ $? -eq 0 -a "x${VER0}" != "x" ] + then + VER="($VER0)" + else + VER="" + fi + break + else + VER="" + T="" + fi + done + eval $V=\$T + putvar $V "$VER" +} + +probe_need() { + local V=$1 + probe $* + eval VV=\$$V + if [ -z "$VV" ] + then + err "needed, but unable to find any of: $*" + fi +} + + +valopt() { + VAL_OPTIONS="$VAL_OPTIONS $1" + + local OP=$1 + local DEFAULT=$2 + shift + shift + local DOC="$*" + if [ $HELP -eq 0 ] + then + local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_') + local V="CFG_${UOP}" + eval $V="$DEFAULT" + for arg in $CFG_ARGS + do + if echo "$arg" | grep -q -- "--$OP=" + then + val=$(echo "$arg" | cut -f2 -d=) + eval $V=$val + fi + done + putvar $V + else + if [ -z "$DEFAULT" ] + then + DEFAULT="" + fi + OP="${OP}=[${DEFAULT}]" + printf " --%-30s %s\n" "$OP" "$DOC" + fi +} + +opt() { + BOOL_OPTIONS="$BOOL_OPTIONS $1" + + local OP=$1 + local DEFAULT=$2 + shift + shift + local DOC="$*" + local FLAG="" + + if [ $DEFAULT -eq 0 ] + then + FLAG="enable" + else + FLAG="disable" + DOC="don't $DOC" + fi + + if [ $HELP -eq 0 ] + then + for arg in $CFG_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}" + eval $V=1 + putvar $V + fi + done + else + if [ ! -z "$META" ] + then + OP="$OP=<$META>" + fi + printf " --%-30s %s\n" "$FLAG-$OP" "$DOC" + fi +} + +flag() { + BOOL_OPTIONS="$BOOL_OPTIONS $1" + + local OP=$1 + shift + local DOC="$*" + + if [ $HELP -eq 0 ] + then + for arg in $CFG_ARGS + do + if [ "$arg" = "--${OP}" ] + then + OP=$(echo $OP | tr 'a-z-' 'A-Z_') + local V="CFG_${OP}" + eval $V=1 + putvar $V + fi + done + else + if [ ! -z "$META" ] + then + OP="$OP=<$META>" + fi + printf " --%-30s %s\n" "$OP" "$DOC" + fi +} + +validate_opt () { + for arg in $CFG_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 + if test --$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 +} + +probe_need CFG_CURL curl + +CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/" +CFG_SELF="$0" +CFG_ARGS="$@" + +HELP=0 +if [ "$1" = "--help" ] +then + HELP=1 + shift + echo + echo "Usage: $CFG_SELF [options]" + echo + echo "Options:" + echo +else + step_msg "processing $CFG_SELF args" +fi + +OPTIONS="" +BOOL_OPTIONS="" +VAL_OPTIONS="" + +flag uninstall "only uninstall from the installation prefix" +valopt prefix "" "set installation prefix" +opt cargo 1 "install cargo with rust" + +if [ $HELP -eq 1 ] +then + echo + exit 0 +fi + +step_msg "validating $CFG_SELF args" +validate_opt + + +# Platform detection copied from `configure` + +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 + ;; + + Darwin) + CFG_OSTYPE=apple-darwin + ;; + + MINGW32*) + CFG_OSTYPE=pc-mingw32 + ;; +# Thad's Cygwin identifers below + +# Vista 32 bit + CYGWIN_NT-6.0) + CFG_OSTYPE=pc-mingw32 + CFG_CPUTYPE=i686 + ;; + +# Vista 64 bit + CYGWIN_NT-6.0-WOW64) + CFG_OSTYPE=w64-mingw32 + CFG_CPUTYPE=x86_64 + ;; + +# Win 7 32 bit + CYGWIN_NT-6.1) + CFG_OSTYPE=pc-mingw32 + CFG_CPUTYPE=i686 + ;; + +# Win 7 64 bit + CYGWIN_NT-6.1-WOW64) + CFG_OSTYPE=w64-mingw32 + CFG_CPUTYPE=x86_64 + ;; + +# 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 + ;; + + 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 + file -L "$SHELL" | grep -q "x86[_-]64" + if [ $? != 0 ]; then + CFG_CPUTYPE=i686 + fi +fi + +HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}" + +# Is this a triple we have nightlies for? +case $HOST_TRIPLE in + + x86_64-unknown-linux-gnu) + ;; + + i686-unknown-linux-gnu) + ;; + + x86_64-apple-darwin) + ;; + + i686-apple-darwin) + ;; + + *) + err "rustup.sh doesn't work for host $HOST_TRIPLE" + +esac + +msg "host triple: ${HOST_TRIPLE}" + +PACKAGE_NAME=rust-nightly +PACKAGE_NAME_AND_TRIPLE="${PACKAGE_NAME}-${HOST_TRIPLE}" +TARBALL_NAME="${PACKAGE_NAME_AND_TRIPLE}.tar.gz" +REMOTE_TARBALL="https://static.rust-lang.org/dist/${TARBALL_NAME}" +TMP_DIR="./rustup-tmp-install" +LOCAL_TARBALL="${TMP_DIR}/${TARBALL_NAME}" +LOCAL_INSTALL_DIR="${TMP_DIR}/${PACKAGE_NAME_AND_TRIPLE}" +LOCAL_INSTALL_SCRIPT="${LOCAL_INSTALL_DIR}/install.sh" + +CARGO_PACKAGE_NAME=cargo-nightly +CARGO_PACKAGE_NAME_AND_TRIPLE="${CARGO_PACKAGE_NAME}-${HOST_TRIPLE}" +CARGO_TARBALL_NAME="${CARGO_PACKAGE_NAME_AND_TRIPLE}.tar.gz" +CARGO_REMOTE_TARBALL="https://static.rust-lang.org/cargo-dist/${CARGO_TARBALL_NAME}" +CARGO_LOCAL_TARBALL="${TMP_DIR}/${CARGO_TARBALL_NAME}" +CARGO_LOCAL_INSTALL_DIR="${TMP_DIR}/${CARGO_PACKAGE_NAME_AND_TRIPLE}" +CARGO_LOCAL_INSTALL_SCRIPT="${CARGO_LOCAL_INSTALL_DIR}/install.sh" + +rm -Rf "${TMP_DIR}" +need_ok "failed to remove temporary installation directory" + +mkdir -p "${TMP_DIR}" +need_ok "failed to create create temporary installation directory" + +msg "downloading rust installer" +"${CFG_CURL}" "${REMOTE_TARBALL}" > "${LOCAL_TARBALL}" +if [ $? -ne 0 ] +then + rm -Rf "${TMP_DIR}" + err "failed to download installer" +fi + +if [ -z "${CFG_DISABLE_CARGO}" ]; then + msg "downloading cargo installer" + "${CFG_CURL}" "${CARGO_REMOTE_TARBALL}" > "${CARGO_LOCAL_TARBALL}" + if [ $? -ne 0 ] + then + rm -Rf "${TMP_DIR}" + err "failed to download cargo installer" + fi +fi + + +(cd "${TMP_DIR}" && tar xzf "${TARBALL_NAME}") +if [ $? -ne 0 ] +then + rm -Rf "${TMP_DIR}" + err "failed to unpack installer" +fi + +MAYBE_UNINSTALL= +if [ -n "${CFG_UNINSTALL}" ] +then + MAYBE_UNINSTALL="--uninstall" +fi + +MAYBE_PREFIX= +if [ -n "${CFG_PREFIX}" ] +then + MAYBE_PREFIX="--prefix=${CFG_PREFIX}" +fi + +sh "${LOCAL_INSTALL_SCRIPT}" "${MAYBE_UNINSTALL}" "${MAYBE_PREFIX}" +if [ $? -ne 0 ] +then + rm -Rf "${TMP_DIR}" + err "failed to install Rust" +fi + +if [ -z "${CFG_DISABLE_CARGO}" ]; then + (cd "${TMP_DIR}" && tar xzf "${CARGO_TARBALL_NAME}") + if [ $? -ne 0 ] + then + rm -Rf "${TMP_DIR}" + err "failed to unpack cargo installer" + fi + + sh "${CARGO_LOCAL_INSTALL_SCRIPT}" "${MAYBE_UNINSTALL}" "${MAYBE_PREFIX}" + if [ $? -ne 0 ] + then + rm -Rf "${TMP_DIR}" + err "failed to install Cargo" + fi +fi + +rm -Rf "${TMP_DIR}" +need_ok "couldn't rm temporary installation directory"