[bug#39309,WIP] gnu: add stack.
diff mbox series

Message ID 87mu9ahbz8.fsf@ngyro.com
State New
Headers show
Series
  • [bug#39309,WIP] gnu: add stack.
Related show

Checks

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

Commit Message

Timothy Sample Feb. 22, 2020, 3:34 p.m. UTC
Hello again,

Timothy Sample <samplet@ngyro.com> writes:

> On the other hand, there are probably less than a dozen Haskell
> packages that need flags [...].

Turns out there are thirteen!

> I will make a patch that does this and see what the damages are.

I’ve attached the patch.  The name of the keyword is not great, so
suggestions there are welcome.  I managed to build all of our Haskell
packages (except for some usual suspects that fail for other reasons).
It’s not so bad, but it’s a bit of a hack.

I’m now wondering why Guix’s treatment of “LIBRARY_PATH” is not just
solving this outright without the need for those flags.  Before I
consider pushing the patch, I’m going to answer that question.  Ideally,
Guix could do more of what it’s good at: understanding the complete
package graph.  :)


-- Tim

Comments

John Soo March 11, 2020, 9:17 a.m. UTC | #1
Hi Tim,

Sorry for my delay.  I think I’m finally starting to understand your patch.


> I’m now wondering why Guix’s treatment of “LIBRARY_PATH” is not just
> solving this outright without the need for those flags.  Before I consider pushing the patch, I’m going to answer that question. 
> Ideally, Guix could do more of what it’s good at: understanding the complete
> package graph.  :)

Yeah it would be nice if it were automatically tracked or if the env vars were respected.

I like the idea of offering more cabal file semantics to package authors. In that regards I have no issues with your patches.  My only thought is we should make the flags lists instead of booleans. Not only would lists match the cabal file specification, but I think having the extra detail would be a nice way to verify against existing cabal files. I can’t imagine just yet how but I could see wanting to be able to specify which paths were being used and their order.

I am not opposed to the names of the fields either, I like that they match the cabal fields.

Thanks again!

John
Timothy Sample March 11, 2020, 2:18 p.m. UTC | #2
Hi John,

John Soo <jsoo1@asu.edu> writes:

> I like the idea of offering more cabal file semantics to package
> authors. In that regards I have no issues with your patches.  My only
> thought is we should make the flags lists instead of booleans. Not
> only would lists match the cabal file specification, but I think
> having the extra detail would be a nice way to verify against existing
> cabal files. I can’t imagine just yet how but I could see wanting to
> be able to specify which paths were being used and their order.

My first attempt did exactly that, but I ran into some problems with it.
IIRC, I had to worry about paths for transitive dependencies, which made
it really hard to get working (and would make it really hard to
maintain).  This patch was take two.  :)  It’s a little less specific
but much easier to work with.

> I am not opposed to the names of the fields either, I like that they
> match the cabal fields.

Good to hear.  Maybe they’re not so bad.

> Thanks again!

I still need to take another look at this, but I’m not sure when I’ll
get the chance.  I’ll try to carve out some time soon.  Thanks again to
you for the patches.  :)


-- Tim
John Soo March 13, 2020, 3:05 p.m. UTC | #3
Hi Tim,

> Good to hear.  Maybe they’re not so bad.

Seem totally reasonable to me.

Then for the gio package problems with gi-gtk and custom Setup.hs? :D

> I still need to take another look at this, but I’m not sure when I’ll
> get the chance.  I’ll try to carve out some time soon.  Thanks again to
> you for the patches.  :)

Ok no rush. My pleasure :)

- John

Patch
diff mbox series

From 01ff315ee02d033fd5335f4f53405db89fd81c14 Mon Sep 17 00:00:00 2001
From: Timothy Sample <samplet@ngyro.com>
Date: Sat, 22 Feb 2020 09:56:36 -0500
Subject: [PATCH] build-system/haskell: Add 'extra-directories?' keyword.

See <https://bugs.gnu.org/39309>.

* guix/build-system/haskell.scm (haskell-build): Add
'extra-directories?'  keyword and pass it through to the builder.
* guix/build/haskell-build-system.scm (configure): Use it to toggle
passing 'extra-include-dirs' and 'extra-lib-dirs' to Cabal.
* gnu/packages/haskell-xyz.scm (ghc-alsa-core, ghc-hmatrix,
ghc-hmatrix-gsl, ghc-hslua, ghc-iwlib, ghc-libyaml, ghc-ncurses,
ghc-openglraw, ghc-x11, ghc-x11-xft, ghc-zlib): Enable
'extra-directories?'.
gnu/packages/haskell-crypto.scm (ghc-digest, ghc-hsopenssl): Likewise.
---
 gnu/packages/haskell-crypto.scm     |  4 ++++
 gnu/packages/haskell-xyz.scm        | 26 ++++++++++++++++++++++----
 guix/build-system/haskell.scm       |  2 ++
 guix/build/haskell-build-system.scm | 17 +++++++++--------
 4 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/gnu/packages/haskell-crypto.scm b/gnu/packages/haskell-crypto.scm
index 4170ec82f0..637a5d421e 100644
--- a/gnu/packages/haskell-crypto.scm
+++ b/gnu/packages/haskell-crypto.scm
@@ -343,6 +343,8 @@  generators, and more.")
         (base32
          "04gy2zp8yzvv7j9bdfvmfzcz3sqyqa6rwslqcn4vyair2vmif5v4"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("zlib" ,zlib)))
     (home-page
@@ -790,6 +792,8 @@  extensions.")
         (base32
          "0qivl9clmybfglwxqp2sq308rv4ia4rhwshcsc8b029bvpp0mpsi"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("ghc-network" ,ghc-network)
        ("openssl" ,openssl)))
diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index e368082c03..9992744245 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -327,6 +327,8 @@  tool lex or flex for C/C++.")
         (base32
          "1avh4a419h9d2zsslg6j8hm87ppgsgqafz8ll037rk2yy1g4jl7b"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("ghc-extensible-exceptions" ,ghc-extensible-exceptions)
        ("alsa-lib" ,alsa-lib)))
