unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH 3/3] gnu: Add ghc.
@ 2015-02-26 19:54 Federico Beffa
  2015-03-01 12:44 ` Federico Beffa
  0 siblings, 1 reply; 13+ messages in thread
From: Federico Beffa @ 2015-02-26 19:54 UTC (permalink / raw)
  To: Guix-devel

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



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

From e68385d00809f2df5a1c1b7beefa4682d2a27a6e Mon Sep 17 00:00:00 2001
From: Federico Beffa <beffa@fbengineering.ch>
Date: Wed, 25 Feb 2015 20:20:24 +0100
Subject: [PATCH 3/3] gnu: Add ghc.

* gnu/packages/haskell.scm: New file.
---
 gnu/packages/haskell.scm | 218 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 218 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..a287ccb
--- /dev/null
+++ b/gnu/packages/haskell.scm
@@ -0,0 +1,218 @@
+;;; 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))
+
+;; 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"
+        ,(origin
+           (method url-fetch)
+           (uri (string-append "https://www.haskell.org/ghc/dist/"
+                               version "/" name "-" version "-"
+                               (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")))))))
+    (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


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-02-26 19:54 Federico Beffa
@ 2015-03-01 12:44 ` Federico Beffa
  2015-03-01 14:55   ` Ludovic Courtès
  2015-03-02  6:29   ` Mark H Weaver
  0 siblings, 2 replies; 13+ messages in thread
From: Federico Beffa @ 2015-03-01 12:44 UTC (permalink / raw)
  To: Guix-devel

