diff mbox series

[bug#54729] build: haskell-build-system: Support packages w. multiple libraries

Message ID 877d1uifzi.fsf@localhost
State New
Headers show
Series [bug#54729] build: haskell-build-system: Support packages w. multiple libraries | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git-branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/issue success View issue

Commit Message

itd Sept. 23, 2022, 9:42 a.m. UTC
Hi,

thanks for the patch!  I applied it, tried it, and ran into some build
issues.  Maybe I missed something; here is (roughly) what I tried:

$ # apply diff to current master
$ git checkout a57c4eff6bbdcff79294fa15ecb95ab2b3c55bb4
$ git checkout origin/wip-haskell -- guix/build/haskell-build-system.scm
$ # bump ghc-attoparsec version
$ git diff gnu/packages/haskell-xyz.scm
$ # build ghc-attoparsec-iso8601 which depends on ghc-attoparsec
$ guix shell -D guix help2man git strace --pure # & bootstrap & ...
$ ./pre-inst-env guix build ghc-attoparsec-iso8601

After some time, this build failed with:

> phase `setup-compiler' succeeded after 0.1 seconds
> starting phase `configure'
> running "runhaskell Setup.hs" with command "configure" and parameters ("--prefix=/gnu/store/70ddgy9ayd4239dp37b7kvcsdxkg5nrj-ghc-attoparsec-iso8601-1.0.2.0" "--libdir=/gnu/store/70ddgy9ayd4239dp37b7kvcsdxkg5nrj-ghc-attoparsec-iso8601-1.0.2.0/lib" "--docdir=/gnu/store/70ddgy9ayd4239dp37b7kvcsdxkg5nrj-ghc-attoparsec-iso8601-1.0.2.0/share/doc/ghc-attoparsec-iso8601-1.0.2.0" "--libsubdir=$compiler/$pkg-$version" "--package-db=/tmp/guix-build-ghc-attoparsec-iso8601-1.0.2.0.drv-0/package.conf.d" "--global" "--enable-tests" "--enable-shared" "--enable-executable-dynamic" "--ghc-option=-fPIC" "--ghc-option=-optl=-Wl,-rpath=/gnu/store/70ddgy9ayd4239dp37b7kvcsdxkg5nrj-ghc-attoparsec-iso8601-1.0.2.0/lib/$compiler/$pkg-$version")
> Configuring attoparsec-iso8601-1.0.2.0...
> Error:
>     The following packages are broken because other packages they depend on are missing. These broken packages must be rebuilt before they can be used.
> installed package attoparsec-0.14.4 is broken due to missing package scientific-0.3.7.0-9XG3zUjXOw970JFcruv0cZ


Ignorant of the patch provided here, I tried to build newer versions of
ghc-attoparsec / its dependants and ended up with the attached patch.
Using this patch, the build succeeds (but I am not sure if the patch's
approach is sensible).
Regards
itd

Comments

itd Dec. 21, 2022, 12:48 p.m. UTC | #1
Dear Haskell team,
dear all,

itd <itd@net.in.tum.de> writes:

> thanks for the patch!  I applied it, tried it, and ran into some build
> issues. [...]
> Ignorant of the patch provided here, I tried to build newer versions of
> ghc-attoparsec / its dependants and ended up with the attached patch.
> Using this patch, the build succeeds (but I am not sure if the patch's
> approach is sensible). [...]

if possible, I'd appreciate feedback on my previous mail.  E.g., does my
attempt in using the originally proposed patch make sense?  Any opinions
on my patch?

Thank you.

Regards
itd
Philip Munksgaard Dec. 23, 2022, 2:03 p.m. UTC | #2
Dear itd,

On Wed, 21 Dec 2022, at 13:48, itd wrote:
> if possible, I'd appreciate feedback on my previous mail.  E.g., does my
> attempt in using the originally proposed patch make sense?  Any opinions
> on my patch?

Yes, I've been meaning to try out your patch, but I haven't had time yet. I will try to get to it over the holidays. Sorry for my tardiness.

Best holiday wishes,
Philip
diff mbox series

Patch

From 959dc9de2d4aa39b7490b4c90e28820edf0d00f9 Mon Sep 17 00:00:00 2001
From: itd <itd@net.in.tum.de>
Date: Fri, 23 Sep 2022 10:58:09 +0200
Subject: [PATCH] WIP update haskell-build-system for newer attoparsec

---
 guix/build/haskell-build-system.scm | 86 +++++++++++++++++------------
 1 file changed, 51 insertions(+), 35 deletions(-)

diff --git a/guix/build/haskell-build-system.scm b/guix/build/haskell-build-system.scm
index ef6cb316ee..d4c4ed4c8c 100644
--- a/guix/build/haskell-build-system.scm
+++ b/guix/build/haskell-build-system.scm
@@ -219,7 +219,10 @@  (define* (register #:key name system inputs outputs #:allow-other-keys)
                    (dep-conf* (string-append dest "/" id ".conf")))
                (when (not (file-exists? dep-conf))
                    (error (format #f "File ~a does not exist. This usually means the dependency ~a is missing. Was checking conf-file ~a." dep-conf id conf-file)))
-               (copy-file dep-conf dep-conf*) ;XXX: maybe symlink instead?
+               ;; Different libraries of same package may share
+               ;; dependencies. Hence, file may exist already.
+               (when (not (file-exists? dep-conf*))
+                   (copy-file dep-conf dep-conf*)) ;XXX: maybe symlink instead?
                (loop (vhash-cons id #t seen)
                      (append lst (conf-depends dep-conf))))
              (loop seen tail))))))
@@ -234,46 +237,59 @@  (define* (register #:key name system inputs outputs #:allow-other-keys)
                                     "/ghc-" version
                                     "/" name ".conf.d"))
          (id-rx (make-regexp "^id:[ \n\t]+([^ \t\n]+)$" regexp/newline))
-         (config-file (string-append out "/" name ".conf"))
+         (maybe-config-file (string-append out "/" name ".conf"))
          (params
-          (list (string-append "--gen-pkg-config=" config-file))))
+          (list (string-append "--gen-pkg-config=" maybe-config-file))))
     (run-setuphs "register" params)
     ;; The conf file is created only when there is a library to register.
