Attached a new patch that hopefully addresses the concerns expressed in this thread: https://lists.gnu.org/archive/html/guix-devel/2015-02/msg00814.html
I do not create a ready to use bootstrap package because the resulting store entry amounts to 940MB! I just keep an unmodified fixed version tarball (68MB) and take care to patch it in custom phases of the final GHC package. This is to avoid having to transfer almost 1GB of data each time we need to rebuild GHC (due, e.g., to an update to a dependency) and is much faster. I took this route after suffering from extremely long and unreliable transfers of the TeXLive package. (Yes, I tend to use --no-substitutes for TeXLive, but when it needs to be transferred as a result of dependencies things get trickier.). Regards, Fede
From c39f2fa29bd614227f501cb83f72e2aa827a9123 Mon Sep 17 00:00:00 2001 From: Federico Beffa <[email protected]> Date: Wed, 25 Feb 2015 20:20:24 +0100 Subject: [PATCH] gnu: Add ghc. * gnu/packages/haskell.scm: New file. --- gnu/packages/haskell.scm | 222 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 gnu/packages/haskell.scm diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm new file mode 100644 index 0000000..b0630a9 --- /dev/null +++ b/gnu/packages/haskell.scm @@ -0,0 +1,222 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2015 Federico Beffa <[email protected]> +;;; +;;; 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 <http://www.gnu.org/licenses/>. + +(define-module (gnu packages haskell) + #:use-module (ice-9 regex) + #:use-module (guix licenses) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix utils) + #:use-module (guix build-system gnu) + #:use-module (gnu packages perl) + #:use-module (gnu packages elf) + #:use-module (gnu packages ghostscript) + #:use-module (gnu packages libffi) + #:use-module (gnu packages libedit) + #:use-module (gnu packages multiprecision) + #:use-module (gnu packages ncurses) + #:use-module (gnu packages python)) + +;; We use bootstrap bianries with a fix version which can be used to build +;; more versions of the GHC compiler. +(define ghc-bootstrap-7.8.4 + (origin + (method url-fetch) + (uri (string-append "https://www.haskell.org/ghc/dist/" + "7.8.4/ghc-7.8.4-" + (if (string-match "x86_64" (%current-system)) + "x86_64" + "i386") + "-unknown-linux-deb7.tar.xz")) + (sha256 + (base32 + (if (string-match "x86_64" (%current-system)) + "13azsl53xgj20mi1hj9x0xb32vvcvs6cpmvwx6znxhas7blh0bpn" + "0wj5s435j0zgww70bj1d3f6wvnnpzlxwvwcyh2qv4qjq5z8j64kg"))))) + +;; 43 tests out of 3965 fail. +;; +;; Most of them do not appear to be serious: +;; +;; - some tests generate files referring to "/bin/sh" and "/bin/ls". I've not +;; figured out how these references are generated. +;; +;; - Some tests allocate more memory than expected (ca. 3% above upper limit) +;; +;; - Some tests try to load unavailable libriries: Control.Concurrent.STM, +;; Data.Vector, Control.Monad.State. +;; +;; - Test posix010 tries to check the existence of a user on the system: +;; getUserEntryForName: does not exist (no such user) +(define-public ghc + (package + (name "ghc") + (version "7.8.4") + (source + (origin + (method url-fetch) + (uri (string-append "https://www.haskell.org/ghc/dist/" + version "/" name "-" version "-src.tar.xz")) + (sha256 + (base32 + "1i4254akbb4ym437rf469gc0m40bxm31blp6s1z1g15jmnacs6f3")))) + (build-system gnu-build-system) + (supported-systems '("i686-linux" "x86_64-linux")) + (outputs '("out" "doc")) + (inputs + `(("gmp" ,gmp) + ("ncurses" ,ncurses) + ("libffi" ,libffi) + ("libedit" ,libedit) + ("ghc-testsuite" + ,(origin + (method url-fetch) + (uri (string-append + "https://www.haskell.org/ghc/dist/" + version "/" name "-" version "-testsuite.tar.xz")) + (sha256 + (base32 + "0q95whf87y4mxjzwzy899g7z7l9pazq4si6iciyhxkcdhqq2ycyh")))))) + (native-inputs + `(("perl" ,perl) + ("python" ,python-2) ; for tests (fails with python-3) + ("ghostscript" ,ghostscript) ; for tests + ("patchelf" ,patchelf) + ;; GHC is built with GHC. Therefore we need bootstrap binaries. + ("ghc-binary" ,ghc-bootstrap-7.8.4))) + (arguments + `(#:test-target "test" + ;; We get a smaller number of test failures by disabling parallel test + ;; execution. + #:parallel-tests? #f + #:modules ((guix build gnu-build-system) + (guix build utils) + (guix build rpath) + (srfi srfi-26)) + #:imported-modules ((guix build gnu-build-system) + (guix build utils) + (guix build rpath)) + #:configure-flags + (list + (string-append "--with-gmp-libraries=" + (assoc-ref %build-inputs "gmp") "/lib") + (string-append "--with-gmp-includes=" + (assoc-ref %build-inputs "gmp") "/include") + "--with-system-libffi" + (string-append "--with-ffi-libraries=" + (assoc-ref %build-inputs "libffi") "/lib") + (string-append "--with-ffi-includes=" + (assoc-ref %build-inputs "libffi") "/include")) + ;; FIXME: The user-guide needs dblatex, docbook-xsl and docbook-utils. + ;; Currently we do not have the last one. + ;; #:make-flags + ;; (list "BUILD_DOCBOOK_HTML = YES") + #:phases + (let* ((ghc-bootstrap-path + (string-append (getcwd) "/" ,name "-" ,version "/ghc-bin")) + (ghc-bootstrap-prefix + (string-append ghc-bootstrap-path "/usr" ))) + (alist-cons-after + 'unpack-bin 'unpack-and-fix-testsuite + (lambda* (#:key inputs outputs #:allow-other-keys) + (with-directory-excursion ".." + (copy-file (assoc-ref inputs "ghc-testsuite") + "ghc-testsuite.tar.xz") + (system* "tar" "xvf" "ghc-testsuite.tar.xz")) + (substitute* (list "testsuite/timeout/Makefile" + "testsuite/timeout/timeout.py" + "testsuite/timeout/timeout.hs" + "testsuite/tests/rename/prog006/Setup.lhs" + "testsuite/tests/programs/life_space_leak/life.test") + (("/bin/sh") (which "sh")) + (("/bin/rm") "rm")) + ;; We need to set the locale for the tests to produce results + ;; identical to the expected ones. + (system* "localedef" "--no-archive" + "--prefix" (getcwd) "-i" "en_US" + "-f" "UTF-8" "./en_US.UTF-8") + (setenv "LOCPATH" (getcwd)) + (setenv "LC_ALL" "en_US.UTF-8") + #t) + (alist-cons-after + 'unpack 'unpack-bin + (lambda* (#:key inputs outputs #:allow-other-keys) + (mkdir-p ghc-bootstrap-prefix) + (with-directory-excursion ghc-bootstrap-path + (copy-file (assoc-ref inputs "ghc-binary") + "ghc-bin.tar.xz") + (zero? (system* "tar" "xvf" "ghc-bin.tar.xz")))) + (alist-cons-before + 'configure 'install-bin + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((binaries + (list + "./utils/ghc-pwd/dist-install/build/tmp/ghc-pwd" + "./utils/hpc/dist-install/build/tmp/hpc" + "./utils/haddock/dist/build/tmp/haddock" + "./utils/hsc2hs/dist-install/build/tmp/hsc2hs" + "./utils/runghc/dist-install/build/tmp/runghc" + "./utils/ghc-cabal/dist-install/build/tmp/ghc-cabal" + "./utils/hp2ps/dist/build/tmp/hp2ps" + "./utils/ghc-pkg/dist-install/build/tmp/ghc-pkg" + "./utils/unlit/dist/build/tmp/unlit" + "./ghc/stage2/build/tmp/ghc-stage2")) + (gmp (assoc-ref inputs "gmp")) + (gmp-lib (string-append gmp "/lib")) + (gmp-include (string-append gmp "/include")) + (ncurses-lib + (string-append (assoc-ref inputs "ncurses") "/lib")) + (ld-so (string-append (assoc-ref inputs "libc") + "/lib/ld-linux-x86-64.so.2")) + (libtinfo-dir + (string-append ghc-bootstrap-prefix + "/lib/ghc-7.8.4/terminfo-0.4.0.0"))) + (with-directory-excursion + (string-append ghc-bootstrap-path "/" ,name "-" ,version) + (setenv "CONFIG_SHELL" (which "bash")) + (setenv "LD_LIBRARY_PATH" gmp-lib) + ;; The binaries have "/lib64/ld-linux-x86-64.so.2" hardcoded. + (for-each + (cut system* "patchelf" "--set-interpreter" ld-so <>) + binaries) + ;; The binaries include a reference to libtinfo.so.5 which is a + ;; subset of libncurses.so.5. We create a symlink in a + ;; directory included in the bootstrap binaries rpath. + (mkdir-p libtinfo-dir) + (symlink + (string-append ncurses-lib "/libncursesw.so." + ,(version-major+minor + (package-version ncurses))) + (string-append libtinfo-dir "/libtinfo.so.5")) + (system* (string-append (getcwd) "/configure") + (string-append "--prefix=" ghc-bootstrap-prefix) + (string-append "--with-gmp-libraries=" gmp-lib) + (string-append "--with-gmp-includes=" gmp-include)) + (setenv "PATH" + (string-append (getenv "PATH") ":" + ghc-bootstrap-prefix "/bin")) + (zero? (system* "make" "install"))))) + %standard-phases)))))) + (home-page "https://www.haskell.org/ghc") + (synopsis "The Glasgow Haskell Compiler") + (description + "The Glasgow Haskell Compiler (GHC) is a state-of-the-art, open source, +compiler and interactive environment for the functional language Haskell.") + (license bsd-3))) + +;;; haskell.scm ends here -- 2.2.1
