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`.

Changed files
+26 -8
pkgs
+1 -1
pkgs/development/haskell-modules/hoogle-local-wrapper.sh
···
COMMAND=$1
shift
-
exec @hoogle@/bin/hoogle "$COMMAND" --database @out@/share/doc/hoogle/default.hoo "$@"
+
exec @hoogle@/bin/hoogle "$COMMAND" --database @database@ "$@"
+20 -4
pkgs/development/haskell-modules/hoogle.nix
···
buildPackages,
haskellPackages,
writeText,
+
runCommand,
}:
# This argument is a function which selects a list of Haskell packages from any
···
# 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
···
)
}
+
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
···
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 = {
···
hydraPlatforms = with lib.platforms; none;
maintainers = with lib.maintainers; [ ttuegel ];
};
-
}
+
})
+5 -3
pkgs/development/haskell-modules/with-packages-wrapper.nix
···
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;
···
preferLocalBuild = true;
passthru = {
inherit (ghc) version meta;
+
+
hoogle = hoogleWithPackages';
# Inform users about backwards incompatibilities with <= 21.05
override =