]> git.lizzy.rs Git - rust.git/blob - src/etc/rustup.sh
doc: remove incomplete sentence
[rust.git] / src / etc / rustup.sh
1 #!/bin/sh
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.
5 #
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.
11
12
13 msg() {
14     echo "rustup: $1"
15 }
16
17 step_msg() {
18     msg
19     msg "$1"
20     msg
21 }
22
23 warn() {
24     echo "rustup: WARNING: $1"
25 }
26
27 err() {
28     echo "rustup: error: $1"
29     exit 1
30 }
31
32 need_ok() {
33     if [ $? -ne 0 ]
34     then
35         err "$1"
36     fi
37 }
38
39
40 putvar() {
41     local T
42     eval T=\$$1
43     eval TLEN=\${#$1}
44     if [ $TLEN -gt 35 ]
45     then
46         printf "rustup: %-20s := %.35s ...\n" $1 "$T"
47     else
48         printf "rustup: %-20s := %s %s\n" $1 "$T" "$2"
49     fi
50 }
51
52 probe() {
53     local V=$1
54     shift
55     local P
56     local T
57     for P
58     do
59         T=$(which $P 2>&1)
60         if [ $? -eq 0 ]
61         then
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" ]
65             then
66               VER="($VER0)"
67             else
68               VER=""
69             fi
70             break
71         else
72             VER=""
73             T=""
74         fi
75     done
76     eval $V=\$T
77     putvar $V "$VER"
78 }
79
80 probe_need() {
81     local V=$1
82     probe $*
83     eval VV=\$$V
84     if [ -z "$VV" ]
85     then
86         err "needed, but unable to find any of: $*"
87     fi
88 }
89
90
91 valopt() {
92     VAL_OPTIONS="$VAL_OPTIONS $1"
93
94     local OP=$1
95     local DEFAULT=$2
96     shift
97     shift
98     local DOC="$*"
99     if [ $HELP -eq 0 ]
100     then
101         local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
102         local V="CFG_${UOP}"
103         eval $V="$DEFAULT"
104         for arg in $CFG_ARGS
105         do
106             if echo "$arg" | grep -q -- "--$OP="
107             then
108                 val=$(echo "$arg" | cut -f2 -d=)
109                 eval $V=$val
110             fi
111         done
112         putvar $V
113     else
114         if [ -z "$DEFAULT" ]
115         then
116             DEFAULT="<none>"
117         fi
118         OP="${OP}=[${DEFAULT}]"
119         printf "    --%-30s %s\n" "$OP" "$DOC"
120     fi
121 }
122
123 opt() {
124     BOOL_OPTIONS="$BOOL_OPTIONS $1"
125
126     local OP=$1
127     local DEFAULT=$2
128     shift
129     shift
130     local DOC="$*"
131     local FLAG=""
132
133     if [ $DEFAULT -eq 0 ]
134     then
135         FLAG="enable"
136     else
137         FLAG="disable"
138         DOC="don't $DOC"
139     fi
140
141     if [ $HELP -eq 0 ]
142     then
143         for arg in $CFG_ARGS
144         do
145             if [ "$arg" = "--${FLAG}-${OP}" ]
146             then
147                 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
148                 FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
149                 local V="CFG_${FLAG}_${OP}"
150                 eval $V=1
151                 putvar $V
152             fi
153         done
154     else
155         if [ ! -z "$META" ]
156         then
157             OP="$OP=<$META>"
158         fi
159         printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
160      fi
161 }
162
163 flag() {
164     BOOL_OPTIONS="$BOOL_OPTIONS $1"
165
166     local OP=$1
167     shift
168     local DOC="$*"
169
170     if [ $HELP -eq 0 ]
171     then
172         for arg in $CFG_ARGS
173         do
174             if [ "$arg" = "--${OP}" ]
175             then
176                 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
177                 local V="CFG_${OP}"
178                 eval $V=1
179                 putvar $V
180             fi
181         done
182     else
183         if [ ! -z "$META" ]
184         then
185             OP="$OP=<$META>"
186         fi
187         printf "    --%-30s %s\n" "$OP" "$DOC"
188      fi
189 }
190
191 validate_opt() {
192     for arg in $CFG_ARGS
193     do
194         isArgValid=0
195         for option in $BOOL_OPTIONS
196         do
197             if test --disable-$option = $arg
198             then
199                 isArgValid=1
200             fi
201             if test --enable-$option = $arg
202             then
203                 isArgValid=1
204             fi
205             if test --$option = $arg
206             then
207                 isArgValid=1
208             fi
209         done
210         for option in $VAL_OPTIONS
211         do
212             if echo "$arg" | grep -q -- "--$option="
213             then
214                 isArgValid=1
215             fi
216         done
217         if [ "$arg" = "--help" ]
218         then
219             echo
220             echo "No more help available for Configure options,"
221             echo "check the Wiki or join our IRC channel"
222             break
223         else
224             if test $isArgValid -eq 0
225             then
226                 err "Option '$arg' is not recognized"
227             fi
228         fi
229     done
230 }
231
232 create_tmp_dir() {
233     local TMP_DIR=./rustup-tmp-install
234
235     rm -Rf "${TMP_DIR}"
236     need_ok "failed to remove temporary installation directory"
237
238     mkdir -p "${TMP_DIR}"
239     need_ok "failed to create create temporary installation directory"
240
241     echo $TMP_DIR
242 }
243
244 probe_need CFG_CURL  curl
245 probe_need CFG_TAR   tar
246 probe_need CFG_FILE  file
247
248 CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
249 CFG_SELF="$0"
250 CFG_ARGS="$@"
251
252 HELP=0
253 if [ "$1" = "--help" ]
254 then
255     HELP=1
256     shift
257     echo
258     echo "Usage: $CFG_SELF [options]"
259     echo
260     echo "Options:"
261     echo
262 else
263     step_msg "processing $CFG_SELF args"
264 fi
265
266 OPTIONS=""
267 BOOL_OPTIONS=""
268 VAL_OPTIONS=""
269
270 flag uninstall "only uninstall from the installation prefix"
271 valopt prefix "" "set installation prefix"
272 opt cargo 1 "install cargo with rust"
273
274 if [ $HELP -eq 1 ]
275 then
276     echo
277     exit 0
278 fi
279
280 step_msg "validating $CFG_SELF args"
281 validate_opt
282
283
284 # Platform detection copied from `configure`
285
286 CFG_OSTYPE=$(uname -s)
287 CFG_CPUTYPE=$(uname -m)
288
289 if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
290 then
291     # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
292     # instead.
293     if sysctl hw.optional.x86_64 | grep -q ': 1'
294     then
295         CFG_CPUTYPE=x86_64
296     fi
297 fi
298
299 # The goal here is to come up with the same triple as LLVM would,
300 # at least for the subset of platforms we're willing to target.
301
302 case $CFG_OSTYPE in
303
304     Linux)
305         CFG_OSTYPE=unknown-linux-gnu
306         ;;
307
308     FreeBSD)
309         CFG_OSTYPE=unknown-freebsd
310         ;;
311
312     Darwin)
313         CFG_OSTYPE=apple-darwin
314         ;;
315
316     MINGW32*)
317         CFG_OSTYPE=pc-mingw32
318         ;;
319 # Thad's Cygwin identifers below
320
321 #   Vista 32 bit
322     CYGWIN_NT-6.0)
323         CFG_OSTYPE=pc-mingw32
324         CFG_CPUTYPE=i686
325         ;;
326
327 #   Vista 64 bit
328     CYGWIN_NT-6.0-WOW64)
329         CFG_OSTYPE=w64-mingw32
330         CFG_CPUTYPE=x86_64
331         ;;
332
333 #   Win 7 32 bit
334     CYGWIN_NT-6.1)
335         CFG_OSTYPE=pc-mingw32
336         CFG_CPUTYPE=i686
337         ;;
338
339 #   Win 7 64 bit
340     CYGWIN_NT-6.1-WOW64)
341         CFG_OSTYPE=w64-mingw32
342         CFG_CPUTYPE=x86_64
343         ;;
344
345 # We do not detect other OS such as XP/2003 using 64 bit using uname.
346 # If we want to in the future, we will need to use Cygwin
347 # Chuck's csih helper in /usr/lib/csih/winProductName.exe or alternative.
348     *)
349         err "unknown OS type: $CFG_OSTYPE"
350         ;;
351 esac
352
353
354 case $CFG_CPUTYPE in
355
356     i386 | i486 | i686 | i786 | x86)
357         CFG_CPUTYPE=i686
358         ;;
359
360     xscale | arm)
361         CFG_CPUTYPE=arm
362         ;;
363
364     x86_64 | x86-64 | x64 | amd64)
365         CFG_CPUTYPE=x86_64
366         ;;
367
368     *)
369         err "unknown CPU type: $CFG_CPUTYPE"
370 esac
371
372 # Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
373 if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
374 then
375     "${CFG_FILE}" -L "$SHELL" | grep -q "x86[_-]64"
376     if [ $? != 0 ]; then
377         CFG_CPUTYPE=i686
378     fi
379 fi
380
381 HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
382
383 # Is this a triple we have nightlies for?
384 case $HOST_TRIPLE in
385
386         x86_64-unknown-linux-gnu)
387                 ;;
388
389         i686-unknown-linux-gnu)
390                 ;;
391
392         x86_64-apple-darwin)
393                 ;;
394
395         i686-apple-darwin)
396                 ;;
397
398         *)
399                 err "rustup.sh doesn't work for host $HOST_TRIPLE"
400
401 esac
402
403 msg "host triple: ${HOST_TRIPLE}"
404
405 CFG_INSTALL_FLAGS=""
406 if [ -n "${CFG_UNINSTALL}" ]
407 then
408     CFG_INSTALL_FLAGS="${CFG_INSTALL_FLAGS} --uninstall"
409 fi
410
411 if [ -n "${CFG_PREFIX}" ]
412 then
413     CFG_INSTALL_FLAGS="${CFG_INSTALL_FLAGS} --prefix=${CFG_PREFIX}"
414 fi
415
416 CFG_TMP_DIR=$(mktemp -d 2>/dev/null \
417            || mktemp -d -t 'rustup-tmp-install' 2>/dev/null \
418            || create_tmp_dir)
419
420 RUST_URL="https://static.rust-lang.org/dist"
421 RUST_PACKAGE_NAME=rust-nightly
422 RUST_PACKAGE_NAME_AND_TRIPLE="${RUST_PACKAGE_NAME}-${HOST_TRIPLE}"
423 RUST_TARBALL_NAME="${RUST_PACKAGE_NAME_AND_TRIPLE}.tar.gz"
424 RUST_LOCAL_INSTALL_DIR="${CFG_TMP_DIR}/${RUST_PACKAGE_NAME_AND_TRIPLE}"
425 RUST_LOCAL_INSTALL_SCRIPT="${RUST_LOCAL_INSTALL_DIR}/install.sh"
426
427 CARGO_URL="https://static.rust-lang.org/cargo-dist"
428 CARGO_PACKAGE_NAME=cargo-nightly
429 CARGO_PACKAGE_NAME_AND_TRIPLE="${CARGO_PACKAGE_NAME}-${HOST_TRIPLE}"
430 CARGO_TARBALL_NAME="${CARGO_PACKAGE_NAME_AND_TRIPLE}.tar.gz"
431 CARGO_LOCAL_INSTALL_DIR="${CFG_TMP_DIR}/${CARGO_PACKAGE_NAME_AND_TRIPLE}"
432 CARGO_LOCAL_INSTALL_SCRIPT="${CARGO_LOCAL_INSTALL_DIR}/install.sh"
433
434 # Fetch the package.
435 download_package() {
436     remote_tarball="$1"
437     local_tarball="$2"
438
439     msg "Downloading ${remote_tarball} to ${local_tarball}"
440
441     "${CFG_CURL}" -f -o "${local_tarball}" "${remote_tarball}"
442     if [ $? -ne 0 ]
443     then
444         rm -Rf "${CFG_TMP_DIR}"
445         err "failed to download installer"
446     fi
447 }
448
449 # Wrap all the commands needed to install a package.
450 install_package() {
451     tarball_name="$1"
452     install_script="$2"
453
454     msg "Extracting ${tarball_name}"
455     (cd "${CFG_TMP_DIR}" && "${CFG_TAR}" -xzf "${tarball_name}")
456     if [ $? -ne 0 ]; then
457         rm -Rf "${CFG_TMP_DIR}"
458         err "failed to unpack installer"
459     fi
460
461     sh "${install_script}" "${CFG_INSTALL_FLAGS}"
462     if [ $? -ne 0 ]
463     then
464         rm -Rf "${CFG_TMP_DIR}"
465         err "failed to install Rust"
466     fi
467 }
468
469 # It's possible that curl could be interrupted partway though downloading
470 # `rustup.sh`, truncating the file. This could be especially bad if we were in
471 # the middle of a line that would run "rm -rf ". To protect against this, we
472 # wrap up the `rustup.sh` destructive functionality in this helper function,
473 # which we call as the last thing we do. This means we will not do anything
474 # unless we have the entire file downloaded.
475 install_packages() {
476     rm -Rf "${CFG_TMP_DIR}"
477     need_ok "failed to remove temporary installation directory"
478
479     mkdir -p "${CFG_TMP_DIR}"
480     need_ok "failed to create create temporary installation directory"
481
482     RUST_LOCAL_TARBALL="${CFG_TMP_DIR}/${RUST_TARBALL_NAME}"
483     CARGO_LOCAL_TARBALL="${CFG_TMP_DIR}/${CARGO_TARBALL_NAME}"
484
485     download_package \
486         "${RUST_URL}/${RUST_TARBALL_NAME}" \
487         "${RUST_LOCAL_TARBALL}"
488
489     if [ -z "${CFG_DISABLE_CARGO}" ]; then
490         download_package \
491             "${CARGO_URL}/${CARGO_TARBALL_NAME}" \
492             "${CARGO_LOCAL_TARBALL}"
493     fi
494
495     install_package \
496         "${RUST_TARBALL_NAME}" \
497         "${RUST_LOCAL_INSTALL_SCRIPT}"
498
499     if [ -z "${CFG_DISABLE_CARGO}" ]; then
500         install_package \
501             "${CARGO_TARBALL_NAME}" \
502             "${CARGO_LOCAL_INSTALL_SCRIPT}"
503     fi
504
505     rm -Rf "${CFG_TMP_DIR}"
506     need_ok "couldn't rm temporary installation directory"
507 }
508
509 install_packages