mirror of
https://git.savannah.gnu.org/git/guix.git
synced 2025-01-19 05:57:04 +01:00
gnu: mrustc: Update to 0.11.0-1.5e01a76.
* gnu/packages/rust.scm (%mrustc-commit): Update to newest commit. (%mrustc-source): Update to 0.11.0-1.5e01a76. Add a patch. Adjust the snippet to not use vendored openssl. (rust-bootstrap)[source]: Remove patch, remove patch-flags. Add to the snippet a substitution for compatibility with llvm-13. [inputs]: Remove input labels. Remove conditional use of clang. [arguments]: Allow parallel building on all architectures. Update the make-flags. Replace the 'unpack phase to unpack the mrustc sources. Delete the custom 'set-mrustc-sources and 'patch-cargo-checksum phases. Adjust the custom 'patch-makefiles phase. Adjust the 'configure and 'build phases to no longer use clang on some architectures. * gnu/packages/patches/mrustc-patches.patch: New file. * gnu/packages/patches/rustc-1.54.0-src.patch: Remove file. * gnu/local.mk (dist_patch_DATA): Update it. Change-Id: I7e444abe4b386b1bb77f05a278ddef45152ddb3c
This commit is contained in:
parent
584c79d5df
commit
07bdee0277
4 changed files with 81 additions and 415 deletions
|
@ -1849,6 +1849,7 @@ dist_patch_DATA = \
|
|||
%D%/packages/patches/mono-mcs-patches-from-5.10.0.patch \
|
||||
%D%/packages/patches/mosaicatcher-unbundle-htslib.patch \
|
||||
%D%/packages/patches/mrrescue-support-love-11.patch \
|
||||
%D%/packages/patches/mrustc-patches.patch \
|
||||
%D%/packages/patches/mtools-mformat-uninitialized.patch \
|
||||
%D%/packages/patches/mupen64plus-ui-console-notice.patch \
|
||||
%D%/packages/patches/musl-cross-locale.patch \
|
||||
|
@ -2177,7 +2178,6 @@ dist_patch_DATA = \
|
|||
%D%/packages/patches/ruby-mustache-1.1.1-fix-race-condition-tests.patch \
|
||||
%D%/packages/patches/ruby-nokogiri.patch \
|
||||
%D%/packages/patches/ruby-x25519-automatic-fallback-non-x86_64.patch \
|
||||
%D%/packages/patches/rustc-1.54.0-src.patch \
|
||||
%D%/packages/patches/rust-1.64-fix-riscv64-bootstrap.patch \
|
||||
%D%/packages/patches/rust-1.70-fix-rustix-build.patch \
|
||||
%D%/packages/patches/rust-1.78-unwinding-fix.patch \
|
||||
|
|
19
gnu/packages/patches/mrustc-patches.patch
Normal file
19
gnu/packages/patches/mrustc-patches.patch
Normal file
|
@ -0,0 +1,19 @@
|
|||
diff --git a/rustc-1.54.0-src.patch b/rustc-1.54.0-src.patch
|
||||
index 088c723a..d322fd0d 100644
|
||||
--- a/rustc-1.54.0-src.patch
|
||||
+++ b/rustc-1.54.0-src.patch
|
||||
@@ -302,14 +302,3 @@
|
||||
use self::generic as arch;
|
||||
|
||||
pub use self::arch::{vec128_storage, vec256_storage, vec512_storage};
|
||||
-
|
||||
---- src/llvm-project/llvm/include/llvm/Support/Signals.h
|
||||
-+++ src/llvm-project/llvm/include/llvm/Support/Signals.h
|
||||
-@@ -14,6 +14,7 @@
|
||||
- #ifndef LLVM_SUPPORT_SIGNALS_H
|
||||
- #define LLVM_SUPPORT_SIGNALS_H
|
||||
-
|
||||
-+#include <cstdint>
|
||||
- #include <string>
|
||||
-
|
||||
- namespace llvm {
|
|
@ -1,304 +0,0 @@
|
|||
# mrustc is much better at enum packing, so causes almost all of these to be smaller by one pointer
|
||||
--- compiler/rustc_ast/src/ast.rs
|
||||
+++ compiler/rustc_ast/src/ast.rs
|
||||
@@ -1075,7 +1075,7 @@ pub struct Expr {
|
||||
}
|
||||
|
||||
// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger.
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(Expr, 104);
|
||||
|
||||
impl Expr {
|
||||
@@ -2779,7 +2779,7 @@ pub enum AssocItemKind {
|
||||
MacCall(MacCall),
|
||||
}
|
||||
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(AssocItemKind, 72);
|
||||
|
||||
impl AssocItemKind {
|
||||
@@ -2831,7 +2831,7 @@ pub enum ForeignItemKind {
|
||||
MacCall(MacCall),
|
||||
}
|
||||
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler="mrustc"),target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(ForeignItemKind, 72);
|
||||
|
||||
impl From<ForeignItemKind> for ItemKind {
|
||||
|
||||
--- compiler/rustc_hir/src/hir.rs
|
||||
+++ compiler/rustc_hir/src/hir.rs
|
||||
@@ -3048,7 +3048,7 @@ impl<'hir> Node<'hir> {
|
||||
}
|
||||
|
||||
// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler="mrustc"),target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
mod size_asserts {
|
||||
rustc_data_structures::static_assert_size!(super::Block<'static>, 48);
|
||||
rustc_data_structures::static_assert_size!(super::Expr<'static>, 64);
|
||||
|
||||
--- compiler/rustc_middle/src/mir/interpret/error.rs
|
||||
+++ compiler/rustc_middle/src/mir/interpret/error.rs
|
||||
@@ -449,7 +449,7 @@ impl dyn MachineStopType {
|
||||
}
|
||||
}
|
||||
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler="mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
static_assert_size!(InterpError<'_>, 64);
|
||||
|
||||
pub enum InterpError<'tcx> {
|
||||
|
||||
--- compiler/rustc_middle/src/mir/mod.rs
|
||||
+++ compiler/rustc_middle/src/mir/mod.rs
|
||||
@@ -2200,7 +2200,7 @@ pub enum AggregateKind<'tcx> {
|
||||
Generator(DefId, SubstsRef<'tcx>, hir::Movability),
|
||||
}
|
||||
|
||||
-#[cfg(target_arch = "x86_64")]
|
||||
+#[cfg(all(not(rust_compiler="mrustc"), target_arch = "x86_64"))]
|
||||
static_assert_size!(AggregateKind<'_>, 48);
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, TyEncodable, TyDecodable, Hash, HashStable)]
|
||||
|
||||
--- compiler/rustc_middle/src/thir.rs
|
||||
+++ compiler/rustc_middle/src/thir.rs
|
||||
@@ -144,7 +144,7 @@ pub enum StmtKind<'tcx> {
|
||||
}
|
||||
|
||||
// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger.
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler="mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(Expr<'_>, 144);
|
||||
|
||||
/// The Thir trait implementor lowers their expressions (`&'tcx H::Expr`)
|
||||
|
||||
--- compiler/rustc_mir/src/interpret/operand.rs
|
||||
+++ compiler/rustc_mir/src/interpret/operand.rs
|
||||
@@ -32,7 +32,7 @@ pub enum Immediate<Tag = ()> {
|
||||
ScalarPair(ScalarMaybeUninit<Tag>, ScalarMaybeUninit<Tag>),
|
||||
}
|
||||
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(Immediate, 56);
|
||||
|
||||
impl<Tag> From<ScalarMaybeUninit<Tag>> for Immediate<Tag> {
|
||||
@@ -87,7 +87,7 @@ pub struct ImmTy<'tcx, Tag = ()> {
|
||||
pub layout: TyAndLayout<'tcx>,
|
||||
}
|
||||
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(ImmTy<'_>, 72);
|
||||
|
||||
impl<Tag: Copy> std::fmt::Display for ImmTy<'tcx, Tag> {
|
||||
|
||||
--- compiler/rustc_mir/src/interpret/place.rs
|
||||
+++ compiler/rustc_mir/src/interpret/place.rs
|
||||
@@ -88,7 +88,7 @@ pub enum Place<Tag = ()> {
|
||||
Local { frame: usize, local: mir::Local },
|
||||
}
|
||||
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(Place, 64);
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
@@ -97,7 +97,7 @@ pub struct PlaceTy<'tcx, Tag = ()> {
|
||||
pub layout: TyAndLayout<'tcx>,
|
||||
}
|
||||
|
||||
-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
+#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(PlaceTy<'_>, 80);
|
||||
|
||||
impl<'tcx, Tag> std::ops::Deref for PlaceTy<'tcx, Tag> {
|
||||
|
||||
#
|
||||
# Disable std_detect's detection logic (use the same logic as miri)
|
||||
#
|
||||
--- library/stdarch/crates/std_detect/src/detect/mod.rs
|
||||
+++ library/stdarch/crates/std_detect/src/detect/mod.rs
|
||||
@@ -86,7 +86,7 @@ mod bit;
|
||||
mod cache;
|
||||
|
||||
cfg_if! {
|
||||
- if #[cfg(miri)] {
|
||||
+ if #[cfg(any(miri, rust_compiler = "mrustc"))] {
|
||||
// When running under miri all target-features that are not enabled at
|
||||
// compile-time are reported as disabled at run-time.
|
||||
//
|
||||
|
||||
#
|
||||
# Disable crc32fast's use of stdarch
|
||||
#
|
||||
--- vendor/crc32fast/src/specialized/mod.rs
|
||||
+++ vendor/crc32fast/src/specialized/mod.rs
|
||||
@@ -1,5 +1,6 @@
|
||||
cfg_if! {
|
||||
if #[cfg(all(
|
||||
+ not(rust_compiler = "mrustc"),
|
||||
crc32fast_stdarchx86,
|
||||
any(target_arch = "x86", target_arch = "x86_64")
|
||||
))] {
|
||||
|
||||
#
|
||||
# Backport which is required to support arm64 on macOS 12
|
||||
# See: https://github.com/alexcrichton/curl-rust/commit/0aea09c428b9bc2bcf46da0fc33959fe3f03c74a
|
||||
#
|
||||
--- vendor/curl/src/lib.rs
|
||||
+++ vendor/curl/src/lib.rs
|
||||
@@ -82,6 +82,9 @@ pub mod easy;
|
||||
pub mod multi;
|
||||
mod panic;
|
||||
|
||||
+#[cfg(test)]
|
||||
+static INITIALIZED: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false);
|
||||
+
|
||||
/// Initializes the underlying libcurl library.
|
||||
///
|
||||
/// The underlying libcurl library must be initialized before use, and must be
|
||||
@@ -102,46 +105,62 @@ pub fn init() {
|
||||
/// Used to prevent concurrent or duplicate initialization.
|
||||
static INIT: Once = Once::new();
|
||||
|
||||
- /// An exported constructor function. On supported platforms, this will be
|
||||
- /// invoked automatically before the program's `main` is called.
|
||||
- #[cfg_attr(
|
||||
- any(target_os = "linux", target_os = "freebsd", target_os = "android"),
|
||||
- link_section = ".init_array"
|
||||
- )]
|
||||
- #[cfg_attr(target_os = "macos", link_section = "__DATA,__mod_init_func")]
|
||||
- #[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")]
|
||||
- static INIT_CTOR: extern "C" fn() = init_inner;
|
||||
+ INIT.call_once(|| {
|
||||
+ #[cfg(need_openssl_init)]
|
||||
+ openssl_probe::init_ssl_cert_env_vars();
|
||||
+ #[cfg(need_openssl_init)]
|
||||
+ openssl_sys::init();
|
||||
+
|
||||
+ unsafe {
|
||||
+ assert_eq!(curl_sys::curl_global_init(curl_sys::CURL_GLOBAL_ALL), 0);
|
||||
+ }
|
||||
+
|
||||
+ #[cfg(test)]
|
||||
+ {
|
||||
+ INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst);
|
||||
+ }
|
||||
+
|
||||
+ // Note that we explicitly don't schedule a call to
|
||||
+ // `curl_global_cleanup`. The documentation for that function says
|
||||
+ //
|
||||
+ // > You must not call it when any other thread in the program (i.e. a
|
||||
+ // > thread sharing the same memory) is running. This doesn't just mean
|
||||
+ // > no other thread that is using libcurl.
|
||||
+ //
|
||||
+ // We can't ever be sure of that, so unfortunately we can't call the
|
||||
+ // function.
|
||||
+ });
|
||||
+}
|
||||
|
||||
+/// An exported constructor function. On supported platforms, this will be
|
||||
+/// invoked automatically before the program's `main` is called. This is done
|
||||
+/// for the convenience of library users since otherwise the thread-safety rules
|
||||
+/// around initialization can be difficult to fulfill.
|
||||
+///
|
||||
+/// This is a hidden public item to ensure the symbol isn't optimized away by a
|
||||
+/// rustc/LLVM bug: https://github.com/rust-lang/rust/issues/47384. As long as
|
||||
+/// any item in this module is used by the final binary (which `init` will be)
|
||||
+/// then this symbol should be preserved.
|
||||
+#[used]
|
||||
+#[doc(hidden)]
|
||||
+#[cfg_attr(
|
||||
+ any(target_os = "linux", target_os = "freebsd", target_os = "android"),
|
||||
+ link_section = ".init_array"
|
||||
+)]
|
||||
+#[cfg_attr(target_os = "macos", link_section = "__DATA,__mod_init_func")]
|
||||
+#[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")]
|
||||
+pub static INIT_CTOR: extern "C" fn() = {
|
||||
/// This is the body of our constructor function.
|
||||
#[cfg_attr(
|
||||
any(target_os = "linux", target_os = "android"),
|
||||
link_section = ".text.startup"
|
||||
)]
|
||||
- extern "C" fn init_inner() {
|
||||
- INIT.call_once(|| {
|
||||
- #[cfg(need_openssl_init)]
|
||||
- openssl_sys::init();
|
||||
-
|
||||
- unsafe {
|
||||
- assert_eq!(curl_sys::curl_global_init(curl_sys::CURL_GLOBAL_ALL), 0);
|
||||
- }
|
||||
-
|
||||
- // Note that we explicitly don't schedule a call to
|
||||
- // `curl_global_cleanup`. The documentation for that function says
|
||||
- //
|
||||
- // > You must not call it when any other thread in the program (i.e.
|
||||
- // > a thread sharing the same memory) is running. This doesn't just
|
||||
- // > mean no other thread that is using libcurl.
|
||||
- //
|
||||
- // We can't ever be sure of that, so unfortunately we can't call the
|
||||
- // function.
|
||||
- });
|
||||
+ extern "C" fn init_ctor() {
|
||||
+ init();
|
||||
}
|
||||
|
||||
- // We invoke our init function through our static to ensure the symbol isn't
|
||||
- // optimized away by a bug: https://github.com/rust-lang/rust/issues/47384
|
||||
- INIT_CTOR();
|
||||
-}
|
||||
+ init_ctor
|
||||
+};
|
||||
|
||||
unsafe fn opt_str<'a>(ptr: *const libc::c_char) -> Option<&'a str> {
|
||||
if ptr.is_null() {
|
||||
@@ -158,3 +177,20 @@ fn cvt(r: curl_sys::CURLcode) -> Result<(), Error> {
|
||||
Err(Error::new(r))
|
||||
}
|
||||
}
|
||||
+
|
||||
+#[cfg(test)]
|
||||
+mod tests {
|
||||
+ use super::*;
|
||||
+
|
||||
+ #[test]
|
||||
+ #[cfg(any(
|
||||
+ target_os = "linux",
|
||||
+ target_os = "macos",
|
||||
+ target_os = "windows",
|
||||
+ target_os = "freebsd",
|
||||
+ target_os = "android"
|
||||
+ ))]
|
||||
+ fn is_initialized_before_main() {
|
||||
+ assert!(INITIALIZED.load(std::sync::atomic::Ordering::SeqCst));
|
||||
+ }
|
||||
+}
|
||||
|
||||
# PPV-Lite also needs to know that we're pretending to be miri
|
||||
--- vendor/ppv-lite86/src/lib.rs
|
||||
+++ vendor/ppv-lite86/src/lib.rs
|
||||
@@ -9,14 +9,14 @@ mod soft;
|
||||
mod types;
|
||||
pub use self::types::*;
|
||||
|
||||
-#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
|
||||
+#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler = "mrustc")))]
|
||||
pub mod x86_64;
|
||||
-#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
|
||||
+#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler = "mrustc")))]
|
||||
use self::x86_64 as arch;
|
||||
|
||||
-#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
|
||||
+#[cfg(any(miri, rust_compiler = "mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
|
||||
pub mod generic;
|
||||
-#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
|
||||
+#[cfg(any(miri, rust_compiler = "mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
|
||||
use self::generic as arch;
|
||||
|
||||
pub use self::arch::{vec128_storage, vec256_storage, vec512_storage};
|
|
@ -128,9 +128,9 @@ (define* (rust-bootstrapped-package base-rust version checksum)
|
|||
|
||||
;;; Note: mrustc's only purpose is to be able to bootstap Rust; it's designed
|
||||
;;; to be used in source form.
|
||||
(define %mrustc-commit "b6754f574f8846eb842feba4ccbeeecb10bdfacc")
|
||||
(define %mrustc-commit "5e01a76097265f4bb27b18885b9af3f2778180f9")
|
||||
(define %mrustc-source
|
||||
(let* ((version "0.10.1")
|
||||
(let* ((version "0.11.0")
|
||||
(commit %mrustc-commit)
|
||||
(revision "1")
|
||||
(name "mrustc"))
|
||||
|
@ -138,11 +138,11 @@ (define %mrustc-source
|
|||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/thepowersgang/mrustc")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(commit %mrustc-commit)))
|
||||
(file-name (git-file-name name (git-version version revision commit)))
|
||||
(sha256
|
||||
(base32
|
||||
"0rqiif7rb5hg6ik3i1flldj311f014q4n9z8wb50cs8kspjz32di"))
|
||||
(base32 "1yyjfl1z6d5r9sv7zl90kqyjw1lqd2cqzwh2syi7yvrpslhihrhy"))
|
||||
(patches (search-patches "mrustc-patches.patch"))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
'(begin
|
||||
|
@ -150,7 +150,10 @@ (define %mrustc-source
|
|||
;; by disabling debug by default.
|
||||
(substitute* (find-files "." "Makefile")
|
||||
(("LINKFLAGS := -g") "LINKFLAGS :=")
|
||||
(("-g ") "")))))))
|
||||
(("-g ") ""))
|
||||
;; Don't use the vendored openssl sources.
|
||||
(substitute* "minicargo.mk"
|
||||
(("--features vendored-openssl") "")))))))
|
||||
|
||||
;;; Rust 1.54 is special in that it is built with mrustc, which shortens the
|
||||
;;; bootstrap path.
|
||||
|
@ -177,26 +180,24 @@ (define-public rust-bootstrap
|
|||
;; Also remove the bundled (mostly Windows) libraries.
|
||||
;; find vendor -not -type d -exec file {} \+ | grep PE32
|
||||
(for-each delete-file
|
||||
(find-files "vendor" "\\.(a|dll|exe|lib)$"))))
|
||||
(patches (search-patches "rustc-1.54.0-src.patch"))
|
||||
(patch-flags '("-p0")))) ;default is -p1
|
||||
(find-files "vendor" "\\.(a|dll|exe|lib)$"))
|
||||
;; Adjust some sources for llvm-13, see llvm commit
|
||||
;; acce401068e78a8c5dc9e06802111ffad3da763f
|
||||
(substitute* (find-files "." "powerpc64le_unknown_linux_gnu.rs")
|
||||
(("e-m:e-i64:64-n32:64-v256:256:256-v512:512:512")
|
||||
"e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"))))))
|
||||
(outputs '("out" "cargo"))
|
||||
(properties '((hidden? . #t)
|
||||
(timeout . 129600) ;36 hours
|
||||
(max-silent-time . 18000))) ;5 hours (for armel)
|
||||
(build-system gnu-build-system)
|
||||
(inputs
|
||||
`(("bash-minimal" ,bash-minimal)
|
||||
,@(if (or (target-ppc64le?)
|
||||
(target-riscv64?))
|
||||
`(("clang" ,clang-13))
|
||||
`())
|
||||
("llvm" ,llvm-13)
|
||||
("openssl" ,openssl-1.1)
|
||||
("zlib" ,zlib)))
|
||||
(list bash-minimal
|
||||
llvm-13
|
||||
openssl-1.1
|
||||
zlib))
|
||||
(native-inputs
|
||||
`(("pkg-config" ,pkg-config)
|
||||
;; Required for the libstd sources.
|
||||
("mrustc-source" ,%mrustc-source)))
|
||||
(arguments
|
||||
`(#:imported-modules ,%cargo-utils-modules ;for `generate-all-checksums'
|
||||
|
@ -207,85 +208,49 @@ (define-public rust-bootstrap
|
|||
;; Rust's own .so library files are not found in any RUNPATH, but
|
||||
;; that doesn't seem to cause issues.
|
||||
#:validate-runpath? #f
|
||||
;; We currently see race conditions between various dependant crates.
|
||||
;; TODO: Re-evaluate after moving to a more recent mrustc.
|
||||
#:parallel-build? #f
|
||||
#:make-flags
|
||||
(list ,(string-append "RUSTC_TARGET="
|
||||
(platform-rust-target
|
||||
(lookup-platform-by-target-or-system
|
||||
(or (%current-target-system)
|
||||
(%current-system)))))
|
||||
,(string-append "RUSTC_VERSION=" version)
|
||||
,(string-append "MRUSTC_TARGET_VER="
|
||||
(version-major+minor version))
|
||||
;; mrustc expects a C11 compatible compiler. Use the default
|
||||
;; C language dialect from the GCC-10 compiler.
|
||||
;; This is necessary for some architectures.
|
||||
"CFLAGS=-std=gnu11"
|
||||
"OUTDIR_SUF=") ;do not add version suffix to output dir
|
||||
,#~(let ((source #$(package-source this-package)))
|
||||
(list (string-append "RUSTC_TARGET="
|
||||
#$(platform-rust-target
|
||||
(lookup-platform-by-target-or-system
|
||||
(or (%current-target-system)
|
||||
(%current-system)))))
|
||||
(string-append "RUSTC_VERSION=" #$version)
|
||||
(string-append "MRUSTC_TARGET_VER="
|
||||
#$(version-major+minor version))
|
||||
(string-append "RUSTC_SRC_TARBALL=" source)
|
||||
"OUTDIR_SUF=")) ;do not add version suffix to output dir
|
||||
#:phases
|
||||
(modify-phases %standard-phases
|
||||
,@(if (target-ppc64le?)
|
||||
`((add-after 'unpack 'patch-sources-for-newer-llvm
|
||||
(lambda _
|
||||
;; Adjust some sources for llvm-13, see llvm commit
|
||||
;; acce401068e78a8c5dc9e06802111ffad3da763f
|
||||
(substitute* (find-files "." "powerpc64le_unknown_linux_gnu.rs")
|
||||
(("e-m:e-i64:64-n32:64-v256:256:256-v512:512:512")
|
||||
"e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512")))))
|
||||
'())
|
||||
(add-after 'unpack 'setup-mrustc-sources
|
||||
(lambda* (#:key inputs #:allow-other-keys)
|
||||
(copy-recursively (assoc-ref inputs "mrustc-source") "../mrustc")
|
||||
;; The Makefile of mrustc expects the sources directory of rustc
|
||||
;; to be at this location, and it simplifies things to make it
|
||||
;; so.
|
||||
(symlink (getcwd)
|
||||
(string-append "../mrustc/rustc-" ,version "-src"))
|
||||
(with-output-to-file "dl-version"
|
||||
(lambda _
|
||||
(format #t "~a~%"
|
||||
,version)))))
|
||||
(add-after 'setup-mrustc-sources 'patch-makefiles
|
||||
(replace 'unpack
|
||||
(lambda* (#:key source inputs #:allow-other-keys)
|
||||
((assoc-ref %standard-phases 'unpack)
|
||||
#:source (assoc-ref inputs "mrustc-source"))))
|
||||
(add-after 'unpack 'patch-makefiles
|
||||
;; This disables building the (unbundled) LLVM.
|
||||
(lambda* (#:key inputs parallel-build? #:allow-other-keys)
|
||||
(let ((llvm (assoc-ref inputs "llvm")))
|
||||
(with-directory-excursion "../mrustc"
|
||||
(substitute* '("minicargo.mk"
|
||||
"run_rustc/Makefile")
|
||||
;; Use the system-provided LLVM.
|
||||
(("LLVM_CONFIG [:|?]= .*")
|
||||
(string-append "LLVM_CONFIG := " llvm "/bin/llvm-config\n")))
|
||||
(substitute* "minicargo.mk"
|
||||
;; Do not try to fetch sources from the Internet.
|
||||
(("@curl.*") "")
|
||||
(("\\$\\(MINICARGO\\) \\$\\(RUSTC_SRC_DL\\)")
|
||||
"$(MINICARGO)"))
|
||||
(substitute* "Makefile"
|
||||
;; Patch date and git obtained version information.
|
||||
((" -D VERSION_GIT_FULLHASH=.*")
|
||||
(string-append
|
||||
" -D VERSION_GIT_FULLHASH=\\\"" ,%mrustc-commit "\\\""
|
||||
" -D VERSION_GIT_BRANCH=\\\"master\\\""
|
||||
" -D VERSION_GIT_SHORTHASH=\\\""
|
||||
,(string-take %mrustc-commit 7) "\\\""
|
||||
" -D VERSION_BUILDTIME="
|
||||
"\"\\\"Thu, 01 Jan 1970 00:00:01 +0000\\\"\""
|
||||
" -D VERSION_GIT_ISDIRTY=0\n")))
|
||||
(substitute* "run_rustc/Makefile"
|
||||
;; Patch the shebang of a generated wrapper for rustc
|
||||
(("#!/bin/sh")
|
||||
(string-append "#!" (which "sh"))))
|
||||
(substitute* "run_rustc/rustc_proxy.sh"
|
||||
(("#!/bin/sh")
|
||||
(string-append "#!" (which "sh"))))))))
|
||||
(add-after 'patch-generated-file-shebangs 'patch-cargo-checksums
|
||||
(lambda _
|
||||
(substitute* "Cargo.lock"
|
||||
(("(checksum = )\".*\"" all name)
|
||||
(string-append name "\"" ,%cargo-reference-hash "\"")))
|
||||
(generate-all-checksums "vendor")))
|
||||
(lambda* (#:key inputs #:allow-other-keys)
|
||||
(substitute* '("minicargo.mk"
|
||||
"run_rustc/Makefile")
|
||||
;; Use the system-provided LLVM.
|
||||
(("LLVM_CONFIG [:|?]= .*")
|
||||
(string-append "LLVM_CONFIG := "
|
||||
(search-input-file inputs "/bin/llvm-config") "\n")))
|
||||
(substitute* "Makefile"
|
||||
;; Patch date and git obtained version information.
|
||||
((" -D VERSION_GIT_FULLHASH=.*")
|
||||
(string-append
|
||||
" -D VERSION_GIT_FULLHASH=\\\"" ,%mrustc-commit "\\\""
|
||||
" -D VERSION_GIT_BRANCH=\\\"master\\\""
|
||||
" -D VERSION_GIT_SHORTHASH=\\\""
|
||||
,(string-take %mrustc-commit 7) "\\\""
|
||||
" -D VERSION_BUILDTIME="
|
||||
"\"\\\"Thu, 01 Jan 1970 00:00:01 +0000\\\"\""
|
||||
" -D VERSION_GIT_ISDIRTY=0\n")))
|
||||
(substitute* '("run_rustc/Makefile"
|
||||
"run_rustc/rustc_proxy.sh")
|
||||
;; Patch the shebang of a generated wrapper for rustc
|
||||
(("#!/bin/sh")
|
||||
(string-append "#!" (which "sh"))))))
|
||||
(add-before 'configure 'configure-cargo-home
|
||||
(lambda _
|
||||
(let ((cargo-home (string-append (getcwd) "/.cargo")))
|
||||
|
@ -293,12 +258,8 @@ (define-public rust-bootstrap
|
|||
(setenv "CARGO_HOME" cargo-home))))
|
||||
(replace 'configure
|
||||
(lambda _
|
||||
,@(if (or (target-ppc64le?)
|
||||
(target-riscv64?))
|
||||
`((setenv "CC" "clang")
|
||||
(setenv "CXX" "clang++"))
|
||||
`((setenv "CC" "gcc")
|
||||
(setenv "CXX" "g++")))
|
||||
(setenv "CC" "gcc")
|
||||
(setenv "CXX" "g++")
|
||||
;; The Guix LLVM package installs only shared libraries.
|
||||
(setenv "LLVM_LINK_SHARED" "1")
|
||||
;; rustc still insists on having 'cc' on PATH in some places
|
||||
|
@ -314,7 +275,6 @@ (define-public rust-bootstrap
|
|||
1)))
|
||||
;; Adapted from:
|
||||
;; https://github.com/dtolnay/bootstrap/blob/master/build-1.54.0.sh.
|
||||
(chdir "../mrustc")
|
||||
;; Use PARLEVEL since both minicargo and mrustc use it
|
||||
;; to set the level of parallelism.
|
||||
(setenv "PARLEVEL" (number->string job-count))
|
||||
|
@ -335,15 +295,6 @@ (define-public rust-bootstrap
|
|||
(apply invoke "make" "-f" "minicargo.mk" "output/rustc"
|
||||
make-flags)
|
||||
|
||||
;; We can to continue the build with gcc after building rustc.
|
||||
;; librustc_driver.so undefined reference to
|
||||
;; `llvm::cfg::Update<llvm::BasicBlock*>::dump() const'
|
||||
,@(if (or (target-ppc64le?)
|
||||
(target-riscv64?))
|
||||
`((setenv "CC" "gcc")
|
||||
(setenv "CXX" "g++"))
|
||||
`())
|
||||
|
||||
(display "Building cargo...\n")
|
||||
(apply invoke "make" "-f" "minicargo.mk" "output/cargo"
|
||||
make-flags)
|
||||
|
|
Loading…
Reference in a new issue