Updated to 2.19.1

This commit is contained in:
Алзим 2018-10-07 10:13:00 +03:00
parent 865d870915
commit 2e5d411747
6 changed files with 768 additions and 97 deletions

View file

@ -1,2 +1,4 @@
sources:
rustc-1.27.0-src.tar.gz: 54e4a19cd7eea451fea568644e4a3e264efcf36a
rust-1.28.0-i686-unknown-linux-gnu.tar.xz: 9f2d0457eedf0c9c38fa3c16d19b3a112338cea6
rust-1.28.0-x86_64-unknown-linux-gnu.tar.xz: ed58f73ef18907ffd3c3157087bebfb88f4449a0
rustc-1.29.1-src.tar.xz: 3c5ed672a33acf182f2d21c41db03f87a56e00ad

View file

@ -0,0 +1,186 @@
From 4b95b1a4fd035a73998dc21b265ce4594e35f8ae Mon Sep 17 00:00:00 2001
From: Alex Crichton <alex@alexcrichton.com>
Date: Thu, 16 Aug 2018 13:19:04 -0700
Subject: [PATCH] Set more llvm function attributes for __rust_try
This shim is generated elsewhere in the compiler so this commit adds support to
ensure it goes through similar paths as the rest of the compiler to set llvm
function attributes like target features.
cc #53372
---
src/librustc_codegen_llvm/attributes.rs | 52 +++++++++++++++++++------
src/librustc_codegen_llvm/base.rs | 21 ----------
src/librustc_codegen_llvm/callee.rs | 2 +-
src/librustc_codegen_llvm/intrinsic.rs | 2 +
src/librustc_codegen_llvm/mono_item.rs | 2 +-
5 files changed, 44 insertions(+), 35 deletions(-)
diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
index 3b5f927d52f0..2a79ce2f2285 100644
--- a/src/librustc_codegen_llvm/attributes.rs
+++ b/src/librustc_codegen_llvm/attributes.rs
@@ -11,7 +11,7 @@
use std::ffi::{CStr, CString};
-use rustc::hir::CodegenFnAttrFlags;
+use rustc::hir::{CodegenFnAttrFlags, CodegenFnAttrs};
use rustc::hir::def_id::{DefId, LOCAL_CRATE};
use rustc::session::Session;
use rustc::session::config::Sanitizer;
@@ -123,11 +123,37 @@ pub fn llvm_target_features(sess: &Session) -> impl Iterator<Item = &str> {
/// Composite function which sets LLVM attributes for function depending on its AST (#[attribute])
/// attributes.
-pub fn from_fn_attrs(cx: &CodegenCx, llfn: ValueRef, id: DefId) {
- let codegen_fn_attrs = cx.tcx.codegen_fn_attrs(id);
+pub fn from_fn_attrs(
+ cx: &CodegenCx,
+ llfn: ValueRef,
+ id: Option<DefId>,
+) {
+ let codegen_fn_attrs = id.map(|id| cx.tcx.codegen_fn_attrs(id))
+ .unwrap_or(CodegenFnAttrs::new());
inline(llfn, codegen_fn_attrs.inline);
+ // The `uwtable` attribute according to LLVM is:
+ //
+ // This attribute indicates that the ABI being targeted requires that an
+ // unwind table entry be produced for this function even if we can show
+ // that no exceptions passes by it. This is normally the case for the
+ // ELF x86-64 abi, but it can be disabled for some compilation units.
+ //
+ // Typically when we're compiling with `-C panic=abort` (which implies this
+ // `no_landing_pads` check) we don't need `uwtable` because we can't
+ // generate any exceptions! On Windows, however, exceptions include other
+ // events such as illegal instructions, segfaults, etc. This means that on
+ // Windows we end up still needing the `uwtable` attribute even if the `-C
+ // panic=abort` flag is passed.
+ //
+ // You can also find more info on why Windows is whitelisted here in:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1302078
+ if !cx.sess().no_landing_pads() ||
+ cx.sess().target.target.options.requires_uwtable {
+ attributes::emit_uwtable(llfn, true);
+ }
+
set_frame_pointer_elimination(cx, llfn);
set_probestack(cx, llfn);
@@ -151,7 +177,7 @@ pub fn from_fn_attrs(cx: &CodegenCx, llfn: ValueRef, id: DefId) {
// *in Rust code* may unwind. Foreign items like `extern "C" {
// fn foo(); }` are assumed not to unwind **unless** they have
// a `#[unwind]` attribute.
- } else if !cx.tcx.is_foreign_item(id) {
+ } else if id.map(|id| !cx.tcx.is_foreign_item(id)).unwrap_or(false) {
Some(true)
} else {
None
@@ -188,14 +214,16 @@ pub fn from_fn_attrs(cx: &CodegenCx, llfn: ValueRef, id: DefId) {
// Note that currently the `wasm-import-module` doesn't do anything, but
// eventually LLVM 7 should read this and ferry the appropriate import
// module to the output file.
- if cx.tcx.sess.target.target.arch == "wasm32" {
- if let Some(module) = wasm_import_module(cx.tcx, id) {
- llvm::AddFunctionAttrStringValue(
- llfn,
- llvm::AttributePlace::Function,
- cstr("wasm-import-module\0"),
- &module,
- );
+ if let Some(id) = id {
+ if cx.tcx.sess.target.target.arch == "wasm32" {
+ if let Some(module) = wasm_import_module(cx.tcx, id) {
+ llvm::AddFunctionAttrStringValue(
+ llfn,
+ llvm::AttributePlace::Function,
+ cstr("wasm-import-module\0"),
+ &module,
+ );
+ }
}
}
}
diff --git a/src/librustc_codegen_llvm/base.rs b/src/librustc_codegen_llvm/base.rs
index 223c04f420f3..b0461582ddcb 100644
--- a/src/librustc_codegen_llvm/base.rs
+++ b/src/librustc_codegen_llvm/base.rs
@@ -486,27 +486,6 @@ pub fn codegen_instance<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, instance: Instance<'
cx.stats.borrow_mut().n_closures += 1;
- // The `uwtable` attribute according to LLVM is:
- //
- // This attribute indicates that the ABI being targeted requires that an
- // unwind table entry be produced for this function even if we can show
- // that no exceptions passes by it. This is normally the case for the
- // ELF x86-64 abi, but it can be disabled for some compilation units.
- //
- // Typically when we're compiling with `-C panic=abort` (which implies this
- // `no_landing_pads` check) we don't need `uwtable` because we can't
- // generate any exceptions! On Windows, however, exceptions include other
- // events such as illegal instructions, segfaults, etc. This means that on
- // Windows we end up still needing the `uwtable` attribute even if the `-C
- // panic=abort` flag is passed.
- //
- // You can also find more info on why Windows is whitelisted here in:
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1302078
- if !cx.sess().no_landing_pads() ||
- cx.sess().target.target.options.requires_uwtable {
- attributes::emit_uwtable(lldecl, true);
- }
-
let mir = cx.tcx.instance_mir(instance.def);
mir::codegen_mir(cx, lldecl, &mir, instance, sig);
}
diff --git a/src/librustc_codegen_llvm/callee.rs b/src/librustc_codegen_llvm/callee.rs
index 2c01bd42cc77..97f07792ede8 100644
--- a/src/librustc_codegen_llvm/callee.rs
+++ b/src/librustc_codegen_llvm/callee.rs
@@ -97,7 +97,7 @@ pub fn get_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
if instance.def.is_inline(tcx) {
attributes::inline(llfn, attributes::InlineAttr::Hint);
}
- attributes::from_fn_attrs(cx, llfn, instance.def.def_id());
+ attributes::from_fn_attrs(cx, llfn, Some(instance.def.def_id()));
let instance_def_id = instance.def_id();
diff --git a/src/librustc_codegen_llvm/intrinsic.rs b/src/librustc_codegen_llvm/intrinsic.rs
index 9c5c0f730c16..f69fce15dc55 100644
--- a/src/librustc_codegen_llvm/intrinsic.rs
+++ b/src/librustc_codegen_llvm/intrinsic.rs
@@ -10,6 +10,7 @@
#![allow(non_upper_case_globals)]
+use attributes;
use intrinsics::{self, Intrinsic};
use llvm;
use llvm::{ValueRef};
@@ -936,6 +937,7 @@ fn gen_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
Abi::Rust
)));
let llfn = declare::define_internal_fn(cx, name, rust_fn_ty);
+ attributes::from_fn_attrs(cx, llfn, None);
let bx = Builder::new_block(cx, llfn, "entry-block");
codegen(bx);
llfn
diff --git a/src/librustc_codegen_llvm/mono_item.rs b/src/librustc_codegen_llvm/mono_item.rs
index a528008e3b4b..32d8b24e3c15 100644
--- a/src/librustc_codegen_llvm/mono_item.rs
+++ b/src/librustc_codegen_llvm/mono_item.rs
@@ -183,7 +183,7 @@ fn predefine_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
if instance.def.is_inline(cx.tcx) {
attributes::inline(lldecl, attributes::InlineAttr::Hint);
}
- attributes::from_fn_attrs(cx, lldecl, instance.def.def_id());
+ attributes::from_fn_attrs(cx, lldecl, Some(instance.def.def_id()));
cx.instances.borrow_mut().insert(instance, lldecl);
}
--
2.17.1

View file

@ -0,0 +1,122 @@
From f4e8d57b6ad6f599de54c020ba185db83cb011a3 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Thu, 16 Aug 2018 11:26:27 -0700
Subject: [PATCH] std: stop backtracing when the frames are full
---
src/libstd/sys/cloudabi/backtrace.rs | 18 ++++++++++--------
src/libstd/sys/redox/backtrace/tracing.rs | 18 ++++++++++--------
src/libstd/sys/unix/backtrace/tracing/gcc_s.rs | 18 ++++++++++--------
3 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/src/libstd/sys/cloudabi/backtrace.rs b/src/libstd/sys/cloudabi/backtrace.rs
index 1b970187558c..2c43b5937ce5 100644
--- a/src/libstd/sys/cloudabi/backtrace.rs
+++ b/src/libstd/sys/cloudabi/backtrace.rs
@@ -64,6 +64,10 @@ extern "C" fn trace_fn(
arg: *mut libc::c_void,
) -> uw::_Unwind_Reason_Code {
let cx = unsafe { &mut *(arg as *mut Context) };
+ if cx.idx >= cx.frames.len() {
+ return uw::_URC_NORMAL_STOP;
+ }
+
let mut ip_before_insn = 0;
let mut ip = unsafe { uw::_Unwind_GetIPInfo(ctx, &mut ip_before_insn) as *mut libc::c_void };
if !ip.is_null() && ip_before_insn == 0 {
@@ -73,14 +77,12 @@ extern "C" fn trace_fn(
}
let symaddr = unsafe { uw::_Unwind_FindEnclosingFunction(ip) };
- if cx.idx < cx.frames.len() {
- cx.frames[cx.idx] = Frame {
- symbol_addr: symaddr as *mut u8,
- exact_position: ip as *mut u8,
- inline_context: 0,
- };
- cx.idx += 1;
- }
+ cx.frames[cx.idx] = Frame {
+ symbol_addr: symaddr as *mut u8,
+ exact_position: ip as *mut u8,
+ inline_context: 0,
+ };
+ cx.idx += 1;
uw::_URC_NO_REASON
}
diff --git a/src/libstd/sys/redox/backtrace/tracing.rs b/src/libstd/sys/redox/backtrace/tracing.rs
index bb70ca360370..c0414b78f8d6 100644
--- a/src/libstd/sys/redox/backtrace/tracing.rs
+++ b/src/libstd/sys/redox/backtrace/tracing.rs
@@ -68,6 +68,10 @@ pub fn unwind_backtrace(frames: &mut [Frame])
extern fn trace_fn(ctx: *mut uw::_Unwind_Context,
arg: *mut libc::c_void) -> uw::_Unwind_Reason_Code {
let cx = unsafe { &mut *(arg as *mut Context) };
+ if cx.idx >= cx.frames.len() {
+ return uw::_URC_NORMAL_STOP;
+ }
+
let mut ip_before_insn = 0;
let mut ip = unsafe {
uw::_Unwind_GetIPInfo(ctx, &mut ip_before_insn) as *mut libc::c_void
@@ -94,14 +98,12 @@ extern fn trace_fn(ctx: *mut uw::_Unwind_Context,
unsafe { uw::_Unwind_FindEnclosingFunction(ip) }
};
- if cx.idx < cx.frames.len() {
- cx.frames[cx.idx] = Frame {
- symbol_addr: symaddr as *mut u8,
- exact_position: ip as *mut u8,
- inline_context: 0,
- };
- cx.idx += 1;
- }
+ cx.frames[cx.idx] = Frame {
+ symbol_addr: symaddr as *mut u8,
+ exact_position: ip as *mut u8,
+ inline_context: 0,
+ };
+ cx.idx += 1;
uw::_URC_NO_REASON
}
diff --git a/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs b/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs
index 1b92fc0e6ad0..6e8415686792 100644
--- a/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs
+++ b/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs
@@ -68,6 +68,10 @@ pub fn unwind_backtrace(frames: &mut [Frame])
extern fn trace_fn(ctx: *mut uw::_Unwind_Context,
arg: *mut libc::c_void) -> uw::_Unwind_Reason_Code {
let cx = unsafe { &mut *(arg as *mut Context) };
+ if cx.idx >= cx.frames.len() {
+ return uw::_URC_NORMAL_STOP;
+ }
+
let mut ip_before_insn = 0;
let mut ip = unsafe {
uw::_Unwind_GetIPInfo(ctx, &mut ip_before_insn) as *mut libc::c_void
@@ -94,14 +98,12 @@ extern fn trace_fn(ctx: *mut uw::_Unwind_Context,
unsafe { uw::_Unwind_FindEnclosingFunction(ip) }
};
- if cx.idx < cx.frames.len() {
- cx.frames[cx.idx] = Frame {
- symbol_addr: symaddr as *mut u8,
- exact_position: ip as *mut u8,
- inline_context: 0,
- };
- cx.idx += 1;
- }
+ cx.frames[cx.idx] = Frame {
+ symbol_addr: symaddr as *mut u8,
+ exact_position: ip as *mut u8,
+ inline_context: 0,
+ };
+ cx.idx += 1;
uw::_URC_NO_REASON
}
--
2.17.1

View file

@ -0,0 +1,26 @@
From 1ea2765918d1212a07e1359537470c477d82a681 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
Date: Mon, 30 Jul 2018 13:08:56 -0700
Subject: [PATCH] run-pass/const-endianness: negate before to_le()
`const LE_I128` needs parentheses to negate the value *before* calling
`to_le()`, otherwise it doesn't match the operations performed in the
black-boxed part of the test. This only makes a tangible difference on
big-endian targets.
---
src/test/run-pass/const-endianess.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/run-pass/const-endianess.rs b/src/test/run-pass/const-endianess.rs
index fa34b49210a6..95c738d3ec49 100644
--- a/src/test/run-pass/const-endianess.rs
+++ b/src/test/run-pass/const-endianess.rs
@@ -25,7 +25,7 @@ fn main() {
#[cfg(not(target_arch = "asmjs"))]
{
const BE_U128: u128 = 999999u128.to_be();
- const LE_I128: i128 = -999999i128.to_le();
+ const LE_I128: i128 = (-999999i128).to_le();
assert_eq!(BE_U128, b(999999u128).to_be());
assert_eq!(LE_I128, b(-999999i128).to_le());
}

View file

@ -1,4 +1,11 @@
addFilter("spurious-executable-perm")
addFilter("zero-length")
addFilter("W: no-soname")
# 834 warnings
addFilter("W: binaryinfo-readelf-failed")
addFilter("W: devel-file-in-non-devel-package")
addFilter("W: hidden-file-or-dir")
addFilter("W: no-soname")
addFilter("W: non-executable-script")
addFilter("W: only-non-binary-in-usr-lib")
addFilter("W: script-without-shebang")
#
addFilter("E: wrong-script-interpreter")
addFilter("E: unstripped-binary-or-object")

514
rust.spec
View file

@ -1,130 +1,458 @@
# ALL Rust libraries are private, because they don't keep an ABI.
%define _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.*
%define __provides_exclude ^(%{_privatelibs})$
%define __requires_exclude ^(%{_privatelibs})$
%define __provides_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$
%define __requires_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$
%define debug_package %{nil}
%define _disable_lto 1
%define _disable_ld_no_undefined 1
# To avoid undefined symbols
%define _find_debuginfo_opts -g
Summary: A safe, concurrent, practical programming language
# We're going to override --libdir when configuring to get rustlib into a
# common path, but we'll fix the shared libraries during install.
%define rustlibdir %{_libdir}/rustlib
# Only x86_64 and i686 are Tier 1 platforms at this time.
# https://forge.rust-lang.org/platform-support.html
%define rust_arches x86_64 %{ix86}
# 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.
%define bootstrap_rust 1.28.0
%define bootstrap_cargo 1.28.0
%define bootstrap_date 2018-08-02
%bcond_without bootstrap
%if %{without bootstrap}
%define bootstrap_arches %{nil}
%else
%define bootstrap_arches %{rust_arches}
%endif
# Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases.
%bcond_without llvm_static
# LLDB only works on some architectures
# LLDB isn't available everywhere...
%bcond_with lldb
# 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!
%define rustc_version 1.29.1
%define cargo_version 1.29.0
%define rustfmt_version 0.99.1
%define rls_version 0.130.0
%define clippy_version 0.0.212
%ifarch x86_64
%define rust_triple x86_64-unknown-linux-gnu
%else
%define rust_triple i686-unknown-linux-gnu
%endif
%ifarch %{bootstrap_arches}
%define bootstrap_root rust-%{bootstrap_rust}-%{rust_triple}
%define local_rust_root %{_builddir}/%{bootstrap_root}/usr
%else
%define local_rust_root %{_prefix}
%endif
Summary: The Rust Programming Language
Name: rust
Version: 1.27.0
Version: %{rustc_version}
Release: 1
License: MIT
License: (ASL 2.0 or MIT) and (BSD and MIT)
Group: Development/Rust
Url: http://www.rust-lang.org/
Source0: http://static.rust-lang.org/dist/rustc-%{version}-src.tar.gz
Source10: %{name}.rpmlintrc
BuildRequires: cmake
BuildRequires: bison
# ^ written as: (rust itself) and (bundled libraries)
Url: https://www.rust-lang.org
Source0: https://static.rust-lang.org/dist/rustc-%{rustc_version}-src.tar.xz
# For bootstrap
Source1: https://static.rust-lang.org/dist/rust-%{bootstrap_rust}-x86_64-unknown-linux-gnu.tar.xz
Source2: https://static.rust-lang.org/dist/rust-%{bootstrap_rust}-i686-unknown-linux-gnu.tar.xz
Source10: rust.rpmlintrc
# https://github.com/rust-lang/rust/pull/52876
Patch1: rust-52876-const-endianess.patch
# https://github.com/rust-lang/rust/pull/53436
Patch2: 0001-std-stop-backtracing-when-the-frames-are-full.patch
# https://github.com/rust-lang/rust/pull/53437
Patch3: 0001-Set-more-llvm-function-attributes-for-__rust_try.patch
BuildRequires: ncurses-devel
BuildRequires: curl
BuildRequires: docbook-style-xsl
BuildRequires: flex
BuildRequires: pkgconfig(libcurl)
BuildRequires: pkgconfig(liblzma)
BuildRequires: pkgconfig(openssl)
BuildRequires: pkgconfig(zlib)
# needs libssh2_userauth_publickey_frommemory
BuildRequires: pkgconfig(libssh2) >= 1.6.0
BuildRequires: pkgconfig(python3)
BuildRequires: cmake >= 2.8.11
BuildRequires: llvm-devel >= 5.0
%if %{with llvm_static}
BuildRequires: pkgconfig(libffi)
%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
BuildRequires: git
BuildRequires: xsltproc
BuildRequires: llvm-devel
BuildRequires: pkgconfig(python)
%if %{without bootstrap}
BuildRequires: cargo >= %{bootstrap_cargo}
BuildRequires: %{name} >= %{bootstrap_rust}
#Conflicts: %%{name} > %%{rustc_version}
%endif
# Virtual provides for folks who attempt "dnf install rustc"
Provides: rustc = %{rustc_version}-%{release}
# Always require our exact standard library
Requires: %{name}-std-static = %{rustc_version}-%{release}
%description
Rust is a curly-brace, block-structured expression language. It
visually resembles the C language family, but differs significantly
in syntactic and semantic details. Its design is oriented toward
concerns of "programming in the large", that is, of creating and
maintaining boundaries - both abstract and operational - that
preserve large-system integrity, availability and concurrency.
Rust is a systems programming language that runs blazingly fast, prevents
segfaults, and guarantees thread safety.
It supports a mixture of imperative procedural, concurrent actor,
object-oriented and pure functional styles. Rust also supports
generic programming and metaprogramming, in both static and dynamic
styles.
This package includes the Rust compiler and documentation generator.
%files
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%{_bindir}/rustc
%{_bindir}/rustdoc
%{_bindir}/rust-gdb
%{_bindir}/rust-lldb
%{_docdir}/%{name}/COPYRIGHT
%{_docdir}/%{name}/LICENSE-APACHE
%{_docdir}/%{name}/LICENSE-MIT
%{_docdir}/%{name}/README.md
%{_libdir}/lib*-*.so
%{_libdir}/rustlib/components
%{_libdir}/rustlib/etc/*.py
%{_libdir}/rustlib/*/codegen-backends/lib*-*.so
%{_libdir}/rustlib/*/lib/lib*-*.so
%{_libdir}/rustlib/*/lib/lib*-*.rlib
%{_mandir}/man*/*
%{_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/
#----------------------------------------------------------------------------
#-------------------------------------------------------------------------
%package doc
Summary: Documentation for the Rust programming language
Group: Documentation
%package std-static
Summary: Standard library for Rust
Group: Development/Rust
%description std-static
This package includes the standard libraries for building applications
written in Rust.
%files std-static
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%dir %{rustlibdir}
%dir %{rustlibdir}/%{rust_triple}
%dir %{rustlibdir}/%{rust_triple}/lib
%{rustlibdir}/%{rust_triple}/lib/*.rlib
#-------------------------------------------------------------------------
%package debugger-common
Summary: Common debugger pretty printers for Rust
Group: Development/Rust
BuildArch: noarch
%description doc
This package contains the HTML documentation of the Rust programming language.
%description debugger-common
This package includes the common functionality
for %{name}-gdb and %{name}-lldb.
%files doc
%{_docdir}/%{name}/html/
%files debugger-common
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%dir %{rustlibdir}
%dir %{rustlibdir}/etc
%{rustlibdir}/etc/debugger_*.py*
#----------------------------------------------------------------------------
#-------------------------------------------------------------------------
%package gdb
Summary: GDB pretty printers for Rust
Group: Development/Rust
Requires: gdb
Requires: %{name}-debugger-common = %{rustc_version}-%{release}
BuildArch: noarch
# (akien) Handle moved files between our old Mageia package and this Fedora-based one
Conflicts: rust < 1.11.0-3
%description gdb
This package includes the rust-gdb script,
which allows easier debugging of Rust programs.
%files gdb
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%{_bindir}/rust-gdb
%{rustlibdir}/etc/gdb_*.py*
#-------------------------------------------------------------------------
%if %{with lldb}
%package lldb
Summary: LLDB pretty printers for Rust
Group: Development/Rust
Requires: lldb
Requires: python-lldb
Requires: %{name}-debugger-common = %{rustc_version}-%{release}
# It could be noarch, but lldb has limited availability
#BuildArch: noarch
%description lldb
This package includes the rust-lldb script,
which allows easier debugging of Rust programs.
%files lldb
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%{_bindir}/rust-lldb
%{rustlibdir}/etc/lldb_*.py*
%endif
#-------------------------------------------------------------------------
%package -n cargo
Summary: Rust's package manager and build tool
Version: %{cargo_version}
Group: Development/Rust
# For tests:
BuildRequires: git
# Cargo is not much use without Rust
Requires: rust
Obsoletes: cargo < 1.26.0-1
%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.
%files -n cargo
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%{_bindir}/cargo
%{_mandir}/man1/cargo*.1*
%{_sysconfdir}/bash_completion.d/cargo
%{_datadir}/zsh/site-functions/_cargo
%dir %{_datadir}/cargo
%dir %{_datadir}/cargo/registry
#-------------------------------------------------------------------------
%package -n rustfmt-preview
Summary: Tool to find and fix Rust formatting issues
Group: Development/Rust
Version: %{rustfmt_version}
Requires: cargo
# Despite the lower version, our rustfmt-preview is newer than rustfmt-0.9.
# It's expected to stay "preview" until it's released as 1.0.
Obsoletes: rustfmt <= 0.9.0
Provides: rustfmt = %{rustfmt_version}
%description -n rustfmt-preview
A tool for formatting Rust code according to style guidelines.
%files -n rustfmt-preview
%doc src/tools/rustfmt/{README,CHANGELOG,Configurations}.md
%{_bindir}/rustfmt
%{_bindir}/cargo-fmt
#-------------------------------------------------------------------------
%package -n rls-preview
Summary: Rust Language Server for IDE integration
Version: %{rls_version}
Group: Development/Rust
Provides: rls = %{rls_version}
Requires: rust-analysis
# /usr/bin/rls is dynamically linked against internal rustc libs
Requires: %{name} = %{rustc_version}-%{release}
%description -n rls-preview
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.
%files -n rls-preview
%doc src/tools/rls/{README.md,COPYRIGHT,debugging.md}
%{_bindir}/rls
#-------------------------------------------------------------------------
%package -n clippy-preview
Summary: Lints to catch common mistakes and improve your Rust code
Version: %{clippy_version}
License: MPLv2.0
Group: Development/Rust
Provides: clippy = %{clippy_version}
Requires: cargo
# /usr/bin/clippy-driver is dynamically linked against internal rustc libs
Requires: %{name} = %{rustc_version}-%{release}
%description -n clippy-preview
A collection of lints to catch common mistakes and improve your Rust code.
%files -n clippy-preview
%doc src/tools/clippy/{README.md,CHANGELOG.md}
%{_bindir}/cargo-clippy
%{_bindir}/clippy-driver
#-------------------------------------------------------------------------
%package src
Summary: Sources for the Rust standard library
Group: Development/Rust
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.
%files src
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%dir %{rustlibdir}
%{rustlibdir}/src
#-------------------------------------------------------------------------
%package analysis
Summary: Compiler analysis data for the Rust standard library
Group: Development/Rust
Requires: rust-std-static = %{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.
%files analysis
%doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT
%{rustlibdir}/%{rust_triple}/analysis/
#-------------------------------------------------------------------------
%prep
%setup -q -n rustc-%{version}-src
%ifarch %{bootstrap_arches}
%ifarch x86_64
tar xf %{SOURCE1}
%else
tar xf %{SOURCE2}
%endif
cd rust-%{bootstrap_rust}-%{rust_triple}
./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 -qn rustc-%{rustc_version}-src
%patch1 -p1
%patch2 -p1
%patch3 -p1
# python3
sed -i.try-py3 -e '/try python2.7/i try python3 "$@"' ./configure
# We're disabling jemalloc, but rust-src still wants it.
# rm -rf src/jemalloc/
rm -rf src/llvm/
%build
./configure \
--prefix=%{_prefix} \
--sysconfdir=%{_sysconfdir} \
--datadir=%{_datadir} \
--libdir=%{_libdir} \
--localstatedir=%{_localstatedir} \
--mandir=%{_mandir} \
--infodir=%{_infodir} \
--disable-rpath \
--default-linker=gcc \
--disable-codegen-tests \
--enable-llvm-link-shared \
--llvm-root=%{_prefix} \
--enable-vendor
# We never enable emscripten.
rm -rf src/llvm-emscripten/
./x.py build
./x.py doc
# extract bundled licenses for packaging
sed -e '/*\//q' src/libbacktrace/backtrace.h \
>src/libbacktrace/LICENSE-libbacktrace
# This tests a problem of exponential growth, which seems to be less-reliably
# fixed when running on older LLVM and/or some arches. Just skip it for now.
sed -i.ignore -e '1i // ignore-test may still be exponential...' \
src/test/run-pass/issue-41696.rs
%if %{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
# Use hardening ldflags.
%if %{without bootstrap}
%ifarch x86_64
%define rustflags -Clink-arg=-Wl,-z,relro,-z,now -L %{rustlibdir}/%{rust_triple}/lib
%else
%define rustflags -Clink-arg=-Wl,-z,relro,-z,now
%endif
%endif
# convince libssh2-sys to use the distro libssh2
export LIBSSH2_SYS_USE_PKG_CONFIG=1
export RUSTFLAGS="%{rustflags}"
%configure2_5x \
--disable-option-checking \
--libdir=%{_libdir} \
--build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \
--local-rust-root=%{local_rust_root} \
--llvm-root=%{_prefix} --disable-codegen-tests \
--disable-jemalloc \
--disable-rpath \
--enable-extended \
--enable-vendor \
--release-channel=stable
#%%{!?with_llvm_static: --enable-llvm-link-shared } } \
python3 ./x.py build
%install
DESTDIR=%{buildroot} ./x.py install --verbose
export RUSTFLAGS="%{rustflags}"
rm -f %{buildroot}%{_libdir}/rustlib/install.log
rm -f %{buildroot}%{_libdir}/rustlib/manifest-*
rm -f %{buildroot}%{_libdir}/rustlib/rust-installer-version
rm -f %{buildroot}%{_libdir}/rustlib/uninstall.sh
DESTDIR=%{buildroot} python3 ./x.py install
# Turn libraries into symlinks to avoid duplicate Provides
pushd %{buildroot}%{_libdir}/rustlib/*/lib/
rm lib*.so
for lib in ../../../*.so
do
ln -s $lib `basename $lib`
done
popd
# The shared libraries should be executable for debuginfo extraction.
find %{buildroot}%{_libdir} -maxdepth 1 -type f -name '*.so' \
-exec chmod -v +x '{}' '+'
# Manually strip them because auto-strip damages files
pushd %{buildroot}%{_libdir}
strip *.so
popd
pushd %{buildroot}%{_bindir}
strip rustc
strip rustdoc
popd
# 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)
%ifarch x86_64
pushd %{buildroot}%{_libdir}/rustlib/x86_64-unknown-linux-gnu/codegen-backends
strip *.so
popd
%else
pushd %{buildroot}%{_libdir}/rustlib/i686-unknown-linux-gnu/codegen-backends
strip *.so
popd
# 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 '{}' '+'
# 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
# Create the path for crate-devel packages
mkdir -p %{buildroot}%{_datadir}/cargo/registry
%if %{without lldb}
rm -f %{buildroot}%{_bindir}/rust-lldb
rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py*
%endif