From 57ec1813fff2e48e011dc95b02e986c0573c3cda Mon Sep 17 00:00:00 2001 From: sternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org> Date: Wed, 9 Jun 2021 15:09:00 +0200 Subject: [PATCH] haskell-generic-builder: allow passing flags to the test suite(s) Every flag the generic builder receives via `testFlags` is passed via `--test-option` [1] to `Setup.hs` which in turn passes them to the underlying test suite binary. These wrapped options are added to `checkFlagsArray` in `checkPhase`. This needs to be done in bash since without structuredAttrs in nixpkgs so far, Nix arrays aren't properly translated into bash arrays, so we'd have all sorts of quoting issues when spaces are involved. Re-using `checkFlags` and `checkFlagsArray` from standard stdenv setup.sh also results in an additional feature: Using `overrideAttrs` `checkFlags` and `checkFlagsArray` can additionally be overridden, which allows passing extra flags to `Setup.hs` whithout being wrapped with `--test-option`. [1]: See also https://cabal.readthedocs.io/en/3.4/setup-commands.html?highlight=test-option#cmdoption-runhaskell-Setup.hs-test-test-option According to the cabal-install man page this also allows passing special variables which are substituted for other values depending on context. --- pkgs/development/haskell-modules/configuration-common.nix | 7 ++----- pkgs/development/haskell-modules/generic-builder.nix | 8 ++++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pkgs/development/haskell-modules/configuration-common.nix b/pkgs/development/haskell-modules/configuration-common.nix index 3a3282d2ab73..468961fc26d4 100644 --- a/pkgs/development/haskell-modules/configuration-common.nix +++ b/pkgs/development/haskell-modules/configuration-common.nix @@ -1928,9 +1928,7 @@ EOT # Disable flaky tests # https://github.com/DavidEichmann/alpaca-netcode/issues/2 alpaca-netcode = overrideCabal super.alpaca-netcode { - # use testTarget to also pass some flags to the test suite. - # TODO: We should add proper support for this to the builder. - testTarget = "test --test-options='-p \"!/[NOCI]/\"'"; + testFlags = [ "--pattern" "!/[NOCI]/" ]; }; # Tests require to run a binary which isn't built @@ -1941,8 +1939,7 @@ EOT # this, run tests with only a single job. # https://github.com/vmchale/libarchive/issues/20 libarchive = overrideCabal super.libarchive { - # TODO: We should add proper support for this to the builder. - testTarget = "libarchive-test --test-options='-j1'"; + testFlags = [ "-j1" ]; }; # unrestrict bounds for hashable and semigroups diff --git a/pkgs/development/haskell-modules/generic-builder.nix b/pkgs/development/haskell-modules/generic-builder.nix index b91da1669527..2b2f23e20eaf 100644 --- a/pkgs/development/haskell-modules/generic-builder.nix +++ b/pkgs/development/haskell-modules/generic-builder.nix @@ -58,7 +58,7 @@ in , pkg-configDepends ? [], libraryPkgconfigDepends ? [], executablePkgconfigDepends ? [], testPkgconfigDepends ? [], benchmarkPkgconfigDepends ? [] , testDepends ? [], testHaskellDepends ? [], testSystemDepends ? [], testFrameworkDepends ? [] , benchmarkDepends ? [], benchmarkHaskellDepends ? [], benchmarkSystemDepends ? [], benchmarkFrameworkDepends ? [] -, testTarget ? "" +, testTarget ? "", testFlags ? [] , broken ? false , preCompileBuildDriver ? null, postCompileBuildDriver ? null , preUnpack ? null, postUnpack ? null @@ -454,9 +454,13 @@ stdenv.mkDerivation ({ inherit doCheck; + # Run test suite(s) and pass `checkFlags` as well as `checkFlagsArray`. + # `testFlags` are added to `checkFlagsArray` each prefixed with + # `--test-option`, so Cabal passes it to the underlying test suite binary. checkPhase = '' runHook preCheck - ${setupCommand} test ${testTarget} + checkFlagsArray+=(${lib.escapeShellArgs (builtins.map (opt: "--test-option=${opt}") testFlags)}) + ${setupCommand} test ${testTarget} $checkFlags ''${checkFlagsArray:+"''${checkFlagsArray[@]}"} runHook postCheck '';