From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Craven Subject: [PATCH 07/12] gnu: Add rust bootstrap binaries. Date: Sun, 11 Dec 2016 18:25:32 +0100 Message-ID: <20161211172537.23315-8-david@craven.ch> References: <20161211172537.23315-1-david@craven.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:46350) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cG7tG-0008Sg-R8 for guix-devel@gnu.org; Sun, 11 Dec 2016 12:26:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cG7tF-0001Eg-1h for guix-devel@gnu.org; Sun, 11 Dec 2016 12:26:22 -0500 Received: from so254-10.mailgun.net ([198.61.254.10]:44394) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cG7tE-00016p-TD for guix-devel@gnu.org; Sun, 11 Dec 2016 12:26:20 -0500 In-Reply-To: <20161211172537.23315-1-david@craven.ch> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: guix-devel@gnu.org * gnu/packages/rust.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add rust.scm. --- gnu/local.mk | 1 + gnu/packages/rust.scm | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 gnu/packages/rust.scm diff --git a/gnu/local.mk b/gnu/local.mk index 98a7f65ca..246057f69 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 000000000..34f87c689 --- /dev/null +++ b/gnu/packages/rust.scm @@ -0,0 +1,190 @@ +;;; 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 commencement) + #: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/" + ;; TODO: Maybe use the i686 binary for bootstrapping rustc on i686 and + ;; x86_64 to minimize the number binaries. + "rust-" %rust-bootstrap-binaries-version + "-x86_64-unknown-linux-gnu.tar.gz")) + (sha256 + (base32 + ;; 1.13.0 "1vaicmm0z6wlqdhshry14mfqgayp5n9pxs31h41w26mqn5rc7x4m" + "0k4qz7d0vd7z2sm4z7lpdhaaz9gbcx78yv6qladl52g32gn6lm4y")))) + +(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 (system->rust-platform system) + (cond + ((string-prefix? "x86_64" system) "x86_64-unknown-linux-gnu") + ((string-prefix? "i686" system) "i686-unknown-linux-gnu") + (else #f))) + +(define-public 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 + ;; FIXME: Use system gcc:lib. Does gcc "lib" need to be + ;; added to %final-inputs? + `(("gcc:lib" ,gcc "lib") + ("zlib" ,zlib))) + (arguments + `(#:tests? #f + #:strip-binaries? #f + #: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 (assoc-ref inputs "gcc")) + (gcc:lib (assoc-ref inputs "gcc:lib")) + (libc (assoc-ref inputs "libc")) + (zlib (assoc-ref inputs "zlib")) + (platform ,(system->rust-platform (%current-system))) + (ld-so (string-append (assoc-ref inputs "libc") + ,(glibc-dynamic-linker))) + (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-" platform)) + (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)) + ;; Rust requires a gcc toolchain for linking. It + ;; looks for a compiler named cc in it's path. This + ;; can probably be configured during the build. + (symlink (string-append gcc "/bin/gcc") + (string-append out "/bin/cc")))))))) + (home-page "https://www.rust-lang.org") + (synopsis "Rustc bootstrap") + (description "This package prepares the rustc binary for bootstrapping +the rustc package.") + (license license:asl2.0))) + +(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 + ;; FIXME: See rustc-bootstrap. + `(("gcc:lib" ,gcc "lib"))) + (arguments + `(#:tests? #f + #:strip-binaries? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (platform ,(system->rust-platform (%current-system))) + (gcc:lib (assoc-ref inputs "gcc:lib")) + (libc (assoc-ref inputs "libc")) + (ld-so (string-append libc ,(glibc-dynamic-linker))) + (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))))))) + (home-page "https://www.rust-lang.org") + (synopsis "Cargo bootstrap") + (description "This package prepares the cargo binary for bootstrapping +the cargo package and it's dependencies. When rustc is build using the new +rustbuild build system it also requires cargo. The gnu build system is going +to be deprecated.") + (license license:asl2.0))) + +(define-public rust-bootstrap + (package + (name "rust-bootstrap") + (version %rust-bootstrap-binaries-version) + (source #f) + (build-system trivial-build-system) + (propagated-inputs + ;; XXX: guix size shows a size of zero. Are propagated inputs not + ;; counted? + `(("rustc-bootstrap" ,rustc-bootstrap) + ("cargo-bootstrap" ,cargo-bootstrap))) + (arguments + `(#:builder + (begin (mkdir (assoc-ref %outputs "out"))))) + (home-page "https://www.rust-lang.org") + (synopsis "Rust bootstrap") + (description "Meta package for rustc and cargo bootstrap packages.") + (license license:asl2.0))) -- 2.11.0