# Contributor: Rasmus Thomsen # Contributor: Jakub Jirutka # Contributor: Shiz # Contributor: Jeizsm # Maintainer: Rasmus Thomsen pkgname=rust pkgver=1.36.0 _llvmver=8 _bootver=1.35.0 pkgrel=0 pkgdesc="The Rust Programming Language" url="https://www.rust-lang.org" arch="x86_64 armv7 armhf" license="Apache-2.0 AND MIT" # gcc is needed at runtime just for linking. Someday rustc might invoke # the linker directly, and then we'll only need binutils. # See: https://github.com/rust-lang/rust/issues/11937 depends="$pkgname-stdlib=$pkgver-r$pkgrel gcc llvm-libunwind-dev musl-dev" # * Rust is self-hosted, so you need rustc (and cargo) to build rustc... # The last revision of this abuild that does not depend on itself (uses # prebuilt rustc and cargo) is 8cb3112594f10a8cee5b5412c28a846acb63167f. makedepends=" cmake curl-dev file libgit2-dev openssl-dev llvm$_llvmver-dev llvm$_llvmver-test-utils python2 tar zlib-dev coreutils rust-bootstrap=>$_bootver cargo-bootstrap " # XXX: This is a hack to allow this abuild to depend on itself. Adding "rust" # to makedepends would not work, because abuild implicitly removes $pkgname # and $subpackages from the abuild's dependencies. provides="rust-bootstrap=$pkgver-r$pkgrel" # This is needed for -src that contains some testing binaries. # Disable tests for now, while we use foreign triplets options="!archcheck !check" subpackages=" $pkgname-dbg $pkgname-stdlib $pkgname-analysis $pkgname-gdb::noarch $pkgname-lldb::noarch $pkgname-doc $pkgname-src::noarch cargo cargo-bash-completions:_cargo_bashcomp:noarch cargo-zsh-completion:_cargo_zshcomp:noarch cargo-doc:_cargo_doc:noarch " source="https://static.rust-lang.org/dist/rustc-$pkgver-src.tar.gz https://exp.exqa.de/alpine-rust/rust-aarch64-$_bootver.tar.xz musl-fix-static-linking.patch musl-fix-linux_musl_base.patch static-pie.patch need-rpath.patch minimize-rpath.patch alpine-move-py-scripts-to-share.patch alpine-change-rpath-to-rustlib.patch alpine-target.patch install-template-shebang.patch cargo-tests-ignore-resolving_minimum_version_with_transitive_deps.patch check-rustc cargo-skip-broken-tests.patch link-musl-dynamically.patch musl-dont-use-crt-static.patch " builddir="$srcdir/rustc-$pkgver-src" # We have to add new arches in multiple steps: # 1. Compile with the upstream triplets, compiling alpine's triplets in # 2. Compile again, now with our triplets selected as build/target, now that # rustc knows about them case "$CARCH" in armv7) _build="armv7-unknown-linux-musleabihf" _target="$_build" ;; armhf) _build="arm-unknown-linux-musleabihf" _target="$_build" ;; ppc64le) _build="powerpc64le-unknown-linux-musl" _target="$_build" ;; aarch64) export LD_LIBRARY_PATH="$srcdir/rust-aarch64/usr/lib" export PATH="$srcdir/rust-aarch64/usr/bin:$PATH" _build="aarch64-unknown-linux-musl" _target="$_build" ;; *) _build="$CBUILD" _target="$CTARGET" esac _rlibdir="usr/lib/rustlib/$_target/lib" _sharedir="usr/share/rust" ldpath="/$_rlibdir" export RUST_BACKTRACE=1 # Convince libgit2-sys to use the distro libgit2. export LIBGIT2_SYS_USE_PKG_CONFIG=1 # rust checksums files in vendor/, but we have to patch a few files... _clear_vendor_checksums() { sed -i 's/\("files":{\)[^}]*/\1/' vendor/$1/.cargo-checksum.json } prepare() { default_prepare sed -i /LD_LIBRARY_PATH/d src/bootstrap/bootstrap.py # to dynamically link against musl _clear_vendor_checksums libc # Remove bundled dependencies. rm -Rf src/llvm/ } build() { # Fails to compile libbacktrace-sys otherwise case "$CARCH" in x86) export CFLAGS="$CFLAGS -fno-stack-protector" ;; esac ./configure \ --build=${_build} \ --host=${_target} \ --target=${_target} \ --prefix="/usr" \ --release-channel="stable" \ --enable-local-rust \ --local-rust-root="/usr" \ --llvm-root="/usr/lib/llvm$_llvmver" \ --musl-root="/usr" \ --disable-docs \ --enable-extended \ --tools="analysis,cargo,src" \ --enable-llvm-link-shared \ --enable-option-checking \ --enable-locked-deps \ --enable-vendor \ --disable-full-bootstrap ./x.py build --jobs ${JOBS:-2} } check() { # At this moment lib/rustlib/$CTARGET/lib does not contain a complete # copy of the .so libs from lib (they will be copied there during # 'x.py install'). Thus we must set LD_LIBRARY_PATH for tests to work. # This is related to change-rpath-to-rustlib.patch. export LD_LIBRARY_PATH="$builddir/build/$CTARGET/stage2/lib" "$srcdir"/check-rustc "$builddir"/build/$CTARGET/stage2/bin/rustc # XXX: There's some problem with these tests, we will figure it out later. # make check \ # LD_LIBRARY_PATH="$_stage0dir/lib" \ # VERBOSE=1 msg "Running tests for cargo..." CFG_DISABLE_CROSS_TESTS=1 ./x.py test --no-fail-fast src/tools/cargo unset LD_LIBRARY_PATH } package() { DESTDIR="$pkgdir" ./x.py install -v cd "$pkgdir" # These libraries are identical to those under rustlib/. Since we have # linked rustc/rustdoc against those under rustlib/, we can remove # them. Read change-rpath-to-rustlib.patch for more info. rm -r usr/lib/*.so # Shared objects should have executable flag. chmod +x $_rlibdir/*.so # Python scripts are noarch, so move them to /usr/share. # Requires move-py-scripts-to-share.patch to be applied. _mv usr/lib/rustlib/etc/*.py $_sharedir/etc/ rmdir -p usr/lib/rustlib/etc 2>/dev/null || true # Remove some clutter. cd usr/lib/rustlib rm components install.log manifest-* rust-installer-version uninstall.sh } stdlib() { pkgdesc="Standard library for Rust (static rlibs)" _mv "$pkgdir"/$_rlibdir/*.rlib "$subpkgdir"/$_rlibdir/ } analysis() { pkgdesc="Compiler analysis data for the Rust standard library" depends="$pkgname-stdlib=$pkgver-r$pkgrel" _mv "$pkgdir"/$_rlibdir/../analysis "$subpkgdir"/${_rlibdir%/*}/ } gdb() { pkgdesc="GDB pretty printers for Rust" depends="$pkgname gdb" mkdir -p "$subpkgdir" cd "$subpkgdir" _mv "$pkgdir"/usr/bin/rust-gdb usr/bin/ _mv "$pkgdir"/$_sharedir/etc/gdb_*.py $_sharedir/etc/ } lldb() { pkgdesc="LLDB pretty printers for Rust" depends="$pkgname lldb py2-lldb" mkdir -p "$subpkgdir" cd "$subpkgdir" _mv "$pkgdir"/usr/bin/rust-lldb usr/bin/ _mv "$pkgdir"/$_sharedir/etc/lldb_*.py $_sharedir/etc/ } src() { pkgdesc="$pkgdesc (source code)" depends="$pkgname" license="$license OFL-1.1 GPL-3.0-or-later GPL-3.0-with-GCC-exception CC-BY-SA-3.0 LGPL-3.0" _mv "$pkgdir"/usr/lib/rustlib/src/rust "$subpkgdir"/usr/src/ rmdir -p "$pkgdir"/usr/lib/rustlib/src 2>/dev/null || true mkdir -p "$subpkgdir"/usr/lib/rustlib/src ln -s ../../../src/rust "$subpkgdir"/usr/lib/rustlib/src/rust } cargo() { pkgdesc="The Rust package manager" license="Apache-2.0 MIT UNLICENSE" depends="$pkgname" # XXX: See comment on top-level provides=. provides="cargo-bootstrap=$pkgver-r$pkgrel" _mv "$pkgdir"/usr/bin/cargo "$subpkgdir"/usr/bin/ } _cargo_bashcomp() { pkgdesc="Bash completions for cargo" license="Apache-2.0 MIT" depends="" install_if="cargo=$pkgver-r$pkgrel bash-completion" cd "$pkgdir" _mv etc/bash_completion.d/cargo \ "$subpkgdir"/usr/share/bash-completion/completions/ rmdir -p etc/bash_completion.d 2>/dev/null || true } _cargo_zshcomp() { pkgdesc="ZSH completions for cargo" license="Apache-2.0 MIT" depends="" install_if="cargo=$pkgver-r$pkgrel zsh" cd "$pkgdir" _mv usr/share/zsh/site-functions/_cargo \ "$subpkgdir"/usr/share/zsh/site-functions/_cargo rmdir -p usr/share/zsh/site-functions 2>/dev/null || true } _cargo_doc() { pkgdesc="The Rust package manager (documentation)" license="Apache-2.0 MIT" install_if="docs cargo=$pkgver-r$pkgrel" # XXX: This is hackish! cd "$pkgdir"/../$pkgname-doc _mv usr/share/man/man1/cargo* "$subpkgdir"/usr/share/man/man1/ } _mv() { local dest; for dest; do true; done # get last argument mkdir -p "$dest" mv "$@" } sha512sums="f0bd470a98d2b044c2af40d0c19838c3f7410c4acea5b2f8b5bcf0ca8294917986e7e5aed7d00ea5520e8b03d7130f993e75125576c693ba571feae0d0b961e9 rustc-1.36.0-src.tar.gz e22bccc770715aaf2a42ea2a09ef24df4f7939f2bdd529538a570db817dcd43e8f7e2ac45412970f1e2aed754d84043a950357e5045172ac64f3aca1c1e86f98 rust-aarch64-1.35.0.tar.xz f5aa0124618acc0176dc30b2fab6d15327c1978db55ccf2074d1db88e0a1bbdaebc0bcdcfd5a8554964edb51be9830c6db64bc99f237463488a45c9804170a4e musl-fix-static-linking.patch a2871fa75fb63570031eda80390461a137fe31ba82bf253caeabf3fb6673b4c80b535917dde139a300fb6d5f8c14fe09c8f7aaf4a506ef5e837540cf00aaa977 musl-fix-linux_musl_base.patch 97e81c57af93df550577f41d795185a9eb0c37528776c250076cc57f06c87e81139eb71cd6b6a4730528511821ae50c304d7deb534d6422cd08bb44193ae605d static-pie.patch d4659b56dbf1218da98b995a0a89a8cfd069dd94b3e9aef4aee987484d96fc8b92f6d695ea4123eff26711961f2db2f7324bf5b4043f41722cd89581aac97f1c need-rpath.patch 7c190c0d47934d91605f89ec2caef597477b154f59e66e032b986cfc2e1db4e5b3fc5cdc1f0178f064b4ac314f692569533a45640b1578aadead9fa6ab999f73 minimize-rpath.patch 35e0619672843d9dd41df4a086404a59b57c12fa014e42d06102bc3856a96ed021e716f9d581ec5c89444acbaedd3edcd2b8a85576df3bb4451c0edde3afbba5 alpine-move-py-scripts-to-share.patch 4f5746acb08c18f749691a8455cc81ea2e9a361621790b006b884c9c895ab9e51a001b6638bed071a9af5c232ed8d1b43c58260839a3f6dce4eec3f495ce4348 alpine-change-rpath-to-rustlib.patch 4d4262efd3b679722070268e2d054c433d395200797bb0b45dbf73580d6fe0784b56a3462154a6ada28cd2bb1396dea15516b1e7262e6901feaa8a8ae7ebbb18 alpine-target.patch 7d59258d4462eba0207739a5c0c8baf1f19d9a396e5547bb4d59d700eb94d50ba6add2e523f3e94e29e993821018594625ea4ac86304fb58f7f8c82622a26ab0 install-template-shebang.patch 3d6f027088e1ec189ce864bf5ed150ccad8be5d9fc0973f1b4d202eec6eab865834403335a9f0765bbfa54638aed7f5d5f2183ba9dfeab9f5bc4ef48111a8427 cargo-tests-ignore-resolving_minimum_version_with_transitive_deps.patch c31fdfe8a9b3411576c75da46645cf0465b9053000a2ab49cf9b2f2733f679d6d33acbf236d67a20e14935d094a685453b7f1840180249f39d610fd0902c3125 check-rustc afca9b5524e270b6ddad4b2c99bba9a5f156a2411b04a9ca5802b185b50420de70555bb2526dcb4d5b12b29ff30afa2fe461d1de83b5345dd8e4ccf52e875c3f cargo-skip-broken-tests.patch 78484210917af128a0fa1cfd762b937e2ff047764829e4ba5a10c1f4589bfb2420bf183b039ef88d8d9a2a60e5e150b7e1cd7e7aa1b1154baa2034d485a8a3bf link-musl-dynamically.patch 795194976763326c5e4a9eefc8b651b6d5fb533d2d000631ed48a92bafac90e9ca33b8d662e6c53ef109ea1a90c69def715d7d7154e3f9fb9035a58a313a7db3 musl-dont-use-crt-static.patch"