diff --git a/doc/hooks/cmake.section.md b/doc/hooks/cmake.section.md index 5bcc3c980fc5..4aecc8440c64 100644 --- a/doc/hooks/cmake.section.md +++ b/doc/hooks/cmake.section.md @@ -33,3 +33,21 @@ The default value is `build`. #### `dontUseCmakeConfigure` {#dont-use-cmake-configure} When set to true, don't use the predefined `cmakeConfigurePhase`. + +## Controlling CTest invocation {#cmake-ctest} + +By default tests are run by make in [`checkPhase`](#ssec-check-phase) or by [ninja](#ninja) if `ninja` is +available in `nativeBuildInputs`. Makefile and Ninja generators produce the `test` target, which invokes `ctest` under the hood. +This makes passing additional arguments to `ctest` difficult, so it's possible to invoke it directly in `checkPhase` +by adding `ctestCheckHook` to `nativeCheckInputs`. + +### CTest Variables {#cmake-ctest-variables} + +#### `disabledTests` {#cmake-ctest-disabled-tests} + +Allows to disable running a list of tests. Note that regular expressions are not supported by `disabledTests`, but +it can be combined with `--exclude-regex` option. + +#### `ctestFlags` {#cmake-ctest-flags} + +Additional options passed to `ctest` together with `checkFlags`. diff --git a/doc/redirects.json b/doc/redirects.json index 77c2ffba7b1e..3d4b4a4c084e 100644 --- a/doc/redirects.json +++ b/doc/redirects.json @@ -5,6 +5,18 @@ "chap-release-notes": [ "release-notes.html#chap-release-notes" ], + "cmake-ctest": [ + "index.html#cmake-ctest" + ], + "cmake-ctest-disabled-tests": [ + "index.html#cmake-ctest-disabled-tests" + ], + "cmake-ctest-flags": [ + "index.html#cmake-ctest-flags" + ], + "cmake-ctest-variables": [ + "index.html#cmake-ctest-variables" + ], "ex-build-helpers-extendMkDerivation": [ "index.html#ex-build-helpers-extendMkDerivation" ], diff --git a/pkgs/applications/audio/zynaddsubfx/default.nix b/pkgs/applications/audio/zynaddsubfx/default.nix index fdcfc0a8005e..f6ac1294fc2a 100644 --- a/pkgs/applications/audio/zynaddsubfx/default.nix +++ b/pkgs/applications/audio/zynaddsubfx/default.nix @@ -45,6 +45,7 @@ # Test dependencies cxxtest, ruby, + ctestCheckHook, }: assert builtins.any (g: guiModule == g) [ @@ -151,28 +152,19 @@ stdenv.mkDerivation rec { nativeCheckInputs = [ cxxtest ruby + ctestCheckHook ]; - # TODO: Update cmake hook to make it simpler to selectively disable cmake tests: #113829 - checkPhase = - let - disabledTests = - # PortChecker is non-deterministic. It's fixed in the master - # branch, but backporting would require an update to rtosc, so - # we'll just disable it until the next release. - [ "PortChecker" ] - - # Tests fail on aarch64 - ++ lib.optionals stdenv.hostPlatform.isAarch64 [ - "MessageTest" - "UnisonTest" - ]; - in - '' - runHook preCheck - ctest --output-on-failure -E '^${lib.concatStringsSep "|" disabledTests}$' - runHook postCheck - ''; + disabledTests = + # PortChecker is non-deterministic. It's fixed in the master + # branch, but backporting would require an update to rtosc, so + # we'll just disable it until the next release. + [ "PortChecker" ] + # Tests fail on aarch64 + ++ lib.optionals stdenv.hostPlatform.isAarch64 [ + "MessageTest" + "UnisonTest" + ]; # Use Zyn-Fusion logo for zest build # An SVG version of the logo isn't hosted anywhere we can fetch, I diff --git a/pkgs/by-name/ct/ctestCheckHook/ctest-check-hook.sh b/pkgs/by-name/ct/ctestCheckHook/ctest-check-hook.sh new file mode 100644 index 000000000000..65d39923f967 --- /dev/null +++ b/pkgs/by-name/ct/ctestCheckHook/ctest-check-hook.sh @@ -0,0 +1,44 @@ +# shellcheck shell=bash disable=SC2154 + +ctestCheckHook() { + echo "Executing ctestCheckHook" + + runHook preCheck + + local buildCores=1 + + if [ "${enableParallelChecking-1}" ]; then + buildCores="$NIX_BUILD_CORES" + fi + + local flagsArray=( + "-j$buildCores" + # This is enabled by the cmakeConfigurePhase by exporting + # CTEST_OUTPUT_ON_FAILURE, but it makes sense it enable it globally here + # as well. + "--output-on-failure" + ) + + local disabledTestsArray=() + concatTo disabledTestsArray disabledTests + + if [ ${#disabledTestsArray[@]} -ne 0 ]; then + local ctestExcludedTestsFile=$NIX_BUILD_TOP/.ctest-excluded-tests + disabledTestsString="$(concatStringsSep "\n" disabledTestsArray)" + echo -e "$disabledTestsString" >"$ctestExcludedTestsFile" + flagsArray+=("--exclude-from-file" "$ctestExcludedTestsFile") + fi + + concatTo flagsArray ctestFlags checkFlags checkFlagsArray + + echoCmd 'ctest flags' "${flagsArray[@]}" + ctest "${flagsArray[@]}" + + echo "Finished ctestCheckHook" + + runHook postCheck +} + +if [ -z "${dontUseCTestCheck-}" ] && [ -z "${checkPhase-}" ]; then + checkPhase=ctestCheckHook +fi diff --git a/pkgs/by-name/ct/ctestCheckHook/package.nix b/pkgs/by-name/ct/ctestCheckHook/package.nix new file mode 100644 index 000000000000..631b2ba8b86a --- /dev/null +++ b/pkgs/by-name/ct/ctestCheckHook/package.nix @@ -0,0 +1,9 @@ +{ + makeSetupHook, + cmake, +}: + +makeSetupHook { + name = "ctestCheckHook"; + propagatedBuildInputs = [ cmake ]; +} ./ctest-check-hook.sh diff --git a/pkgs/by-name/gi/gifticlib/package.nix b/pkgs/by-name/gi/gifticlib/package.nix index d20a554c318b..acd9dabbab9e 100644 --- a/pkgs/by-name/gi/gifticlib/package.nix +++ b/pkgs/by-name/gi/gifticlib/package.nix @@ -6,6 +6,7 @@ expat, nifticlib, zlib, + ctestCheckHook, }: stdenv.mkDerivation { @@ -33,11 +34,11 @@ stdenv.mkDerivation { # without the test data, this is only a few basic tests doCheck = !stdenv.hostPlatform.isDarwin; - checkPhase = '' - runHook preCheck - ctest -LE 'NEEDS_DATA' - runHook postCheck - ''; + nativeCheckInputs = [ ctestCheckHook ]; + checkFlags = [ + "-LE" + "NEEDS_DATA" + ]; meta = with lib; { homepage = "https://www.nitrc.org/projects/gifti"; diff --git a/pkgs/by-name/pd/pdal/package.nix b/pkgs/by-name/pd/pdal/package.nix index f09062a3c5bc..8fae42c069e9 100644 --- a/pkgs/by-name/pd/pdal/package.nix +++ b/pkgs/by-name/pd/pdal/package.nix @@ -2,6 +2,7 @@ lib, stdenv, callPackage, + ctestCheckHook, fetchFromGitHub, testers, @@ -92,6 +93,9 @@ stdenv.mkDerivation (finalAttrs: { ]; doCheck = true; + # tests are flaky and they seem to fail less often when they don't run in + # parallel + enableParallelChecking = false; disabledTests = [ # Tests failing due to TileDB library implementation, disabled also @@ -116,16 +120,9 @@ stdenv.mkDerivation (finalAttrs: { nativeCheckInputs = [ gdal # gdalinfo + ctestCheckHook ]; - checkPhase = '' - runHook preCheck - # tests are flaky and they seem to fail less often when they don't run in - # parallel - ctest -j 1 --output-on-failure -E '^${lib.concatStringsSep "|" finalAttrs.disabledTests}$' - runHook postCheck - ''; - postInstall = '' patchShebangs --update --build $out/bin/pdal-config '';