# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Contributor: Shiz <hi@shiz.me>
# Contributor: Jeizsm <jeizsm@gmail.com>
# Maintainer: Samuel Holland <samuel@sholland.org>
pkgname=rust
pkgver=1.37.0
_bootcargover=0.37.0
_bootver=1.36.0
_llvmver=8
pkgrel=0
pkgdesc="The Rust Programming Language"
url="https://www.rust-lang.org"
arch="all"
license="(Apache-2.0 OR MIT) AND (NCSA OR MIT) AND BSD-2-Clause AND BSD-3-Clause"
depends="$pkgname-stdlib=$pkgver-r$pkgrel gcc musl-dev"
makedepends="
	curl-dev
	libgit2-dev
	libssh2-dev
	llvm$_llvmver-dev
	llvm$_llvmver-test-utils
	openssl-dev
	python3
	zlib-dev
	"
provides="$pkgname-bootstrap=$pkgver-r$pkgrel"
subpackages="
	$pkgname-dbg
	$pkgname-stdlib
	$pkgname-analysis
	$pkgname-doc
	$pkgname-gdb::noarch
	$pkgname-lldb::noarch
	$pkgname-src::noarch
	cargo
	cargo-clippy:_cargo_clippy
	cargo-fmt:_cargo_fmt
	cargo-doc:_cargo_doc:noarch
	cargo-bash-completion:_cargo_bashcomp:noarch
	cargo-zsh-completion:_cargo_zshcomp:noarch
	miri
	rls
	rustfmt
	"
source="https://static.rust-lang.org/dist/rustc-$pkgver-src.tar.xz
	https://distfiles.adelielinux.org/source/rust/cargo-$_bootcargover-$CBUILD.tar.xz
	https://distfiles.adelielinux.org/source/rust/rust-std-$_bootver-$CBUILD.tar.xz
	https://distfiles.adelielinux.org/source/rust/rustc-$_bootver-$CBUILD.tar.xz
	0001-Don-t-pass-CFLAGS-to-the-C-compiler.patch
	0002-Fix-LLVM-build.patch
	0003-Allow-rustdoc-to-work-when-cross-compiling-on-musl.patch
	0004-Require-static-native-libraries-when-linking-static-.patch
	0005-Remove-nostdlib-and-musl_root-from-musl-targets.patch
	0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch
	0007-Fix-C-aggregate-passing-ABI-on-powerpc.patch
	0008-Fix-zero-sized-aggregate-ABI-on-powerpc.patch
	0009-compiletest-Match-suffixed-environments.patch
	0010-test-c-variadic-Fix-patterns-on-powerpc64.patch
	0011-test-use-extern-for-plugins-Don-t-assume-multilib.patch
	0012-test-sysroot-crates-are-unstable-Fix-test-when-rpath.patch
	0013-Ignore-broken-and-non-applicable-tests.patch
	0014-Link-stage-2-tools-dynamically-to-libstd.patch
	0015-Move-debugger-scripts-to-usr-share-rust.patch
	0016-Add-foxkit-target-specs.patch
	0030-libc-linkage.patch
	0031-typenum-pmmx.patch
	0040-rls-atomics.patch
	"
builddir="$srcdir/rustc-$pkgver-src"
_rlibdir="/usr/lib/rustlib/$CTARGET/lib"

prepare() {
	default_prepare

	$srcdir/cargo-$_bootcargover-$CBUILD/install.sh \
		--destdir=$srcdir/prebuilt \
		--prefix=/ \
		--disable-ldconfig
	$srcdir/rust-std-$_bootver-$CBUILD/install.sh \
		--destdir=$srcdir/prebuilt \
		--prefix=/ \
		--disable-ldconfig
	$srcdir/rustc-$_bootver-$CBUILD/install.sh \
		--destdir=$srcdir/prebuilt \
		--prefix=/ \
		--disable-ldconfig
}

build() {
	cat > config.toml <<- EOF
		[build]
		build = "$CBUILD"
		host = [ "$CHOST" ]
		target = [ "$CTARGET" ]
		cargo = "$srcdir/prebuilt/bin/cargo"
		rustc = "$srcdir/prebuilt/bin/rustc"
		submodules = false
		python = "python3"
		locked-deps = true
		vendor = true
		extended = true
		tools = [ "analysis", "cargo", "clippy", "rls", "rustfmt", "src" ]
		[install]
		prefix = "/usr"
		[rust]
		codegen-units = 1
		codegen-units-std = 1
		debug-assertions = false
		debuginfo-level = 2
		debuginfo-level-rustc = 0
		debuginfo-level-tests = 0
		backtrace = true
		incremental = false
		parallel-compiler = false
		channel = "stable"
		rpath = false
		verbose-tests = true
		dist-src = false
		jemalloc = false
		llvm-libunwind = false
		[target.$CTARGET]
		cc = "$CTARGET-gcc"
		cxx = "$CTARGET-g++"
		linker = "$CTARGET-gcc"
		llvm-config = "/usr/lib/llvm$_llvmver/bin/llvm-config"
		crt-static = false
		[dist]
		src-tarball = false
	EOF

	LIBGIT2_SYS_USE_PKG_CONFIG=1 \
	LLVM_LINK_SHARED=1 \
	RUST_BACKTRACE=1 \
	python3 x.py dist -j ${JOBS:-2}
}

