Update to 1.18.0.

This commit is contained in:
Josh Stone 2017-06-08 15:08:30 -07:00
parent bba5493470
commit 96a6a3452a
5 changed files with 410 additions and 25 deletions

8
.gitignore vendored
View File

@ -49,3 +49,11 @@
/rust-1.16.0-powerpc64-unknown-linux-gnu.tar.gz
/rust-1.16.0-s390x-unknown-linux-gnu.tar.gz
/rust-1.16.0-x86_64-unknown-linux-gnu.tar.gz
/rustc-1.18.0-src.tar.gz
/rust-1.17.0-aarch64-unknown-linux-gnu.tar.gz
/rust-1.17.0-armv7-unknown-linux-gnueabihf.tar.gz
/rust-1.17.0-i686-unknown-linux-gnu.tar.gz
/rust-1.17.0-powerpc64le-unknown-linux-gnu.tar.gz
/rust-1.17.0-powerpc64-unknown-linux-gnu.tar.gz
/rust-1.17.0-s390x-unknown-linux-gnu.tar.gz
/rust-1.17.0-x86_64-unknown-linux-gnu.tar.gz

View File

@ -0,0 +1,368 @@
From 9d8fc50c4a989c934f9473e28022b86a07556dca Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Tue, 6 Jun 2017 12:59:04 -0700
Subject: [PATCH] rustbuild: Add `./x.py test --no-fail-fast`
This option forwards to each `cargo test` invocation, and applies the
same logic across all test steps to keep going after failures. At the
end, a brief summary line reports how many commands failed, if any.
Note that if a test program fails to even start at all, or if an
auxiliary build command related to testing fails, these are still left
to stop everything right away.
Fixes #40219.
---
src/bootstrap/check.rs | 53 ++++++++++++++++++++++++++++++++++++++-----------
src/bootstrap/flags.rs | 14 ++++++++++++-
src/bootstrap/lib.rs | 22 +++++++++++++++++++-
src/bootstrap/step.rs | 12 +++++++++--
src/build_helper/lib.rs | 38 ++++++++++++++++++++++++-----------
5 files changed, 111 insertions(+), 28 deletions(-)
diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs
index f8f641060c44..f39a7ba61213 100644
--- a/src/bootstrap/check.rs
+++ b/src/bootstrap/check.rs
@@ -58,6 +58,29 @@ impl fmt::Display for TestKind {
}
}
+fn try_run(build: &Build, cmd: &mut Command) {
+ if build.flags.cmd.no_fail_fast() {
+ if !build.try_run(cmd) {
+ let failures = build.delayed_failures.get();
+ build.delayed_failures.set(failures + 1);
+ }
+ } else {
+ build.run(cmd);
+ }
+}
+
+#[allow(unused)]
+fn try_run_quiet(build: &Build, cmd: &mut Command) {
+ if build.flags.cmd.no_fail_fast() {
+ if !build.try_run_quiet(cmd) {
+ let failures = build.delayed_failures.get();
+ build.delayed_failures.set(failures + 1);
+ }
+ } else {
+ build.run_quiet(cmd);
+ }
+}
+
/// Runs the `linkchecker` tool as compiled in `stage` by the `host` compiler.
///
/// This tool in `src/tools` will verify the validity of all our links in the
@@ -67,8 +90,8 @@ pub fn linkcheck(build: &Build, host: &str) {
let compiler = Compiler::new(0, host);
let _time = util::timeit();
- build.run(build.tool_cmd(&compiler, "linkchecker")
- .arg(build.out.join(host).join("doc")));
+ try_run(build, build.tool_cmd(&compiler, "linkchecker")
+ .arg(build.out.join(host).join("doc")));
}
/// Runs the `cargotest` tool as compiled in `stage` by the `host` compiler.
@@ -95,9 +118,9 @@ pub fn cargotest(build: &Build, stage: u32, host: &str) {
let _time = util::timeit();
let mut cmd = Command::new(build.tool(&Compiler::new(0, host), "cargotest"));
build.prepare_tool_cmd(compiler, &mut cmd);
- build.run(cmd.env("PATH", newpath)
- .arg(&build.cargo)
- .arg(&out_dir));
+ try_run(build, cmd.env("PATH", newpath)
+ .arg(&build.cargo)
+ .arg(&out_dir));
}
/// Runs the `tidy` tool as compiled in `stage` by the `host` compiler.
@@ -113,7 +136,7 @@ pub fn tidy(build: &Build, host: &str) {
if !build.config.vendor {
cmd.arg("--no-vendor");
}
- build.run(&mut cmd);
+ try_run(build, &mut cmd);
}
fn testdir(build: &Build, host: &str) -> PathBuf {
@@ -261,7 +284,7 @@ pub fn compiletest(build: &Build,
}
let _time = util::timeit();
- build.run(&mut cmd);
+ try_run(build, &mut cmd);
}
/// Run `rustdoc --test` for all documentation in `src/doc`.
@@ -337,7 +360,7 @@ fn markdown_test(build: &Build, compiler: &Compiler, markdown: &Path) {
}
cmd.arg("--test-args").arg(test_args);
- build.run(&mut cmd);
+ try_run(build, &mut cmd);
}
/// Run all unit tests plus documentation tests for an entire crate DAG defined
@@ -388,6 +411,9 @@ pub fn krate(build: &Build,
cargo.arg("--manifest-path")
.arg(build.src.join(path).join("Cargo.toml"))
.arg("--features").arg(features);
+ if test_kind.subcommand() == "test" && build.flags.cmd.no_fail_fast() {
+ cargo.arg("--no-fail-fast");
+ }
match krate {
Some(krate) => {
@@ -452,7 +478,7 @@ pub fn krate(build: &Build,
krate_qemu(build, &compiler, target, mode);
} else {
cargo.args(&build.flags.cmd.test_args());
- build.run(&mut cargo);
+ try_run(build, &mut cargo);
}
}
@@ -521,7 +547,7 @@ fn krate_emscripten(build: &Build,
if build.config.quiet_tests {
cmd.arg("--quiet");
}
- build.run(&mut cmd);
+ try_run(build, &mut cmd);
}
}
@@ -544,7 +570,7 @@ fn krate_qemu(build: &Build,
cmd.arg("--quiet");
}
cmd.args(&build.flags.cmd.test_args());
- build.run(&mut cmd);
+ try_run(build, &mut cmd);
}
}
@@ -671,6 +697,9 @@ pub fn bootstrap(build: &Build) {
.current_dir(build.src.join("src/bootstrap"))
.env("CARGO_TARGET_DIR", build.out.join("bootstrap"))
.env("RUSTC", &build.rustc);
+ if build.flags.cmd.no_fail_fast() {
+ cmd.arg("--no-fail-fast");
+ }
cmd.arg("--").args(&build.flags.cmd.test_args());
- build.run(&mut cmd);
+ try_run(build, &mut cmd);
}
diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs
index a1466d68a135..1ed759d24c54 100644
--- a/src/bootstrap/flags.rs
+++ b/src/bootstrap/flags.rs
@@ -61,6 +61,7 @@ pub enum Subcommand {
Test {
paths: Vec<PathBuf>,
test_args: Vec<String>,
+ no_fail_fast: bool,
},
Bench {
paths: Vec<PathBuf>,
@@ -137,7 +138,10 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`");
// Some subcommands get extra options
match subcommand.as_str() {
- "test" => { opts.optmulti("", "test-args", "extra arguments", "ARGS"); },
+ "test" => {
+ opts.optflag("", "no-fail-fast", "Run all tests regardless of failure");
+ opts.optmulti("", "test-args", "extra arguments", "ARGS");
+ },
"bench" => { opts.optmulti("", "test-args", "extra arguments", "ARGS"); },
"dist" => { opts.optflag("", "install", "run installer as well"); },
_ => { },
@@ -260,6 +264,7 @@ Arguments:
Subcommand::Test {
paths: paths,
test_args: matches.opt_strs("test-args"),
+ no_fail_fast: matches.opt_present("no-fail-fast"),
}
}
"bench" => {
@@ -335,6 +340,13 @@ impl Subcommand {
_ => Vec::new(),
}
}
+
+ pub fn no_fail_fast(&self) -> bool {
+ match *self {
+ Subcommand::Test { no_fail_fast, .. } => no_fail_fast,
+ _ => false,
+ }
+ }
}
fn split(s: Vec<String>) -> Vec<String> {
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index 5e046f41673e..d2303c96d201 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -76,6 +76,7 @@ extern crate num_cpus;
extern crate rustc_serialize;
extern crate toml;
+use std::cell::Cell;
use std::cmp;
use std::collections::HashMap;
use std::env;
@@ -85,7 +86,7 @@ use std::io::Read;
use std::path::{Component, PathBuf, Path};
use std::process::Command;
-use build_helper::{run_silent, run_suppressed, output, mtime};
+use build_helper::{run_silent, run_suppressed, try_run_silent, try_run_suppressed, output, mtime};
use util::{exe, libdir, add_lib_path};
@@ -164,6 +165,7 @@ pub struct Build {
crates: HashMap<String, Crate>,
is_sudo: bool,
src_is_git: bool,
+ delayed_failures: Cell<usize>,
}
#[derive(Debug)]
@@ -257,6 +259,7 @@ impl Build {
lldb_python_dir: None,
is_sudo: is_sudo,
src_is_git: src_is_git,
+ delayed_failures: Cell::new(0),
}
}
@@ -847,6 +850,23 @@ impl Build {
run_suppressed(cmd)
}
+ /// Runs a command, printing out nice contextual information if it fails.
+ /// Exits if the command failed to execute at all, otherwise returns its
+ /// `status.success()`.
+ fn try_run(&self, cmd: &mut Command) -> bool {
+ self.verbose(&format!("running: {:?}", cmd));
+ try_run_silent(cmd)
+ }
+
+ /// Runs a command, printing out nice contextual information if it fails.
+ /// Exits if the command failed to execute at all, otherwise returns its
+ /// `status.success()`.
+ #[allow(unused)]
+ fn try_run_quiet(&self, cmd: &mut Command) -> bool {
+ self.verbose(&format!("running: {:?}", cmd));
+ try_run_suppressed(cmd)
+ }
+
/// Prints a message if this build is configured in verbose mode.
fn verbose(&self, msg: &str) {
if self.flags.verbose() || self.config.verbose() {
diff --git a/src/bootstrap/step.rs b/src/bootstrap/step.rs
index 17902a39df1e..f0522035127c 100644
--- a/src/bootstrap/step.rs
+++ b/src/bootstrap/step.rs
@@ -28,6 +28,7 @@
use std::collections::{BTreeMap, HashSet, HashMap};
use std::mem;
+use std::process;
use check::{self, TestKind};
use compile;
@@ -1092,8 +1093,8 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd?
let (kind, paths) = match self.build.flags.cmd {
Subcommand::Build { ref paths } => (Kind::Build, &paths[..]),
Subcommand::Doc { ref paths } => (Kind::Doc, &paths[..]),
- Subcommand::Test { ref paths, test_args: _ } => (Kind::Test, &paths[..]),
- Subcommand::Bench { ref paths, test_args: _ } => (Kind::Bench, &paths[..]),
+ Subcommand::Test { ref paths, .. } => (Kind::Test, &paths[..]),
+ Subcommand::Bench { ref paths, .. } => (Kind::Bench, &paths[..]),
Subcommand::Dist { ref paths, install } => {
if install {
return vec![self.sbuild.name("install")]
@@ -1191,6 +1192,13 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd?
self.build.verbose(&format!("executing step {:?}", step));
(self.rules[step.name].run)(step);
}
+
+ // Check for postponed failures from `test --no-fail-fast`.
+ let failures = self.build.delayed_failures.get();
+ if failures > 0 {
+ println!("\n{} command(s) did not execute successfully.\n", failures);
+ process::exit(1);
+ }
}
/// From the top level targets `steps` generate a topological ordering of
diff --git a/src/build_helper/lib.rs b/src/build_helper/lib.rs
index cb58a916fb79..10b0f19d6274 100644
--- a/src/build_helper/lib.rs
+++ b/src/build_helper/lib.rs
@@ -42,35 +42,49 @@ pub fn run(cmd: &mut Command) {
}
pub fn run_silent(cmd: &mut Command) {
+ if !try_run_silent(cmd) {
+ std::process::exit(1);
+ }
+}
+
+pub fn try_run_silent(cmd: &mut Command) -> bool {
let status = match cmd.status() {
Ok(status) => status,
Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}",
cmd, e)),
};
if !status.success() {
- fail(&format!("command did not execute successfully: {:?}\n\
- expected success, got: {}",
- cmd,
- status));
+ println!("\n\ncommand did not execute successfully: {:?}\n\
+ expected success, got: {}\n\n",
+ cmd,
+ status);
}
+ status.success()
}
pub fn run_suppressed(cmd: &mut Command) {
+ if !try_run_suppressed(cmd) {
+ std::process::exit(1);
+ }
+}
+
+pub fn try_run_suppressed(cmd: &mut Command) -> bool {
let output = match cmd.output() {
Ok(status) => status,
Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}",
cmd, e)),
};
if !output.status.success() {
- fail(&format!("command did not execute successfully: {:?}\n\
- expected success, got: {}\n\n\
- stdout ----\n{}\n\
- stderr ----\n{}\n",
- cmd,
- output.status,
- String::from_utf8_lossy(&output.stdout),
- String::from_utf8_lossy(&output.stderr)));
+ println!("\n\ncommand did not execute successfully: {:?}\n\
+ expected success, got: {}\n\n\
+ stdout ----\n{}\n\
+ stderr ----\n{}\n\n",
+ cmd,
+ output.status,
+ String::from_utf8_lossy(&output.stdout),
+ String::from_utf8_lossy(&output.stderr));
}
+ output.status.success()
}
pub fn gnu_target(target: &str) -> String {
--
2.13.0

View File

@ -8,10 +8,10 @@
# To bootstrap from scratch, set the channel and date from src/stage0.txt
# e.g. 1.10.0 wants rustc: 1.9.0-2016-05-24
# or nightly wants some beta-YYYY-MM-DD
%global bootstrap_rust 1.16.0
%global bootstrap_cargo 0.17.0
%global bootstrap_rust 1.17.0
%global bootstrap_cargo 0.18.0
%global bootstrap_channel %{bootstrap_rust}
%global bootstrap_date 2017-03-11
%global bootstrap_date 2017-04-27
# Only the specified arches will use bootstrap binaries.
#global bootstrap_arches %%{rust_arches}
@ -47,8 +47,8 @@
Name: rust
Version: 1.17.0
Release: 2%{?dist}
Version: 1.18.0
Release: 1%{?dist}
Summary: The Rust Programming Language
License: (ASL 2.0 or MIT) and (BSD and ISC and MIT)
# ^ written as: (rust itself) and (bundled libraries)
@ -62,8 +62,12 @@ ExclusiveArch: %{rust_arches}
%endif
Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.gz
# Don't let configure clobber our debuginfo choice for stable releases.
Patch1: rust-1.16.0-configure-no-override.patch
# Backport rust#42363 to run all tests
Patch2: rust-1.18.0-no-fail-fast.patch
# Get the Rust triple for any arch.
%{lua: function rust_triple(arch)
local abi = "gnu"
@ -103,7 +107,7 @@ end}
%ifarch %{bootstrap_arches}
%global bootstrap_root rust-%{bootstrap_channel}-%{rust_triple}
%global local_rust_root %{_builddir}/%{bootstrap_root}%{_prefix}
%global local_rust_root %{_builddir}/%{bootstrap_root}/usr
Provides: bundled(%{name}-bootstrap) = %{bootstrap_rust}
%else
BuildRequires: cargo >= %{bootstrap_cargo}
@ -121,11 +125,7 @@ BuildRequires: python2
BuildRequires: curl
%if %with bundled_llvm
%if 0%{?epel}
BuildRequires: cmake3
%else
BuildRequires: cmake
%endif
Provides: bundled(llvm) = 3.9
%else
%if 0%{?fedora} >= 26 || 0%{?epel}
@ -173,6 +173,8 @@ Requires: gcc
%global _privatelibs lib.*-[[:xdigit:]]*[.]so.*
%global __provides_exclude ^(%{_privatelibs})$
%global __requires_exclude ^(%{_privatelibs})$
%global __provides_exclude_from ^%{_docdir}/.*$
%global __requires_exclude_from ^%{_docdir}/.*$
# While we don't want to encourage dynamic linking to Rust shared libraries, as
# there's no stable ABI, we still need the unallocated metadata (.rustc) to
@ -186,7 +188,7 @@ Requires: gcc
%if %{without bundled_llvm} && "%{llvm_root}" != "%{_prefix}"
# https://github.com/rust-lang/rust/issues/40717
%global rustflags %{rustflags} -Clink-arg=-L%{llvm_root}/lib
%global library_path $(%{llvm_root}/bin/llvm-config --libdir)
%endif
%description
@ -259,7 +261,7 @@ its standard library.
%ifarch %{bootstrap_arches}
%setup -q -n %{bootstrap_root} -T -b %{bootstrap_source}
./install.sh --components=cargo,rustc,rust-std-%{rust_triple} \
--prefix=./%{_prefix} --disable-ldconfig
--prefix=%{local_rust_root} --disable-ldconfig
test -f '%{local_rust_root}/bin/cargo'
test -f '%{local_rust_root}/bin/rustc'
%endif
@ -298,12 +300,14 @@ sed -i.ffi -e '$a #[link(name = "ffi")] extern {}' \
%endif
%patch1 -p1 -b .no-override
%patch2 -p1 -b .no-fail-fast
%build
%{?cmake_path:export PATH=%{cmake_path}:$PATH}
export RUSTFLAGS="%{rustflags}"
%{?library_path:export LIBRARY_PATH="%{library_path}"}
%{?rustflags:export RUSTFLAGS="%{rustflags}"}
# We're going to override --libdir when configuring to get rustlib into a
# common path, but we'll fix the shared libraries during install.
@ -327,7 +331,8 @@ export RUSTFLAGS="%{rustflags}"
%install
%{?cmake_path:export PATH=%{cmake_path}:$PATH}
export RUSTFLAGS="%{rustflags}"
%{?library_path:export LIBRARY_PATH="%{library_path}"}
%{?rustflags:export RUSTFLAGS="%{rustflags}"}
DESTDIR=%{buildroot} ./x.py dist --install
@ -374,10 +379,11 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py*
%check
%{?cmake_path:export PATH=%{cmake_path}:$PATH}
export RUSTFLAGS="%{rustflags}"
%{?library_path:export LIBRARY_PATH="%{library_path}"}
%{?rustflags:export RUSTFLAGS="%{rustflags}"}
# The results are not stable on koji, so mask errors and just log it.
./x.py test || :
./x.py test --no-fail-fast || :
%post -p /sbin/ldconfig
@ -438,6 +444,9 @@ export RUSTFLAGS="%{rustflags}"
%changelog
* Thu Jun 08 2017 Josh Stone <jistone@redhat.com> - 1.18.0-1
- Update to 1.18.0.
* Mon May 08 2017 Josh Stone <jistone@redhat.com> - 1.17.0-2
- Move shared libraries back to libdir and symlink in rustlib

View File

@ -1 +1 @@
SHA512 (rustc-1.17.0-src.tar.gz) = 781799b29d83b4f0f433814bd818df034526db8e7f88c2df51d3b814eacafe8098d4bbe47ace951e1943325b3267b244007cf04f1f11083645b25aeacd40ebb6
SHA512 (rustc-1.18.0-src.tar.gz) = eff0460b647dfb3490e28d4dec4f9781d31a942f22de75d9bd1ba31591597226b6862ec5132e8b4fcdbcf6e6ffa085ca5dda7ff8260cd82388fc13e8d3b4a2eb

View File

@ -1,8 +1,8 @@
SHA512 (rustc-1.17.0-src.tar.gz) = 781799b29d83b4f0f433814bd818df034526db8e7f88c2df51d3b814eacafe8098d4bbe47ace951e1943325b3267b244007cf04f1f11083645b25aeacd40ebb6
SHA512 (rust-1.16.0-aarch64-unknown-linux-gnu.tar.gz) = 6f1cd5a9884c2a595c43fda7ce283035ebe901510615006163eba3dea757169ca76239b2c64b506d2c396debb01b4bfe8d7b1c5ea9138ba646bb19f5a55b33bc
SHA512 (rust-1.16.0-armv7-unknown-linux-gnueabihf.tar.gz) = 4aead298cec7c25c256da84be22790eb38e527f4478d180ccb7cffaf88736c4f7e762a30deba53e14feda049b1814ccdd91c38a86ce2106d8518de4079740739
SHA512 (rust-1.16.0-i686-unknown-linux-gnu.tar.gz) = 7a780a107d98c6a8883f95dbb5a5ec95bad52fb1e735afba29b47411b450d464cbc8dfe73d35de1eb18b9a1f9ea727daa1ca9d3042e2a98c67ad570d328e139d
SHA512 (rust-1.16.0-powerpc64le-unknown-linux-gnu.tar.gz) = e1afc94bc6f80eeb6371d7037afd3fdaea189b6d0c2c5b569f6fb5976d7a7d105da57d2cf46b067a418f15083e62418fe6f3d6b40f6e2357d018b692fdb3a1a7
SHA512 (rust-1.16.0-powerpc64-unknown-linux-gnu.tar.gz) = e93a509a84c433893c7ceb68720bbc30f097afd933178dc513273a32d3c6a37b4e234c11216bf730ac4fa28fc1ce9538b7e0ecde46c165145e72171a2cb7170a
SHA512 (rust-1.16.0-s390x-unknown-linux-gnu.tar.gz) = 45184f2b4d6ed21c90bef96380008d4787effa46986172053b366f7424e22c097577e720c88faa2acfbbb7dd41ed36596bfc691dcd8bf8d96278e34ec75666a2
SHA512 (rust-1.16.0-x86_64-unknown-linux-gnu.tar.gz) = f3d381c0e47e0af02eb116376422c3e48295c2854c6ad8c03d4c13e662f3cc1fdddf25923f7b3ef358c5cf670ed67d75e2197162434a81d5f9499e6e0e2d1054
SHA512 (rustc-1.18.0-src.tar.gz) = eff0460b647dfb3490e28d4dec4f9781d31a942f22de75d9bd1ba31591597226b6862ec5132e8b4fcdbcf6e6ffa085ca5dda7ff8260cd82388fc13e8d3b4a2eb
SHA512 (rust-1.17.0-aarch64-unknown-linux-gnu.tar.gz) = 58a44c7c5ddcec2560b48103aedb6718aa944e2058683af69638b6d00d7a76de0ed32c8a0819bf7a4585d01b349b260abdd1b9d4a378e3beaa7fef7872e5deb6
SHA512 (rust-1.17.0-armv7-unknown-linux-gnueabihf.tar.gz) = e4970d090ab067e73507ea7cbcbf39de84ca2f3e506fffe0d76cabf2fb22e88229fe9d6fec5f025da6f7975ec1e8ffb82c6e5a58d50c1c51718494a19dfdf770
SHA512 (rust-1.17.0-i686-unknown-linux-gnu.tar.gz) = 32212fdb237cc638fe4ac4aec6b23fe9fec25c9b7329090b89dc6feac2fe7f48999b2bee8155bb345dfe94ef5fda9ea4ca670cb323ad5936046a54c495f52af9
SHA512 (rust-1.17.0-powerpc64le-unknown-linux-gnu.tar.gz) = 1963b596dd8c5fe3fe836319074246107a982ee6c17d973a681e1bd96870440295b73bed60929fdf445136990d15bf90d96843115db4287ffced07dafa6364d1
SHA512 (rust-1.17.0-powerpc64-unknown-linux-gnu.tar.gz) = faffdf9e61e525cec9dfe47bee780a95d58c0778eafab2d9f56021f3910e5b6fee358de6af7ef0185c298921b2c010ebf2faa1c271cb4818c7e03f3424aac0ab
SHA512 (rust-1.17.0-s390x-unknown-linux-gnu.tar.gz) = c92cba2b24422e9ce09b1ac1fae2da0ce4d884dddc1b6606c76d8f2e94dc6e46391632dfd005669fe37a7d0c447fddf155e8976a0b3bd4b0c96dd60877ca644e
SHA512 (rust-1.17.0-x86_64-unknown-linux-gnu.tar.gz) = e12afcbc5a4642c908305c843f014d3802705f18d4e98e1a42dcca574dbe22af01ec8479f8c3fee5ddf12c530212118ff6eef5c4a2762ad4da6c2b071f163513