summary refs log tree commit diff
path: root/pkgs/development/libraries/haskell/hoogle/local.nix
blob: 822c2bdd82eaa882e0b7e5523072ef3e630ef53e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Install not only the Hoogle library and executable, but also a local Hoogle
# database which provides "Source" links to all specified 'packages' -- or the
# current Haskell Platform if no custom package set is provided.
#
# It is intended to be used in config.nix similarly to:
#
# { packageOverrides = pkgs: rec {
#
#   haskellPackages =
#     let callPackage = pkgs.lib.callPackageWith haskellPackages;
#     in pkgs.recurseIntoAttrs (pkgs.haskellPackages.override {
#         extension = self: super: {
#           hoogleLocal = pkgs.haskellPackages.hoogleLocal.override {
#             packages = with pkgs.haskellPackages; [
#               mmorph
#               monadControl
#             ];
#           };
#         };
#       });
# }}
#
# This will build mmorph and monadControl, and have the hoogle installation
# refer to their documentation via symlink so they are not garbage collected.

{ stdenv, hoogle, rehoo
, ghc, packages ? [ ghc.ghc ]
}:

let
  inherit (stdenv.lib) optional;
  wrapper = ./hoogle-local-wrapper.sh;
in
stdenv.mkDerivation {
  name = "hoogle-local-0.1";
  buildInputs = [hoogle rehoo];

  phases = [ "installPhase" ];

  docPackages = packages;
  installPhase = ''
    if [ -z "$docPackages" ]; then
        echo "ERROR: The packages attribute has not been set"
        exit 1
    fi

    mkdir -p $out/share/hoogle/doc
    export HOOGLE_DOC_PATH=$out/share/hoogle/doc

    cd $out/share/hoogle

    function import_dbs() {
        find $1 -name '*.txt' | while read f; do
          newname=$(basename "$f" | tr '[:upper:]' '[:lower:]')
          if [[ -f $f && ! -f ./$newname ]]; then
            cp -p $f ./$newname
            hoogle convert -d "$(dirname $f)" "./$newname"
          fi
        done
    }

    for i in $docPackages; do
        findInputs $i docPackages propagated-native-build-inputs
        findInputs $i docPackages propagated-build-inputs
    done

    for i in $docPackages; do
      if [[ ! $i == $out ]]; then
        for docdir in $i/share/doc/*-ghc-*/* $i/share/doc/*; do
          if [[ -d $docdir ]]; then
            import_dbs $docdir
            ln -sf $docdir $out/share/hoogle/doc
          fi
        done
      fi
    done

    import_dbs ${ghc}/share/doc/ghc*/html/libraries
    ln -sf ${ghc}/share/doc/ghc*/html/libraries/* $out/share/hoogle/doc

    chmod 644 *.hoo *.txt
    rehoo -j4 -c64 .

    rm -fr downloads *.dep *.txt
    mv default.hoo x || exit 0
    rm -f *.hoo
    mv x default.hoo || exit 1

    if [ ! -f default.hoo ]; then
        echo "Unable to build the default Hoogle database"
        exit 1
    fi

    mkdir -p $out/bin
    substitute ${wrapper} $out/bin/hoogle \
        --subst-var out --subst-var-by shell ${stdenv.shell} \
        --subst-var-by hoogle ${hoogle}
    chmod +x $out/bin/hoogle
  '';

  meta = {
    description = "A local Hoogle database";
    platforms = ghc.meta.platforms;
    hydraPlatforms = with stdenv.lib.platforms; none;
    maintainers = with stdenv.lib.maintainers; [ ttuegel ];
  };
}