[-- 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


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-01 12:44 ` Federico Beffa
@ 2015-03-01 14:55   ` Ludovic Courtès
  2015-03-02  6:29   ` Mark H Weaver
  1 sibling, 0 replies; 13+ messages in thread
From: Ludovic Courtès @ 2015-03-01 14:55 UTC (permalink / raw)
  To: Federico Beffa; +Cc: Guix-devel

Federico Beffa <beffa@ieee.org> skribis:

> 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.

Sounds good.

> 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.

[...]

> +;; 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)

All these seem workable: #1 and #4 should be easily fixed by adjusting
to the specifics of our build environment, and #2 and #3 might just need
to be skipped.  But let’s get this patch in first.  :-)

[...]

> +            (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"))

Perhaps (find-files "testsuite" ".*") would be enough?

> +            ;; We need to set the locale for the tests to produce results
> +            ;; identical to the expected ones.

s/set the locale/install a UTF-8 locale/ (presumably.)

[...]

> +           (alist-cons-before
> +            'configure 'install-bin

This phase installs bootstrap binaries to $out/bin and adds them to
$PATH, right?  Wouldn’t it be enough to install them to $TMPDIR/bin and
add that to $PATH?

> +            (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"))

Could we just list base names and do

  (append-map (lambda (program)
                (find-files "." (string-append "^" program "$")))
              '("ghc-pwd" "hpc" ...))

> +                     (ld-so (string-append (assoc-ref inputs "libc")
> +                                           "/lib/ld-linux-x86-64.so.2"))

Please use ,(glibc-dynamic-linker) for the base name.


[...]

> +                  (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")))))

Perhaps move “make install” to a separate phase?

Thanks for the great work!

Eventually we should move Hugs to haskell.scm as well.

Ludo’.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-01 12:44 ` Federico Beffa
  2015-03-01 14:55   ` Ludovic Courtès
@ 2015-03-02  6:29   ` Mark H Weaver
  2015-03-02 11:09     ` Federico Beffa
  1 sibling, 1 reply; 13+ messages in thread
From: Mark H Weaver @ 2015-03-02  6:29 UTC (permalink / raw)
  To: Federico Beffa; +Cc: Guix-devel

Federico Beffa <beffa@ieee.org> writes:

> 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)

Eventually we should learn how to build our own bootstrap GHC that's as
lean as theirs, but we can do that later.

> 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.

This new file needs to be added to gnu-system.am.

> 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
[...]
> +;; We use bootstrap bianries with a fix version which can be used to build

s/bianries/binaries/

> +    (description
> +     "The Glasgow Haskell Compiler (GHC) is a state-of-the-art, open source,
> +compiler and interactive environment for the functional language Haskell.")

We should remove the term "open source".  Everything in GuixSD is free
software anyway, so we needn't mention that in our package descriptions.

     Thanks,
       Mark

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-02  6:29   ` Mark H Weaver
@ 2015-03-02 11:09     ` Federico Beffa
  2015-03-03 12:24       ` Ludovic Courtès
  0 siblings, 1 reply; 13+ messages in thread
From: Federico Beffa @ 2015-03-02 11:09 UTC (permalink / raw)
  To: Mark H Weaver, Ludovic Courtès; +Cc: Guix-devel

ludo@gnu.org (Ludovic Courtès) writes:

>> +            (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"))
>
> Perhaps (find-files "testsuite" ".*") would be enough?

Somehow find-files appears to have problems with a file. This happens
even if I install the en_US.UTF-8 locale:

Backtrace:
In ice-9/boot-9.scm:
2401: 19 [save-module-excursion #<procedure 1691880 at
ice-9/boot-9.scm:4045:3 ()>]
4050: 18 [#<procedure 1691880 at ice-9/boot-9.scm:4045:3 ()>]
1724: 17 [%start-stack load-stack ...]
1729: 16 [#<procedure 16a6c60 ()>]
In unknown file:
   ?: 15 [primitive-load
"/gnu/store/qxy6784klrpjqnmxw00l6fpkqi60jwad-ghc-7.8.4-guile-builder"]
In ice-9/eval.scm:
 387: 14 [eval # ()]
In srfi/srfi-1.scm:
 830: 13 [every1 #<procedure 17b2520 at
/gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/gnu-build-system.scm:475:9
(expr)> ...]
In /gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/gnu-build-system.scm:
 479: 12 [#<procedure 17b2520 at
/gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/gnu-build-system.scm:475:9
(expr)> #]
In ice-9/eval.scm:
 432: 11 [eval # #]
In srfi/srfi-1.scm:
 619: 10 [for-each #<procedure 1b744e0 at ice-9/eval.scm:416:20 (a)> #]
In ice-9/boot-9.scm:
 171: 9 [with-throw-handler #t ...]
 867: 8 [call-with-input-file
"testsuite/tests/codeGen/should_run/cgrun037.stdout" ...]
In /gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/utils.scm:
 443: 7 [#<procedure 1f2ae00 at
/gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/utils.scm:442:10
(in)> #<input: testsuite/tests/codeGen/should_run/cgrun037.stdout 11>]
 469: 6 [#<procedure 1a9f6a0 at
/gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/utils.scm:465:6
(in out)> #<input: testsuite/tests/codeGen/should_run/cgrun037.stdout
11> ...]
In srfi/srfi-1.scm:
 465: 5 [fold #<procedure 19d5180 at
/gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/utils.scm:469:32
(r+p line)> ...]
In /gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/utils.scm:
 472: 4 [#<procedure 19d5180 at
/gnu/store/v4q9shphawhckqp35x05fxz5sfijv92r-module-import/guix/build/utils.scm:469:32
(r+p line)> # ...]
In ice-9/regex.scm:
 189: 3 [list-matches #<regexp 1b66100> "hello\x00 world\n" 0]
 176: 2 [fold-matches #<regexp 1b66100> "hello\x00 world\n" ...]
In unknown file:
   ?: 1 [regexp-exec #<regexp 1b66100> "hello\x00 world\n" 0 0]
In ice-9/boot-9.scm:
 106: 0 [#<procedure 1f2ae40 at ice-9/boot-9.scm:97:6 (thrown-k .
args)> misc-error ...]

ice-9/boot-9.scm:106:20: In procedure #<procedure 1f2ae40 at
ice-9/boot-9.scm:97:6 (thrown-k . args)>:
ice-9/boot-9.scm:106:20: string contains #\nul character: "hello\x00 world\n"
builder for `/gnu/store/ixnpnrj6g6svayzz5kw0yhigm5vgjd2g-ghc-7.8.4.drv'
failed with exit code 1
@ build-failed /gnu/store/ixnpnrj6g6svayzz5kw0yhigm5vgjd2g-ghc-7.8.4.drv
- 1 builder for
`/gnu/store/ixnpnrj6g6svayzz5kw0yhigm5vgjd2g-ghc-7.8.4.drv' failed
with exit code 1
cannot build derivation
`/gnu/store/659as6vx99qfrnwl1cc59kkgwiqwhg2l-ghc-7.8.4.drv': 1
dependencies couldn't be built
killing process 10073

>
> [...]
>
>> +           (alist-cons-before
>> +            'configure 'install-bin
>
> This phase installs bootstrap binaries to $out/bin and adds them to
> $PATH, right?  Wouldn’t it be enough to install them to $TMPDIR/bin and
> add that to $PATH?

That is what is happening :-). The bootstrap binaries are installed in a
temporary local directory inside the build directory:

       (let* ((ghc-bootstrap-path
               (string-append (getcwd) "/" ,name "-" ,version "/ghc-bin"))
              (ghc-bootstrap-prefix
               (string-append ghc-bootstrap-path "/usr" )))

               ...

                  (system* (string-append (getcwd) "/configure")
                           (string-append "--prefix=" ghc-bootstrap-prefix)

                           ...

>
>> +            (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"))
>
> Could we just list base names and do
>
>   (append-map (lambda (program)
>                 (find-files "." (string-append "^" program "$")))
>               '("ghc-pwd" "hpc" ...))

Here I'm puzzled. If I test the command that you suggest by displaying
the generated list (during the phase execution), I see that it produces
the same list as the original one (at least as displayed on screen).

In spite of this, differently than with the explicit list, the phase
fails because somehow the listed files do not get patched by

                  (for-each
                   (cut system* "patchelf" "--set-interpreter" ld-so <>)
                   binaries)

Unless you understand what's happening, I would propose for now to
keep the explicit lists.

Regards,
Fede

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-02 11:09     ` Federico Beffa
@ 2015-03-03 12:24       ` Ludovic Courtès
  2015-03-05  8:26         ` Federico Beffa
  0 siblings, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2015-03-03 12:24 UTC (permalink / raw)
  To: Federico Beffa; +Cc: Guix-devel

Federico Beffa <beffa@ieee.org> skribis:

> ludo@gnu.org (Ludovic Courtès) writes:
>
>>> +            (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"))
>>
>> Perhaps (find-files "testsuite" ".*") would be enough?
>
> Somehow find-files appears to have problems with a file. This happens
> even if I install the en_US.UTF-8 locale:

[...]

>    ?: 1 [regexp-exec #<regexp 1b66100> "hello\x00 world\n" 0 0]
> In ice-9/boot-9.scm:
>  106: 0 [#<procedure 1f2ae40 at ice-9/boot-9.scm:97:6 (thrown-k .
> args)> misc-error ...]
>
> ice-9/boot-9.scm:106:20: In procedure #<procedure 1f2ae40 at
> ice-9/boot-9.scm:97:6 (thrown-k . args)>:
> ice-9/boot-9.scm:106:20: string contains #\nul character: "hello\x00 world\n"

Right, that’s because ‘regexp-exec’ uses libc’s regexp functions, for
which the nul character marks the end of the string.

This file presumably cannot be patched with ‘substitute*’.  Is it a problem?

>> This phase installs bootstrap binaries to $out/bin and adds them to
>> $PATH, right?  Wouldn’t it be enough to install them to $TMPDIR/bin and
>> add that to $PATH?
>
> That is what is happening :-).

OK, sorry for the confusion.

>>> +            (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"))
>>
>> Could we just list base names and do
>>
>>   (append-map (lambda (program)
>>                 (find-files "." (string-append "^" program "$")))
>>               '("ghc-pwd" "hpc" ...))
>
> Here I'm puzzled. If I test the command that you suggest by displaying
> the generated list (during the phase execution), I see that it produces
> the same list as the original one (at least as displayed on screen).
>
> In spite of this, differently than with the explicit list, the phase
> fails because somehow the listed files do not get patched by
>
>                   (for-each
>                    (cut system* "patchelf" "--set-interpreter" ld-so <>)
>                    binaries)
>
> Unless you understand what's happening, I would propose for now to
> keep the explicit lists.

Weird, but OK then.

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  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
  0 siblings, 2 replies; 13+ messages in thread
From: Federico Beffa @ 2015-03-05  8:26 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: Guix-devel

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

On Tue, Mar 3, 2015 at 1:24 PM, Ludovic Courtès <ludo@gnu.org> wrote:
>> Somehow find-files appears to have problems with a file. This happens
>> even if I install the en_US.UTF-8 locale:
>
> [...]
>
>>    ?: 1 [regexp-exec #<regexp 1b66100> "hello\x00 world\n" 0 0]
>> In ice-9/boot-9.scm:
>>  106: 0 [#<procedure 1f2ae40 at ice-9/boot-9.scm:97:6 (thrown-k .
>> args)> misc-error ...]
>>
>> ice-9/boot-9.scm:106:20: In procedure #<procedure 1f2ae40 at
>> ice-9/boot-9.scm:97:6 (thrown-k . args)>:
>> ice-9/boot-9.scm:106:20: string contains #\nul character: "hello\x00 world\n"
>
> Right, that’s because ‘regexp-exec’ uses libc’s regexp functions, for
> which the nul character marks the end of the string.
>
> This file presumably cannot be patched with ‘substitute*’.  Is it a problem?

Sorry for the long delay... No, no problem. I will just not use the
exact command you suggested.

I tried to use a regex in find-files, but, as for the other file list,
something goes wrong. Right now I do not have time to investigate and
propose to keep the list as attached.

Regards,
Fede

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

From 8cc8a4775640bab78c8932e0cf17e211578c6f70 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 | 231 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 231 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..04c69a8
--- /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
-- 
2.2.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-05  8:26         ` Federico Beffa
@ 2015-03-08 21:36           ` Ludovic Courtès
  2015-03-21 23:21           ` Mark H Weaver
  1 sibling, 0 replies; 13+ messages in thread
From: Ludovic Courtès @ 2015-03-08 21:36 UTC (permalink / raw)
  To: Federico Beffa; +Cc: Guix-devel

Federico Beffa <beffa@ieee.org> skribis:

> From 8cc8a4775640bab78c8932e0cf17e211578c6f70 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.

Great, thanks for your time!  I know this one had been on a few people’s
to-do list for some time.  ;-)

Ludo’.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-05  8:26         ` Federico Beffa
  2015-03-08 21:36           ` Ludovic Courtès
@ 2015-03-21 23:21           ` Mark H Weaver
  1 sibling, 0 replies; 13+ messages in thread
From: Mark H Weaver @ 2015-03-21 23:21 UTC (permalink / raw)
  To: Federico Beffa; +Cc: Guix-devel

All attempts to build ghc on i686 have failed, according to Hydra.

  http://hydra.gnu.org/job/gnu/master/ghc-7.8.4.i686-linux/all
  http://hydra.gnu.org/build/331946/log/tail-reload

Would you be willing to take a look?

     Mark

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
@ 2015-03-22 20:31 Federico Beffa
  2015-03-25 21:20 ` Ludovic Courtès
  0 siblings, 1 reply; 13+ messages in thread
From: Federico Beffa @ 2015-03-22 20:31 UTC (permalink / raw)
  To: Guix-devel

Mark H Weaver <mhw@netris.org> writes:

> All attempts to build ghc on i686 have failed, according to Hydra.
>
>   http://hydra.gnu.org/job/gnu/master/ghc-7.8.4.i686-linux/all
>   http://hydra.gnu.org/build/331946/log/tail-reload
>
> Would you be willing to take a look?

I've already had a look last week-end, but I've not found a fix yet.

The error message

configure: error: cannot determine current directory

is the same that I was getting before patching the file

ghc-7.8.4/utils/ghc-pwd/dist-install/build/tmp/ghc-pwd

in the binary distribution for x86_64.

ldd on that file for the i386 executable gives (from a Debian shell):

    linux-gate.so.1 =>  (0xf779c000)
    librt.so.1 => /lib32/librt.so.1 (0xf777b000)
    libutil.so.1 => /lib32/libutil.so.1 (0xf7777000)
    libdl.so.2 => /lib32/libdl.so.2 (0xf7773000)
    libgmp.so.10 => not found
    libm.so.6 => /lib32/libm.so.6 (0xf774d000)
    libHSdirectory-1.2.1.0-ghc7.8.4.so => not found
    libHSunix-2.7.0.1-ghc7.8.4.so => not found
    libHSbytestring-0.10.4.0-ghc7.8.4.so => not found
    libHStime-1.4.2-ghc7.8.4.so => not found
    libHSold-locale-1.0.0.6-ghc7.8.4.so => not found
    libHSdeepseq-1.3.0.2-ghc7.8.4.so => not found
    libHSarray-0.5.0.0-ghc7.8.4.so => not found
    libHSfilepath-1.3.0.2-ghc7.8.4.so => not found
    libHSbase-4.7.0.2-ghc7.8.4.so => not found
    libHSinteger-gmp-0.5.1.0-ghc7.8.4.so => not found
    libHSghc-prim-0.3.1.0-ghc7.8.4.so => not found
    libHSrts-ghc7.8.4.so => not found
    libffi.so.6 => not found
    libc.so.6 => /lib32/libc.so.6 (0xf75e5000)
    libpthread.so.0 => /lib32/libpthread.so.0 (0xf75ca000)
    /lib/ld-linux.so.2 (0xf779d000)

while for x86_64 gives:

    linux-vdso.so.1 =>  (0x00007fff94fe8000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe65ca09000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fe65c806000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe65c602000)
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fe65c392000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe65c110000)
    libHSdirectory-1.2.1.0-ghc7.8.4.so => not found
    libHSunix-2.7.0.1-ghc7.8.4.so => not found
    libHSbytestring-0.10.4.0-ghc7.8.4.so => not found
    libHStime-1.4.2-ghc7.8.4.so => not found
    libHSold-locale-1.0.0.6-ghc7.8.4.so => not found
    libHSdeepseq-1.3.0.2-ghc7.8.4.so => not found
    libHSarray-0.5.0.0-ghc7.8.4.so => not found
    libHSfilepath-1.3.0.2-ghc7.8.4.so => not found
    libHSbase-4.7.0.2-ghc7.8.4.so => not found
    libHSinteger-gmp-0.5.1.0-ghc7.8.4.so => not found
    libHSghc-prim-0.3.1.0-ghc7.8.4.so => not found
    libHSrts-ghc7.8.4.so => not found
    libffi.so.6 => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe65bd80000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
(0x00007fe65bb63000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe65cc29000)

All haskell libraries are found with the help of the ghc build system and I
patch the hardcoded interpreter with

(system* "patchelf" "--set-interpreter"
  (string-append (assoc-ref inputs "libc")
                 (glibc-dynamic-linker)))

I'm not sure about the difference between "linux-vdso.so.1" and
"linux-gate.so.1".  As far as I understand they are the gateway into the
kernel for system calls, but have zero experience with that.

Any help would be appreciated.

Regards,
Fede

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-22 20:31 [PATCH 3/3] gnu: Add ghc Federico Beffa
@ 2015-03-25 21:20 ` Ludovic Courtès
  2015-03-28 19:15   ` Federico Beffa
  0 siblings, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2015-03-25 21:20 UTC (permalink / raw)
  To: Federico Beffa; +Cc: Guix-devel

Federico Beffa <beffa@ieee.org> skribis:

> Mark H Weaver <mhw@netris.org> writes:
>
>> All attempts to build ghc on i686 have failed, according to Hydra.
>>
>>   http://hydra.gnu.org/job/gnu/master/ghc-7.8.4.i686-linux/all
>>   http://hydra.gnu.org/build/331946/log/tail-reload
>>
>> Would you be willing to take a look?
>
> I've already had a look last week-end, but I've not found a fix yet.
>
> The error message
>
> configure: error: cannot determine current directory
>
> is the same that I was getting before patching the file
>
> ghc-7.8.4/utils/ghc-pwd/dist-install/build/tmp/ghc-pwd
>
> in the binary distribution for x86_64.

Could you try ‘guix build ghc -s i686-linux -K’ and then investigate
from there?  It might be clearer what needs to be patched.

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-25 21:20 ` Ludovic Courtès
@ 2015-03-28 19:15   ` Federico Beffa
  2015-03-31 19:31     ` Mark H Weaver
  0 siblings, 1 reply; 13+ messages in thread
From: Federico Beffa @ 2015-03-28 19:15 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: Guix-devel

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

On Wed, Mar 25, 2015 at 10:20 PM, Ludovic Courtès <ludo@gnu.org> wrote:
> Could you try ‘guix build ghc -s i686-linux -K’ and then investigate
> from there?  It might be clearer what needs to be patched.

That was indeed very useful! Thanks for making me discover the '-s' option :-)

The attached patch should fix the problem.

Regards,
Fede

[-- Attachment #2: 0001-gnu-ghc-Fix-i686-build.patch --]
[-- Type: text/x-diff, Size: 2528 bytes --]

From 52b593fd287a76b6a7ab04e5a3dc82bf4dc72d6b Mon Sep 17 00:00:00 2001
From: Federico Beffa <beffa@fbengineering.ch>
Date: Sat, 28 Mar 2015 20:09:37 +0100
Subject: [PATCH] gnu: ghc: Fix i686 build.

* gnu/packages/haskell.scm (ghc-bootstrap-7.8.4, ghc): Split
  'ghc-bootstrap-7.8.4' into 'ghc-bootstrap-i686-7.8.4' and
  'ghc-bootstrap-x86_64-7.8.4'. Select the appropriate input in 'ghc'.
---
 gnu/packages/haskell.scm | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index 183d0eb..46a4b4f 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -33,22 +33,23 @@
   #: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
+(define ghc-bootstrap-x86_64-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"))
+    (uri
+     "https://www.haskell.org/ghc/dist/7.8.4/ghc-7.8.4-x86_64-unknown-linux-deb7.tar.xz")
     (sha256
      (base32
-      (if (string-match "x86_64" (%current-system))
-          "13azsl53xgj20mi1hj9x0xb32vvcvs6cpmvwx6znxhas7blh0bpn"
-          "0wj5s435j0zgww70bj1d3f6wvnnpzlxwvwcyh2qv4qjq5z8j64kg")))))
+          "13azsl53xgj20mi1hj9x0xb32vvcvs6cpmvwx6znxhas7blh0bpn"))))
+
+(define ghc-bootstrap-i686-7.8.4
+  (origin
+    (method url-fetch)
+    (uri
+     "https://www.haskell.org/ghc/dist/7.8.4/ghc-7.8.4-i386-unknown-linux-deb7.tar.xz")
+    (sha256
+     (base32
+      "0wj5s435j0zgww70bj1d3f6wvnnpzlxwvwcyh2qv4qjq5z8j64kg"))))
 
 ;; 43 tests out of 3965 fail.
 ;;
@@ -99,7 +100,10 @@
        ("ghostscript" ,ghostscript)        ; for tests
        ("patchelf" ,patchelf)
        ;; GHC is built with GHC. Therefore we need bootstrap binaries.
-       ("ghc-binary" ,ghc-bootstrap-7.8.4)))
+       ("ghc-binary"
+        ,(if (string-match "x86_64" (or (%current-target-system) (%current-system)))
+             ghc-bootstrap-x86_64-7.8.4
+             ghc-bootstrap-i686-7.8.4))))
     (arguments
      `(#:test-target "test"
        ;; We get a smaller number of test failures by disabling parallel test
-- 
2.2.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] gnu: Add ghc.
  2015-03-28 19:15   ` Federico Beffa
@ 2015-03-31 19:31     ` Mark H Weaver
  0 siblings, 0 replies; 13+ messages in thread
From: Mark H Weaver @ 2015-03-31 19:31 UTC (permalink / raw)
  To: Federico Beffa; +Cc: Guix-devel

Federico Beffa <beffa@ieee.org> writes:

> From 52b593fd287a76b6a7ab04e5a3dc82bf4dc72d6b Mon Sep 17 00:00:00 2001
> From: Federico Beffa <beffa@fbengineering.ch>
> Date: Sat, 28 Mar 2015 20:09:37 +0100
> Subject: [PATCH] gnu: ghc: Fix i686 build.
>
> * gnu/packages/haskell.scm (ghc-bootstrap-7.8.4, ghc): Split
>   'ghc-bootstrap-7.8.4' into 'ghc-bootstrap-i686-7.8.4' and
>   'ghc-bootstrap-x86_64-7.8.4'. Select the appropriate input in 'ghc'.

How about this instead:

* gnu/packages/haskell.scm (ghc-bootstrap-7.8.4): Replace with ...
  (ghc-bootstrap-x86_64-7.8.4, ghc-bootstrap-i686-7.8.4): ... these.
  (ghc)[native-inputs]: Select the appropriate bootstrap.

> diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
> index 183d0eb..46a4b4f 100644
> --- a/gnu/packages/haskell.scm
> +++ b/gnu/packages/haskell.scm
> @@ -33,22 +33,23 @@
>    #: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
> +(define ghc-bootstrap-x86_64-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"))
> +    (uri
> +     "https://www.haskell.org/ghc/dist/7.8.4/ghc-7.8.4-x86_64-unknown-linux-deb7.tar.xz")
>      (sha256
>       (base32
> -      (if (string-match "x86_64" (%current-system))
> -          "13azsl53xgj20mi1hj9x0xb32vvcvs6cpmvwx6znxhas7blh0bpn"
> -          "0wj5s435j0zgww70bj1d3f6wvnnpzlxwvwcyh2qv4qjq5z8j64kg")))))
> +          "13azsl53xgj20mi1hj9x0xb32vvcvs6cpmvwx6znxhas7blh0bpn"))))

Now that the 'if' is gone, please indent the hash so that the open quote
is under the 'b' in 'base32'.

Otherwise it looks good to me.  Okay to push with these changes.

    Thanks!
      Mark

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2015-03-31 19:31 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-22 20:31 [PATCH 3/3] gnu: Add ghc 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
  -- strict thread matches above, loose matches on Subject: below --
2015-02-26 19:54 Federico Beffa
2015-03-01 12:44 ` Federico Beffa
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

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).