about summary refs log tree commit diff
path: root/third_party/bazel/rules_haskell/haskell/private/haddock_wrapper.sh.tpl
blob: c359da1c321dc788e39d83198f1c76f1689916f0 (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
#!/usr/bin/env bash
#
# Usage: haddock-wrapper.sh <PREBUILD_DEPS_FILE> <HADDOCK_ARGS>

set -eo pipefail

%{env}

PREBUILT_DEPS_FILE=$1
shift

extra_args=()

for pkg in $(< $PREBUILT_DEPS_FILE)
do
    # Assumption: the `haddock-interfaces` field always only contains
    # exactly one file name. This seems to hold in practice, though the
    # ghc documentation defines it as:
    # > (string list) A list of filenames containing Haddock interface files
    # > (.haddock files) for this package.
    # If there were more than one file, going by the output for the `depends`,
    # the file names would be separated by a space character.
    # https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/packages.html#installedpackageinfo-a-package-specification
    haddock_interfaces=$(%{ghc-pkg} --simple-output field $pkg haddock-interfaces)
    haddock_html=$(%{ghc-pkg} --simple-output field $pkg haddock-html)

    # Sometimes the referenced `.haddock` file does not exist
    # (e.g. for `nixpkgs.haskellPackages` deps with haddock disabled).
    # In that case, skip this package with a warning.
    if [[ -f "$haddock_interfaces" ]]
    then
        # TODO: link source code,
        # `--read-interface=$haddock_html,$pkg_src,$haddock_interfaces
        # https://haskell-haddock.readthedocs.io/en/latest/invoking.html#cmdoption-read-interface
        extra_args+=("--read-interface=$haddock_html,$haddock_interfaces")
    else
        echo "Warning: haddock missing for package $pkg" 1>&2
    fi
done

# BSD and GNU mktemp are very different; attempt GNU first
TEMP=$(mktemp -d 2>/dev/null || mktemp -d -t 'haddock_wrapper')
trap cleanup 1 2 3 6
cleanup() { rmdir "$TEMP"; }
# XXX Override TMPDIR to prevent race conditions on certain platforms.
# This is a workaround for
# https://github.com/haskell/haddock/issues/894.
TMPDIR=$TEMP %{haddock} "${extra_args[@]}" "$@"
cleanup