diff --git a/.abf.yml b/.abf.yml index 07b2930..7b73260 100644 --- a/.abf.yml +++ b/.abf.yml @@ -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 diff --git a/0001-Set-more-llvm-function-attributes-for-__rust_try.patch b/0001-Set-more-llvm-function-attributes-for-__rust_try.patch new file mode 100644 index 0000000..36bb15c --- /dev/null +++ b/0001-Set-more-llvm-function-attributes-for-__rust_try.patch @@ -0,0 +1,186 @@ +From 4b95b1a4fd035a73998dc21b265ce4594e35f8ae Mon Sep 17 00:00:00 2001 +From: Alex Crichton +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 { + + /// 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, ++) { ++ 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 + diff --git a/0001-std-stop-backtracing-when-the-frames-are-full.patch b/0001-std-stop-backtracing-when-the-frames-are-full.patch new file mode 100644 index 0000000..aa1b9a5 --- /dev/null +++ b/0001-std-stop-backtracing-when-the-frames-are-full.patch @@ -0,0 +1,122 @@ +From f4e8d57b6ad6f599de54c020ba185db83cb011a3 Mon Sep 17 00:00:00 2001 +From: Josh Stone +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 + diff --git a/rust-52876-const-endianess.patch b/rust-52876-const-endianess.patch new file mode 100644 index 0000000..1e844e8 --- /dev/null +++ b/rust-52876-const-endianess.patch @@ -0,0 +1,26 @@ +From 1ea2765918d1212a07e1359537470c477d82a681 Mon Sep 17 00:00:00 2001 +From: Josh Stone +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()); + } diff --git a/rust.rpmlintrc b/rust.rpmlintrc index 2b43335..aa9e6d8 100644 --- a/rust.rpmlintrc +++ b/rust.rpmlintrc @@ -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") diff --git a/rust.spec b/rust.spec index 18f054d..5b6a602 100644 --- a/rust.spec +++ b/rust.spec @@ -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