unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Federico Beffa <beffa@ieee.org>
To: Guix-devel <guix-devel@gnu.org>
Subject: Re: [PATCH 3/3] gnu: Add ghc.
Date: Sun, 1 Mar 2015 13:44:57 +0100	[thread overview]
Message-ID: <CAKrPhPPu8qYSkyJ5gRy-TOPY7K0dPAFCZdcGU8kYNd-bTg82KQ@mail.gmail.com> (raw)
In-Reply-To: <CAKrPhPMkwMyJhUCdd6_QkV8XPuUMLpYsufu6+t6m=hLUGLu6=g@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

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

[-- Attachment #2: 0001-gnu-Add-ghc.patch --]
[-- Type: text/x-diff, Size: 10847 bytes --]

From c39f2fa29bd614227f501cb83f72e2aa827a9123 Mon Sep 17 00:00:00 2001
From: Federico Beffa <beffa@fbengineering.ch>
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 <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 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


  reply	other threads:[~2015-03-01 12:45 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-26 19:54 [PATCH 3/3] gnu: Add ghc Federico Beffa
2015-03-01 12:44 ` Federico Beffa [this message]
2015-03-01 14:55   ` Ludovic Courtès
2015-03-02  6:29   ` Mark H Weaver
2015-03-02 11:09     ` Federico Beffa
2015-03-03 12:24       ` Ludovic Courtès
2015-03-05  8:26         ` Federico Beffa
2015-03-08 21:36           ` Ludovic Courtès
2015-03-21 23:21           ` Mark H Weaver
  -- strict thread matches above, loose matches on Subject: below --
2015-03-22 20:31 Federico Beffa
2015-03-25 21:20 ` Ludovic Courtès
2015-03-28 19:15   ` Federico Beffa
2015-03-31 19:31     ` Mark H Weaver

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKrPhPPu8qYSkyJ5gRy-TOPY7K0dPAFCZdcGU8kYNd-bTg82KQ@mail.gmail.com \
    --to=beffa@ieee.org \
    --cc=guix-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).