From 03c44317c8eeddae4a4fc4ec0ee85df1300f52e7 Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Thu, 1 May 2025 16:19:22 -0700 Subject: [PATCH] haskellPackages.ghcWithHoogle: add `passthru.hoogle` Package sets built with `haskellPackages.ghcWithHoogle` provide a Hoogle executable which points to a Hoogle database, but there's no way to programmatically access the derivation containing the Hoogle database from the package set. This adds a `passthru.hoogle` attribute to package sets built with `haskellPackages.ghcWithHoogle`, and a `passthru.database` helper to derivations built with `haskellPackages.hoogleWithPackages`. --- .../haskell-modules/hoogle-local-wrapper.sh | 2 +- pkgs/development/haskell-modules/hoogle.nix | 24 +++++++++++++++---- .../haskell-modules/with-packages-wrapper.nix | 8 ++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/pkgs/development/haskell-modules/hoogle-local-wrapper.sh b/pkgs/development/haskell-modules/hoogle-local-wrapper.sh index 223d19b70f03..e5b63669ae73 100644 --- a/pkgs/development/haskell-modules/hoogle-local-wrapper.sh +++ b/pkgs/development/haskell-modules/hoogle-local-wrapper.sh @@ -2,4 +2,4 @@ COMMAND=$1 shift -exec @hoogle@/bin/hoogle "$COMMAND" --database @out@/share/doc/hoogle/default.hoo "$@" +exec @hoogle@/bin/hoogle "$COMMAND" --database @database@ "$@" diff --git a/pkgs/development/haskell-modules/hoogle.nix b/pkgs/development/haskell-modules/hoogle.nix index 9237f0fda59f..d20fc0f2978c 100644 --- a/pkgs/development/haskell-modules/hoogle.nix +++ b/pkgs/development/haskell-modules/hoogle.nix @@ -8,6 +8,7 @@ buildPackages, haskellPackages, writeText, + runCommand, }: # This argument is a function which selects a list of Haskell packages from any @@ -40,8 +41,11 @@ let # we grab the doc outputs (map (lib.getOutput "doc") packages); + # Hoogle database path, relative to `$out`. + databasePath = "share/doc/hoogle/default.hoo"; + in -buildPackages.stdenv.mkDerivation { +buildPackages.stdenv.mkDerivation (finalAttrs: { name = "hoogle-with-packages"; buildInputs = [ ghc @@ -101,8 +105,10 @@ buildPackages.stdenv.mkDerivation { ) } + databasePath="$out/"${lib.escapeShellArg databasePath} + echo building hoogle database - hoogle generate --database $out/share/doc/hoogle/default.hoo --local=$out/share/doc/hoogle + hoogle generate --database "$databasePath" --local=$out/share/doc/hoogle echo building haddock index # adapted from GHC's gen_contents_index @@ -122,13 +128,23 @@ buildPackages.stdenv.mkDerivation { echo finishing up mkdir -p $out/bin substitute ${wrapper} $out/bin/hoogle \ - --subst-var out --subst-var-by shell ${stdenv.shell} \ + --subst-var-by shell ${stdenv.shell} \ + --subst-var-by database "$databasePath" \ --subst-var-by hoogle ${hoogle} chmod +x $out/bin/hoogle ''; passthru = { isHaskellLibrary = false; # for the filter in ./with-packages-wrapper.nix + + # The path to the Hoogle database. + database = "${finalAttrs.finalPackage}/${databasePath}"; + + tests.can-search-database = runCommand "can-search-database" { } '' + # This succeeds even if no results are found, but `Prelude.map` should + # always be available. + ${finalAttrs.finalPackage}/bin/hoogle search Prelude.map > $out + ''; }; meta = { @@ -137,4 +153,4 @@ buildPackages.stdenv.mkDerivation { hydraPlatforms = with lib.platforms; none; maintainers = with lib.maintainers; [ ttuegel ]; }; -} +}) diff --git a/pkgs/development/haskell-modules/with-packages-wrapper.nix b/pkgs/development/haskell-modules/with-packages-wrapper.nix index 020dc12651b0..b1b227d2dcc2 100644 --- a/pkgs/development/haskell-modules/with-packages-wrapper.nix +++ b/pkgs/development/haskell-modules/with-packages-wrapper.nix @@ -47,9 +47,9 @@ selectPackages: let inherit (haskellPackages) llvmPackages ghc; - packages = - selectPackages haskellPackages - ++ lib.optional withHoogle (hoogleWithPackages selectPackages); + hoogleWithPackages' = if withHoogle then hoogleWithPackages selectPackages else null; + + packages = selectPackages haskellPackages ++ [ hoogleWithPackages' ]; isGhcjs = ghc.isGhcjs or false; isHaLVM = ghc.isHaLVM or false; @@ -202,6 +202,8 @@ else passthru = { inherit (ghc) version meta; + hoogle = hoogleWithPackages'; + # Inform users about backwards incompatibilities with <= 21.05 override = _: