diff options
-rw-r--r-- | gnu-system.am | 1 | ||||
-rw-r--r-- | gnu/packages/haskell.scm | 231 |
2 files changed, 232 insertions, 0 deletions
diff --git a/gnu-system.am b/gnu-system.am index 5d981cb8bf..b65c249fc7 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -145,6 +145,7 @@ GNU_SYSTEM_MODULES = \ gnu/packages/guile-wm.scm \ gnu/packages/gv.scm \ gnu/packages/gxmessage.scm \ + gnu/packages/haskell.scm \ gnu/packages/hugs.scm \ gnu/packages/hurd.scm \ gnu/packages/icu4c.scm \ diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm new file mode 100644 index 0000000000..04c69a8dca --- /dev/null +++ b/gnu/packages/haskell.scm @@ -0,0 +1,231 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch> +;;; +;;; 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 bootstrap) + #: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 binaries 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) + (srfi srfi-1)) + #: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")) + ;; We need to install an UTF-8 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") + (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")) + #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 + 'install-bin 'configure-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") + ,(glibc-dynamic-linker))) + (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")) + (setenv "PATH" + (string-append (getenv "PATH") ":" + ghc-bootstrap-prefix "/bin")) + (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))))) + (alist-cons-before + 'configure 'install-bin + (lambda* (#:key inputs outputs #:allow-other-keys) + (with-directory-excursion + (string-append ghc-bootstrap-path "/" ,name "-" ,version) + (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 compiler and +interactive environment for the functional language Haskell.") + (license bsd-3))) + +;;; haskell.scm ends here |