From 4fd41d0a2976d23777c4e53d4d61b7cde99f3fd1 Mon Sep 17 00:00:00 2001 From: Dan Callaghan Date: Mon, 16 Apr 2018 13:47:49 +1000 Subject: [PATCH] Add cargo, rls, and analysis --- pull-49959.patch | 195 +++++++++++++++++++++++++++++++++++++++++++++++ rust.spec | 178 +++++++++++++++++++++++++++++++++++------- 2 files changed, 346 insertions(+), 27 deletions(-) create mode 100644 pull-49959.patch diff --git a/pull-49959.patch b/pull-49959.patch new file mode 100644 index 0000000..be2ed9f --- /dev/null +++ b/pull-49959.patch @@ -0,0 +1,195 @@ +From f89f1b496c0c3b96aa8e41bef882131008dac6c3 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Fri, 13 Apr 2018 16:52:54 -0700 +Subject: [PATCH 1/3] rustbuild: allow building tools with debuginfo + +Debugging information for the extended tools is currently disabled for +concerns about the size. This patch adds `--enable-debuginfo-tools` to +let one opt into having that debuginfo. + +This is useful for debugging the tools in distro packages. We always +strip debuginfo into separate packages anyway, so the extra size is not +a concern in regular use. +--- + CONTRIBUTING.md | 1 + + config.toml.example | 4 ++++ + src/bootstrap/builder.rs | 12 ++++++++---- + src/bootstrap/config.rs | 5 +++++ + src/bootstrap/configure.py | 1 + + 5 files changed, 19 insertions(+), 4 deletions(-) + +diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md +index 70376c120f..fcd995b703 100644 +--- a/CONTRIBUTING.md ++++ b/CONTRIBUTING.md +@@ -121,6 +121,7 @@ configuration used in the build process. Some options to note: + #### `[rust]`: + - `debuginfo = true` - Build a compiler with debuginfo. Makes building rustc slower, but then you can use a debugger to debug `rustc`. + - `debuginfo-lines = true` - An alternative to `debuginfo = true` that doesn't let you use a debugger, but doesn't make building rustc slower and still gives you line numbers in backtraces. ++- `debuginfo-tools = true` - Build the extended tools with debuginfo. + - `debug-assertions = true` - Makes the log output of `debug!` work. + - `optimize = false` - Disable optimizations to speed up compilation of stage1 rust, but makes the stage1 compiler x100 slower. + +diff --git a/config.toml.example b/config.toml.example +index f153562a53..64e2f1b424 100644 +--- a/config.toml.example ++++ b/config.toml.example +@@ -259,6 +259,10 @@ + # standard library. + #debuginfo-only-std = false + ++# Enable debuginfo for the extended tools: cargo, rls, rustfmt ++# Adding debuginfo increases their sizes by a factor of 3-4. ++#debuginfo-tools = false ++ + # Whether or not jemalloc is built and enabled + #use-jemalloc = true + +diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs +index fcb78c479f..584c0cbe75 100644 +--- a/src/bootstrap/builder.rs ++++ b/src/bootstrap/builder.rs +@@ -603,10 +603,14 @@ impl<'a> Builder<'a> { + cargo.env("RUSTDOC_LIBDIR", self.rustc_libdir(self.compiler(2, self.build.build))); + } + +- if mode != Mode::Tool { +- // Tools don't get debuginfo right now, e.g. cargo and rls don't +- // get compiled with debuginfo. +- // Adding debuginfo increases their sizes by a factor of 3-4. ++ if mode == Mode::Tool { ++ // Tools like cargo and rls don't get debuginfo by default right now, but this can be ++ // enabled in the config. Adding debuginfo increases their sizes by a factor of 3-4. ++ if self.config.rust_debuginfo_tools { ++ cargo.env("RUSTC_DEBUGINFO", self.config.rust_debuginfo.to_string()); ++ cargo.env("RUSTC_DEBUGINFO_LINES", self.config.rust_debuginfo_lines.to_string()); ++ } ++ } else { + cargo.env("RUSTC_DEBUGINFO", self.config.rust_debuginfo.to_string()); + cargo.env("RUSTC_DEBUGINFO_LINES", self.config.rust_debuginfo_lines.to_string()); + cargo.env("RUSTC_FORCE_UNSTABLE", "1"); +diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs +index f3810ac869..ac64e6e8e3 100644 +--- a/src/bootstrap/config.rs ++++ b/src/bootstrap/config.rs +@@ -88,6 +88,7 @@ pub struct Config { + pub rust_debuginfo: bool, + pub rust_debuginfo_lines: bool, + pub rust_debuginfo_only_std: bool, ++ pub rust_debuginfo_tools: bool, + pub rust_rpath: bool, + pub rustc_parallel_queries: bool, + pub rustc_default_linker: Option, +@@ -271,6 +272,7 @@ struct Rust { + debuginfo: Option, + debuginfo_lines: Option, + debuginfo_only_std: Option, ++ debuginfo_tools: Option, + experimental_parallel_queries: Option, + debug_jemalloc: Option, + use_jemalloc: Option, +@@ -425,6 +427,7 @@ impl Config { + let mut llvm_assertions = None; + let mut debuginfo_lines = None; + let mut debuginfo_only_std = None; ++ let mut debuginfo_tools = None; + let mut debug = None; + let mut debug_jemalloc = None; + let mut debuginfo = None; +@@ -462,6 +465,7 @@ impl Config { + debuginfo = rust.debuginfo; + debuginfo_lines = rust.debuginfo_lines; + debuginfo_only_std = rust.debuginfo_only_std; ++ debuginfo_tools = rust.debuginfo_tools; + optimize = rust.optimize; + ignore_git = rust.ignore_git; + debug_jemalloc = rust.debug_jemalloc; +@@ -553,6 +557,7 @@ impl Config { + config.rust_thinlto = thinlto.unwrap_or(true); + config.rust_debuginfo_lines = debuginfo_lines.unwrap_or(default); + config.rust_debuginfo_only_std = debuginfo_only_std.unwrap_or(default); ++ config.rust_debuginfo_tools = debuginfo_tools.unwrap_or(default); + + let default = debug == Some(true); + config.debug_jemalloc = debug_jemalloc.unwrap_or(default); +diff --git a/src/bootstrap/configure.py b/src/bootstrap/configure.py +index 99a3ee4e4c..689dd905fb 100755 +--- a/src/bootstrap/configure.py ++++ b/src/bootstrap/configure.py +@@ -78,6 +78,7 @@ def v(*args): + o("debuginfo", "rust.debuginfo", "build with debugger metadata") + o("debuginfo-lines", "rust.debuginfo-lines", "build with line number debugger metadata") + o("debuginfo-only-std", "rust.debuginfo-only-std", "build only libstd with debugging information") ++o("debuginfo-tools", "rust.debuginfo-tools", "build extended tools with debugging information") + o("debug-jemalloc", "rust.debug-jemalloc", "build jemalloc with --enable-debug --enable-fill") + v("save-toolstates", "rust.save-toolstates", "save build and test status of external tools into this file") + +-- +2.14.3 + + +From f0a43d3a9a4c28ea45d6bed430b1d9d561944e16 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Fri, 13 Apr 2018 21:57:53 -0700 +Subject: [PATCH 2/3] Avoid specific claims about debuginfo size + +--- + config.toml.example | 2 +- + src/bootstrap/builder.rs | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/config.toml.example b/config.toml.example +index 64e2f1b424..46be1ecab7 100644 +--- a/config.toml.example ++++ b/config.toml.example +@@ -260,7 +260,7 @@ + #debuginfo-only-std = false + + # Enable debuginfo for the extended tools: cargo, rls, rustfmt +-# Adding debuginfo increases their sizes by a factor of 3-4. ++# Adding debuginfo makes them several times larger. + #debuginfo-tools = false + + # Whether or not jemalloc is built and enabled +diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs +index 584c0cbe75..627a695884 100644 +--- a/src/bootstrap/builder.rs ++++ b/src/bootstrap/builder.rs +@@ -605,7 +605,7 @@ impl<'a> Builder<'a> { + + if mode == Mode::Tool { + // Tools like cargo and rls don't get debuginfo by default right now, but this can be +- // enabled in the config. Adding debuginfo increases their sizes by a factor of 3-4. ++ // enabled in the config. Adding debuginfo makes them several times larger. + if self.config.rust_debuginfo_tools { + cargo.env("RUSTC_DEBUGINFO", self.config.rust_debuginfo.to_string()); + cargo.env("RUSTC_DEBUGINFO_LINES", self.config.rust_debuginfo_lines.to_string()); +-- +2.14.3 + + +From 7ddb573a2ea41ad3c35f927b7b90fd545a6ab9da Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Fri, 13 Apr 2018 21:58:21 -0700 +Subject: [PATCH 3/3] Make debuginfo-tools always default false + +--- + src/bootstrap/config.rs | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs +index ac64e6e8e3..06443ae6cd 100644 +--- a/src/bootstrap/config.rs ++++ b/src/bootstrap/config.rs +@@ -557,7 +557,7 @@ impl Config { + config.rust_thinlto = thinlto.unwrap_or(true); + config.rust_debuginfo_lines = debuginfo_lines.unwrap_or(default); + config.rust_debuginfo_only_std = debuginfo_only_std.unwrap_or(default); +- config.rust_debuginfo_tools = debuginfo_tools.unwrap_or(default); ++ config.rust_debuginfo_tools = debuginfo_tools.unwrap_or(false); + + let default = debug == Some(true); + config.debug_jemalloc = debug_jemalloc.unwrap_or(default); +-- +2.14.3 + diff --git a/rust.spec b/rust.spec index 464d3e0..a9e58df 100644 --- a/rust.spec +++ b/rust.spec @@ -39,11 +39,15 @@ %bcond_with lldb %endif - +# Some sub-packages are versioned independently of the rust compiler and runtime itself. +%global rustc_version 1.25.0 +%global cargo_version 0.26.0 +%global rustfmt_version 0.3.8 +%global rls_version 0.125.1 Name: rust -Version: 1.25.0 -Release: 2%{?dist} +Version: %{rustc_version} +Release: 3%{?dist} Summary: The Rust Programming Language License: (ASL 2.0 or MIT) and (BSD and ISC and MIT) # ^ written as: (rust itself) and (bundled libraries) @@ -51,17 +55,17 @@ URL: https://www.rust-lang.org ExclusiveArch: %{rust_arches} %if "%{channel}" == "stable" -%global rustc_package rustc-%{version}-src +%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/49290 -Patch1: 0001-Allow-installing-rustfmt-without-config.extended.patch - # https://github.com/rust-lang/rust/pull/49484 -Patch2: 0001-Ignore-stack-probes-tests-on-powerpc-s390x-too.patch +Patch1: 0001-Ignore-stack-probes-tests-on-powerpc-s390x-too.patch + +# https://github.com/rust-lang/rust/pull/49959 +Patch2: pull-49959.patch # Get the Rust triple for any arch. %{lua: function rust_triple(arch) @@ -107,10 +111,10 @@ Provides: bundled(%{name}-bootstrap) = %{bootstrap_rust} %else BuildRequires: cargo >= %{bootstrap_cargo} %if 0%{?fedora} >= 27 -BuildRequires: (%{name} >= %{bootstrap_rust} with %{name} <= %{version}) +BuildRequires: (%{name} >= %{bootstrap_rust} with %{name} <= %{rustc_version}) %else BuildRequires: %{name} >= %{bootstrap_rust} -BuildConflicts: %{name} > %{version} +BuildConflicts: %{name} > %{rustc_version} %endif %global local_rust_root %{_prefix} %endif @@ -119,8 +123,12 @@ BuildRequires: make BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: ncurses-devel -BuildRequires: zlib-devel BuildRequires: curl +BuildRequires: pkgconfig(libcurl) +BuildRequires: pkgconfig(liblzma) +BuildRequires: pkgconfig(libssh2) +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(zlib) %if 0%{?rhel} && 0%{?rhel} <= 7 %global python python2 @@ -163,11 +171,11 @@ Provides: bundled(libbacktrace) = 6.1.0 Provides: bundled(miniz) = 1.16~beta+r1 # Virtual provides for folks who attempt "dnf install rustc" -Provides: rustc = %{version}-%{release} -Provides: rustc%{?_isa} = %{version}-%{release} +Provides: rustc = %{rustc_version}-%{release} +Provides: rustc%{?_isa} = %{rustc_version}-%{release} # Always require our exact standard library -Requires: %{name}-std-static%{?_isa} = %{version}-%{release} +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. @@ -228,7 +236,7 @@ This package includes the common functionality for %{name}-gdb and %{name}-lldb. Summary: GDB pretty printers for Rust BuildArch: noarch Requires: gdb -Requires: %{name}-debugger-common = %{version}-%{release} +Requires: %{name}-debugger-common = %{rustc_version}-%{release} %description gdb This package includes the rust-gdb script, which allows easier debugging of Rust @@ -245,7 +253,7 @@ Summary: LLDB pretty printers for Rust Requires: lldb Requires: python2-lldb -Requires: %{name}-debugger-common = %{version}-%{release} +Requires: %{name}-debugger-common = %{rustc_version}-%{release} %description lldb This package includes the rust-lldb script, which allows easier debugging of Rust @@ -266,20 +274,68 @@ 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.26.0 +%else +BuildRequires: pkgconfig(libgit2) >= 0.24 +%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 + +%description -n cargo-doc +This package includes HTML documentation for Cargo. + + %package -n rustfmt-preview Summary: Tool to find and fix Rust formatting issues -Version: 0.3.8 +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 = %{version} +Provides: rustfmt = %{rustfmt_version} %description -n rustfmt-preview A tool for formatting Rust code according to style guidelines. +%package -n rls-preview +Summary: Rust Language Server for IDE integration +Version: %{rls_version} +Provides: rls = %{rls_version} +%if %with bundled_libgit2 +Provides: bundled(libgit2) = 0.26.0 +%endif +Requires: rust-analysis +# /usr/bin/rls is dynamically linked against internal rustc libs +Requires: %{name}%{?_isa} = %{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. + + %package src Summary: Sources for the Rust standard library BuildArch: noarch @@ -289,6 +345,16 @@ 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} @@ -301,8 +367,8 @@ test -f '%{local_rust_root}/bin/rustc' %setup -q -n %{rustc_package} -%patch1 -p1 -b .dist-rustfmt -%patch2 -p1 -b .ignore-ibm +%patch1 -p1 -b .ignore-ibm +%patch2 -p1 %if "%{python}" == "python3" sed -i.try-py3 -e '/try python2.7/i try python3 "$@"' ./configure @@ -350,6 +416,11 @@ find src/vendor -name .cargo-checksum.json \ %build +%if %without bundled_libgit2 +# convince libgit2-sys to use the distro libgit2 +export LIBGIT2_SYS_USE_PKG_CONFIG=1 +%endif + %{?cmake_path:export PATH=%{cmake_path}:$PATH} %{?library_path:export LIBRARY_PATH="%{library_path}"} %{?rustflags:export RUSTFLAGS="%{rustflags}"} @@ -362,9 +433,9 @@ find src/vendor -name .cargo-checksum.json \ %ifarch %{arm} # full debuginfo is exhausting memory; just do libstd for now # https://github.com/rust-lang/rust/issues/45854 -%define enable_debuginfo --enable-debuginfo --enable-debuginfo-only-std --disable-debuginfo-lines +%define enable_debuginfo --enable-debuginfo --enable-debuginfo-only-std --disable-debuginfo-tools --disable-debuginfo-lines %else -%define enable_debuginfo --enable-debuginfo --disable-debuginfo-only-std --disable-debuginfo-lines +%define enable_debuginfo --enable-debuginfo --disable-debuginfo-only-std --enable-debuginfo-tools --disable-debuginfo-lines %endif %configure --disable-option-checking \ @@ -376,11 +447,11 @@ find src/vendor -name .cargo-checksum.json \ --disable-jemalloc \ --disable-rpath \ %{enable_debuginfo} \ + --enable-extended \ --enable-vendor \ --release-channel=%{channel} %{python} ./x.py build -%{python} ./x.py build src/tools/rustfmt %{python} ./x.py doc @@ -390,9 +461,6 @@ find src/vendor -name .cargo-checksum.json \ %{?rustflags:export RUSTFLAGS="%{rustflags}"} DESTDIR=%{buildroot} %{python} ./x.py install -DESTDIR=%{buildroot} %{python} ./x.py install rustfmt -DESTDIR=%{buildroot} %{python} ./x.py install src - # Make sure the shared libraries are in the proper libdir %if "%{_libdir}" != "%{common_libdir}" @@ -427,12 +495,38 @@ rm -f %{buildroot}%{_docdir}/%{name}/README.md rm -f %{buildroot}%{_docdir}/%{name}/COPYRIGHT 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/html +cat < %{buildroot}%{_docdir}/cargo/html/index.html + + + + + + + cargo-doc redirection + + + Cargo documentation has been moved to the rust-doc package. + If you are not redirected automatically, please follow this + link. + + +EOF + %if %without lldb rm -f %{buildroot}%{_bindir}/rust-lldb rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py* @@ -446,7 +540,9 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py* # 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 src/tools/rustfmt || : +%{python} ./x.py test --no-fail-fast cargo || : +%{python} ./x.py test --no-fail-fast rls || : +%{python} ./x.py test --no-fail-fast rustfmt || : %ldconfig_scriptlets @@ -507,6 +603,21 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py* %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}/cargo/html + + %files -n rustfmt-preview %{_bindir}/rustfmt %{_bindir}/cargo-fmt @@ -514,12 +625,25 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_*.py* %license src/tools/rustfmt/LICENSE-{APACHE,MIT} +%files -n rls-preview +%{_bindir}/rls +%doc src/tools/rls/{README.md,COPYRIGHT,debugging.md} +%license src/tools/rls/LICENSE-{APACHE,MIT} + + %files src %dir %{rustlibdir} %{rustlibdir}/src +%files analysis +%{rustlibdir}/%{rust_triple}/analysis/ + + %changelog +* Mon Apr 16 2018 Dan Callaghan - 1.25.0-3 +- Add cargo, rls, and analysis + * Tue Apr 10 2018 Josh Stone - 1.25.0-2 - Filter codegen-backends from Provides too.