summary refs log tree commit diff
path: root/pkgs/development/lisp-modules
diff options
context:
space:
mode:
authorKasper Gałkowski <k@galkowski.xyz>2023-03-10 23:13:53 +0100
committerKasper Gałkowski <k@galkowski.xyz>2023-03-11 15:11:38 +0100
commit84eea85ad99ac2dd4c30d22dc32004888ea73b03 (patch)
tree0f77951c06b0cb94ef8a7e7d6d0dc1a5fecd2592 /pkgs/development/lisp-modules
parent653ba458347e33ce31fce1c7402678bcdb5bed87 (diff)
downloadnixpkgs-84eea85ad99ac2dd4c30d22dc32004888ea73b03.tar
nixpkgs-84eea85ad99ac2dd4c30d22dc32004888ea73b03.tar.gz
nixpkgs-84eea85ad99ac2dd4c30d22dc32004888ea73b03.tar.bz2
nixpkgs-84eea85ad99ac2dd4c30d22dc32004888ea73b03.tar.lz
nixpkgs-84eea85ad99ac2dd4c30d22dc32004888ea73b03.tar.xz
nixpkgs-84eea85ad99ac2dd4c30d22dc32004888ea73b03.tar.zst
nixpkgs-84eea85ad99ac2dd4c30d22dc32004888ea73b03.zip
lisp-modules: use wrapLisp to wrap Lisps
The previous approach of manually repeating a complex pattern inside Common Lisp
implementation package declarations was fragile and hard to change. After
reading python and lua modules code in Nixpkgs, I was able to come up with
something better.

The function `wrapLisp` doesn't need to be inside package declarations so all
the code for wrapping Lisps can be in `all-packages.nix`.

This works by wrapping the `override` function created from `mkDerivation` to
accept a new argument `packageOverrides`.

One problem with this is that `override.__functionArgs` disappears. But one can
look at the source code of a package to discover what can be overridden.
Diffstat (limited to 'pkgs/development/lisp-modules')
-rw-r--r--pkgs/development/lisp-modules/import/database/sqlite.lisp2
-rw-r--r--pkgs/development/lisp-modules/nix-cl.nix27
2 files changed, 23 insertions, 6 deletions
diff --git a/pkgs/development/lisp-modules/import/database/sqlite.lisp b/pkgs/development/lisp-modules/import/database/sqlite.lisp
index c25c5c7d47c..fb502e42452 100644
--- a/pkgs/development/lisp-modules/import/database/sqlite.lisp
+++ b/pkgs/development/lisp-modules/import/database/sqlite.lisp
@@ -170,4 +170,4 @@ in lib.makeScope pkgs.newScope (self: {")
                  ,@(when (or (find #\/ name)
                             (find name +broken-packages+ :test #'string=))
                     '(("meta" (:attrs ("broken" (:symbol "true")))))))))))))
-      (format f "~%})"))))
+      (format f "~%})~%"))))
diff --git a/pkgs/development/lisp-modules/nix-cl.nix b/pkgs/development/lisp-modules/nix-cl.nix
index 208ca7559d8..7e671e7cc63 100644
--- a/pkgs/development/lisp-modules/nix-cl.nix
+++ b/pkgs/development/lisp-modules/nix-cl.nix
@@ -286,8 +286,25 @@ let
       '';
     });
 
-in {
-  inherit commonLispPackagesFor;
-  inherit lispWithPackages;
-  inherit build-asdf-system;
-}
+  wrapLisp = { pkg, faslExt, program ? pkg.pname, flags ? [], asdf ? pkgs.asdf_3_3 }:
+    let
+      spec = { inherit pkg faslExt program flags asdf; };
+      pkgs = commonLispPackagesFor spec;
+      withPackages = lispWithPackages pkgs;
+      override =
+        { packageOverrides ? (self: super: {}) , ... } @ attrs:
+        let
+          pkg' = spec.pkg.override attrs;
+          spec' = spec // { pkg = pkg'; };
+          pkgs = (commonLispPackagesFor spec').overrideScope' packageOverrides;
+          withPackages = lispWithPackages pkgs;
+        in pkg' // {
+          inherit pkgs withPackages override;
+          buildASDFSystem = args: build-asdf-system (args // spec');
+        };
+    in pkg // {
+      inherit pkgs withPackages override;
+      buildASDFSystem = args: build-asdf-system (args // spec);
+    };
+
+in wrapLisp