-    (when (file-exists? config-file)
+    (when (file-exists? maybe-config-file)
       (mkdir-p config-dir)
-      (let* ((contents (call-with-input-file config-file read-string))
-             (config-file-name+id (match:substring (first (list-matches id-rx contents)) 1)))
+      ;; If more that one library is defined, they share conf file as
+      ;; parent directory.
+      (let* ((config-files (if (file-is-directory? maybe-config-file)
+                             (find-files maybe-config-file)
+                             (list maybe-config-file))))
+        (map
+          (lambda (config-file)
+            (let* ((contents (call-with-input-file config-file read-string))
+                   (config-file-name+id (match:substring (first (list-matches id-rx contents)) 1)))
 
-        (when (or
-                (and
-                  (string? config-file-name+id)
-                  (string-null? config-file-name+id))
-                (not config-file-name+id))
-          (error (format #f "The package id for ~a is empty. This is a bug." config-file)))
+              (when (or
+                      (and
+                        (string? config-file-name+id)
+                        (string-null? config-file-name+id))
+                      (not config-file-name+id))
+                (error (format #f "The package id for ~a is empty. This is a bug." config-file)))
 
-        ;; Remove reference to "doc" output from "lib" (or "out") by rewriting the
-        ;; "haddock-interfaces" field and removing the optional "haddock-html"
-        ;; field in the generated .conf file.
-        (when doc
-          (substitute* config-file
-            (("^haddock-html: .*") "\n")
-            (((format #f "^haddock-interfaces: ~a" doc))
-             (string-append "haddock-interfaces: " lib)))
-          ;; Move the referenced file to the "lib" (or "out") output.
-          (match (find-files doc "\\.haddock$")
-            ((haddock-file . rest)
-             (let* ((subdir (string-drop haddock-file (string-length doc)))
-                    (new    (string-append lib subdir)))
-               (mkdir-p (dirname new))
-               (rename-file haddock-file new)))
-            (_ #f)))
-        (install-transitive-deps config-file %tmp-db-dir config-dir)
-        (rename-file config-file
-                     (string-append config-dir "/"
-                                    config-file-name+id ".conf"))
-        (invoke "ghc-pkg"
-                (string-append "--package-db=" config-dir)
-                "recache")))
+              ;; Remove reference to "doc" output from "lib" (or "out") by rewriting the
+              ;; "haddock-interfaces" field and removing the optional "haddock-html"
+              ;; field in the generated .conf file.
+              (when doc
+                (substitute* config-file
+                  (("^haddock-html: .*") "\n")
+                  (((format #f "^haddock-interfaces: ~a" doc))
+                   (string-append "haddock-interfaces: " lib)))
+                ;; Move the referenced file to the "lib" (or "out") output.
+                (match (find-files doc "\\.haddock$")
+                  ((haddock-file . rest)
+                   (let* ((subdir (string-drop haddock-file (string-length doc)))
+                          (new    (string-append lib subdir)))
+                     (mkdir-p (dirname new))
+                     (rename-file haddock-file new)))
+                  (_ #f)))
+              (install-transitive-deps config-file %tmp-db-dir config-dir)
+              ;; Make current conf file available for possible
+              ;; subsequent conf files.
+              (copy-file config-file
+                         (string-append %tmp-db-dir "/"
+                                        config-file-name+id ".conf"))
+              (rename-file config-file
+                           (string-append config-dir "/"
+                                          config-file-name+id ".conf"))
+              (invoke "ghc-pkg"
+                      (string-append "--package-db=" config-dir)
+                      "recache")))
+          config-files)))
     #t))
 
 (define* (check #:key tests? test-target #:allow-other-keys)

base-commit: a57c4eff6bbdcff79294fa15ecb95ab2b3c55bb4
-- 
2.37.3