diff --git a/.gitignore b/.gitignore index e69de29..c948cae 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,3 @@ +/rustc-1.10.0-src.tar.gz +/rustc-1.9.0-i686-unknown-linux-gnu.tar.gz +/rustc-1.9.0-x86_64-unknown-linux-gnu.tar.gz diff --git a/rust-hoedown-pr6-misleading-indentation.patch b/rust-hoedown-pr6-misleading-indentation.patch new file mode 100644 index 0000000..6d11c72 --- /dev/null +++ b/rust-hoedown-pr6-misleading-indentation.patch @@ -0,0 +1,30 @@ +commit a3736a0a1907cbc8bf619708738815a5fd789c80 (from 4638c60dedfa581fd5fa7c6420d8f32274c9ca0b) +Merge: 4638c60dedfa 2c3e600653f4 +Author: Alex Crichton +Date: Tue May 31 10:51:47 2016 -0700 + + Merge pull request #6 from intelfx/patch-1 + + document.c: fix trigger of -Werror=misleading-indentation + +diff --git a/src/document.c b/src/document.c +index e2731dab41a2..8cd7315b418c 100644 +--- a/src/document.c ++++ b/src/document.c +@@ -1154,13 +1154,13 @@ char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offse + while (i < size) { + if (data[i] == '\\') i += 2; + else if (data[i] == '(' && i != 0) { +- nb_p++; i++; ++ nb_p++; + } + else if (data[i] == ')') { + if (nb_p == 0) break; +- else nb_p--; i++; ++ else nb_p--; + } else if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\'' || data[i] == '"')) break; +- else i++; ++ i++; + } + + if (i >= size) goto cleanup; diff --git a/rust-pr33787-enable-local-rebuild.patch b/rust-pr33787-enable-local-rebuild.patch new file mode 100644 index 0000000..0ec517c --- /dev/null +++ b/rust-pr33787-enable-local-rebuild.patch @@ -0,0 +1,134 @@ +commit dd6e8d45e183861d44ed91a99f0a50403b2776a3 (from 57ef015132ec09345b88d2ec20a9d9809b5d3dfc) +Merge: 57ef015132ec 0ca7d3dc1ffd +Author: bors +Date: Mon May 23 20:02:23 2016 -0700 + + Auto merge of #33787 - cuviper:local-rebuild, r=alexcrichton + + Add --enable-local-rebuild to bootstrap from the current release + + In Linux distributions, it is often necessary to rebuild packages for cases like applying new patches or linking against new system libraries. In this scenario, the rustc in the distro build environment may already match the current release that we're trying to rebuild. Thus we don't want to use the prior release's bootstrap key, nor `--cfg stage0` for the prior unstable features. + + The new `configure --enable-local-rebuild` option specifies that we are rebuilding from the current release. The current bootstrap key is used for the local rustc, and current stage1 features are also assumed. Both the makefiles and rustbuild support this configuration. + + Fixes #29556 + r? @alexcrichton + +diff --git a/configure b/configure +index 38f3e3b00c6d..b7053c5c54f5 100755 +--- a/configure ++++ b/configure +@@ -599,6 +599,7 @@ opt debug-assertions 0 "build with debugging assertions" + opt fast-make 0 "use .gitmodules as timestamp for submodule deps" + opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds" + opt local-rust 0 "use an installed rustc rather than downloading a snapshot" ++opt local-rebuild 0 "use an installed rustc matching the current version, for rebuilds" + opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM" + opt rpath 1 "build rpaths into rustc itself" + opt stage0-landing-pads 1 "enable landing pads during bootstrap with stage0" +@@ -847,6 +848,16 @@ then + BIN_SUF=.exe + fi + ++# --enable-local-rebuild implies --enable-local-rust too ++if [ -n "$CFG_ENABLE_LOCAL_REBUILD" ] ++then ++ if [ -z "$CFG_ENABLE_LOCAL_RUST" ] ++ then ++ CFG_ENABLE_LOCAL_RUST=1 ++ putvar CFG_ENABLE_LOCAL_RUST ++ fi ++fi ++ + if [ -n "$CFG_ENABLE_LOCAL_RUST" ] + then + system_rustc=$(which rustc) +diff --git a/mk/main.mk b/mk/main.mk +index 493b61051331..6feb53ec7b17 100644 +--- a/mk/main.mk ++++ b/mk/main.mk +@@ -34,7 +34,14 @@ CFG_FILENAME_EXTRA=$(shell printf '%s' $(CFG_RELEASE)$(CFG_EXTRA_FILENAME) | $(C + # intentionally not "secure" by any definition, this is largely just a deterrent + # from users enabling unstable features on the stable compiler. + CFG_BOOTSTRAP_KEY=$(CFG_FILENAME_EXTRA) ++ ++# The stage0 compiler needs to use the previous key recorded in src/stage0.txt, ++# except for local-rebuild when it just uses the same current key. ++ifdef CFG_ENABLE_LOCAL_REBUILD ++CFG_BOOTSTRAP_KEY_STAGE0=$(CFG_BOOTSTRAP_KEY) ++else + CFG_BOOTSTRAP_KEY_STAGE0=$(shell grep 'rustc_key' $(S)src/stage0.txt | sed 's/rustc_key: '//) ++endif + + ifeq ($(CFG_RELEASE_CHANNEL),stable) + # This is the normal semver version string, e.g. "0.12.0", "0.12.0-nightly" +@@ -526,6 +533,11 @@ ifneq ($(strip $(CFG_BUILD)),$(strip $(3))) + CFGFLAG$(1)_T_$(2)_H_$(3) = stage1 + + RPATH_VAR$(1)_T_$(2)_H_$(3) := $$(TARGET_RPATH_VAR1_T_$(2)_H_$$(CFG_BUILD)) ++else ++ifdef CFG_ENABLE_LOCAL_REBUILD ++# Assume the local-rebuild rustc already has stage1 features too. ++CFGFLAG$(1)_T_$(2)_H_$(3) = stage1 ++endif + endif + endif + +diff --git a/src/bootstrap/build/config.rs b/src/bootstrap/build/config.rs +index 3c35b9a95169..fb1ad12d914f 100644 +--- a/src/bootstrap/build/config.rs ++++ b/src/bootstrap/build/config.rs +@@ -67,6 +67,7 @@ pub struct Config { + pub target: Vec, + pub rustc: Option, + pub cargo: Option, ++ pub local_rebuild: bool, + + // libstd features + pub debug_jemalloc: bool, +@@ -315,6 +316,7 @@ impl Config { + ("RPATH", self.rust_rpath), + ("OPTIMIZE_TESTS", self.rust_optimize_tests), + ("DEBUGINFO_TESTS", self.rust_debuginfo_tests), ++ ("LOCAL_REBUILD", self.local_rebuild), + } + + match key { +diff --git a/src/bootstrap/build/mod.rs b/src/bootstrap/build/mod.rs +index ebc05c5f61c5..21d12d27d92e 100644 +--- a/src/bootstrap/build/mod.rs ++++ b/src/bootstrap/build/mod.rs +@@ -510,6 +510,14 @@ impl Build { + .arg("-j").arg(self.jobs().to_string()) + .arg("--target").arg(target); + ++ let stage; ++ if compiler.stage == 0 && self.config.local_rebuild { ++ // Assume the local-rebuild rustc already has stage1 features. ++ stage = 1; ++ } else { ++ stage = compiler.stage; ++ } ++ + // Customize the compiler we're running. Specify the compiler to cargo + // as our shim and then pass it some various options used to configure + // how the actual compiler itself is called. +@@ -518,7 +526,7 @@ impl Build { + // src/bootstrap/{rustc,rustdoc.rs} + cargo.env("RUSTC", self.out.join("bootstrap/debug/rustc")) + .env("RUSTC_REAL", self.compiler_path(compiler)) +- .env("RUSTC_STAGE", compiler.stage.to_string()) ++ .env("RUSTC_STAGE", stage.to_string()) + .env("RUSTC_DEBUGINFO", self.config.rust_debuginfo.to_string()) + .env("RUSTC_CODEGEN_UNITS", + self.config.rust_codegen_units.to_string()) +@@ -744,7 +752,7 @@ impl Build { + // In stage0 we're using a previously released stable compiler, so we + // use the stage0 bootstrap key. Otherwise we use our own build's + // bootstrap key. +- let bootstrap_key = if compiler.is_snapshot(self) { ++ let bootstrap_key = if compiler.is_snapshot(self) && !self.config.local_rebuild { + &self.bootstrap_key_stage0 + } else { + &self.bootstrap_key + diff --git a/rust-pr33798-miniz-misleading-indentation.patch b/rust-pr33798-miniz-misleading-indentation.patch new file mode 100644 index 0000000..4812fa9 --- /dev/null +++ b/rust-pr33798-miniz-misleading-indentation.patch @@ -0,0 +1,58 @@ +commit 7bddce693cec4ae4eb6970ed91289815b316cff3 (from 17b6261cc41343b1f2b611ca12f1ccd2d4306ee5) +Merge: 17b6261cc413 6e9774f4bb70 +Author: bors +Date: Fri May 27 14:49:10 2016 -0700 + + Auto merge of #33798 - locallycompact:lc/misleading-intentation, r=alexcrichton + + Fix misleading intentation errors on gcc 6.0 + + Currently building with latest gcc results in the following error: + + compile: x86_64-unknown-linux-gnu/rt/miniz.o + /home/lc/rust/src/rt/miniz.c: In function ‘tinfl_decompress’: + /home/lc/rust/src/rt/miniz.c:578:9: error: this ‘for’ clause does not guard... [-Werror=misleading-indentation] + for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; + ^~~ + /home/lc/rust/src/rt/miniz.c:578:47: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘for’ + for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; + ^~~ + /home/lc/rust/src/rt/miniz.c: In function ‘tdefl_find_match’: + /home/lc/rust/src/rt/miniz.c:1396:5: error: this ‘if’ clause does not guard... [-Werror=misleading-indentation] + if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; + ^~ + /home/lc/rust/src/rt/miniz.c:1396:23: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’ + if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; + ^ + + This patch stops this. + +diff --git a/src/rt/miniz.c b/src/rt/miniz.c +index 2b803b06d099..2daca9378a4a 100644 +--- a/src/rt/miniz.c ++++ b/src/rt/miniz.c +@@ -575,7 +575,10 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex + { + mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; + r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); +- for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; ++ for ( i = 0; i <= 143; ++i) *p++ = 8; ++ for ( ; i <= 255; ++i) *p++ = 9; ++ for ( ; i <= 279; ++i) *p++ = 7; ++ for ( ; i <= 287; ++i) *p++ = 8; + } + else + { +@@ -1393,7 +1396,10 @@ static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahe + if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break; + TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; + } +- if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; ++ if (!dist) break; ++ p = s; q = d->m_dict + probe_pos; ++ for (probe_len = 0; probe_len < max_match_len; probe_len++) ++ if (*p++ != *q++) break; + if (probe_len > match_len) + { + *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return; + diff --git a/rust.spec b/rust.spec new file mode 100644 index 0000000..182ee2a --- /dev/null +++ b/rust.spec @@ -0,0 +1,275 @@ +# 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 +%bcond_without bootstrap +%global bootstrap_channel 1.9.0 +%global bootstrap_date 2016-05-24 + +# Use "rebuild" when building with a distro rustc of the same version. +# Turn this off when the distro has the prior release, matching bootstrap. +%bcond_without rebuild + +# The script for minidebuginfo copies symbols and *notes* into a "mini" +# ELF object compressed into the .gnu_debugdata section. This includes our +# relatively large .note.rustc metadata, bloating every library. Eventually +# that metadata should be stripped beforehand -- see rust #23366 and #26764. +%undefine _include_minidebuginfo + +Name: rust +Version: 1.10.0 +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) +URL: https://www.rust-lang.org + +%if "%{channel}" == "stable" +%global rustc_package rustc-%{version} +%else +%global rustc_package rustc-%{channel} +%endif +Source0: https://static.rust-lang.org/dist/%{rustc_package}-src.tar.gz + +%if %with bootstrap +%global bootstrap_base https://static.rust-lang.org/dist/%{bootstrap_date}/rustc-%{bootstrap_channel} +Source1: %{bootstrap_base}-x86_64-unknown-linux-gnu.tar.gz +Source2: %{bootstrap_base}-i686-unknown-linux-gnu.tar.gz +#Source3: %{bootstrap_base}-armv7-unknown-linux-gnueabihf.tar.gz +#Source4: %{bootstrap_base}-aarch64-unknown-linux-gnu.tar.gz +%endif + +# Only x86_64 and i686 are Tier 1 platforms at this time. +# https://doc.rust-lang.org/stable/book/getting-started.html#tier-1 +ExclusiveArch: x86_64 i686 +#ExclusiveArch: x86_64 i686 armv7hl aarch64 +%ifarch armv7hl +%global rust_triple armv7-unknown-linux-gnueabihf +%else +%define rust_triple %{_target_cpu}-unknown-linux-gnu +%endif + +# merged for 1.11.0: https://github.com/rust-lang/rust/pull/33787 +Patch1: rust-pr33787-enable-local-rebuild.patch + +# merged for 1.11.0: https://github.com/rust-lang/rust/pull/33798 +Patch2: rust-pr33798-miniz-misleading-indentation.patch + +# merged for 1.11.0: https://github.com/rust-lang/hoedown/pull/6 +# via https://github.com/rust-lang/rust/pull/33988 +# (but eventually we should ditch this bundled hoedown) +Patch3: rust-hoedown-pr6-misleading-indentation.patch + +BuildRequires: make +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: llvm-devel +BuildRequires: zlib-devel +BuildRequires: python2 +BuildRequires: curl + +%if %without bootstrap +%if %with rebuild +BuildRequires: %{name} < %{version}-%{release} +BuildRequires: %{name} >= %{version} +%else +BuildRequires: %{name} < %{version} +BuildRequires: %{name} >= %{bootstrap_channel} +%endif +%endif + +# make check: src/test/run-pass/wait-forked-but-failed-child.rs +BuildRequires: /usr/bin/ps + +# TODO: work on unbundling these! +Provides: bundled(compiler-rt) = 3.8 +Provides: bundled(hoedown) = 3.0.5 +Provides: bundled(jquery) = 2.1.4 +Provides: bundled(libbacktrace) = 6.1.0 +Provides: bundled(miniz) = 1.14 + +# 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: gcc + +# ALL Rust libraries are private, because they don't keep an ABI. +%global _privatelibs lib.*-[[:xdigit:]]{8}[.]so.* +%global __provides_exclude ^(%{_privatelibs})$ +%global __requires_exclude ^(%{_privatelibs})$ + +%description +Rust is a systems programming language that runs blazingly fast, prevents +segfaults, and guarantees thread safety. + +This package includes the Rust compiler, standard library, and documentation +generator. + + +%package gdb +Summary: GDB pretty printers for Rust +BuildArch: noarch +Requires: gdb + +%description gdb +This package includes the rust-gdb script, which allows easier debugging of Rust +programs. + + +%package doc +Summary: Documentation for Rust +BuildArch: noarch +# Note, while docs are mostly noarch, some things do vary by target_arch. +# These are few though, so for now we won't worry about it. FWIW, upstream's +# doc.rust-lang.org is only generated on Linux x86_64. + +%description doc +This package includes HTML documentation for the Rust programming language and +its standard library. + + +# TODO: consider a rust-std package containing .../rustlib/$target +# This might allow multilib cross-compilation to work naturally. + + +%prep +%setup -q -n %{rustc_package} + +%patch1 -p1 -b .rebuild +%patch2 -p1 -b .miniz-indent +%patch3 -p1 -d src/rt/hoedown/ -b .hoedown-indent + +# unbundle +rm -rf src/llvm/ src/jemalloc/ + +# extract bundled licenses for packaging +cp src/rt/hoedown/LICENSE src/rt/hoedown/LICENSE-hoedown +sed -e '/*\//q' src/libbacktrace/backtrace.h \ + >src/libbacktrace/LICENSE-libbacktrace + +# rust-gdb has hardcoded SYSROOT/lib -- let's make it noarch +sed -i.noarch -e 's#DIRECTORY=".*"#DIRECTORY="%{_datadir}/%{name}/etc"#' \ + src/etc/rust-gdb + +# These tests assume that alloc_jemalloc is present +sed -i.jemalloc -e '1i // ignore-test jemalloc is disabled' \ + src/test/compile-fail/allocator-dylib-is-system.rs \ + src/test/compile-fail/allocator-rust-dylib-is-jemalloc.rs \ + src/test/run-pass/allocator-default.rs + +# Fedora's LLVM doesn't support any mips targets -- see "llc -version" +sed -i.nomips -e '/target=mips/,+1s/^/# unsupported /' \ + src/test/run-make/atomic-lock-free/Makefile + +%if %without bootstrap +# The hardcoded stage0 "lib" is inappropriate when using Fedora's own rustc +sed -i.libdir -e '/^HLIB_RELATIVE/s/lib$/$$(CFG_LIBDIR_RELATIVE)/' mk/main.mk +%endif + +%if %with bootstrap +mkdir -p dl/ +cp -t dl/ %{SOURCE1} %{SOURCE2} # %{SOURCE3} %{SOURCE4} +%endif + + +%build +%configure --disable-option-checking \ + --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \ + %{!?with_bootstrap:--enable-local-rust %{?with_rebuild:--enable-local-rebuild}} \ + --llvm-root=/usr --disable-codegen-tests \ + --disable-jemalloc \ + --disable-rpath \ + --enable-debuginfo \ + --release-channel=%{channel} +%make_build VERBOSE=1 + + +%install +%make_install VERBOSE=1 + +# Remove installer artifacts (manifests, uninstall scripts, etc.) +find %{buildroot}/%{_libdir}/rustlib/ -maxdepth 1 -type f -exec rm -v '{}' '+' + +# We don't want to ship the target shared libraries for lack of any Rust ABI. +find %{buildroot}/%{_libdir}/rustlib/ -type f -name '*.so' -exec rm -v '{}' '+' + +# The remaining shared libraries should be executable for debuginfo extraction. +find %{buildroot}/%{_libdir}/ -type f -name '*.so' -exec chmod -v +x '{}' '+' + +# 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-APACHE +rm -f %{buildroot}/%{_docdir}/%{name}/LICENSE-MIT + +# Sanitize the HTML documentation +find %{buildroot}/%{_docdir}/%{name}/html -empty -delete +find %{buildroot}/%{_docdir}/%{name}/html -type f -exec chmod -v -x '{}' '+' + +# Move rust-gdb's python scripts so they're noarch +mkdir -p %{buildroot}/%{_datadir}/%{name} +mv -v %{buildroot}/%{_libdir}/rustlib/etc %{buildroot}/%{_datadir}/%{name}/ + + +%check +# Note, many of the tests execute in parallel threads, +# so it's better not to use a parallel make here. +make check-lite VERBOSE=1 + + +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig + + +%files +%license COPYRIGHT LICENSE-APACHE LICENSE-MIT +%license src/libbacktrace/LICENSE-libbacktrace +%license src/rt/hoedown/LICENSE-hoedown +%doc README.md +%{_bindir}/rustc +%{_bindir}/rustdoc +%{_mandir}/man1/rustc.1* +%{_mandir}/man1/rustdoc.1* +%{_libdir}/lib* +%dir %{_libdir}/rustlib +%{_libdir}/rustlib/%{rust_triple} + + +%files gdb +%{_bindir}/rust-gdb +%{_datadir}/%{name} + + +%files doc +%dir %{_docdir}/%{name} +%license %{_docdir}/%{name}/html/FiraSans-LICENSE.txt +%license %{_docdir}/%{name}/html/Heuristica-LICENSE.txt +%license %{_docdir}/%{name}/html/LICENSE-APACHE.txt +%license %{_docdir}/%{name}/html/LICENSE-MIT.txt +%license %{_docdir}/%{name}/html/SourceCodePro-LICENSE.txt +%license %{_docdir}/%{name}/html/SourceSerifPro-LICENSE.txt +%doc %{_docdir}/%{name}/html/ + + +%changelog +* Thu Aug 11 2016 Josh Stone - 1.10.0-3 +- Initial import into Fedora (#1356907), bootstrapped +- Format license text as suggested in review. +- Make -doc noarch for now, despite small variations. +- Note how the tests already run in parallel. +- Undefine _include_minidebuginfo, because it duplicates ".note.rustc". + +* Tue Jul 26 2016 Josh Stone - 1.10.0-2 +- Update -doc directory ownership, and mark its licenses. +- Package and declare licenses for libbacktrace and hoedown. +- Set bootstrap_base as a global. +- Explicitly require python2. + +* Thu Jul 14 2016 Josh Stone - 1.10.0-1 +- Initial package, bootstrapped diff --git a/sources b/sources index e69de29..5dbb32c 100644 --- a/sources +++ b/sources @@ -0,0 +1,3 @@ +a48fef30353fc9daa70b484b690ce5db rustc-1.10.0-src.tar.gz +287d0f4838afa56abfab6be0805cf07a rustc-1.9.0-i686-unknown-linux-gnu.tar.gz +f1cf6d2fe15e4be18a08259f1540a4ae rustc-1.9.0-x86_64-unknown-linux-gnu.tar.gz