summaryrefslogtreecommitdiff
path: root/repo/rust
diff options
context:
space:
mode:
authordavidovski <david@davidovski.xyz>2022-05-31 11:05:19 +0100
committerdavidovski <david@davidovski.xyz>2022-05-31 11:05:19 +0100
commit48ca75555522716f0f686dcae3dd6cf3d8ad714d (patch)
tree00c0f58550ba4661e87376f2f02c8001c69bae44 /repo/rust
parent871b2b573f01c1b3176a0f65458b3d281b41c437 (diff)
removed idea of repos
Diffstat (limited to 'repo/rust')
-rw-r--r--repo/rust/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch24
-rw-r--r--repo/rust/0007-do-not-install-libunwind-source.patch19
-rw-r--r--repo/rust/alpine-move-py-scripts-to-share.patch23
-rw-r--r--repo/rust/alpine-target.patch191
-rw-r--r--repo/rust/cargo.xibuild8
-rw-r--r--repo/rust/check-rustc109
-rw-r--r--repo/rust/install-template-shebang.patch10
-rw-r--r--repo/rust/link-musl-dynamically.patch17
-rw-r--r--repo/rust/musl-fix-linux_musl_base.patch23
-rw-r--r--repo/rust/need-rpath.patch62
-rw-r--r--repo/rust/need-ssp_nonshared.patch13
-rw-r--r--repo/rust/rust.xibuild75
12 files changed, 574 insertions, 0 deletions
diff --git a/repo/rust/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch b/repo/rust/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch
new file mode 100644
index 0000000..30cb66f
--- /dev/null
+++ b/repo/rust/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch
@@ -0,0 +1,24 @@
+Additions for build.rs by q66, necessary for our musl setup.
+
+From 1eb558f246269606c6d8d73824ef6b44fa10764e Mon Sep 17 00:00:00 2001
+From: Samuel Holland <samuel@sholland.org>
+Date: Sat, 9 Sep 2017 00:14:16 -0500
+Subject: [PATCH 06/16] Prefer libgcc_eh over libunwind for musl
+
+---
+ src/libunwind/lib.rs | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/libunwind/lib.rs b/src/libunwind/lib.rs
+index 9182e349b19..0377fbb58fc 100644
+--- a/library/unwind/src/lib.rs
++++ b/library/unwind/src/lib.rs
+@@ -51,7 +51,7 @@
+ #[link(name = "unwind", cfg(not(target_feature = "crt-static")))]
+ extern "C" {}
+ } else {
+- #[link(name = "unwind", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))]
++ #[link(name = "gcc_eh", cfg(target_feature = "crt-static"))]
+ #[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))]
+ extern "C" {}
+ }
diff --git a/repo/rust/0007-do-not-install-libunwind-source.patch b/repo/rust/0007-do-not-install-libunwind-source.patch
new file mode 100644
index 0000000..e8ff8b7
--- /dev/null
+++ b/repo/rust/0007-do-not-install-libunwind-source.patch
@@ -0,0 +1,19 @@
+From: Dominic Meiser <alpine@msrd0.de>
+Date: Tue, 22 Dec 2020 23:31:28 +0100
+Subject: [PATCH] Do not install libunwind source
+
+This was added in rustc 1.48, but is incompatible with the Alpine Linux package since it removes all bundled
+dependencies prior to building.
+
+diff -Naur rustc-1.48.0-src.orig/src/bootstrap/dist.rs rustc-1.48.0-src/src/bootstrap/dist.rs
+--- rustc-1.48.0-src.orig/src/bootstrap/dist.rs 2020-12-22 16:39:30.504249113 +0100
++++ rustc-1.48.0-src/src/bootstrap/dist.rs 2020-12-22 16:42:08.663006830 +0100
+@@ -1016,7 +1016,7 @@
+ copy_src_dirs(
+ builder,
+ &builder.src,
+- &["library", "src/llvm-project/libunwind"],
++ &["library"],
+ &[
+ // not needed and contains symlinks which rustup currently
+ // chokes on when unpacking.
diff --git a/repo/rust/alpine-move-py-scripts-to-share.patch b/repo/rust/alpine-move-py-scripts-to-share.patch
new file mode 100644
index 0000000..21be36f
--- /dev/null
+++ b/repo/rust/alpine-move-py-scripts-to-share.patch
@@ -0,0 +1,23 @@
+--- a/src/etc/rust-gdb
++++ b/src/etc/rust-gdb
+@@ -12,7 +12,7 @@
+
+ # Find out where the pretty printer Python module is
+ RUSTC_SYSROOT="$("$RUSTC" --print=sysroot)"
+-GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc"
++GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/share/rust/etc"
+
+ # Run GDB with the additional arguments that load the pretty printers
+ # Set the environment variable `RUST_GDB` to overwrite the call to a
+ # Set the environment variable `RUST_GDB` to overwrite the call to a
+--- a/src/etc/rust-lldb
++++ b/src/etc/rust-lldb
+@@ -8,7 +8,7 @@
+
+ # Find out where to look for the pretty printer Python module
+ RUSTC_SYSROOT=$(rustc --print sysroot)
+-RUST_LLDB="$RUSTC_SYSROOT/lib/rustlib/$host/bin/lldb"
++RUST_LLDB="$RUSTC_SYSROOT/share/rust/etc"
+
+ lldb=lldb
+ if [ -f "$RUST_LLDB" ]; then
diff --git a/repo/rust/alpine-target.patch b/repo/rust/alpine-target.patch
new file mode 100644
index 0000000..2392cdd
--- /dev/null
+++ b/repo/rust/alpine-target.patch
@@ -0,0 +1,191 @@
+From: Shiz <hi@shiz.me>
+Updated by Rasmus Thomsen <oss@cogitri.dev> on 28th of July 2019
+Updated again by Ariadne Conill <ariadne@dereferenced.org> on 31 October 2020
+Date: Thu, 20 Aug 2017 01:52:36 +0200
+Last-Updated: Sat, 28 Oct 2017 20:23:00 +0200
+Subject: [PATCH] Add Alpine targets
+
+This adds `$arch-alpine-linux-musl` targets to Rust to encode our toolchain
+and distribution-specific quirks instead of polluting the main musl target of
+`$arch-unknown-linux-musl`.
+
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/aarch64_alpine_linux_musl.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::aarch64_unknown_linux_musl::target();
++
++ base.llvm_target = "aarch64-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/armv6_alpine_linux_musleabihf.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::arm_unknown_linux_musleabihf::target();
++
++ base.llvm_target = "armv6-alpine-linux-musleabihf".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/armv7_alpine_linux_musleabihf.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::armv7_unknown_linux_musleabihf::target();
++
++ base.llvm_target = "armv7-alpine-linux-musleabihf".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/i586_alpine_linux_musl.rs
+@@ -0,0 +1,14 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::i686_unknown_linux_musl::target();
++
++ base.options.cpu = "pentium4".to_string();
++ base.llvm_target = "i586-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- rustc-1.48.0-src.orig/compiler/rustc_target/src/spec/mod.rs
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/mod.rs
+@@ -490,6 +490,16 @@
+ }
+
+ supported_targets! {
++ ("i586-alpine-linux-musl", i586_alpine_linux_musl),
++ ("x86_64-alpine-linux-musl", x86_64_alpine_linux_musl),
++ ("aarch64-alpine-linux-musl", aarch64_alpine_linux_musl),
++ ("armv6-alpine-linux-musleabihf", armv6_alpine_linux_musleabihf),
++ ("armv7-alpine-linux-musleabihf", armv7_alpine_linux_musleabihf),
++ ("powerpc-alpine-linux-musl", powerpc_alpine_linux_musl),
++ ("powerpc64-alpine-linux-musl", powerpc64_alpine_linux_musl),
++ ("powerpc64le-alpine-linux-musl", powerpc64le_alpine_linux_musl),
++ ("s390x-alpine-linux-musl", s390x_alpine_linux_musl),
++ ("riscv64-alpine-linux-musl", riscv64_alpine_linux_musl),
+ ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
+ ("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
+ ("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/powerpc64_alpine_linux_musl.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::powerpc64_unknown_linux_musl::target();
++
++ base.llvm_target = "powerpc64-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/powerpc64le_alpine_linux_musl.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::powerpc64le_unknown_linux_musl::target();
++
++ base.llvm_target = "powerpc64le-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/powerpc_alpine_linux_musl.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::powerpc_unknown_linux_musl::target();
++
++ base.llvm_target = "powerpc-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/s390x_alpine_linux_musl.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::s390x_unknown_linux_musl::target();
++
++ base.llvm_target = "s390x-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/x86_64_alpine_linux_musl.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::x86_64_unknown_linux_musl::target();
++
++ base.llvm_target = "x86_64-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
+--- /dev/null
++++ rustc-1.52.1-src/compiler/rustc_target/src/spec/riscv64_alpine_linux_musl.rs
+@@ -0,0 +1,13 @@
++use crate::spec::Target;
++
++pub fn target() -> Target {
++ let mut base = super::riscv64gc_unknown_linux_musl::target();
++
++ base.llvm_target = "riscv64-alpine-linux-musl".to_string();
++ base.options.vendor = "alpine".to_string();
++ base.options.crt_static_default = false;
++ base.options.static_position_independent_executables = true;
++ base.options.need_rpath = true;
++
++ base
++}
diff --git a/repo/rust/cargo.xibuild b/repo/rust/cargo.xibuild
new file mode 100644
index 0000000..8a9f47e
--- /dev/null
+++ b/repo/rust/cargo.xibuild
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+DEPS="rust"
+DESC="Rust package manager"
+
+package () {
+ add_from_main "usr/bin/cargo"
+}
diff --git a/repo/rust/check-rustc b/repo/rust/check-rustc
new file mode 100644
index 0000000..d4b85be
--- /dev/null
+++ b/repo/rust/check-rustc
@@ -0,0 +1,109 @@
+#!/bin/sh
+# vim: set ts=4:
+set -eu
+
+RUSTC="$1"
+TMPDIR="$(pwd)/.tmp-${0##*/}-$RANDOM"
+failed=0
+
+unset RUST_BACKTRACE
+unset RUSTC_CRT_STATIC
+
+
+_rustc() {
+ printf '\n$ rustc %s\n' "$*"
+ "$RUSTC" "$@"
+}
+
+die() {
+ printf '\033[1;31mERROR:\033[0m %s\n' "$1" >&2 # bold red
+ exit 1
+}
+
+fail() {
+ printf '\033[1;31mFAIL:\033[0m %s\n' "$1" >&2 # bold red
+ failed=$(( failed + 1 ))
+}
+
+assert_dynamic() {
+ readelf -l "$1" | grep -Fqw INTERP \
+ && readelf -d "$1" | grep -Fqw NEEDED || {
+ fail "$1 is not a dynamic executable!"
+ readelf -ld "$1"
+ }
+}
+
+assert_ok() {
+ "$1" || fail "$1 exited with status $?"
+}
+
+assert_panic() {
+ local status=0
+ "$1" || status=$? && [ "$status" = 101 ] \
+ || fail "$1 exited with status $status, but expected 101"
+}
+
+assert_pie() {
+ readelf -d "$1" | grep -Fw FLAGS_1 | grep -Fqw PIE || {
+ fail "$1 is not a PIE executable!"
+ readelf -d "$1"
+ }
+}
+
+assert_static() {
+ test -f "$1" \
+ && ! readelf -l "$1" | grep -Fqw INTERP \
+ && ! readelf -d "$1" | grep -Fqw NEEDED || {
+ fail "$1 is not a static executable!"
+ readelf -ld "$1"
+ }
+}
+
+
+#-------------------- M a i n --------------------
+
+test -d "$TMPDIR" && die "$TMPDIR already exists!"
+mkdir -p "$TMPDIR"
+trap "rm -R '$TMPDIR'" EXIT
+
+cd "$TMPDIR"
+
+cat >> hello_world.rs <<-EOF
+ fn main() {
+ println!("Hello, world!");
+ }
+EOF
+
+_rustc hello_world.rs
+assert_ok ./hello_world
+assert_dynamic hello_world
+assert_pie hello_world
+rm -f hello_world
+
+_rustc -C target-feature=-crt-static hello_world.rs
+assert_ok ./hello_world
+assert_dynamic hello_world
+assert_pie hello_world
+rm -f hello_world
+
+_rustc -C target-feature=+crt-static hello_world.rs
+assert_ok ./hello_world
+assert_static hello_world
+assert_pie hello_world
+rm -f hello_world
+
+
+cat >> panic.rs <<-EOF
+ fn main() {
+ panic!("This should panic");
+ }
+EOF
+
+_rustc -C target-feature=-crt-static panic.rs
+assert_panic ./panic
+
+_rustc -C target-feature=+crt-static panic.rs
+assert_panic ./panic
+
+
+[ "$failed" -eq 0 ] || die "$failed assertion(s) has failed"
diff --git a/repo/rust/install-template-shebang.patch b/repo/rust/install-template-shebang.patch
new file mode 100644
index 0000000..e81b579
--- /dev/null
+++ b/repo/rust/install-template-shebang.patch
@@ -0,0 +1,10 @@
+The script seems to be POSIX-sh (+ local) compatible.
+
+--- a/src/tools/rust-installer/install-template.sh
++++ b/src/tools/rust-installer/install-template.sh
+@@ -1,4 +1,4 @@
+-#!/bin/bash
++#!/bin/sh
+ # Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+ # file at the top-level directory of this distribution and at
+ # http://rust-lang.org/COPYRIGHT.
diff --git a/repo/rust/link-musl-dynamically.patch b/repo/rust/link-musl-dynamically.patch
new file mode 100644
index 0000000..55d02a3
--- /dev/null
+++ b/repo/rust/link-musl-dynamically.patch
@@ -0,0 +1,17 @@
+--- rustc-1.58.0-src.orig/vendor/libc/src/unix/mod.rs
++++ rustc-1.58.0-src/vendor/libc/src/unix/mod.rs
+@@ -329,11 +329,11 @@
+ #[link(name = "c", cfg(not(target_feature = "crt-static")))]
+ extern {}
+ } else if #[cfg(target_env = "musl")] {
++ #[link(name = "c")]
++ extern {}
+ #[cfg_attr(feature = "rustc-dep-of-std",
+- link(name = "c", kind = "static", modifiers = "-bundle",
++ link(name = "gcc", kind = "static", modifiers = "-bundle",
+ cfg(target_feature = "crt-static")))]
+- #[cfg_attr(feature = "rustc-dep-of-std",
+- link(name = "c", cfg(not(target_feature = "crt-static"))))]
+ extern {}
+ } else if #[cfg(target_os = "emscripten")] {
+ #[link(name = "c")]
diff --git a/repo/rust/musl-fix-linux_musl_base.patch b/repo/rust/musl-fix-linux_musl_base.patch
new file mode 100644
index 0000000..1771ffe
--- /dev/null
+++ b/repo/rust/musl-fix-linux_musl_base.patch
@@ -0,0 +1,23 @@
+From: Jakub Jirutka <jakub@jirutka.cz>
+Date: Sat, 08 Aug 2016 15:06:00 +0200
+Subject: [PATCH] Fix linux_musl_base for native musl host
+
+See https://github.com/rust-lang/rust/pull/40113
+
+--- a/compiler/rustc_target/src/spec/linux_musl_base.rs
++++ b/compiler/rustc_target/src/spec/linux_musl_base.rs
+@@ -5,12 +5,9 @@
+ let mut base = super::linux_base::opts();
+
+ base.env = "musl".to_string();
+- base.pre_link_objects_fallback = crt_objects::pre_musl_fallback();
+- base.post_link_objects_fallback = crt_objects::post_musl_fallback();
+- base.crt_objects_fallback = Some(CrtObjectsFallback::Musl);
+
+ // These targets statically link libc by default
+- base.crt_static_default = true;
++ base.crt_static_default = false;
+
+ base
+ }
+
diff --git a/repo/rust/need-rpath.patch b/repo/rust/need-rpath.patch
new file mode 100644
index 0000000..5ab8377
--- /dev/null
+++ b/repo/rust/need-rpath.patch
@@ -0,0 +1,62 @@
+From: Shiz <hi@shiz.me>
+Date: Thu, 20 Aug 2017 01:48:22 +0200
+Subject: [PATCH] Add need_rpath target option to force RPATH generation
+
+This adds a `need_rpath` option to the target options in order to implicitly
+have the equivalent of `-C rpath` specified by default for final products
+(executables and dynamic libraries), so that RPATHs are always added.
+
+We have to skip this step in the bootstrap phase as it does its own manual
+RPATH additions, but unfortunately there's no clean way to detect this.
+As such, we have to resort to checking the `RUSTC_BOOTSTRAP` variable.
+Hacky hacky!
+
+--- a/compiler/rustc_target/src/spec/mod.rs
++++ b/compiler/rustc_target/src/spec/mod.rs
+@@ -379,6 +379,8 @@
+ pub allows_weak_linkage: bool,
+ /// Whether the linker support rpaths or not. Defaults to false.
+ pub has_rpath: bool,
++ /// Whether to force rpath support on by default. Defaults to false.
++ pub need_rpath: bool,
+ /// Whether to disable linking to the default libraries, typically corresponds
+ /// to `-nodefaultlibs`. Defaults to true.
+ pub no_default_libraries: bool,
+@@ -519,6 +519,7 @@
+ linker_is_gnu: false,
+ allows_weak_linkage: true,
+ has_rpath: false,
++ need_rpath: false,
+ no_default_libraries: true,
+ position_independent_executables: false,
+ static_position_independent_executables: false,
+@@ -776,6 +776,7 @@
+ key!(linker_is_gnu, bool);
+ key!(allows_weak_linkage, bool);
+ key!(has_rpath, bool);
++ key!(need_rpath, bool);
+ key!(no_default_libraries, bool);
+ key!(position_independent_executables, bool);
+ key!(static_position_independent_executables, bool);
+@@ -980,6 +980,7 @@
+ target_option_val!(linker_is_gnu);
+ target_option_val!(allows_weak_linkage);
+ target_option_val!(has_rpath);
++ target_option_val!(need_rpath);
+ target_option_val!(no_default_libraries);
+ target_option_val!(position_independent_executables);
+ target_option_val!(static_position_independent_executables);
+--- a/compiler/rustc_codegen_ssa/src/back/link.rs.orig
++++ b/compiler/rustc_codegen_ssa/src/back/link.rs
+@@ -1675,7 +1675,10 @@
+ // FIXME (#2397): At some point we want to rpath our guesses as to
+ // where extern libraries might live, based on the
+ // add_lib_search_paths
+- if sess.opts.cg.rpath {
++ // XXX: hacky hacky
++ let bootstrap = env::var("RUSTC_BOOTSTRAP").is_ok();
++ if !bootstrap && !sess.crt_static(None) &&
++ (sess.opts.cg.rpath || sess.target.options.need_rpath) {
+ let libs = codegen_results
+ .crate_info
+ .used_crates
diff --git a/repo/rust/need-ssp_nonshared.patch b/repo/rust/need-ssp_nonshared.patch
new file mode 100644
index 0000000..f1adf20
--- /dev/null
+++ b/repo/rust/need-ssp_nonshared.patch
@@ -0,0 +1,13 @@
+--- a/library/std/src/sys/unix/mod.rs.orig 2021-02-11 18:34:14.479832268 +0100
++++ b/library/std/src/sys/unix/mod.rs 2021-02-11 18:38:28.078987749 +0100
+@@ -243,6 +243,9 @@
+ #[link(name = "log")]
+ #[link(name = "gcc")]
+ extern "C" {}
++ } else if #[cfg(all(target_os = "linux", target_env = "musl"))] {
++ #[link(name = "ssp_nonshared")]
++ extern "C" {}
+ } else if #[cfg(target_os = "freebsd")] {
+ #[link(name = "execinfo")]
+ #[link(name = "pthread")]
+
diff --git a/repo/rust/rust.xibuild b/repo/rust/rust.xibuild
new file mode 100644
index 0000000..a3075e3
--- /dev/null
+++ b/repo/rust/rust.xibuild
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+MAKEDEPS="cmake libclang clang llvm curl"
+DEPS="libssh2 openssl"
+
+PKG_VER=1.59.0
+SOURCE=https://static.rust-lang.org/dist/rustc-$PKG_VER-src.tar.gz
+DESC="Systems programming language focused on safety, speed and concurrency"
+
+ADDITIONAL="
+ 0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch
+ 0007-do-not-install-libunwind-source.patch
+ install-template-shebang.patch
+ link-musl-dynamically.patch
+ musl-fix-linux_musl_base.patch
+ need-rpath.patch
+ need-ssp_nonshared.patch
+"
+
+prepare () {
+ apply_patches
+ sed -i /LD_LIBRARY_PATH/d src/bootstrap/bootstrap.py
+ sed -i 's/\("files":{\)[^}]*/\1/' vendor/libc/.cargo-checksum.json
+}
+
+build () {
+ target=x86_64-unknown-linux-musl
+ build=x86_64-unknown-linux-musl
+ ./configure \
+ --build="$build" \
+ --host="$target" \
+ --target="$target" \
+ --prefix="/usr" \
+ --release-channel="stable" \
+ --llvm-root="/usr/lib/" \
+ --disable-docs \
+ --enable-extended \
+ --tools="analysis,cargo,src,rustfmt" \
+ --enable-llvm-link-shared \
+ --enable-option-checking \
+ --enable-locked-deps \
+ --enable-vendor \
+ --set="rust.musl-root=/usr" \
+ --set="rust.codegen-units=1" \
+ --set="rust.codegen-units-std=1" \
+ --set="rust.parallel-compiler=true" \
+ --set="target.$target.llvm-config=/usr/bin/llvm-config" \
+ --set="target.$target.musl-root=/usr" \
+ --set="target.$target.crt-static=false" \
+ --set="target.$target.cc=gcc" \
+ --set="target.$target.cxx=g++" \
+ --set="target.$target.ar=ar" \
+ --set="target.$target.linker=gcc" \
+ --set="target.$build.musl-root=/usr" \
+ --set="target.$build.crt-static=false" \
+ --set="target.$build.cc=gcc" \
+ --set="target.$build.cxx=g++" \
+ --set="target.$build.ar=ar" \
+ --set="target.$build.linker=gcc" \
+
+ sed 's/#deny-warnings = .*/deny-warnings = false/' -i config.toml
+ sed 's|deny(warnings,|deny(|' -i src/bootstrap/lib.rs
+
+ python ./x.py dist -v --jobs $JOBS
+
+}
+
+package () {
+ export LIBSSH2_SYS_USE_PKG_CONFIG=1 &&
+ DESTDIR=${PWD}/install python3 ./x.py install &&
+ unset LIBSSH2_SYS_USE_PKG_CONFIG
+
+ chown -R root:root install &&
+ cp -a install/* $PKG_DEST
+}