check() {
	LIBGIT2_SYS_USE_PKG_CONFIG=1 \
	LLVM_LINK_SHARED=1 \
	RUST_BACKTRACE=1 \
	python3 x.py test -j ${JOBS:-2} --no-doc --no-fail-fast \
		src/test/codegen \
		src/test/codegen-units \
		src/test/compile-fail \
		src/test/incremental \
		src/test/mir-opt \
		src/test/pretty \
		src/test/run-fail \
		src/test/run-fail/pretty \
		src/test/run-make \
		src/test/run-make-fulldeps \
		src/test/run-pass \
		src/test/run-pass/pretty \
		src/test/run-pass-fulldeps \
		src/test/run-pass-fulldeps/pretty \
		src/test/ui \
		src/test/ui-fulldeps
}

package() {
	cd "$builddir"/build/dist

	tar xf rust-$pkgver-$CTARGET.tar.gz
	rust-$pkgver-$CTARGET/install.sh \
		--destdir="$pkgdir" \
		--prefix=/usr \
		--sysconfdir="$pkgdir"/etc \
		--disable-ldconfig
	tar xf rust-src-$pkgver.tar.gz
	rust-src-$pkgver/install.sh \
		--destdir="$pkgdir" \
		--prefix=/usr \
		--disable-ldconfig

	rm "$pkgdir"/usr/lib/*.so \
	   "$pkgdir"/usr/lib/rustlib/components \
	   "$pkgdir"/usr/lib/rustlib/install.log \
	   "$pkgdir"/usr/lib/rustlib/manifest-* \
	   "$pkgdir"/usr/lib/rustlib/rust-installer-version \
	   "$pkgdir"/usr/lib/rustlib/uninstall.sh
}

stdlib() {
	pkgdesc="Standard library for Rust"
	depends="musl-utils"

	_mv "$pkgdir"$_rlibdir/*.so "$subpkgdir"$_rlibdir

	mkdir -p "$subpkgdir"/etc/ld.so.conf.d
	echo "$_rlibdir" > "$subpkgdir"/etc/ld.so.conf.d/$pkgname.conf
}

analysis() {
	pkgdesc="Compiler analysis data for the Rust standard library"
	depends="$pkgname=$pkgver-r$pkgrel $pkgname-stdlib=$pkgver-r$pkgrel"

	_mv "$pkgdir"${_rlibdir%/*}/analysis "$subpkgdir"${_rlibdir%/*}
}

gdb() {
	pkgdesc="GDB pretty printers for Rust"
	license="Apache-2.0 OR MIT"
	depends="$pkgname gdb"
	install_if="$pkgname=$pkgver-r$pkgrel gdb"

	_mv "$pkgdir"/usr/bin/rust-gdb "$subpkgdir"/usr/bin
	_mv "$pkgdir"/usr/bin/rust-gdbgui "$subpkgdir"/usr/bin
	_mv "$pkgdir"/usr/share/rust/gdb_*.py "$subpkgdir"/usr/share/rust
}

lldb() {
	pkgdesc="LLDB pretty printers for Rust"
	license="Apache-2.0 OR MIT"
	depends="$pkgname lldb py3-lldb"
	install_if="$pkgname=$pkgver-r$pkgrel lldb"

	_mv "$pkgdir"/usr/bin/rust-lldb "$subpkgdir"/usr/bin
	_mv "$pkgdir"/usr/share/rust/lldb_*.py "$subpkgdir"/usr/share/rust
}

src() {
	pkgdesc="$pkgdesc (source code)"
	depends=""

	_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"
	provides="cargo-bootstrap=$pkgver-r$pkgrel"
	depends="$pkgname-stdlib=$pkgver-r$pkgrel $pkgname"

	_mv "$pkgdir"/usr/bin/cargo "$subpkgdir"/usr/bin
}

_cargo_clippy() {
	pkgdesc="A collection of Rust lints (cargo plugin)"
	depends="$pkgname-stdlib=$pkgver-r$pkgrel cargo"

	_mv "$pkgdir"/usr/bin/cargo-clippy \
	    "$pkgdir"/usr/bin/clippy-driver \
	    "$subpkgdir"/usr/bin
}

_cargo_fmt() {
	pkgdesc="Format Rust code (cargo plugin)"
	depends="$pkgname-stdlib=$pkgver-r$pkgrel cargo rustfmt"
	install_if="cargo=$pkgver-r$pkgrel rustfmt=$pkgver-r$pkgrel"

	_mv "$pkgdir"/usr/bin/cargo-fmt "$subpkgdir"/usr/bin
}

_cargo_bashcomp() {
	pkgdesc="Bash completion for cargo"
	license="Apache-2.0 OR MIT"
	depends=""
	install_if="cargo=$pkgver-r$pkgrel bash-completion"

	_mv "$pkgdir"/etc/bash_completion.d/cargo \
	    "$subpkgdir"/usr/share/bash-completion/completions
	rmdir -p "$pkgdir"/etc/bash_completion.d 2>/dev/null || true
}

_cargo_zshcomp() {
	pkgdesc="ZSH completion for cargo"
	license="Apache-2.0 OR MIT"
	depends=""
	install_if="cargo=$pkgver-r$pkgrel zsh"

	_mv "$pkgdir"/usr/share/zsh/site-functions/_cargo \
	    "$subpkgdir"/usr/share/zsh/site-functions/_cargo
	rmdir -p "$pkgdir"/usr/share/zsh/site-functions 2>/dev/null || true
}

_cargo_doc() {
	pkgdesc="The Rust package manager (documentation)"
	license="Apache-2.0 OR MIT"
	depends=""
	install_if="cargo=$pkgver-r$pkgrel docs"

	# XXX: This is hackish!
	_mv "$pkgdir"/../$pkgname-doc/usr/share/man/man1/cargo* \
	    "$subpkgdir"/usr/share/man/man1
}

miri() {
	pkgdesc="An interpreter for Rust's mid-level intermediate representation"
	license="Apache-2.0 OR MIT"
	depends="$pkgname-stdlib=$pkgver-r$pkgrel"

	_mv "$pkgdir"/usr/bin/miri "$subpkgdir"/usr/bin
}

rls() {
	pkgdesc="The Rust language server"
	license="Apache-2.0 OR MIT"
	depends="$pkgname-stdlib=$pkgver-r$pkgrel"

	_mv "$pkgdir"/usr/bin/rls "$subpkgdir"/usr/bin
}

rustfmt() {
	pkgdesc="Format Rust code"
	depends="$pkgname-stdlib=$pkgver-r$pkgrel"

	_mv "$pkgdir"/usr/bin/rustfmt "$subpkgdir"/usr/bin
}

_mv() {
	local dest; for dest; do true; done  # get last argument
	mkdir -p "$dest"
	mv "$@"
}

sha512sums="bfee43f578e6d44ead950b870b9fd31087e1bd3f917611f5dce7ad56504b83185edf43e297e8d1304e9e97b9a580d1e6adf6608ab8ed6dee0dc8c5153cdbc5d4  rustc-1.37.0-src.tar.xz
ab0711dafeae76d9718a0c6aaf118f512d295c66191d96198acc3591f5412d4ee6c50ad5cc56df8f1f32a2be3c4d9bb5ead798c6b9f4089c0a624e09825dd6be  cargo-0.37.0-powerpc-foxkit-linux-musl.tar.xz
aa97abeccf03d3368b60731845d23ff74fb962818b7d1e6ada2e9a647b442a1b824541402f3a883c9be6e1f8db94ca98244fc4009ff0386403c57f999bd6d263  rust-std-1.36.0-powerpc-foxkit-linux-musl.tar.xz
5078bdd341b145119ba3396892cd8f63c65fafb1b041674e350b2cc02376fd2c32799baca85e916522c34c416a6c67d9d92bf8f44abb575a1ae1fedc4726516e  rustc-1.36.0-powerpc-foxkit-linux-musl.tar.xz
5b765a47a49cbab26e5093ebf6dce5b8e3463ebdb0e404b9c952fef7993fd57e9a0d9f7d301c97b76b8bd35e4ea8b72c8768aa384cd215c2a12ddd45727343f8  0001-Don-t-pass-CFLAGS-to-the-C-compiler.patch
9b711ee16eed20a0293c1ca6d96c48db3fae5f2f60fdcb04ae2d1acfdc8036fa3b41ca799717aa14279fd7b7db0090861bceddeafd8d41f70433039e4983d9c8  0002-Fix-LLVM-build.patch
7f61bdc7c754379e1675d2f102f1f60f4c29ca2a2293d70741db46a0f29d61008d067166c7576cd0e5fa3c26e811e711e851b22f7df69974a7b53fa316c33777  0003-Allow-rustdoc-to-work-when-cross-compiling-on-musl.patch
0f1989e4db3a48fe8718002a58aaecf359bc65bf5a6dae327c062fce0b8a3176a6b70c80c72118d5fcabbc16b67b986ce67ab1fda13ca52899ca320716f3e606  0004-Require-static-native-libraries-when-linking-static-.patch
b27045eb7809438db988979843f68ddfee46a6f889b0fbaaed401b249d6e224940e9d15143e55f8b2df911a8fa24dfec81da0f064b47a86f3ed24010aee309e3  0005-Remove-nostdlib-and-musl_root-from-musl-targets.patch
4662f036e037b99178bb24c32524211eb5fc10ac711d16f13ddb933db84811eab3149cbe943521536d00c765eade1c1df01ca7e8f4fee69fca540546c0fbe806  0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch
8742ff1c442dc2c7baad528fd6c51e202d091f24fbd7ac1350241a729a20f6f90818b76bb4de0b36b09afdeaad89b54843f08fb474e2232854cb68cd3d6a57b5  0007-Fix-C-aggregate-passing-ABI-on-powerpc.patch
8eb5c08701cfcdc14ece1c40fa2276e760283ce9228c96ff1dedb5256dcec307c3705a8e27ac1bd767184d0acfc835b9b0b4f02d5fa7ec24a75f04014e67ec61  0008-Fix-zero-sized-aggregate-ABI-on-powerpc.patch
20f794339f7a9c048dad2f39b5a3dad9293b07ba0b130354c0e74ec71088d2f2c24f6630543e8e5a41b244c8c1013249403ce8acf1fc2c2b4ab5065049f7f04e  0009-compiletest-Match-suffixed-environments.patch
d3d3250d762b482c93679cbc7a1d5ccf2eb803e271b840a5d426cf77d58d2cb53fd76baf46bfbaf7674c5ef9f18133cf0b48be08864c002171f3547aaa377bd6  0010-test-c-variadic-Fix-patterns-on-powerpc64.patch
d01d27d6f344fd30f75e7acd8f1b967eda382f7ee6387f8b0c52aa1ab083d5d86fa9d8d424c3e2b792502e75df03bacc58bd24ed4e448cfefe6bbfbb57586b06  0011-test-use-extern-for-plugins-Don-t-assume-multilib.patch
e25a4ba32b3b6fbc774c341bb3bda481a9f86917204e7c9bd69f34e2a72b4b3e58256d0619a94ce1d0f4cc17913d7216974b86fe96a776ba4260d0a01dcacaa9  0012-test-sysroot-crates-are-unstable-Fix-test-when-rpath.patch
68f7b35980c7b4b7088e28a7350c847656d4ffecbcec125ac6790a057a8a735563739f0ade8a7cf0283844cd1655114fa7ad6be106993e34b66e520aed34dd6d  0013-Ignore-broken-and-non-applicable-tests.patch
b6d4ce58e540373da797c89ed2ca3b23a8504511ee6bb6d0c52bd04273498aab10c99baf6f4633bb5a246c2612a7a538cbfed494bf901afdc6688f937234b4ac  0014-Link-stage-2-tools-dynamically-to-libstd.patch
fc10130544f7ceda378a9e7fb03a0dc4ea32a6d031061eada60af2d1c688d94f38ab31aad74f8f11b8aec2614415befa2c5e9789eeaf73b998f39b9677886155  0015-Move-debugger-scripts-to-usr-share-rust.patch
2c11c4bee3c6d10de6c2a9937bf3901f4c60dd1d9c50fcf57daa182a9b4d7b40d27632d3ef31ef083ae7903fcd49fdd41413ab8de1021f7d857884b9ac53c724  0016-Add-foxkit-target-specs.patch
7642e95d7f5e5d167a2f3e1300fc63f7bf34b6c0667b4e43e7c2378acd8c293f82d7c5651dfb75b03d717c0c5c369911f595dc641a629024e615d443244e6da1  0030-libc-linkage.patch
0cb12e9165d198c1e04b258454dbaf5459e192ad24d64c9fa132ebe0f1bcd5da3550eae8dfdaa792fa809b505af62964ecf0219dc4373420ee8ad3e111539a09  0031-typenum-pmmx.patch
ab35bacf45ef5e46be110a8d27867fd4d5deb23cd5cbe8dc7f1da2177469945f9254f2a7915ee4fc430468a4421623429f0a01eb9eba14e047384efe3d3ec152  0040-rls-atomics.patch"