summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/patches/rust-1.19-mrustc.patch28
-rw-r--r--gnu/packages/rust.scm127
3 files changed, 152 insertions, 4 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 3b92a7ac0e..91de38c5a3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1124,6 +1124,7 @@ dist_patch_DATA = \
%D%/packages/patches/ruby-concurrent-test-arm.patch \
%D%/packages/patches/ruby-rack-ignore-failing-test.patch \
%D%/packages/patches/ruby-tzinfo-data-ignore-broken-test.patch\
+ %D%/packages/patches/rust-1.19-mrustc.patch \
%D%/packages/patches/rust-bootstrap-stage0-test.patch \
%D%/packages/patches/rust-coresimd-doctest.patch \
%D%/packages/patches/rxvt-unicode-escape-sequences.patch \
diff --git a/gnu/packages/patches/rust-1.19-mrustc.patch b/gnu/packages/patches/rust-1.19-mrustc.patch
new file mode 100644
index 0000000000..261162172e
--- /dev/null
+++ b/gnu/packages/patches/rust-1.19-mrustc.patch
@@ -0,0 +1,28 @@
+See https://github.com/thepowersgang/mrustc/archive/v0.8.0.tar.gz
+
+--- rustc-1.19.0-src-orig/src/libcore/intrinsics.rs
++++ rustc-1.19.0-src/src/libcore/intrinsics.rs
+@@ -678,5 +678,9 @@
+ pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize;
+
++ /// Obtain the length of a slice pointer
++ #[cfg(rust_compiler="mrustc")]
++ pub fn mrustc_slice_len<T>(pointer: *const [T]) -> usize;
++
+ /// Gets a static string slice containing the name of a type.
+ pub fn type_name<T: ?Sized>() -> &'static str;
+
+--- rustc-1.19.0-src-orig/src/libcore/slice/mod.rs
++++ rustc-1.19.0-src/src/libcore/slice/mod.rs
+@@ -413,6 +413,8 @@
+ #[inline]
+ fn len(&self) -> usize {
+- unsafe {
+- mem::transmute::<&[T], Repr<T>>(self).len
+- }
++ #[cfg(not(rust_compiler="mrustc"))]
++ let rv = unsafe { mem::transmute::<&[T], Repr<T>>(self).len };
++ #[cfg(rust_compiler="mrustc")]
++ let rv = unsafe { ::intrinsics::mrustc_slice_len(self) };
++ rv
+ }
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 0695f8c7d2..41195c0e10 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -171,10 +171,12 @@ in turn be used to build the final Rust.")
(package
(name "rust")
(version "1.19.0")
- (source (rust-source version "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"))
+ (source (rust-source version "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm"
+ #:patches '("rust-1.19-mrustc.patch")))
(outputs '("out" "cargo"))
(arguments
`(#:imported-modules ,%cargo-build-system-modules ;for `generate-checksums'
+ #:modules ((guix build utils) (ice-9 match) (guix build gnu-build-system))
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'set-env
@@ -187,6 +189,24 @@ in turn be used to build the final Rust.")
;; guix llvm-3.9.1 package installs only shared libraries
(setenv "LLVM_LINK_SHARED" "1")
#t))
+ (add-after 'unpack 'patch-cargo-tomls
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (substitute* "src/librustc_errors/Cargo.toml"
+ (("[[]dependencies[]]") "
+[dependencies]
+term = \"0.4.4\"
+"))
+ (substitute* "src/librustc/Cargo.toml"
+ (("[[]dependencies[]]") "
+[dependencies]
+getopts = { path = \"../libgetopts\" }
+"))
+ (substitute* "src/librustdoc/Cargo.toml"
+ (("[[]dependencies[]]") "
+[dependencies]
+test = { path = \"../libtest\" }
+"))
+ #t))
(add-after 'unpack 'patch-tests
(lambda* (#:key inputs #:allow-other-keys)
(let ((bash (assoc-ref inputs "bash")))
@@ -243,12 +263,97 @@ in turn be used to build the final Rust.")
(generate-checksums dir ,%cargo-reference-project-file)))
(find-files "src/vendor" ".cargo-checksum.json"))
#t))
+ ;; This phase is overridden by newer versions.
(replace 'configure
(const #t))
+ ;; This phase is overridden by newer versions.
+ (replace 'build
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let ((rustc-bootstrap (assoc-ref inputs "rustc-bootstrap")))
+ (setenv "CFG_COMPILER_HOST_TRIPLE"
+ ,(nix-system->gnu-triplet (%current-system)))
+ (setenv "CFG_RELEASE" "")
+ (setenv "CFG_RELEASE_CHANNEL" "stable")
+ (setenv "CFG_LIBDIR_RELATIVE" "lib")
+ (setenv "CFG_VERSION" "1.19.0-stable-mrustc")
+ ; bad: (setenv "CFG_PREFIX" "mrustc") ; FIXME output path.
+ (mkdir-p "output")
+ (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
+ "src/rustc" "--vendor-dir" "src/vendor"
+ "--output-dir" "output/rustc-build"
+ "-L" (string-append rustc-bootstrap "/lib/mrust")
+ "-j" "1")
+ (install-file "output/rustc-build/rustc" "output") ; FIXME: Remove?
+ (setenv "CFG_COMPILER_HOST_TRIPLE" #f)
+ (setenv "CFG_RELEASE" #f)
+ (setenv "CFG_RELEASE_CHANNEL" #f)
+ (setenv "CFG_VERSION" #f)
+ (setenv "CFG_PREFIX" #f)
+ (setenv "CFG_LIBDIR_RELATIVE" #f)
+ (invoke (string-append rustc-bootstrap "/tools/bin/minicargo")
+ "src/tools/cargo" "--vendor-dir" "src/vendor"
+ "--output-dir" "output/cargo-build"
+ "-L" "output/"
+ "-L" (string-append rustc-bootstrap "/lib/mrust")
+ "-j" "1")
+ ;; Now use the newly-built rustc to build the libraries.
+ ;; One day that could be replaced by:
+ ;; (invoke "output/cargo-build/cargo" "build"
+ ;; "--manifest-path" "src/bootstrap/Cargo.toml"
+ ;; "--verbose") ; "--locked" "--frozen"
+ ;; but right now, Cargo has problems with libstd's circular
+ ;; dependencies.
+ (mkdir-p "output/target-libs")
+ (for-each ((@ (ice-9 match) match-lambda)
+ ((name . flags)
+ (write name)
+ (newline)
+ (apply invoke
+ "output/rustc-build/rustc"
+ "-C" (string-append "linker="
+ (getenv "CC"))
+ "-L" "output/target-libs"
+ (string-append "src/" name "/lib.rs")
+ "-o"
+ (string-append "output/target-libs/"
+ (car (string-split name #\/))
+ ".rlib")
+ flags)))
+ '(("libcore")
+ ("libstd_unicode")
+ ("liballoc")
+ ("libcollections")
+ ("librand")
+ ("liblibc/src" "--cfg" "stdbuild")
+ ("libunwind" "-l" "gcc_s")
+ ("libcompiler_builtins")
+ ("liballoc_system")
+ ("libpanic_unwind")
+ ;; Uses "cc" to link.
+ ("libstd" "-l" "dl" "-l" "rt" "-l" "pthread")
+ ("libarena")))
+ #t)))
+ ;; This phase is overridden by newer versions.
(replace 'check
(const #t))
+ ;; This phase is overridden by newer versions.
(replace 'install
- (const #t)))))
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (target-system ,(or (%current-target-system)
+ (nix-system->gnu-triplet
+ (%current-system))))
+ (out-libs (string-append out "/lib/rustlib/"
+ target-system "/lib")))
+ ;(setenv "CFG_PREFIX" out)
+ (mkdir-p out-libs)
+ (copy-recursively "output/target-libs" out-libs)
+ (install-file "output/rustc-build/rustc"
+ (string-append out "/bin"))
+ (install-file "output/cargo-build/cargo"
+ (string-append (assoc-ref outputs "cargo")
+ "/bin")))
+ #t)))))
(build-system gnu-build-system)
(native-inputs
`(("bison" ,bison) ; For the tests
@@ -258,8 +363,8 @@ in turn be used to build the final Rust.")
("git" ,git)
("procps" ,procps) ; For the tests
("python-2" ,python-2)
- ("rustc-bootstrap" ,rust-bootstrap)
- ("cargo-bootstrap" ,rust-bootstrap "cargo")
+ ("rustc-bootstrap" ,mrustc)
+ ("cargo-bootstrap" ,mrustc "cargo")
("pkg-config" ,pkg-config) ; For "cargo"
("which" ,which)))
(inputs
@@ -400,6 +505,18 @@ safety and thread safety guarantees.")
(version "1.23.0")
(source (rust-source version "14fb8vhjzsxlbi6yrn1r6fl5dlbdd1m92dn5zj5gmzfwf4w9ar3l"))
(outputs '("out" "doc" "cargo"))
+ (native-inputs
+ `(("bison" ,bison) ; For the tests
+ ("cmake" ,cmake)
+ ("flex" ,flex) ; For the tests
+ ("gdb" ,gdb) ; For the tests
+ ("git" ,git)
+ ("procps" ,procps) ; For the tests
+ ("python-2" ,python-2)
+ ("rustc-bootstrap" ,rust-bootstrap)
+ ("cargo-bootstrap" ,rust-bootstrap "cargo")
+ ("pkg-config" ,pkg-config) ; For "cargo"
+ ("which" ,which)))
(arguments
(substitute-keyword-arguments (package-arguments rust-1.19)
((#:phases phases)
@@ -410,6 +527,8 @@ safety and thread safety guarantees.")
(substitute* "src/binaryen/CMakeLists.txt"
(("ADD_COMPILE_FLAG\\(\\\"-march=native\\\"\\)") ""))
#t))
+ ;; TODO: Revisit this and find out whether that's needed after all.
+ (delete 'patch-cargo-tomls)
(add-after 'patch-tests 'patch-cargo-tests
(lambda _
(substitute* "src/tools/cargo/tests/build.rs"