From daaabd8ee20406533b88fb272e342409ba51190d Mon Sep 17 00:00:00 2001 From: Patrick J Volkerding Date: Fri, 4 Oct 2019 21:35:49 +0000 Subject: Fri Oct 4 21:35:49 UTC 2019 a/pkgtools-15.0-noarch-24.txz: Rebuilt. installpkg: support --no-overwrite option for upgradepkg's second install pass. Don't use this option directly unless you have a good reason. upgradepkg: call installpkg with --no-overwrite for the second install pass. This cuts the drive writes for a package upgrade almost in half so we can be kinder to SSDs. ap/nano-4.5-x86_64-1.txz: Upgraded. l/gmime-3.2.4-x86_64-1.txz: Upgraded. l/gnu-efi-3.0.10-x86_64-1.txz: Upgraded. l/gtk+3-3.24.12-x86_64-1.txz: Upgraded. testing/packages/rust-1.38.0-x86_64-2.txz: Rebuilt. The package size here has been put on a tremendous diet. Thanks to Andrew Clemons and Willy Sudiarto Raharjo for help with this. Compile test results: firefox-68.1.0esr: fail firefox-69.0.2: pass seamonkey-2.49.5: pass thunderbird-68.1.1: fail --- .../0001-WIP-minimize-the-rust-std-component.patch | 74 +++++ testing/source/rust/link_libffi.diff | 12 + testing/source/rust/rust.SlackBuild | 303 +++++++++++++++++++++ testing/source/rust/rust.url | 23 ++ testing/source/rust/slack-desc | 19 ++ 5 files changed, 431 insertions(+) create mode 100644 testing/source/rust/0001-WIP-minimize-the-rust-std-component.patch create mode 100644 testing/source/rust/link_libffi.diff create mode 100755 testing/source/rust/rust.SlackBuild create mode 100644 testing/source/rust/rust.url create mode 100644 testing/source/rust/slack-desc (limited to 'testing') diff --git a/testing/source/rust/0001-WIP-minimize-the-rust-std-component.patch b/testing/source/rust/0001-WIP-minimize-the-rust-std-component.patch new file mode 100644 index 000000000..04be717a3 --- /dev/null +++ b/testing/source/rust/0001-WIP-minimize-the-rust-std-component.patch @@ -0,0 +1,74 @@ +From 2bf05f208272cd58c57f4d7d8d0e10fdb22e8719 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Fri, 27 Sep 2019 12:33:08 -0700 +Subject: [PATCH] [WIP] minimize the rust-std component + +--- + src/bootstrap/dist.rs | 45 +++++++++++++++---------------------------- + 1 file changed, 16 insertions(+), 29 deletions(-) + +diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs +index 552965863d10..76fbd07f9fb5 100644 +--- a/src/bootstrap/dist.rs ++++ b/src/bootstrap/dist.rs +@@ -667,41 +667,28 @@ impl Step for Std { + return distdir(builder).join(format!("{}-{}.tar.gz", name, target)); + } + +- // We want to package up as many target libraries as possible +- // for the `rust-std` package, so if this is a host target we +- // depend on librustc and otherwise we just depend on libtest. +- if builder.hosts.iter().any(|t| t == target) { +- builder.ensure(compile::Rustc { compiler, target }); +- } else { +- if builder.no_std(target) == Some(true) { +- // the `test` doesn't compile for no-std targets +- builder.ensure(compile::Std { compiler, target }); +- } else { +- builder.ensure(compile::Test { compiler, target }); +- } +- } ++ builder.ensure(compile::Std { compiler, target }); ++ builder.ensure(compile::Test { compiler, target }); + + let image = tmpdir(builder).join(format!("{}-{}-image", name, target)); + let _ = fs::remove_dir_all(&image); + +- let dst = image.join("lib/rustlib").join(target); ++ let dst = image.join("lib/rustlib").join(target).join("lib"); + t!(fs::create_dir_all(&dst)); +- let mut src = builder.sysroot_libdir(compiler, target).to_path_buf(); +- src.pop(); // Remove the trailing /lib folder from the sysroot_libdir +- builder.cp_filtered(&src, &dst, &|path| { +- if let Some(name) = path.file_name().and_then(|s| s.to_str()) { +- if name == builder.config.rust_codegen_backends_dir.as_str() { +- return false +- } +- if name == "bin" { +- return false +- } +- if name.contains("LLVM") { +- return false +- } ++ ++ let compiler_to_use = builder.compiler_for(compiler.stage, compiler.host, target); ++ let stamp = dbg!(compile::libstd_stamp(builder, compiler_to_use, target)); ++ for (path, host) in builder.read_stamp_file(&stamp) { ++ if !host { ++ builder.copy(&path, &dst.join(path.file_name().unwrap())); + } +- true +- }); ++ } ++ let stamp = dbg!(compile::libtest_stamp(builder, compiler_to_use, target)); ++ for (path, host) in builder.read_stamp_file(&stamp) { ++ if !host { ++ builder.copy(&path, &dst.join(path.file_name().unwrap())); ++ } ++ } + + let mut cmd = rust_installer(builder); + cmd.arg("generate") +-- +2.21.0 + diff --git a/testing/source/rust/link_libffi.diff b/testing/source/rust/link_libffi.diff new file mode 100644 index 000000000..38e0113e9 --- /dev/null +++ b/testing/source/rust/link_libffi.diff @@ -0,0 +1,12 @@ +diff -Naur rustc-1.21.0-src.bak/src/librustc_llvm/build.rs rustc-1.21.0-src/src/librustc_llvm/build.rs +--- rustc-1.21.0-src.bak/src/librustc_llvm/build.rs 2017-10-10 09:04:51.000000000 +1300 ++++ rustc-1.21.0-src/src/librustc_llvm/build.rs 2017-10-14 15:28:56.761081727 +1300 +@@ -221,6 +221,8 @@ + println!("cargo:rustc-link-lib={}={}", kind, name); + } + ++ println!("cargo:rustc-link-lib=dylib=ffi"); ++ + // LLVM ldflags + // + // If we're a cross-compile of LLVM then unfortunately we can't trust these diff --git a/testing/source/rust/rust.SlackBuild b/testing/source/rust/rust.SlackBuild new file mode 100755 index 000000000..b76374cf7 --- /dev/null +++ b/testing/source/rust/rust.SlackBuild @@ -0,0 +1,303 @@ +#!/bin/bash + +# Copyright 2017 Andrew Clemons, Wellington, New Zealand +# Copyright 2017, 2018, 2019 Patrick J. Volkerding, Sebeka, Minnesota, USA +# Copyright 2017 Stuart Winter +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +cd $(dirname $0) ; CWD=$(pwd) + +PKGNAM=rust +SRCNAM="${PKGNAM}c" +VERSION=${VERSION:-1.38.0} +BUILD=${BUILD:-2} + +# Set this to YES to build with the system LLVM, or NO to use the bundled LLVM. +# YES is probably better (when it works...) +SYSTEM_LLVM=${SYSTEM_LLVM:-YES} + +# Bootstrap variables (might not be kept updated for latest Rust): +RSTAGE0_VERSION=${RSTAGE0_VERSION:-1.37.0} +RSTAGE0_DIR=${RSTAGE0_DIR:-2019-08-15} +CSTAGE0_VERSION=${CSTAGE0_VERSION:-0.38.0} +CSTAGE0_DIR=${CSTAGE0_DIR:-$RSTAGE0_DIR} + +# Automatically determine the architecture we're building on: +MARCH=$( uname -m ) +if [ -z "$ARCH" ]; then + case "$MARCH" in + i?86) export ARCH=i686 ;; + armv7hl) export ARCH=$MARCH ;; + arm*) export ARCH=arm ;; + # Unless $ARCH is already set, use uname -m for all other archs: + *) export ARCH=$MARCH ;; + esac +fi +unset MARCH + +# For compiling i686 under an x86_64 kernel: +if [ "$(uname -m)" = "x86_64" -a "$(file -L /usr/bin/gcc | grep 80386 | grep 32-bit)" != "" ]; then + ARCH=i686 +fi + +# If the variable PRINT_PACKAGE_NAME is set, then this script will report what +# the name of the created package would be, and then exit. This information +# could be useful to other scripts. +if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then + echo "$PKGNAM-$VERSION-$ARCH-$BUILD.txz" + exit 0 +fi + +# if you already have rust and cargo installed, you can bootstrap from the +# previous version. +if [ "$LOCAL_BOOTSTRAP" = "" ] && [ -x /usr/bin/cargo ] && [ -x /usr/bin/rustc ] ; then + LOCAL_BOOTSTRAP=yes +fi + +# https://forge.rust-lang.org/platform-support.html +# Bootstrapping ARCH: +if [ "$ARCH" = "i586" ]; then + if [ "$LOCAL_BOOTSTRAP" = "yes" ] ; then + if rustc -Vv | grep host | grep i586 > /dev/null ; then + BARCH="$ARCH" + else + BARCH="i686" + + if case "$( uname -m )" in i586) true ;; *) false ;; esac ; then + echo "rust must be bootstrapped from an i686 machine" + exit 1 + fi + fi + else + # i586 must be built on a i686 machine, since the bootstrap compiler is i686 + BARCH="i686" + + if case "$( uname -m )" in i586) true ;; *) false ;; esac ; then + echo "rust must be bootstrapped from an i686 machine" + exit 1 + fi + fi + + TARCH="$ARCH" +elif [ "$ARCH" = "armv7hl" ]; then + BARCH="armv7" + TARCH="$BARCH" +else + BARCH="$ARCH" + TARCH="$ARCH" +fi + +# Bootstrapping ABI: +if [ "$ARCH" = "armv7hl" ]; then + BABI="gnueabihf" +else + BABI="gnu" +fi + +TMP=${TMP:-/tmp} +OUTPUT=${OUTPUT:-/tmp} +PKG=$TMP/package-$PKGNAM + +# Not needed, as the build will automatically use as many jobs as there are +# cores. +#NUMJOBS=${NUMJOBS:-" -j$(expr $(nproc) + 1) "} + +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +elif [ "$ARCH" = "armv7hl" ]; then + SLKCFLAGS="" + LIBDIRSUFFIX="" +else + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +fi + +rm -rf $PKG +mkdir -p $TMP $PKG $OUTPUT +cd $TMP +rm -rf $SRCNAM-$VERSION-src +tar xvf $CWD/$SRCNAM-$VERSION-src.tar.?z || exit 1 +cd $SRCNAM-$VERSION-src || exit 1 + +# Link with -lffi in case of using system LLVM: +if [ "${SYSTEM_LLVM}" = "YES" ]; then + zcat $CWD/link_libffi.diff.gz | patch -p1 --verbose || exit 1 +fi + +# Try to debloat the build: +zcat $CWD/0001-WIP-minimize-the-rust-std-component.patch.gz | patch -p1 --verbose || exit 1 + +if [ "$LOCAL_BOOTSTRAP" != "yes" ] ; then + # rust requires bootstrapping with the previous rust version. + # versions are defined in src/stage0.txt. + mkdir -p build/cache/$RSTAGE0_DIR + cp $CWD/$PKGNAM-std-$RSTAGE0_VERSION-$BARCH-unknown-linux-gnu.tar.?z \ + $CWD/$SRCNAM-$RSTAGE0_VERSION-$BARCH-unknown-linux-gnu.tar.?z \ + build/cache/$RSTAGE0_DIR + mkdir -p build/cache/$CSTAGE0_DIR + cp $CWD/cargo-$CSTAGE0_VERSION-$BARCH-unknown-linux-gnu.tar.?z build/cache/$CSTAGE0_DIR +fi + +# Build configuration. We'll go ahead and build with rpath because it may be +# needed during the build, and then we'll strip the rpaths out of the +# binaries later. +cat << EOF > config.toml +[llvm] +ccache = "/usr/bin/ccache" +link-shared = true + +[build] +build = "$BARCH-unknown-linux-$BABI" +host = ["$TARCH-unknown-linux-$BABI"] +target = ["$TARCH-unknown-linux-$BABI"] +submodules = false +vendor = true +extended = true + +[install] +prefix = "/usr" +docdir = "doc/rust-$VERSION" +libdir = "lib$LIBDIRSUFFIX" +mandir = "man" + +[rust] +codegen-units = 0 +channel = "stable" +rpath = true +codegen-tests = false +ignore-git = true + +EOF + +if [ "${SYSTEM_LLVM}" = "YES" ]; then + cat << EOF >> config.toml +# Add this stuff to build with the system LLVM: +[target.i586-unknown-linux-gnu] +llvm-config = "/usr/bin/llvm-config" + +[target.i686-unknown-linux-gnu] +llvm-config = "/usr/bin/llvm-config" + +[target.x86_64-unknown-linux-gnu] +llvm-config = "/usr/bin/llvm-config" + +[target.armv7-unknown-linux-gnueabihf] +llvm-config = "/usr/bin/llvm-config" +EOF +fi + +if [ "$LOCAL_BOOTSTRAP" = "yes" ] ; then + sed -i "s|^\(extended = true\)$|\1\nrustc = \"/usr/bin/rustc\"\ncargo = \"/usr/bin/cargo\"|" config.toml +fi + +chown -R root:root . +find -L . \ + \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ + -o -perm 511 \) -exec chmod 755 {} \+ -o \ + \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ + -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+ + +export PKG_CONFIG_ALLOW_CROSS=1 + +if [ "$BARCH" = "i586" ] ; then + # when bootstrapping from i586 (rust already installed), also build a i686 + # rustlib: + sed -i 's/^target =.*$/target = ["i686-unknown-linux-gnu"]/' config.toml +elif [ "$BARCH" = "i686" ] ; then + if [ "$TARCH" = "i586" ] ; then + # this will cause some messages like: + # warning: redundant linker flag specified for library `m` + # but will keep the build from falling over when doing the stage1 compiler + # linking for the i586 compiler. seems the correct flags don't get passed + # through and we end up failures like: + # error: linking with `clang` failed: exit code: 1 + # /tmp/SBo/rustc-1.20.0-src/build/i686-unknown-linux-gnu/stage1-rustc/i586-unknown-linux-gnu/release/deps/librustc_llvm-4ab259c9aed547db.so: undefined reference to `xxx` + export RUSTFLAGS="$RUSTFLAGS -C link-args=-lrt -ldl -lcurses -lpthread -lz -lm" + fi +fi + +if [ "$ARCH" = "armv7hl" ] ; then + python x.py dist +else + # README.md says gcc 4.7 / clang 3.x or later needed + # but building fails for me with GCC 5.3 from slackware 14.2 + export CC=clang + export CXX=clang++ + CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + python x.py dist || exit 1 +fi + +DESTDIR=$PKG python x.py install || exit 1 + +# Eh, none of this is all that big. Might as well leave it around as a +# reference. +#rm -f $PKG/usr/lib$LIBDIRSUFFIX/rustlib/components +#rm -f $PKG/usr/lib$LIBDIRSUFFIX/rustlib/install.log +#rm -f $PKG/usr/lib$LIBDIRSUFFIX/rustlib/manifest-* +#rm -f $PKG/usr/lib$LIBDIRSUFFIX/rustlib/rust-installer-version +#rm -f $PKG/usr/lib$LIBDIRSUFFIX/rustlib/uninstall.sh +# Make sure the paths are correct, though: +sed -i "s,/tmp/package-rust/,/,g" $PKG/usr/lib$LIBDIRSUFFIX/rustlib/install.log $PKG/usr/lib$LIBDIRSUFFIX/rustlib/manifest-* +# And a little compression doesn't hurt either: +gzip -9 $PKG/usr/lib$LIBDIRSUFFIX/rustlib/manifest-* + +# Correct permissions on shared libraries: +find $PKG/usr/lib$LIBDIRSUFFIX -name "*.so" -exec chmod 755 "{}" \+ + +# Evidently there are a lot of duplicated libraries in this tree, so let's +# try to save some space: +( cd $PKG/usr/lib${LIBDIRSUFFIX}/rustlib/*-linux-gnu/lib && for file in *.so ; do if cmp -s $file ../../../$file ; then ln -sf ../../../$file .; fi; done ) + +# Strip ELF objects: +find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true + +# Remove any compiled-in RPATHs: +find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | while read elfobject ; do + patchelf --remove-rpath $elfobject || exit 1 +done + +# Compress man pages: +find $PKG/usr/man -type f -exec gzip -9 {} \+ +for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done + +# Add some documentation: +mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION +cp -a *.md COPYRIGHT* COPYING* LICENSE* $PKG/usr/doc/$PKGNAM-$VERSION +# Include licenses from third party vendors: +mkdir $PKG/usr/doc/$PKGNAM-$VERSION/vendor +( cd src/vendor + tar cf - $(find . -maxdepth 2 | grep -e README -e LICENSE -e COPYING -e CHANGELOG -e PERFORMANCE -e UPGRADE ) | ( cd $PKG/usr/doc/$PKGNAM-$VERSION/vendor ; tar xf - ) +) + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $OUTPUT/$PKGNAM-$VERSION-$ARCH-$BUILD.txz diff --git a/testing/source/rust/rust.url b/testing/source/rust/rust.url new file mode 100644 index 000000000..560589366 --- /dev/null +++ b/testing/source/rust/rust.url @@ -0,0 +1,23 @@ +# Source code (repacked to .tar.xz): +lftpget https://static.rust-lang.org/dist/rustc-1.38.0-src.tar.gz +gzip -d rustc-*tar.gz +plzip -9 -v rustc-*tar + +# Please note that the bootstrap binary packages listed below might not be kept +# updated for later versions. The Rust compiler as shipped with Slackware +# should be able to compile the next released version of Rust. +# +# To find the expected date/versions for bootstrap binaries to be able to +# update the urls below, look at src/stage0.txt in the Rust sources. +exit 0 + +# i686 bootstrap: +lftpget https://static.rust-lang.org/dist/2019-08-15/cargo-0.38.0-i686-unknown-linux-gnu.tar.gz +lftpget https://static.rust-lang.org/dist/2019-08-15/rust-std-1.37.0-i686-unknown-linux-gnu.tar.gz +lftpget https://static.rust-lang.org/dist/2019-08-15/rustc-1.37.0-i686-unknown-linux-gnu.tar.gz + +# x86_64 bootstrap: +lftpget https://static.rust-lang.org/dist/2019-08-15/cargo-0.38.0-x86_64-unknown-linux-gnu.tar.gz +lftpget https://static.rust-lang.org/dist/2019-08-15/rust-std-1.37.0-x86_64-unknown-linux-gnu.tar.gz +lftpget https://static.rust-lang.org/dist/2019-08-15/rustc-1.37.0-x86_64-unknown-linux-gnu.tar.gz + diff --git a/testing/source/rust/slack-desc b/testing/source/rust/slack-desc new file mode 100644 index 000000000..924b1907e --- /dev/null +++ b/testing/source/rust/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. +# Line up the first '|' above the ':' following the base package name, and +# the '|' on the right side marks the last column you can put a character in. +# You must make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':' except on otherwise blank lines. + + |-----handy-ruler------------------------------------------------------| +rust: rust (a safe, concurrent, practical language) +rust: +rust: Rust is a curly-brace, block-structured expression language. +rust: Its design is oriented toward concerns of "programming in the large", +rust: that is, of creating and maintaining boundaries - both abstract and +rust: operational - that preserve large-system integrity, availability, +rust: and concurrency. +rust: +rust: Homepage: https://rust-lang.org +rust: +rust: -- cgit v1.2.3