From 423f9e4494859d1320aca171c1c61f204737c6bb Mon Sep 17 00:00:00 2001 From: David Craven Date: Thu, 22 Sep 2016 15:04:14 +0200 Subject: [PATCH] gnu: Add rust bootstrap binaries. * gnu/packages/rust.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add rust.scm. --- gnu/local.mk | 1 + gnu/packages/rust.scm | 184 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 gnu/packages/rust.scm diff --git a/gnu/local.mk b/gnu/local.mk index a06f359435..739d92a7b0 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -321,6 +321,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/rsync.scm \ %D%/packages/ruby.scm \ %D%/packages/rush.scm \ + %D%/packages/rust.scm \ %D%/packages/samba.scm \ %D%/packages/sawfish.scm \ %D%/packages/scanner.scm \ diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm new file mode 100644 index 0000000000..0ed3df922f --- /dev/null +++ b/gnu/packages/rust.scm @@ -0,0 +1,184 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 David Craven +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu packages rust) + #:use-module (gnu packages base) + #:use-module (gnu packages bootstrap) + #:use-module (gnu packages compression) + #:use-module (gnu packages elf) + #:use-module (gnu packages gcc) + #:use-module (guix build-system gnu) + #:use-module (guix build-system trivial) + #:use-module (guix download) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (ice-9 match) + #:use-module (srfi srfi-26)) + +;; Should be one less than the current released version. +(define %rust-bootstrap-binaries-version "1.12.1") + +(define %rust-bootstrap-binaries + (origin + (method url-fetch) + (uri (string-append + "https://static.rust-lang.org/dist/" + "rust-" %rust-bootstrap-binaries-version + "-i686-unknown-linux-gnu.tar.gz")) + (sha256 + (base32 + "1cvbx7bbhbn3w6pn64rp9fdp2n17rwzxgsnifncw5nqx9p8vksgd")))) + +(define (increment-rust-version rust-version major patch) + (match (string-split rust-version #\.) + (("1" minor _) + (string-append (number->string major) "." + (number->string (+ (string->number minor) 1)) "." + (number->string patch))))) + +(define* (cargo-version rustc-version #:optional (patch 0)) + ;; Computes the cargo version that matches the rustc version. + ;; https://github.com/rust-lang/cargo#Releases + (increment-rust-version rustc-version 0 patch)) + +(define* (rustc-version bootstrap-version #:optional (patch 0)) + ;; Computes the rustc version that can be compiled from a given + ;; other rustc version. The patch argument is for selecting + ;; a stability or security fix. 1.11.0 -> 1.12.1 -> 1.13.0 + (increment-rust-version bootstrap-version 1 patch)) + +(define rustc-bootstrap + (package + (name "rustc-bootstrap") + (version %rust-bootstrap-binaries-version) + (source %rust-bootstrap-binaries) + (build-system gnu-build-system) + (native-inputs + `(("patchelf" ,patchelf))) + (inputs + `(("gcc:lib" ,(canonical-package gcc) "lib") + ("zlib" ,zlib))) + (arguments + `(#:tests? #f + #:strip-binaries? #f + #:system "i686-linux" + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (gcc:lib (assoc-ref inputs "gcc:lib")) + (libc (assoc-ref inputs "libc")) + (zlib (assoc-ref inputs "zlib")) + (ld-so (string-append libc + ,(glibc-dynamic-linker "i686-linux"))) + (rpath (string-append out "/lib:" zlib "/lib:" + libc "/lib:" gcc:lib "/lib")) + (rustc (string-append out "/bin/rustc")) + (rustdoc (string-append out "/bin/rustdoc"))) + (system* "bash" "install.sh" + (string-append "--prefix=" out) + (string-append "--components=rustc," + "rust-std-i686-unknown-linux-gnu")) + (for-each (lambda (file) + (system* "patchelf" "--set-rpath" rpath file)) + (cons* rustc rustdoc (find-files out "\\.so$"))) + (for-each (lambda (file) + (system* "patchelf" "--set-interpreter" ld-so file)) + (list rustc rustdoc)))))))) + (supported-systems '("i686-linux" "x86_64-linux")) + (home-page "https://www.rust-lang.org") + (synopsis "Prebuilt rust compiler") + (description "This package provides a pre-built @command{rustc} compiler, +which can in turn be used to build the final Rust compiler.") + (license license:asl2.0))) + +;; FIXME: Make private once cargo is packaged. Is currently used by the +;; cargo-build-system. +(define-public cargo-bootstrap + (package + (name "cargo-bootstrap") + (version (cargo-version %rust-bootstrap-binaries-version)) + (source %rust-bootstrap-binaries) + (build-system gnu-build-system) + (native-inputs + `(("patchelf" ,patchelf))) + (inputs + `(("gcc:lib" ,(canonical-package gcc) "lib"))) + (arguments + `(#:tests? #f + #:strip-binaries? #f + #:system "i686-linux" + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (gcc:lib (assoc-ref inputs "gcc:lib")) + (libc (assoc-ref inputs "libc")) + (ld-so (string-append libc + ,(glibc-dynamic-linker "i686-linux"))) + (rpath (string-append out "/lib:" libc "/lib:" + gcc:lib "/lib")) + (cargo (string-append out "/bin/cargo"))) + (system* "bash" "install.sh" + (string-append "--prefix=" out) + "--components=cargo") + (system* "patchelf" + "--set-interpreter" ld-so + "--set-rpath" rpath + cargo))))))) + (supported-systems '("i686-linux" "x86_64-linux")) + (home-page "https://www.rust-lang.org") + (synopsis "Prebuilt cargo package manager") + (description "This package provides a pre-built @command{cargo} package +manager, which is required to build itself.") + (license license:asl2.0))) + +(define rust-bootstrap + (package + (name "rust-bootstrap") + (version %rust-bootstrap-binaries-version) + (source #f) + (build-system trivial-build-system) + (propagated-inputs + `(("rustc-bootstrap" ,rustc-bootstrap) + ("cargo-bootstrap" ,cargo-bootstrap) + ("gcc" ,(canonical-package gcc)))) + (arguments + `(#:modules ((guix build utils)) + #:builder + (begin + (use-modules (guix build utils)) + (let ((out (assoc-ref %outputs "out")) + (gcc (assoc-ref %build-inputs "gcc"))) + (mkdir-p (string-append out "/bin")) + ;; Rust requires a C toolchain for linking. The prebuilt + ;; binaries expect a compiler called cc. Thus symlink gcc + ;; to cc. + (symlink (string-append gcc "/bin/gcc") + (string-append out "/bin/cc")))))) + (home-page "https://www.rust-lang.org") + (synopsis "Rust bootstrapping meta package") + (description "Meta package for a rust environment. Provides pre-compiled +rustc-bootstrap and cargo-bootstrap packages.") + (license license:asl2.0)))