| 15 Sep 2025 |
Alex | Thanks for the advice. I'll take a look when I get to work on the PRs. | 14:05:39 |
bglgwyng | I realized that I diagnosed the issue wrong | 15:02:06 |
bglgwyng | {
packages.zlib1 = (pkgs.haskellPackages.zlib).override { zlib = pkgs.zlib; };
# it works
packages.zlib2 = (pkgs.haskellPackages.callCabal2nix "zlib" inputs.zlib-src { }).override { zlib = pkgs.zlib; };
# it works
packages.splitmix1 = (pkgs.haskellPackages.splitmix).override { testu01 = null; };
# it doesn't work
packages.splitmix2 = (pkgs.haskellPackages.callCabal2nix "splitmix" inputs.splitmix-src { }).override { testu01 = null; };
};
Only the last one failed with 'error: function 'anonymous lambda' called without required argument 'testu01''
| 15:02:33 |
bglgwyng | Here is the reproducer https://github.com/bglgwyng/haskellPackages-override | 15:02:59 |
bglgwyng | * {
packages.zlib1 = (pkgs.haskellPackages.zlib).override { zlib = pkgs.zlib; };
# it works
packages.zlib2 = (pkgs.haskellPackages.callCabal2nix "zlib" inputs.zlib-src { }).override { zlib = pkgs.zlib; };
# it works
packages.splitmix1 = (pkgs.haskellPackages.splitmix).override { testu01 = null; };
# it doesn't work
packages.splitmix2 = (pkgs.haskellPackages.callCabal2nix "splitmix" inputs.splitmix-src { }).override { testu01 = null; };
};
Only the last one failed with error: function 'anonymous lambda' called without required argument 'testu01'
| 15:03:21 |
bglgwyng | I can see testu01 in the arguments of cabal2nix-splitmix, but somehow the override failed. | 15:04:08 |
keypusher | I have a hard time getting protoc (on the PATH) while building a package with callCabal2Nix. It's used by cabal extension. | 15:20:20 |
keypusher | Are there any tricks to troubleshooting that? | 15:21:06 |
sterni (he/him) | keypusher: cabal2nix does not really have the ability to do that automatically since Cabal does not allow specifying a dependency on a build tool that is not itself a Cabal package. You need to use addBuildTools or the like from haskell.lib.compose. | 15:32:07 |
sterni (he/him) | bglgwyng: on what system does packages.splitmix2 fail to evaluate? | 15:36:34 |
keypusher | Oh ok. I tried googling "haskell.lib.compose addBuildtools" but came up a bit short. You don't happen to have some useful url? | 15:37:31 |
keypusher | thanks btw! | 15:37:53 |
sterni (he/him) | bglgwyng: the testu01 test suite is only buildable on linux, Cabal discards this dependency on non-linux, you can force the platform to use with e.g. --system x86_64-linux | 15:38:40 |
sterni (he/him) | keypusher: https://nixos.org/manual/nixpkgs/stable/#haskell-trivial-helpers | 15:39:11 |
bglgwyng | it's x86_64-linux | 15:52:22 |
bglgwyng | I haven't trie don the other platforms | 15:53:24 |
sterni (he/him) | cabal2nix --system x86_64-linux https://hackage.haskell.org/package/splitmix-0.1.3.1.tar.gz gives me
{ mkDerivation, async, base, base-compat-batteries, bytestring
, containers, criterion, deepseq, fetchzip, HUnit, lib
, math-functions, process, random, template-haskell, test-framework
, test-framework-hunit, testu01, tf-random, vector
}:
mkDerivation {
pname = "splitmix";
version = "0.1.3.1";
src = fetchzip {
url = "https://hackage.haskell.org/package/splitmix-0.1.3.1.tar.gz";
sha256 = "0mll5axdvh5wan6prh3v6l2n15xsj31ghi0g887ljpk515id5a2w";
};
libraryHaskellDepends = [ base deepseq ];
testHaskellDepends = [
async base base-compat-batteries bytestring containers deepseq
HUnit math-functions process random template-haskell test-framework
test-framework-hunit tf-random vector
];
testSystemDepends = [ testu01 ];
benchmarkHaskellDepends = [
base containers criterion random tf-random
];
description = "Fast Splittable PRNG";
license = lib.licenses.bsd3;
}
So this looks fine.
| 15:54:59 |
sterni (he/him) | ahh now I understand the issue. | 15:56:50 |
sterni (he/him) | The problem with override is that it depends on initially computing the derivation successfully. This doesn't work if an argument is missing which is the case here with testu01. That's why callCabal2nix has a third argument to pass in arguments (which can also act as an override at the definition site). So you want to do:
(pkgs.haskellPackages.callCabal2nix "splitmix" (builtins.fetchTarball "https://hackage.haskell.org/package/splitmix-0.1.3.1.tar.gz") { testu01 = null /* just pass something */; }).override { testu01 = /* later we can pass something else: */ my-pkg; }
| 15:59:14 |
bglgwyng | Ah I see | 16:06:43 |
bglgwyng | Thanks! | 16:06:46 |
bglgwyng | One thing annoying is that I can investigate the argments with builtins.functionArgs (pkgs.callCabal2nix name src) | 16:13:54 |
bglgwyng | Maybe it's because wrapped? I think I can find how to fix it | 16:14:12 |
keypusher | So going the addBuildTools route will require me to build wo using callCabal2Nix then? | 16:19:31 |
maralorn | I am missing a bit of context, but I don’t think so. Both functions are compatible. First call callCabal2Nix then apply addBuildTools to the result of the function. | 16:33:23 |
keypusher | Oh ok. I'll try that | 16:34:22 |
keypusher | You made my day. 4 hours of struggling just came to an end. My nix intuition is lacking. | 16:36:43 |
keypusher | Thanks 🎉 | 16:37:15 |
sterni (he/him) | I noticed that, too, yesterday, I think this is a bug and is probably fixable | 17:43:17 |
Alex | In reply to @sternenseemann:systemli.org I would just start with adding a MicroHs package set built with GHC as we don't have hugs and then just iterate on that; maybe add hugs separately, have a hugs package set (if that even makes sense). Not sure which branch to PR to.
I assume haskell-updates is the best choice?
(Hugs fix without GCC 13 is ready.) | 22:37:00 |