@@ -5352,6 +5354,8 @@  accessed or modified.")
        (sha256
         (base32 "1sqy1aci5zfagkb34mz3xdil7cl96z4b4cx28cha54vc5sx1lhpg"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("ghc-random" ,ghc-random)
        ("ghc-split" ,ghc-split)
@@ -5383,6 +5387,8 @@  numerical computations based on BLAS and LAPACK.")
        (sha256
         (base32 "0v6dla426x4ywaq59jm89ql1i42n39iw6z0j378xwb676v9kfxhm"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("ghc-hmatrix" ,ghc-hmatrix)
        ("ghc-vector" ,ghc-vector)
@@ -5600,7 +5606,8 @@  handler built in.")
                 "183bgl5jcx5y2r94lviqfw0a5w9089nxjd1z40k8vx9y2h60pm6j"))))
     (build-system haskell-build-system)
     (arguments
-     `(#:configure-flags '("-fsystem-lua")))
+     `(#:configure-flags '("-fsystem-lua")
+       #:extra-directories? #t))
     (inputs
      `(("lua" ,lua)
        ("ghc-exceptions" ,ghc-exceptions)
@@ -6210,6 +6217,8 @@  instances for conversion to and from JSON .ipynb files.")
        (sha256
         (base32 "0khmfwql4vwj55idsxmhjhrbqzfir3g9wm5lmpvnf77mm95cfpdz"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("wireless-tools" ,wireless-tools)))
     (home-page "https://github.com/jaor/iwlib")
@@ -6556,7 +6565,8 @@  compiler versions.")
            #t))))
     (build-system haskell-build-system)
     (arguments
-     `(#:configure-flags `("--flags=system-libyaml")))
+     `(#:configure-flags `("--flags=system-libyaml")
+       #:extra-directories? #t))
     (inputs
      `(("ghc-conduit" ,ghc-conduit)
        ("ghc-resourcet" ,ghc-resourcet)
@@ -7698,7 +7708,8 @@  between 2 and 3 times faster than the Mersenne Twister.")
           "0gsyyaqyh5r9zc0rhwpj5spyd6i4w2vj61h4nihgmmh0yyqvf3z5"))))
     (build-system haskell-build-system)
     (arguments
-     '(#:phases
+     '(#:extra-directories? #t
+       #:phases
        (modify-phases %standard-phases
          (add-before 'build 'fix-includes
            (lambda _
@@ -8036,6 +8047,8 @@  version 1.3).")
         (base32
          "0zgllb4bcash2i2cispa3j565aw3dpxs41ghmhpvyvi4a6xmyldx"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("ghc-half" ,ghc-half)
        ("ghc-fixed" ,ghc-fixed)
@@ -13150,6 +13163,8 @@  modernized interface.")
        (sha256
         (base32 "0gg6852mrlgl8zng1j84fismz7k81jr5fk92glgkscf8q6ryg0bm"))))
     (build-system haskell-build-system)
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("libx11" ,libx11)
        ("libxrandr" ,libxrandr)
@@ -13174,6 +13189,8 @@  bindings are a direct translation of the C bindings.")
                            "X11-xft-" version ".tar.gz"))
        (sha256
         (base32 "1lgqb0s2qfwwgbvwxhjbi23rbwamzdi0l0slfr20c3jpcbp3zfjf"))))
+    (arguments
+     `(#:extra-directories? #t))
     (inputs
      `(("ghc-x11" ,ghc-x11)
        ("ghc-utf8-string" ,ghc-utf8-string)
@@ -13374,7 +13391,8 @@  modifying, and extracting files from zip archives in Haskell.")
          "1l11jraslcrp9d4wnhwfyhwk4fsiq1aq8i6vj81vcq1m2zzi1y7h"))))
     (build-system haskell-build-system)
     (arguments
-     `(#:phases
+     `(#:extra-directories? #t
+       #:phases
        (modify-phases %standard-phases
          (add-before 'configure 'strip-test-framework-constraints
            (lambda _
diff --git a/guix/build-system/haskell.scm b/guix/build-system/haskell.scm
index 1ec11c71d8..25f4797d16 100644
--- a/guix/build-system/haskell.scm
+++ b/guix/build-system/haskell.scm
@@ -106,6 +106,7 @@  version REVISION."
                         (tests? #t)
                         (test-target "test")
                         (configure-flags ''())
+                        extra-directories?
                         (phases '(@ (guix build haskell-build-system)
                                     %standard-phases))
                         (outputs '("out"))
@@ -134,6 +135,7 @@  provides a 'Setup.hs' file as its build system."
                                            (derivation->output-path revision))
                                           (revision revision))
                       #:configure-flags ,configure-flags
+                      #:extra-directories? ,extra-directories?
                       #:haddock-flags ,haddock-flags
                       #:system ,system
                       #:test-target ,test-target
diff --git a/guix/build/haskell-build-system.scm b/guix/build/haskell-build-system.scm
index 91f62138d0..f69e16582a 100644
--- a/guix/build/haskell-build-system.scm
+++ b/guix/build/haskell-build-system.scm
@@ -72,8 +72,8 @@  and parameters ~s~%"
           (apply invoke "runhaskell" setup-file command params))
         (error "no Setup.hs nor Setup.lhs found"))))
 
-(define* (configure #:key outputs inputs tests? (configure-flags '())
-                    #:allow-other-keys)
+(define* (configure #:key outputs inputs tests? extra-directories?
+                    (configure-flags '()) #:allow-other-keys)
   "Configure a given Haskell package."
   (let* ((out (assoc-ref outputs "out"))
          (doc (assoc-ref outputs "doc"))
@@ -84,6 +84,10 @@  and parameters ~s~%"
                        (((_ . dir) ...)
                         dir)
                        (_ '())))
+         (include-dirs (map (cut string-append "--extra-include-dirs=" <>)
+                            (search-path-as-list '("include") input-dirs)))
+         (lib-dirs (map (cut string-append "--extra-lib-dirs=" <>)
+                        (search-path-as-list '("lib") input-dirs)))
          (ghc-path (getenv "GHC_PACKAGE_PATH"))
          (params (append `(,(string-append "--prefix=" out))
                          `(,(string-append "--libdir=" (or lib out) "/lib"))
@@ -94,12 +98,9 @@  and parameters ~s~%"
                          '("--libsubdir=$compiler/$pkg-$version")
                          `(,(string-append "--package-db=" %tmp-db-dir))
                          '("--global")
-                         `(,@(map
-                              (cut string-append "--extra-include-dirs=" <>)
-                              (search-path-as-list '("include") input-dirs)))
-                         `(,@(map
-                              (cut string-append "--extra-lib-dirs=" <>)
-                              (search-path-as-list '("lib") input-dirs)))
+                         (if extra-directories?
+                             (append include-dirs lib-dirs)
+                             '())
                          (if tests?
                              '("--enable-tests")
                              '())
-- 
2.25.0