2 # Copyright 2014 The Rust Project Developers. See the COPYRIGHT
3 # file at the top-level directory of this distribution and at
4 # http://rust-lang.org/COPYRIGHT.
6 # Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
7 # http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
8 # <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
9 # option. This file may not be copied, modified, or distributed
10 # except according to those terms.
24 echo "rustup: WARNING: $1"
28 echo "rustup: error: $1"
46 printf "rustup: %-20s := %.35s ...\n" $1 "$T"
48 printf "rustup: %-20s := %s %s\n" $1 "$T" "$2"
62 VER0
=$
($P --version 2>/dev
/null |
head -1 \
63 |
sed -e 's/[^0-9]*\([vV]\?[0-9.]\+[^ ]*\).*/\1/' )
64 if [ $?
-eq 0 -a "x${VER0}" != "x" ]
86 err
"needed, but unable to find any of: $*"
92 VAL_OPTIONS
="$VAL_OPTIONS $1"
101 local UOP
=$
(echo $OP |
tr '[:lower:]' '[:upper:]' |
tr '\-' '\_')
106 if echo "$arg" |
grep -q -- "--$OP="
108 val
=$
(echo "$arg" | cut
-f2 -d=)
118 OP
="${OP}=[${DEFAULT}]"
119 printf " --%-30s %s\n" "$OP" "$DOC"
124 BOOL_OPTIONS
="$BOOL_OPTIONS $1"
133 if [ $DEFAULT -eq 0 ]
145 if [ "$arg" = "--${FLAG}-${OP}" ]
147 OP
=$
(echo $OP |
tr 'a-z-' 'A-Z_')
148 FLAG
=$
(echo $FLAG |
tr 'a-z' 'A-Z')
149 local V
="CFG_${FLAG}_${OP}"
159 printf " --%-30s %s\n" "$FLAG-$OP" "$DOC"
164 BOOL_OPTIONS
="$BOOL_OPTIONS $1"
174 if [ "$arg" = "--${OP}" ]
176 OP
=$
(echo $OP |
tr 'a-z-' 'A-Z_')
187 printf " --%-30s %s\n" "$OP" "$DOC"
195 for option
in $BOOL_OPTIONS
197 if test --disable-$option = $arg
201 if test --enable-$option = $arg
205 if test --$option = $arg
210 for option
in $VAL_OPTIONS
212 if echo "$arg" |
grep -q -- "--$option="
217 if [ "$arg" = "--help" ]
220 echo "No more help available for Configure options,"
221 echo "check the Wiki or join our IRC channel"
224 if test $isArgValid -eq 0
226 err
"Option '$arg' is not recognized"
233 local TMP_DIR
=`pwd`/rustup-tmp-install
236 need_ok
"failed to remove temporary installation directory"
238 mkdir
-p "${TMP_DIR}"
239 need_ok
"failed to create create temporary installation directory"
244 # Make `tr` locale independent
247 probe_need CFG_CURL curl
248 probe_need CFG_TAR
tar
249 probe_need CFG_FILE
file
251 probe CFG_SHA256SUM sha256sum
252 probe CFG_SHASUM shasum
254 if [ -z "$CFG_SHA256SUM" -a -z "$CFG_SHASUM" ]; then
255 err
"unable to find either sha256sum or shasum"
259 if [ -n "$CFG_SHA256SUM" ]; then
262 ${CFG_SHASUM} -a 256 $@
266 CFG_SRC_DIR
="$(cd $(dirname $0) && pwd)/"
271 if [ "$1" = "--help" ]
276 echo "Usage: $CFG_SELF [options]"
281 step_msg
"processing $CFG_SELF args"
288 flag uninstall
"only uninstall from the installation prefix"
289 valopt prefix
"" "set installation prefix"
290 valopt
date "" "use the YYYY-MM-DD nightly instead of the current nightly"
291 valopt channel
"beta" "use the selected release channel [beta]"
292 flag save
"save the downloaded nightlies to ~/.rustup"
300 step_msg
"validating $CFG_SELF args"
304 # Platform detection copied from `configure`
306 CFG_OSTYPE
=$
(uname
-s)
307 CFG_CPUTYPE
=$
(uname
-m)
309 if [ $CFG_OSTYPE = Darwin
-a $CFG_CPUTYPE = i386
]
311 # Darwin's `uname -m` lies and always returns i386. We have to use sysctl
313 if sysctl hw.optional.x86_64 |
grep -q ': 1'
319 # The goal here is to come up with the same triple as LLVM would,
320 # at least for the subset of platforms we're willing to target.
325 CFG_OSTYPE
=unknown-linux-gnu
329 CFG_OSTYPE
=unknown-freebsd
333 CFG_OSTYPE
=apple-darwin
337 CFG_OSTYPE
=pc-mingw32
339 # Thad's Cygwin identifiers below
343 CFG_OSTYPE
=pc-mingw32
349 CFG_OSTYPE
=w64-mingw32
355 CFG_OSTYPE
=pc-mingw32
361 CFG_OSTYPE
=w64-mingw32
365 # We do not detect other OS such as XP/2003 using 64 bit using uname.
366 # If we want to in the future, we will need to use Cygwin
367 # Chuck's csih helper in /usr/lib/csih/winProductName.exe or alternative.
369 err
"unknown OS type: $CFG_OSTYPE"
376 i386 | i486 | i686 | i786 | x86
)
384 x86_64 | x86-64 | x64 | amd64
)
389 err
"unknown CPU type: $CFG_CPUTYPE"
392 # Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
393 if [ $CFG_OSTYPE = unknown-linux-gnu
-a $CFG_CPUTYPE = x86_64
]
395 "${CFG_FILE}" -L "$SHELL" |
grep -q "x86[_-]64"
401 HOST_TRIPLE
="${CFG_CPUTYPE}-${CFG_OSTYPE}"
403 # Is this a triple we have nightlies for?
406 x86_64-unknown-linux-gnu
)
409 i686-unknown-linux-gnu
)
419 err
"rustup.sh doesn't work for host $HOST_TRIPLE"
423 msg
"host triple: ${HOST_TRIPLE}"
426 if [ -n "${CFG_UNINSTALL}" ]
428 CFG_INSTALL_FLAGS
="${CFG_INSTALL_FLAGS} --uninstall"
431 if [ -n "${CFG_PREFIX}" ]
433 CFG_INSTALL_FLAGS
="${CFG_INSTALL_FLAGS} --prefix=${CFG_PREFIX}"
436 CFG_TMP_DIR
=$
(mktemp
-d 2>/dev
/null \
437 || mktemp
-d -t 'rustup-tmp-install' 2>/dev
/null \
440 # If we're saving nightlies and we didn't specify which one, grab the latest
441 # version from the perspective of the server. Buildbot has typically finished
442 # building and uploading by ~8UTC, but we want to include a little buffer.
444 # FIXME It would be better to use the known most recent nightly that has been
445 # built. This is waiting on a change to have buildbot publish metadata that
447 if [ -n "${CFG_SAVE}" -a -z "${CFG_DATE}" ];
449 CFG_DATE
=`TZ=Etc/UTC+9 date "+%Y-%m-%d"`
452 RUST_URL
="https://static.rust-lang.org/dist"
453 case "$CFG_CHANNEL" in
455 # add a date suffix if we want a particular nightly.
456 if [ -n "${CFG_DATE}" ];
458 RUST_URL
="${RUST_URL}/${CFG_DATE}"
461 RUST_PACKAGE_NAME
=rust-nightly
464 RUST_PACKAGE_NAME
=rust-1.0
.0-beta
467 err
"Currently 'beta' and 'nightly' are the only supported channels"
470 RUST_PACKAGE_NAME_AND_TRIPLE
="${RUST_PACKAGE_NAME}-${HOST_TRIPLE}"
471 RUST_TARBALL_NAME
="${RUST_PACKAGE_NAME_AND_TRIPLE}.tar.gz"
472 RUST_LOCAL_INSTALL_DIR
="${CFG_TMP_DIR}/${RUST_PACKAGE_NAME_AND_TRIPLE}"
473 RUST_LOCAL_INSTALL_SCRIPT
="${RUST_LOCAL_INSTALL_DIR}/install.sh"
476 msg
"Downloading ${remote_sha256}"
477 remote_sha256
=`"${CFG_CURL}" -f "${remote_sha256}"`
478 if [ -n "${CFG_SAVE}" ]; then
479 echo "${remote_sha256}" > "${local_sha_file}"
481 if [ "$?" -ne 0 ]; then
482 rm -Rf "${CFG_TMP_DIR}"
483 err
"Failed to download ${remote_url}"
490 local_sha_file
="${local_file}.sha256"
492 if [ -n "${CFG_SAVE}" ]; then
493 if [ -f "${local_sha_file}" ]; then
494 msg
"Local ${local_sha_file} exists, treating as remote hash"
495 remote_sha256
=`cat "${local_sha_file}"`
504 local_sha256
=$
(calculate_hash
"${local_file}")
505 if [ "$?" -ne 0 ]; then
506 rm -Rf "${CFG_TMP_DIR}"
507 err
"Failed to compute hash for ${local_tarball}"
510 # We only need the sha, not the filenames
511 remote_sha256
=`echo ${remote_sha256} | cut -f 1 -d ' '`
512 local_sha256
=`echo ${local_sha256} | cut -f 1 -d ' '`
514 if [ "${remote_sha256}" != "${local_sha256}" ]; then
515 rm -Rf "${CFG_TMP_DIR}"
516 errmsg
="invalid sha256.\n"
517 errmsg
="$errmsg ${remote_sha256}\t${remote_tarball}\n"
518 errmsg
="$errmsg ${local_sha256}\t${local_tarball}"
523 # Fetch the package. Optionally caches the tarballs.
527 remote_sha256
="${remote_tarball}.sha256"
529 # Check if we've already downloaded this file.
530 if [ -e "${local_tarball}.tmp" ]; then
531 msg
"Resuming ${remote_tarball} to ${local_tarball}"
533 "${CFG_CURL}" -f -C - -o "${local_tarball}.tmp" "${remote_tarball}"
536 rm -Rf "${CFG_TMP_DIR}"
537 err
"failed to download installer"
540 mv "${local_tarball}.tmp" "${local_tarball}"
541 elif [ ! -e "${local_tarball}" ]; then
542 msg
"Downloading ${remote_tarball} to ${local_tarball}"
544 "${CFG_CURL}" -f -o "${local_tarball}.tmp" "${remote_tarball}"
547 rm -Rf "${CFG_TMP_DIR}"
548 err
"failed to download installer"
551 mv "${local_tarball}.tmp" "${local_tarball}"
554 verify_hash
"${remote_sha256}" "${local_tarball}"
557 # Wrap all the commands needed to install a package.
562 msg
"Extracting ${local_tarball}"
563 (cd "${CFG_TMP_DIR}" && "${CFG_TAR}" -xzf "${local_tarball}")
564 if [ $?
-ne 0 ]; then
565 rm -Rf "${CFG_TMP_DIR}"
566 err
"failed to unpack installer"
569 sh
"${install_script}" "${CFG_INSTALL_FLAGS}"
572 rm -Rf "${CFG_TMP_DIR}"
573 err
"failed to install Rust"
577 # It's possible that curl could be interrupted partway though downloading
578 # `rustup.sh`, truncating the file. This could be especially bad if we were in
579 # the middle of a line that would run "rm -rf ". To protect against this, we
580 # wrap up the `rustup.sh` destructive functionality in this helper function,
581 # which we call as the last thing we do. This means we will not do anything
582 # unless we have the entire file downloaded.
584 rm -Rf "${CFG_TMP_DIR}"
585 need_ok
"failed to remove temporary installation directory"
587 mkdir
-p "${CFG_TMP_DIR}"
588 need_ok
"failed to create create temporary installation directory"
590 # If we're saving our nightlies, put them in $HOME/.rustup.
591 if [ -n "${CFG_SAVE}" ]
593 RUST_DOWNLOAD_DIR
="${HOME}/.rustup/${CFG_DATE}"
595 RUST_DOWNLOAD_DIR
="${CFG_TMP_DIR}"
598 mkdir
-p "${RUST_DOWNLOAD_DIR}"
599 need_ok
"failed to create create download directory"
601 RUST_LOCAL_TARBALL
="${RUST_DOWNLOAD_DIR}/${RUST_TARBALL_NAME}"
604 "${RUST_URL}/${RUST_TARBALL_NAME}" \
605 "${RUST_LOCAL_TARBALL}"
608 "${RUST_LOCAL_TARBALL}" \
609 "${RUST_LOCAL_INSTALL_SCRIPT}"
611 rm -Rf "${CFG_TMP_DIR}"
612 need_ok
"couldn't rm temporary installation directory"