diff --git a/pkgs/development/haskell-modules/generic-builder.nix b/pkgs/development/haskell-modules/generic-builder.nix index b29af39a8b099..cdff45ffafa6c 100644 --- a/pkgs/development/haskell-modules/generic-builder.nix +++ b/pkgs/development/haskell-modules/generic-builder.nix @@ -345,8 +345,10 @@ let (enableFeature doCoverage "coverage") (enableFeature enableStaticLibraries "static") (enableFeature enableSharedExecutables "executable-dynamic") - (enableFeature doCheck "tests") - (enableFeature doBenchmark "benchmarks") + # "--enable-tests/--enable-benchmarks are incompatible with explicitly + # specifying a component to configure." + (enableFeature (doCheck && buildTarget == "") "tests") + (enableFeature (doBenchmark && buildTarget == "") "benchmarks") "--enable-library-vanilla" # TODO: Should this be configurable? (enableFeature enableLibraryForGhci "library-for-ghci") (enableFeature enableDeadCodeElimination "split-sections") @@ -724,7 +726,7 @@ lib.fix ( runHook preConfigure echo configureFlags: $configureFlags - ${setupCommand} configure $configureFlags 2>&1 | ${coreutils}/bin/tee "$NIX_BUILD_TOP/cabal-configure.log" + ${setupCommand} configure ${buildTarget} $configureFlags 2>&1 | ${coreutils}/bin/tee "$NIX_BUILD_TOP/cabal-configure.log" ${lib.optionalString (!allowInconsistentDependencies) '' if grep -E -q -z 'Warning:.*depends on multiple versions' "$NIX_BUILD_TOP/cabal-configure.log"; then echo >&2 "*** abort because of serious configure-time warning from Cabal" @@ -807,7 +809,10 @@ lib.fix ( mkdir -p "$packageConfDir" ${setupCommand} register --gen-pkg-config=$packageConfFile if [ -d "$packageConfFile" ]; then - mv "$packageConfFile/"* "$packageConfDir" + # Avoid 'mv "$dir"/*' failing due to unexpanded glob in empty directory. + if [ -n "$(find "$packageConfFile" -mindepth 1 -print -quit)" ]; then + mv "$packageConfFile/"* "$packageConfDir" + fi rmdir "$packageConfFile" fi for packageConfFile in "$packageConfDir/"*; do diff --git a/pkgs/test/haskell/default.nix b/pkgs/test/haskell/default.nix index 8f1f21d65b51f..1814435afcf60 100644 --- a/pkgs/test/haskell/default.nix +++ b/pkgs/test/haskell/default.nix @@ -4,7 +4,7 @@ lib.recurseIntoAttrs { shellFor = callPackage ./shellFor { }; cabalSdist = callPackage ./cabalSdist { }; documentationTarball = callPackage ./documentationTarball { }; - setBuildTarget = callPackage ./setBuildTarget { }; + setBuildTarget = lib.recurseIntoAttrs (callPackage ./setBuildTarget { }); incremental = callPackage ./incremental { }; upstreamStackHpackVersion = callPackage ./upstreamStackHpackVersion { }; } diff --git a/pkgs/test/haskell/setBuildTarget/default.nix b/pkgs/test/haskell/setBuildTarget/default.nix index 68f9b25dba75a..ef5bded23d8bc 100644 --- a/pkgs/test/haskell/setBuildTarget/default.nix +++ b/pkgs/test/haskell/setBuildTarget/default.nix @@ -1,6 +1,13 @@ -{ pkgs, haskellPackages }: +{ + haskell, + haskellPackages, + pkgs, + testers, +}: let + inherit (haskell.lib.compose) doCheck dontCheck setBuildTarget; + # This can be regenerated by running `cabal2nix ./src` in the current directory. pkgDef = { @@ -12,9 +19,11 @@ let pname = "haskell-setBuildTarget"; version = "0.1.0.0"; src = ./src; - isLibrary = false; + isLibrary = true; isExecutable = true; + libraryHaskellDepends = [ base ]; executableHaskellDepends = [ base ]; + testHaskellDepends = [ base ]; license = "unknown"; }; @@ -23,7 +32,7 @@ let test = target: excluded: let - only = pkgs.haskell.lib.compose.setBuildTarget target drv; + only = dontCheck (setBuildTarget target drv); in '' if [[ ! -f "${only}/bin/${target}" ]]; then @@ -38,14 +47,25 @@ let ''; in -pkgs.runCommand "test haskell.lib.compose.setBuildTarget" - { - meta = { - inherit (drv.meta) platforms; - }; - } - '' - ${test "foo" "bar"} - ${test "bar" "foo"} - touch "$out" - '' +{ + pass-setBuildTarget = + pkgs.runCommand "test haskell.lib.compose.setBuildTarget" + { meta = { inherit (drv.meta) platforms; }; } + '' + ${test "foo" "bar"} + ${test "bar" "foo"} + touch "$out" + ''; + + # Not building the test-suite (that is mentioned in the .cabal file) is a + # failure when doCheck=true. + fail-doCheck-setBuildTarget = + pkgs.runCommand "fail-doCheck-setBuildTarget" + { result = testers.testBuildFailure (doCheck (setBuildTarget "exe:foo" drv)); } + '' + echo -n 'Checking testBuildFailure.log: ' + grep --quiet --fixed-strings 'Error: Setup: No test suites enabled.' $result/testBuildFailure.log + echo OK + touch "$out" + ''; +} diff --git a/pkgs/test/haskell/setBuildTarget/src/SomeModule.hs b/pkgs/test/haskell/setBuildTarget/src/SomeModule.hs new file mode 100644 index 0000000000000..a1058854828e1 --- /dev/null +++ b/pkgs/test/haskell/setBuildTarget/src/SomeModule.hs @@ -0,0 +1 @@ +module SomeModule where diff --git a/pkgs/test/haskell/setBuildTarget/src/haskell-setBuildTarget.cabal b/pkgs/test/haskell/setBuildTarget/src/haskell-setBuildTarget.cabal index 7395e139451cc..e4fe60a0f3b13 100644 --- a/pkgs/test/haskell/setBuildTarget/src/haskell-setBuildTarget.cabal +++ b/pkgs/test/haskell/setBuildTarget/src/haskell-setBuildTarget.cabal @@ -14,3 +14,15 @@ executable bar main-is: Bar.hs build-depends: base default-language: Haskell2010 + +-- A library that the executables don't depend on. +library + exposed-modules: SomeModule + build-depends: base + default-language: Haskell2010 + +test-suite sometest + type: exitcode-stdio-1.0 + main-is: sometest.hs + build-depends: base + default-language: Haskell2010 diff --git a/pkgs/test/haskell/setBuildTarget/src/sometest.hs b/pkgs/test/haskell/setBuildTarget/src/sometest.hs new file mode 100644 index 0000000000000..d82a4bd93b7e7 --- /dev/null +++ b/pkgs/test/haskell/setBuildTarget/src/sometest.hs @@ -0,0 +1,4 @@ +module Main where + +main :: IO () +main = return ()