From c3f84f113df43c5d5c7acccb920d0954424fe14a Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: May 07 2019 13:58:34 +0000 Subject: import rust-1.31.0-5.module+el8+2556+ac3e4365 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d052f7a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/rustc-1.31.0-src.tar.xz diff --git a/.rust.metadata b/.rust.metadata new file mode 100644 index 0000000..7763ad5 --- /dev/null +++ b/.rust.metadata @@ -0,0 +1 @@ +79878ca48506ee7d17cd8375fca5f9950699c097 SOURCES/rustc-1.31.0-src.tar.xz diff --git a/SOURCES/0001-Deal-with-EINTR-in-net-timeout-tests.patch b/SOURCES/0001-Deal-with-EINTR-in-net-timeout-tests.patch new file mode 100644 index 0000000..7e49746 --- /dev/null +++ b/SOURCES/0001-Deal-with-EINTR-in-net-timeout-tests.patch @@ -0,0 +1,118 @@ +From f107514aef0b25b0d959941df1e45b18a478151b Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Fri, 30 Nov 2018 15:33:40 -0800 +Subject: [PATCH] Deal with EINTR in net timeout tests + +We've seen sporadic QE failures in the timeout tests on this assertion: + + assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut); + +So there's an error, but not either of the expected kinds. Adding a +format to show the kind revealed `ErrorKind::Interrupted` (`EINTR`). + +For the cases that were using `read`, we can just use `read_exact` to +keep trying after interruption. For those using `recv_from`, we have to +manually loop until we get a non-interrupted result. +--- + src/libstd/net/tcp.rs | 10 ++++++---- + src/libstd/net/udp.rs | 20 ++++++++++++++++---- + src/libstd/sys/unix/ext/net.rs | 10 ++++++---- + 3 files changed, 28 insertions(+), 12 deletions(-) + +diff --git a/src/libstd/net/tcp.rs b/src/libstd/net/tcp.rs +index ad212a547579..be797803233a 100644 +--- a/src/libstd/net/tcp.rs ++++ b/src/libstd/net/tcp.rs +@@ -1548,8 +1548,9 @@ mod tests { + + let mut buf = [0; 10]; + let start = Instant::now(); +- let kind = stream.read(&mut buf).err().expect("expected error").kind(); +- assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut); ++ let kind = stream.read_exact(&mut buf).err().expect("expected error").kind(); ++ assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, ++ "unexpected_error: {:?}", kind); + assert!(start.elapsed() > Duration::from_millis(400)); + drop(listener); + } +@@ -1570,8 +1571,9 @@ mod tests { + assert_eq!(b"hello world", &buf[..]); + + let start = Instant::now(); +- let kind = stream.read(&mut buf).err().expect("expected error").kind(); +- assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut); ++ let kind = stream.read_exact(&mut buf).err().expect("expected error").kind(); ++ assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, ++ "unexpected_error: {:?}", kind); + assert!(start.elapsed() > Duration::from_millis(400)); + drop(listener); + } +diff --git a/src/libstd/net/udp.rs b/src/libstd/net/udp.rs +index 0ebe3284b4f0..fc68abae05a0 100644 +--- a/src/libstd/net/udp.rs ++++ b/src/libstd/net/udp.rs +@@ -1030,8 +1030,14 @@ mod tests { + let mut buf = [0; 10]; + + let start = Instant::now(); +- let kind = stream.recv_from(&mut buf).err().expect("expected error").kind(); +- assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut); ++ loop { ++ let kind = stream.recv_from(&mut buf).err().expect("expected error").kind(); ++ if kind != ErrorKind::Interrupted { ++ assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, ++ "unexpected_error: {:?}", kind); ++ break; ++ } ++ } + assert!(start.elapsed() > Duration::from_millis(400)); + } + +@@ -1049,8 +1055,14 @@ mod tests { + assert_eq!(b"hello world", &buf[..]); + + let start = Instant::now(); +- let kind = stream.recv_from(&mut buf).err().expect("expected error").kind(); +- assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut); ++ loop { ++ let kind = stream.recv_from(&mut buf).err().expect("expected error").kind(); ++ if kind != ErrorKind::Interrupted { ++ assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, ++ "unexpected_error: {:?}", kind); ++ break; ++ } ++ } + assert!(start.elapsed() > Duration::from_millis(400)); + } + +diff --git a/src/libstd/sys/unix/ext/net.rs b/src/libstd/sys/unix/ext/net.rs +index 55f43ccd7db4..737437c76b7c 100644 +--- a/src/libstd/sys/unix/ext/net.rs ++++ b/src/libstd/sys/unix/ext/net.rs +@@ -1654,8 +1654,9 @@ mod test { + or_panic!(stream.set_read_timeout(Some(Duration::from_millis(1000)))); + + let mut buf = [0; 10]; +- let kind = stream.read(&mut buf).err().expect("expected error").kind(); +- assert!(kind == io::ErrorKind::WouldBlock || kind == io::ErrorKind::TimedOut); ++ let kind = stream.read_exact(&mut buf).err().expect("expected error").kind(); ++ assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, ++ "unexpected_error: {:?}", kind); + } + + #[test] +@@ -1675,8 +1676,9 @@ mod test { + or_panic!(stream.read(&mut buf)); + assert_eq!(b"hello world", &buf[..]); + +- let kind = stream.read(&mut buf).err().expect("expected error").kind(); +- assert!(kind == io::ErrorKind::WouldBlock || kind == io::ErrorKind::TimedOut); ++ let kind = stream.read_exact(&mut buf).err().expect("expected error").kind(); ++ assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, ++ "unexpected_error: {:?}", kind); + } + + // Ensure the `set_read_timeout` and `set_write_timeout` calls return errors +-- +2.19.1 + diff --git a/SOURCES/0001-Fix-invalid_const_promotion-test-on-some-archs.patch b/SOURCES/0001-Fix-invalid_const_promotion-test-on-some-archs.patch new file mode 100644 index 0000000..17d0312 --- /dev/null +++ b/SOURCES/0001-Fix-invalid_const_promotion-test-on-some-archs.patch @@ -0,0 +1,25 @@ +From 01e0d23d66d44f7a46b27a91b90b0d1c8aedc25f Mon Sep 17 00:00:00 2001 +From: James Duley +Date: Wed, 31 Oct 2018 22:59:53 +0000 +Subject: [PATCH] Fix invalid_const_promotion test on some archs + +On at least AArch64 `llvm.trap` raises SIGTRAP. +--- + src/test/run-pass/invalid_const_promotion.rs | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/test/run-pass/invalid_const_promotion.rs b/src/test/run-pass/invalid_const_promotion.rs +index ed8c4992417a..0f354e1aad6c 100644 +--- a/src/test/run-pass/invalid_const_promotion.rs ++++ b/src/test/run-pass/invalid_const_promotion.rs +@@ -39,6 +39,7 @@ fn check_status(status: std::process::ExitStatus) + use std::os::unix::process::ExitStatusExt; + + assert!(status.signal() == Some(libc::SIGILL) ++ || status.signal() == Some(libc::SIGTRAP) + || status.signal() == Some(libc::SIGABRT)); + } + +-- +2.19.2 + diff --git a/SOURCES/0001-Revert-Do-not-add-src-to-sysroot-crates-paths-they-a.patch b/SOURCES/0001-Revert-Do-not-add-src-to-sysroot-crates-paths-they-a.patch new file mode 100644 index 0000000..1a7e792 --- /dev/null +++ b/SOURCES/0001-Revert-Do-not-add-src-to-sysroot-crates-paths-they-a.patch @@ -0,0 +1,28 @@ +From 23359b93e6accbe5f45e2fe2089db31955e4008e Mon Sep 17 00:00:00 2001 +From: Igor Matuszewski +Date: Mon, 10 Dec 2018 13:52:41 +0100 +Subject: [PATCH] Revert "Do not add src/ to sysroot crates' paths, they + already have it now." + +This reverts commit d5d2f98d6f7668e2b6139c6cd93a8d20e28c396b. +--- + src/loader.rs | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/loader.rs b/src/loader.rs +index 645c95139164..2b931d9b7d95 100644 +--- a/src/loader.rs ++++ b/src/loader.rs +@@ -99,7 +99,8 @@ impl AnalysisLoader for CargoAnalysisLoader { + .join("lib") + .join("rustlib") + .join("src") +- .join("rust"); ++ .join("rust") ++ .join("src"); + + vec![ + SearchDirectory::new(libs_path, Some(src_path)), +-- +2.19.2 + diff --git a/SOURCES/0001-Try-to-get-the-target-triple-from-rustc-itself.patch b/SOURCES/0001-Try-to-get-the-target-triple-from-rustc-itself.patch new file mode 100644 index 0000000..90f3115 --- /dev/null +++ b/SOURCES/0001-Try-to-get-the-target-triple-from-rustc-itself.patch @@ -0,0 +1,90 @@ +From 72cd8aedc2901d6a6b598eadc001cc39040ae487 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Wed, 12 Dec 2018 16:51:31 -0800 +Subject: [PATCH] Try to get the target triple from rustc itself + +The prior method was trying to pick the triple out of the sysroot path. +A FIXME comment already notes that this doesn't work with custom +toolchains in rustup. It also fails with distro-installed toolchains, +where the sysroot may simply be `/usr`. + +The output of `rustc -Vv` is a more reliable source, as it contains a +line like `host: x86_64-unknown-linux-gnu`. This should be enough to +identify the triple for any `rustc`, but just in case, the path-based +code is kept as a fallback. +--- + src/loader.rs | 41 ++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 38 insertions(+), 3 deletions(-) + +diff --git a/src/loader.rs b/src/loader.rs +index 645c95139164..fe92bef1c596 100644 +--- a/src/loader.rs ++++ b/src/loader.rs +@@ -108,9 +108,33 @@ impl AnalysisLoader for CargoAnalysisLoader { + } + } + ++fn extract_target_triple(sys_root_path: &Path) -> String { ++ // First try to get the triple from the rustc version output, ++ // otherwise fall back on the rustup-style toolchain path. ++ extract_rustc_host_triple() ++ .unwrap_or_else(|| extract_rustup_target_triple(sys_root_path)) ++} ++ ++fn extract_rustc_host_triple() -> Option { ++ let rustc = env::var("RUSTC").unwrap_or(String::from("rustc")); ++ let verbose_version = Command::new(rustc) ++ .arg("--verbose") ++ .arg("--version") ++ .output() ++ .ok() ++ .and_then(|out| String::from_utf8(out.stdout).ok())?; ++ ++ // Extracts the triple from a line like `host: x86_64-unknown-linux-gnu` ++ verbose_version ++ .lines() ++ .find(|line| line.starts_with("host: ")) ++ .and_then(|host| host.split_whitespace().nth(1)) ++ .map(String::from) ++} ++ + // FIXME: This can fail when using a custom toolchain in rustup (often linked to + // `/$rust_repo/build/$target/stage2`) +-fn extract_target_triple(sys_root_path: &Path) -> String { ++fn extract_rustup_target_triple(sys_root_path: &Path) -> String { + // Extracts nightly-x86_64-pc-windows-msvc from + // $HOME/.rustup/toolchains/nightly-x86_64-pc-windows-msvc + let toolchain = sys_root_path +@@ -169,7 +193,7 @@ mod tests { + r#"C:\Users\user\.rustup\toolchains\nightly-x86_64-pc-windows-msvc"#, + ); + assert_eq!( +- extract_target_triple(path), ++ extract_rustup_target_triple(path), + String::from("x86_64-pc-windows-msvc") + ); + } +@@ -180,8 +204,19 @@ mod tests { + "/home/user/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu", + ); + assert_eq!( +- extract_target_triple(path), ++ extract_rustup_target_triple(path), + String::from("x86_64-unknown-linux-gnu") + ); + } ++ ++ #[test] ++ fn target_triple() { ++ let sys_root_path = sys_root_path(); ++ let target_triple = extract_target_triple(&sys_root_path); ++ let target_path = sys_root_path ++ .join("lib") ++ .join("rustlib") ++ .join(&target_triple); ++ assert!(target_path.is_dir(), "{:?} is not a directory!", target_path); ++ } + } +-- +2.19.2 + diff --git a/SPECS/rust.spec b/SPECS/rust.spec new file mode 100644 index 0000000..a33d385 --- /dev/null +++ b/SPECS/rust.spec @@ -0,0 +1,796 @@ +# Only x86_64 and i686 are Tier 1 platforms at this time. +# https://forge.rust-lang.org/platform-support.html +#global rust_arches x86_64 i686 armv7hl aarch64 ppc64 ppc64le s390x +%global rust_arches x86_64 i686 aarch64 ppc64le s390x + +# The channel can be stable, beta, or nightly +%{!?channel: %global channel stable} + +# 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 +# Note that cargo matches the program version here, not its crate version. +%global bootstrap_rust 1.30.0 +%global bootstrap_cargo 1.30.0 +%global bootstrap_channel %{bootstrap_rust} +%global bootstrap_date 2018-10-25 + +# Only the specified arches will use bootstrap binaries. +#global bootstrap_arches %%{rust_arches} + +# Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases. +%bcond_with llvm_static + +# We can also choose to just use Rust's bundled LLVM, in case the system LLVM +# is insufficient. Rust currently requires LLVM 5.0+. +%if 0%{?rhel} && 0%{?rhel} <= 6 && !0%{?epel} +%bcond_without bundled_llvm +%else +%bcond_with bundled_llvm +%endif + +# libgit2-sys expects to use its bundled library, which is sometimes just a +# snapshot of libgit2's master branch. This can mean the FFI declarations +# won't match our released libgit2.so, e.g. having changed struct fields. +# So, tread carefully if you toggle this... +%bcond_without bundled_libgit2 + +%if 0%{?rhel} +%bcond_without bundled_libssh2 +%else +%bcond_with bundled_libssh2 +%endif + +# LLDB only works on some architectures +%ifarch %{arm} aarch64 %{ix86} x86_64 +# LLDB isn't available everywhere... +%if !0%{?rhel} || 0%{?rhel} > 7 +%bcond_without lldb +%else +%bcond_with lldb +%endif +%else +%bcond_with lldb +%endif + +# Some sub-packages are versioned independently of the rust compiler and runtime itself. +# Also beware that if any of these are not changed in a version bump, then the release +# number should still increase, not be reset to 1! +%global rustc_version 1.31.0 +%global cargo_version 1.31.0 +%global rustfmt_version 1.0.0 +%global rls_version 1.31.6 +%global clippy_version 0.0.212 + +Name: rust +Version: %{rustc_version} +Release: 5%{?dist} +Summary: The Rust Programming Language +License: (ASL 2.0 or MIT) and (BSD and MIT) +# ^ written as: (rust itself) and (bundled libraries) +URL: https://www.rust-lang.org +ExclusiveArch: %{rust_arches} + +%if "%{channel}" == "stable" +%global rustc_package rustc-%{rustc_version}-src +%else +%global rustc_package rustc-%{channel}-src +%endif +Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz + +# https://github.com/rust-lang/rust/pull/56394 +Patch1: 0001-Deal-with-EINTR-in-net-timeout-tests.patch + +# https://github.com/rust-lang/rust/pull/55575 +Patch2: 0001-Fix-invalid_const_promotion-test-on-some-archs.patch + +# https://github.com/rust-lang/rls/issues/1171#issuecomment-445813148 +# https://github.com/rust-dev-tools/rls-analysis/commit/23359b93e6accbe5f45e2fe2089db31955e4008e +# Only revert for Rust 1.31 -- the change was meant to go with 1.32 and later. +Patch3: 0001-Revert-Do-not-add-src-to-sysroot-crates-paths-they-a.patch + +# https://github.com/rust-dev-tools/rls-analysis/pull/160 +Patch4: 0001-Try-to-get-the-target-triple-from-rustc-itself.patch + +# Get the Rust triple for any arch. +%{lua: function rust_triple(arch) + local abi = "gnu" + if arch == "armv7hl" then + arch = "armv7" + abi = "gnueabihf" + elseif arch == "ppc64" then + arch = "powerpc64" + elseif arch == "ppc64le" then + arch = "powerpc64le" + end + return arch.."-unknown-linux-"..abi +end} + +%global rust_triple %{lua: print(rust_triple(rpm.expand("%{_target_cpu}")))} + +%if %defined bootstrap_arches +# For each bootstrap arch, add an additional binary Source. +# Also define bootstrap_source just for the current target. +%{lua: do + local bootstrap_arches = {} + for arch in string.gmatch(rpm.expand("%{bootstrap_arches}"), "%S+") do + table.insert(bootstrap_arches, arch) + end + local base = rpm.expand("https://static.rust-lang.org/dist/%{bootstrap_date}" + .."/rust-%{bootstrap_channel}") + local target_arch = rpm.expand("%{_target_cpu}") + for i, arch in ipairs(bootstrap_arches) do + print(string.format("Source%d: %s-%s.tar.xz\n", + i, base, rust_triple(arch))) + if arch == target_arch then + rpm.define("bootstrap_source "..i) + end + end +end} +%endif + +%ifarch %{bootstrap_arches} +%global bootstrap_root rust-%{bootstrap_channel}-%{rust_triple} +%global local_rust_root %{_builddir}/%{bootstrap_root}/usr +Provides: bundled(%{name}-bootstrap) = %{bootstrap_rust} +%else +BuildRequires: cargo >= %{bootstrap_cargo} +%if 0%{?fedora} >= 27 || 0%{?rhel} > 7 +BuildRequires: (%{name} >= %{bootstrap_rust} with %{name} <= %{rustc_version}) +%else +BuildRequires: %{name} >= %{bootstrap_rust} +BuildConflicts: %{name} > %{rustc_version} +%endif +%global local_rust_root %{_prefix} +%endif + +BuildRequires: make +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: ncurses-devel +BuildRequires: curl +BuildRequires: pkgconfig(libcurl) +BuildRequires: pkgconfig(liblzma) +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(zlib) + +%if %without bundled_libgit2 +BuildRequires: pkgconfig(libgit2) >= 0.27 +%endif + +%if %without bundled_libssh2 +# needs libssh2_userauth_publickey_frommemory +BuildRequires: pkgconfig(libssh2) >= 1.6.0 +%endif + +%if 0%{?rhel} +%if 0%{?rhel} <= 7 +%global python python2 +%else +%global python /usr/libexec/platform-python +%endif +%else +%global python python3 +%endif +BuildRequires: %{python} + +%if %with bundled_llvm +BuildRequires: cmake3 >= 3.4.3 +Provides: bundled(llvm) = 8.0.0~svn +%else +BuildRequires: cmake >= 2.8.11 +%if 0%{?epel} +%global llvm llvm5.0 +%endif +%if %defined llvm +%global llvm_root %{_libdir}/%{llvm} +%else +%global llvm llvm +%global llvm_root %{_prefix} +%endif +BuildRequires: %{llvm}-devel >= 5.0 +%if %with llvm_static +BuildRequires: %{llvm}-static +BuildRequires: libffi-devel +%endif +%endif + +# make check needs "ps" for src/test/run-pass/wait-forked-but-failed-child.rs +BuildRequires: procps-ng + +# debuginfo-gdb tests need gdb +BuildRequires: gdb + +# TODO: work on unbundling these! +Provides: bundled(libbacktrace) = 8.1.0 +Provides: bundled(miniz) = 1.16~beta+r1 + +# Virtual provides for folks who attempt "dnf install rustc" +Provides: rustc = %{rustc_version}-%{release} +Provides: rustc%{?_isa} = %{rustc_version}-%{release} + +# Always require our exact standard library +Requires: %{name}-std-static%{?_isa} = %{rustc_version}-%{release} + +# The C compiler is needed at runtime just for linking. Someday rustc might +# invoke the linker directly, and then we'll only need binutils. +# https://github.com/rust-lang/rust/issues/11937 +Requires: /usr/bin/cc + +# ALL Rust libraries are private, because they don't keep an ABI. +%global _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.* +%global __provides_exclude ^(%{_privatelibs})$ +%global __requires_exclude ^(%{_privatelibs})$ +%global __provides_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$ +%global __requires_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$ + +# 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 +# support custom-derive plugins like #[proc_macro_derive(Foo)]. But eu-strip is +# very eager by default, so we have to limit it to -g, only debugging symbols. +%if 0%{?fedora} >= 27 || 0%{?rhel} > 7 +# Newer find-debuginfo.sh supports --keep-section, which is preferable. rhbz1465997 +%global _find_debuginfo_opts --keep-section .rustc +%else +%global _find_debuginfo_opts -g +%undefine _include_minidebuginfo +%endif + +# Use hardening ldflags. +%global rustflags -Clink-arg=-Wl,-z,relro,-z,now + +%if %{without bundled_llvm} +%if 0%{?fedora} || 0%{?rhel} > 7 || 0%{?scl:1} +%global llvm_has_filecheck 1 +%endif +%if "%{llvm_root}" != "%{_prefix}" +# https://github.com/rust-lang/rust/issues/40717 +%global library_path $(%{llvm_root}/bin/llvm-config --libdir) +%endif +%endif + +%description +Rust is a systems programming language that runs blazingly fast, prevents +segfaults, and guarantees thread safety. + +This package includes the Rust compiler and documentation generator. + + +%package std-static +Summary: Standard library for Rust + +%description std-static +This package includes the standard libraries for building applications +written in Rust. + + +%package debugger-common +Summary: Common debugger pretty printers for Rust +BuildArch: noarch + +%description debugger-common +This package includes the common functionality for %{name}-gdb and %{name}-lldb. + + +%package gdb +Summary: GDB pretty printers for Rust +BuildArch: noarch +Requires: gdb +Requires: %{name}-debugger-common = %{rustc_version}-%{release} + +%description gdb +This package includes the rust-gdb script, which allows easier debugging of Rust +programs. + + +%if %with lldb + +%package lldb +Summary: LLDB pretty printers for Rust + +# It could be noarch, but lldb has limited availability +#BuildArch: noarch + +Requires: lldb +Requires: python3-lldb +Requires: %{name}-debugger-common = %{rustc_version}-%{release} + +%description lldb +This package includes the rust-lldb script, which allows easier debugging of Rust +programs. + +%endif + + +%package doc +Summary: Documentation for Rust +# NOT BuildArch: noarch +# Note, while docs are mostly noarch, some things do vary by target_arch. +# Koji will fail the build in rpmdiff if two architectures build a noarch +# subpackage differently, so instead we have to keep its arch. + +%description doc +This package includes HTML documentation for the Rust programming language and +its standard library. + + +%package -n cargo +Summary: Rust's package manager and build tool +Version: %{cargo_version} +%if %with bundled_libgit2 +Provides: bundled(libgit2) = 0.27 +%endif +%if %with bundled_libssh2 +Provides: bundled(libssh2) = 1.8.1~dev +%endif +# For tests: +BuildRequires: git +# Cargo is not much use without Rust +Requires: rust + +%description -n cargo +Cargo is a tool that allows Rust projects to declare their various dependencies +and ensure that you'll always get a repeatable build. + + +%package -n cargo-doc +Summary: Documentation for Cargo +Version: %{cargo_version} +BuildArch: noarch +# Cargo no longer builds its own documentation +# https://github.com/rust-lang/cargo/pull/4904 +Requires: rust-doc = %{rustc_version}-%{release} + +%description -n cargo-doc +This package includes HTML documentation for Cargo. + + +%package -n rustfmt +Summary: Tool to find and fix Rust formatting issues +Version: %{rustfmt_version} +Requires: cargo + +# The component/package was rustfmt-preview until Rust 1.31. +Obsoletes: rustfmt-preview < 1.0.0 +Provides: rustfmt-preview = %{rustfmt_version}-%{release} + +%description -n rustfmt +A tool for formatting Rust code according to style guidelines. + + +%package -n rls +Summary: Rust Language Server for IDE integration +Version: %{rls_version} +Provides: rls = %{rls_version} +%if %with bundled_libgit2 +Provides: bundled(libgit2) = 0.27 +%endif +%if %with bundled_libssh2 +Provides: bundled(libssh2) = 1.8.1~dev +%endif +Requires: rust-analysis +# /usr/bin/rls is dynamically linked against internal rustc libs +Requires: %{name}%{?_isa} = %{rustc_version}-%{release} + +# The component/package was rls-preview until Rust 1.31. +Obsoletes: rls-preview < 1.31.6 +Provides: rls-preview = %{rls_version}-%{release} + +%description -n rls +The Rust Language Server provides a server that runs in the background, +providing IDEs, editors, and other tools with information about Rust programs. +It supports functionality such as 'goto definition', symbol search, +reformatting, and code completion, and enables renaming and refactorings. + + +%package -n clippy +Summary: Lints to catch common mistakes and improve your Rust code +Version: %{clippy_version} +Provides: clippy = %{clippy_version} +Requires: cargo +# /usr/bin/clippy-driver is dynamically linked against internal rustc libs +Requires: %{name}%{?_isa} = %{rustc_version}-%{release} + +# The component/package was clippy-preview until Rust 1.31. +Obsoletes: clippy-preview <= 0.0.212 +Provides: clippy-preview = %{clippy_version}-%{release} + +%description -n clippy +A collection of lints to catch common mistakes and improve your Rust code. + + +%package src +Summary: Sources for the Rust standard library +BuildArch: noarch + +%description src +This package includes source files for the Rust standard library. It may be +useful as a reference for code completion tools in various editors. + + +%package analysis +Summary: Compiler analysis data for the Rust standard library +Requires: rust-std-static%{?_isa} = %{rustc_version}-%{release} + +%description analysis +This package contains analysis data files produced with rustc's -Zsave-analysis +feature for the Rust standard library. The RLS (Rust Language Server) uses this +data to provide information about the Rust standard library. + + +%prep + +%ifarch %{bootstrap_arches} +%setup -q -n %{bootstrap_root} -T -b %{bootstrap_source} +./install.sh --components=cargo,rustc,rust-std-%{rust_triple} \ + --prefix=%{local_rust_root} --disable-ldconfig +test -f '%{local_rust_root}/bin/cargo' +test -f '%{local_rust_root}/bin/rustc' +%endif + +%setup -q -n %{rustc_package} + +%patch1 -p1 +%patch2 -p1 + +pushd src/vendor/rls-analysis +%patch3 -p1 +%patch4 -p1 +popd + +%if "%{python}" != "python2" +sed -i.try-py3 -e '/try python2.7/i try %{python} "$@"' ./configure +%endif + +# We're disabling jemalloc, but rust-src still wants it. +# rm -rf src/jemalloc/ + +%if %without bundled_llvm +rm -rf src/llvm/ +%endif + +# We never enable emscripten. +rm -rf src/llvm-emscripten/ + +# We never enable other LLVM tools. +rm -rf src/tools/clang +rm -rf src/tools/lld +rm -rf src/tools/lldb + +# extract bundled licenses for packaging +sed -e '/*\//q' src/libbacktrace/backtrace.h \ + >src/libbacktrace/LICENSE-libbacktrace + +%if %{with bundled_llvm} && 0%{?epel} +mkdir -p cmake-bin +ln -s /usr/bin/cmake3 cmake-bin/cmake +%global cmake_path $PWD/cmake-bin +%endif + +%if %{without bundled_llvm} && %{with llvm_static} +# Static linking to distro LLVM needs to add -lffi +# https://github.com/rust-lang/rust/issues/34486 +sed -i.ffi -e '$a #[link(name = "ffi")] extern {}' \ + src/librustc_llvm/lib.rs +%endif + +# The configure macro will modify some autoconf-related files, which upsets +# cargo when it tries to verify checksums in those files. If we just truncate +# that file list, cargo won't have anything to complain about. +find src/vendor -name .cargo-checksum.json \ + -exec sed -i.uncheck -e 's/"files":{[^}]*}/"files":{ }/' '{}' '+' + + +%build + +%if %without bundled_libgit2 +# convince libgit2-sys to use the distro libgit2 +export LIBGIT2_SYS_USE_PKG_CONFIG=1 +%endif + +%if %without bundled_libssh2 +# convince libssh2-sys to use the distro libssh2 +export LIBSSH2_SYS_USE_PKG_CONFIG=1 +%endif + +%{?cmake_path:export PATH=%{cmake_path}:$PATH} +%{?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. +%global common_libdir %{_prefix}/lib +%global rustlibdir %{common_libdir}/rustlib + +%ifarch %{arm} %{ix86} +# full debuginfo is exhausting memory; just do libstd for now +# https://github.com/rust-lang/rust/issues/45854 +%if (0%{?fedora} && 0%{?fedora} < 27) || (0%{?rhel} && 0%{?rhel} <= 7) +# Older rpmbuild didn't work with partial debuginfo coverage. +%global debug_package %{nil} +%define enable_debuginfo --disable-debuginfo --disable-debuginfo-only-std --disable-debuginfo-tools --disable-debuginfo-lines +%else +%define enable_debuginfo --enable-debuginfo --enable-debuginfo-only-std --disable-debuginfo-tools --disable-debuginfo-lines +%endif +%else +%define enable_debuginfo --enable-debuginfo --disable-debuginfo-only-std --enable-debuginfo-tools --disable-debuginfo-lines +%endif + +%configure --disable-option-checking \ + --libdir=%{common_libdir} \ + --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \ + --local-rust-root=%{local_rust_root} \ + %{!?with_bundled_llvm: --llvm-root=%{llvm_root} \ + %{!?llvm_has_filecheck: --disable-codegen-tests} \ + %{!?with_llvm_static: --enable-llvm-link-shared } } \ + --disable-jemalloc \ + --disable-rpath \ + %{enable_debuginfo} \ + --enable-extended \ + --enable-vendor \ + --enable-verbose-tests \ + --release-channel=%{channel} + +%{python} ./x.py build +%{python} ./x.py doc + + +%install +%{?cmake_path:export PATH=%{cmake_path}:$PATH} +%{?library_path:export LIBRARY_PATH="%{library_path}"} +%{?rustflags:export RUSTFLAGS="%{rustflags}"} + +DESTDIR=%{buildroot} %{python} ./x.py install + +# Make sure the shared libraries are in the proper libdir +%if "%{_libdir}" != "%{common_libdir}" +mkdir -p %{buildroot}%{_libdir} +find %{buildroot}%{common_libdir} -maxdepth 1 -type f -name '*.so' \ + -exec mv -v -t %{buildroot}%{_libdir} '{}' '+' +%endif + +# The shared libraries should be executable for debuginfo extraction. +find %{buildroot}%{_libdir} -maxdepth 1 -type f -name '*.so' \ + -exec chmod -v +x '{}' '+' + +# The libdir libraries are identical to those under rustlib/. It's easier on +# library loading if we keep them in libdir, but we do need them in rustlib/ +# to support dynamic linking for compiler plugins, so we'll symlink. +(cd "%{buildroot}%{rustlibdir}/%{rust_triple}/lib" && + find ../../../../%{_lib} -maxdepth 1 -name '*.so' | + while read lib; do + # make sure they're actually identical! + cmp "$lib" "${lib##*/}" + ln -v -f -s -t . "$lib" + done) + +# Remove installer artifacts (manifests, uninstall scripts, etc.) +find %{buildroot}%{rustlibdir} -maxdepth 1 -type f -exec rm -v '{}' '+' + +# Remove backup files from %%configure munging +find %{buildroot}%{rustlibdir} -type f -name '*.orig' -exec rm -v '{}' '+' + +# https://fedoraproject.org/wiki/Changes/Make_ambiguous_python_shebangs_error +# We don't actually need to ship any of those python scripts in rust-src anyway. +find %{buildroot}%{rustlibdir}/src -type f -name '*.py' -exec rm -v '{}' '+' + +# FIXME: __os_install_post will strip the rlibs +# -- should we find a way to preserve debuginfo? + +# Remove unwanted documentation files (we already package them) +rm -f %{buildroot}%{_docdir}/%{name}/README.md +rm -f %{buildroot}%{_docdir}/%{name}/COPYRIGHT +rm -f %{buildroot}%{_docdir}/%{name}/LICENSE +rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-APACHE +rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-MIT +rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-THIRD-PARTY +rm -f %{buildroot}%{_docdir}/%{name}/*.old + +# Sanitize the HTML documentation +find %{buildroot}%{_docdir}/%{name}/html -empty -delete +find %{buildroot}%{_docdir}/%{name}/html -type f -exec chmod -x '{}' '+' + +# Create the path for crate-devel packages +mkdir -p %{buildroot}%{_datadir}/cargo/registry + +# Cargo no longer builds its own documentation +# https://github.com/rust-lang/cargo/pull/4904 +mkdir -p %{buildroot}%{_docdir}/cargo +ln -sT ../rust/html/cargo/ %{buildroot}%{_docdir}/cargo/html + +%if %without lldb +rm -f %{buildroot}%{_bindir}/rust-lldb +rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py* +%endif + + +%check +%{?cmake_path:export PATH=%{cmake_path}:$PATH} +%{?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. +%{python} ./x.py test --no-fail-fast || : +%{python} ./x.py test --no-fail-fast cargo || : +%{python} ./x.py test --no-fail-fast clippy || : +%{python} ./x.py test --no-fail-fast rls || : +%{python} ./x.py test --no-fail-fast rustfmt || : + + +%ldconfig_scriptlets + + +%files +%license COPYRIGHT LICENSE-APACHE LICENSE-MIT +%license src/libbacktrace/LICENSE-libbacktrace +%doc README.md +%{_bindir}/rustc +%{_bindir}/rustdoc +%{_libdir}/*.so +%{_mandir}/man1/rustc.1* +%{_mandir}/man1/rustdoc.1* +%dir %{rustlibdir} +%dir %{rustlibdir}/%{rust_triple} +%dir %{rustlibdir}/%{rust_triple}/lib +%{rustlibdir}/%{rust_triple}/lib/*.so +%{rustlibdir}/%{rust_triple}/codegen-backends/ + + +%files std-static +%dir %{rustlibdir} +%dir %{rustlibdir}/%{rust_triple} +%dir %{rustlibdir}/%{rust_triple}/lib +%{rustlibdir}/%{rust_triple}/lib/*.rlib + + +%files debugger-common +%dir %{rustlibdir} +%dir %{rustlibdir}/etc +%{rustlibdir}/etc/debugger_*.py* + + +%files gdb +%{_bindir}/rust-gdb +%{rustlibdir}/etc/gdb_*.py* + + +%if %with lldb +%files lldb +%{_bindir}/rust-lldb +%{rustlibdir}/etc/lldb_*.py* +%endif + + +%files doc +%docdir %{_docdir}/%{name} +%dir %{_docdir}/%{name} +%dir %{_docdir}/%{name}/html +%{_docdir}/%{name}/html/*/ +%{_docdir}/%{name}/html/*.html +%{_docdir}/%{name}/html/*.css +%{_docdir}/%{name}/html/*.js +%{_docdir}/%{name}/html/*.svg +%{_docdir}/%{name}/html/*.woff +%license %{_docdir}/%{name}/html/*.txt + + +%files -n cargo +%license src/tools/cargo/LICENSE-APACHE src/tools/cargo/LICENSE-MIT src/tools/cargo/LICENSE-THIRD-PARTY +%doc src/tools/cargo/README.md +%{_bindir}/cargo +%{_mandir}/man1/cargo*.1* +%{_sysconfdir}/bash_completion.d/cargo +%{_datadir}/zsh/site-functions/_cargo +%dir %{_datadir}/cargo +%dir %{_datadir}/cargo/registry + + +%files -n cargo-doc +%docdir %{_docdir}/cargo +%dir %{_docdir}/cargo +%{_docdir}/cargo/html + + +%files -n rustfmt +%{_bindir}/rustfmt +%{_bindir}/cargo-fmt +%doc src/tools/rustfmt/{README,CHANGELOG,Configurations}.md +%license src/tools/rustfmt/LICENSE-{APACHE,MIT} + + +%files -n rls +%{_bindir}/rls +%doc src/tools/rls/{README.md,COPYRIGHT,debugging.md} +%license src/tools/rls/LICENSE-{APACHE,MIT} + + +%files -n clippy +%{_bindir}/cargo-clippy +%{_bindir}/clippy-driver +%doc src/tools/clippy/{README.md,CHANGELOG.md} +%license src/tools/clippy/LICENSE-{APACHE,MIT} + + +%files src +%dir %{rustlibdir} +%{rustlibdir}/src + + +%files analysis +%{rustlibdir}/%{rust_triple}/analysis/ + + +%changelog +* Fri Dec 14 2018 Josh Stone - 1.31.0-5 +- Restore rust-lldb. + +* Thu Dec 13 2018 Josh Stone - 1.31.0-4 +- Backport fixes for rls. + +* Thu Dec 13 2018 Josh Stone - 1.31.0-3 +- Update to 1.31.0 -- Rust 2018! +- clippy/rls/rustfmt are no longer -preview + +* Wed Dec 12 2018 Josh Stone - 1.30.1-2 +- Update to 1.30.1. + +* Tue Nov 06 2018 Josh Stone - 1.29.2-1 +- Update to 1.29.2. + +* Thu Nov 01 2018 Josh Stone - 1.28.0-1 +- Update to 1.28.0. + +* Thu Nov 01 2018 Josh Stone - 1.27.2-1 +- Update to 1.27.2. + +* Wed Oct 10 2018 Josh Stone - 1.26.2-12 +- Fix "fp" target feature for AArch64 (#1632880) + +* Mon Oct 08 2018 Josh Stone - 1.26.2-11 +- Security fix for str::repeat (pending CVE). + +* Fri Oct 05 2018 Josh Stone - 1.26.2-10 +- Rebuild without bootstrap binaries. + +* Thu Oct 04 2018 Josh Stone - 1.26.2-9 +- Bootstrap without SCL packaging. (rhbz1635067) + +* Tue Aug 28 2018 Tom Stellard - 1.26.2-8 +- Use python3 prefix for lldb Requires + +* Mon Aug 13 2018 Josh Stone - 1.26.2-7 +- Build with platform-python + +* Tue Aug 07 2018 Josh Stone - 1.26.2-6 +- Exclude rust-src from auto-requires + +* Thu Aug 02 2018 Josh Stone - 1.26.2-5 +- Rebuild without bootstrap binaries. + +* Tue Jul 31 2018 Josh Stone - 1.26.2-4 +- Bootstrap as a module. + +* Mon Jun 04 2018 Josh Stone - 1.26.2-3 +- Update to 1.26.2. + +* Wed May 30 2018 Josh Stone - 1.26.1-2 +- Update to 1.26.1. + +* Fri May 18 2018 Josh Stone - 1.26.0-1 +- Update to 1.26.0. + +* Tue Apr 10 2018 Josh Stone - 1.25.0-2 +- Filter codegen-backends from Provides too. + +* Tue Apr 03 2018 Josh Stone - 1.25.0-1 +- Update to 1.25.0. +- Add rustfmt-preview as a subpackage. + +* Thu Feb 22 2018 Josh Stone - 1.24.0-1 +- Update to 1.24.0. + +* Tue Jan 16 2018 Josh Stone - 1.23.0-2 +- Rebuild without bootstrap binaries. + +* Mon Jan 15 2018 Josh Stone - 1.23.0-1 +- Bootstrap 1.23 on el8.