Subject: Re: [PATCH] gnu: Add microcabal.

From: Lars-Dominik Braun <[email-masked]>
Date: Sat, 1 Feb 2025 14:19:36 +0100

Hi,

> * gnu/packages/haskell-apps.scm (microcabal): New variable.

I’m using a slightly modified patch (see attachment), but `mcabal`
cannot build any packages. It seems that it ignores the MHSDIR environment
variable:

    mcabal build fail
    mcabal: Build package fail
    mcabal: Building in /home/lars/.mcabal/packages/fail-4.9.0.0
    mcabal: Building library fail
    mhs: error: no location: Module not found: Mhs.Builtin
    search path=[".","dist-mcabal/autogen"]
    package path=["."]
    mhs: error: callCommand: failed 256, "mhs -Pfail-4.9.0.0 -ofail-4.9.0.0.pkg -i -i. -idist-mcabal/autogen '-DVERSION_base=\"4.19.1.0\"' '-DMIN_VERSION_base(x,y,z)=((x)<4||(x)==4&&(y)<19||(x)==4&&(y)==19&&(z)<=1)' -a. Control.Monad.Fail"

Looking at the MicroCabal sources mcabal might be expecting mhs to be
installed as an “mcabal package”?

Lars

>From 9d701dac7c56db1e662e2930a324bd4581e7ce79 Mon Sep 17 00:00:00 2001
Message-ID: <[email-masked]>
From: Homo <[email-masked]>
Date: Thu, 23 Jan 2025 18:20:33 +0200
Subject: [PATCH] gnu: Add microcabal.

Depends on <https://issues.guix.gnu.org/75778>.

* gnu/packages/haskell-apps.scm (microcabal): New variable.

Change-Id: Ib676c2afc360c379183422b1038f045af5485b59
Signed-off-by: Lars-Dominik Braun <[email-masked]>
---
 gnu/packages/haskell-apps.scm | 59 +++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/gnu/packages/haskell-apps.scm b/gnu/packages/haskell-apps.scm
index 1ef3ed4035..6b61ae026b 100644
--- a/gnu/packages/haskell-apps.scm
+++ b/gnu/packages/haskell-apps.scm
@@ -20,6 +20,7 @@
 ;;; Copyright © 2021 Morgan Smith <[email-masked]>
 ;;; Copyright © 2022 David Thompson <[email-masked]>
 ;;; Copyright © 2024 jgart <[email-masked]>
+;;; Copyright © 2025 Homo <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -42,8 +43,10 @@ (define-module (gnu packages haskell-apps)
   #:use-module (guix git-download)
   #:use-module (guix packages)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix build-system gnu)
   #:use-module (guix build-system haskell)
   #:use-module (gnu packages)
+  #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages freedesktop)
@@ -59,6 +62,7 @@ (define-module (gnu packages haskell-apps)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages rsync)
   #:use-module (gnu packages version-control)
+  #:use-module (gnu packages wget)
   #:use-module (gnu packages xorg))
 
 (define-public apply-refact
@@ -783,6 +787,61 @@ (define-public matterhorn
      "This is a terminal client for the Mattermost chat system.")
     (license license:bsd-3)))
 
+(define-public microcabal
+  ;; There are no tags, using latest commit.
+  (let ((commit "75aab2f5dfa3bacc1876dc1da9828a7e54e01d68")
+        (revision "0"))
+    (package
+      (name "microcabal")
+      (version (git-version "0.5.0.0" revision commit))
+      (source (origin
+        (method git-fetch)
+        (uri (git-reference
+          (url "https://github.com/augustss/MicroCabal")
+          (commit commit)))
+        (file-name (git-file-name name version))
+        (sha256
+          (base32 "0hzp2zfvldl5gmnvr33vxbpd75fhm4kkdsvakd49wdpmcamp01yg"))))
+      (build-system gnu-build-system)
+      (arguments
+        (list
+          #:make-flags #~(list "MHS=mhs")
+          ;; Tests require *.cabal files from MicroHs's code.
+          #:tests? #f
+          #:phases
+          #~(modify-phases %standard-phases
+            (add-after 'unpack 'fix-paths
+              (lambda* (#:key inputs #:allow-other-keys)
+                (substitute* "src/MicroCabal/Unix.hs"
+                  (("(\"[^\"]*)(wget|mkdir|tar|rm|cp)( [^\"]*\")" all prefix binary postfix)
+                   (string-append
+                     prefix
+                    (search-input-file inputs (string-append "/bin/" binary))
+                    postfix)))))
+            (replace 'configure
+              (lambda _
+                (substitute* "Makefile"
+                  (("MHSDIR=[^ ]* ?")
+                    "")
+                  ;; Don't build with GHC.
+                  (("bin/gmcabal bin/mcabal")
+                    "bin/mcabal"))))
+            (replace 'install
+              (lambda _
+                (let ((bin (string-append #$output "/bin/")))
+                  (install-file "bin/mcabal" bin)))))))
+      (inputs (list wget tar coreutils))
+      (propagated-inputs (list microhs)) ;; Propagate microhs, because it needs a search path.
+      (home-page "https://github.com/augustss/MicroCabal")
+      (synopsis "Reimplementation of a subset of Cabal")
+      (description "Why a reimplementation?  Because Cabal is not a Haskell tool, it is a ghc tool.
+A Haskell tool should be compilable by an implementation of Haskell2010,
+which Cabal is definitely not.
+
+To get a consistent set of packages MicroCabal uses Stackage to find compatible packages.
+So in a sense, MicroCabal is more like a MicroStackage.")
+      (license license:asl2.0))))
+
 (define-public nixfmt
   (package
     (name "nixfmt")

base-commit: b226a1007a9111adacb05984b8d74def24257dce
prerequisite-patch-id: cf5c00ff7ab68e16a9c83d294d57d08c1745dfeb
-- 
2.47.1