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`.
This commit is contained in:
Rebecca Turner 2025-05-01 16:19:22 -07:00
parent 7650c61104
commit 03c44317c8
No known key found for this signature in database
3 changed files with 26 additions and 8 deletions

View File

@ -2,4 +2,4 @@
COMMAND=$1 COMMAND=$1
shift shift
exec @hoogle@/bin/hoogle "$COMMAND" --database @out@/share/doc/hoogle/default.hoo "$@" exec @hoogle@/bin/hoogle "$COMMAND" --database @database@ "$@"

View File

@ -8,6 +8,7 @@
buildPackages, buildPackages,
haskellPackages, haskellPackages,
writeText, writeText,
runCommand,
}: }:
# This argument is a function which selects a list of Haskell packages from any # This argument is a function which selects a list of Haskell packages from any
@ -40,8 +41,11 @@ let
# we grab the doc outputs # we grab the doc outputs
(map (lib.getOutput "doc") packages); (map (lib.getOutput "doc") packages);
# Hoogle database path, relative to `$out`.
databasePath = "share/doc/hoogle/default.hoo";
in in
buildPackages.stdenv.mkDerivation { buildPackages.stdenv.mkDerivation (finalAttrs: {
name = "hoogle-with-packages"; name = "hoogle-with-packages";
buildInputs = [ buildInputs = [
ghc ghc
@ -101,8 +105,10 @@ buildPackages.stdenv.mkDerivation {
) )
} }
databasePath="$out/"${lib.escapeShellArg databasePath}
echo building hoogle database 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 echo building haddock index
# adapted from GHC's gen_contents_index # adapted from GHC's gen_contents_index
@ -122,13 +128,23 @@ buildPackages.stdenv.mkDerivation {
echo finishing up echo finishing up
mkdir -p $out/bin mkdir -p $out/bin
substitute ${wrapper} $out/bin/hoogle \ 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} --subst-var-by hoogle ${hoogle}
chmod +x $out/bin/hoogle chmod +x $out/bin/hoogle
''; '';
passthru = { passthru = {
isHaskellLibrary = false; # for the filter in ./with-packages-wrapper.nix 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 = { meta = {
@ -137,4 +153,4 @@ buildPackages.stdenv.mkDerivation {
hydraPlatforms = with lib.platforms; none; hydraPlatforms = with lib.platforms; none;
maintainers = with lib.maintainers; [ ttuegel ]; maintainers = with lib.maintainers; [ ttuegel ];
}; };
} })

View File

@ -47,9 +47,9 @@ selectPackages:
let let
inherit (haskellPackages) llvmPackages ghc; inherit (haskellPackages) llvmPackages ghc;
packages = hoogleWithPackages' = if withHoogle then hoogleWithPackages selectPackages else null;
selectPackages haskellPackages
++ lib.optional withHoogle (hoogleWithPackages selectPackages); packages = selectPackages haskellPackages ++ [ hoogleWithPackages' ];
isGhcjs = ghc.isGhcjs or false; isGhcjs = ghc.isGhcjs or false;
isHaLVM = ghc.isHaLVM or false; isHaLVM = ghc.isHaLVM or false;
@ -202,6 +202,8 @@ else
passthru = { passthru = {
inherit (ghc) version meta; inherit (ghc) version meta;
hoogle = hoogleWithPackages';
# Inform users about backwards incompatibilities with <= 21.05 # Inform users about backwards incompatibilities with <= 21.05
override = override =
_: _: