|
4 | 4 | # `cardano-ledger` repository.
|
5 | 5 | #
|
6 | 6 | # usage:
|
7 |
| -# ./haddocks.sh directory [true|false] |
| 7 | +# ./haddocks.sh directory [components ...] |
8 | 8 | #
|
9 | 9 | # $1 - where to put the generated pages, this directory contents will be wiped
|
10 | 10 | # out (so don't pass `/` or `./` - the latter will delete your 'dist-newstyle')
|
11 |
| -# (the default is './haddocks') |
12 |
| -# $2 - whether to re-build haddocks with `cabal haddock` command or a component name |
13 |
| -# (the default is true) |
| 11 | +# (the default is 'haddocks') |
| 12 | +# $2 - the components to re-build haddocks for, or 'all' |
| 13 | +# (the default is none) |
14 | 14 | #
|
15 | 15 |
|
16 | 16 | set -euo pipefail
|
17 | 17 |
|
18 |
| -OUTPUT_DIR=${1:-"./haddocks"} |
19 |
| -REGENERATE=${2:-"true"} |
| 18 | +OUTPUT_DIR=${1:-haddocks} |
| 19 | +REGENERATE=("${@:2}") |
20 | 20 |
|
21 |
| -BUILD_DIR="dist-newstyle" |
22 |
| -GHC_VERSION=$(ghc --numeric-version) |
23 |
| -OS_ARCH="$(cat dist-newstyle/cache/plan.json | jq -r '.arch + "-" + .os' | head -n 1 | xargs)" |
| 21 | +BUILD_DIR=dist-newstyle |
24 | 22 |
|
| 23 | +CABAL_OPTS=( |
| 24 | + --builddir "${BUILD_DIR}" |
| 25 | + --enable-benchmarks |
| 26 | + --enable-documentation |
| 27 | + --enable-tests |
| 28 | +) |
25 | 29 |
|
26 | 30 | # Generate `doc-index.json` and `doc-index.html` per package, to assemble them later at the top level.
|
27 | 31 | HADDOCK_OPTS=(
|
28 |
| - --builddir "${BUILD_DIR}" |
29 |
| - --haddock-all |
30 |
| - --haddock-internal |
31 |
| - --haddock-html |
32 |
| - --haddock-quickjump |
33 |
| - --haddock-hyperlink-source |
34 |
| - --haddock-option "--show-all" |
35 |
| - --haddock-option "--use-unicode" |
36 |
| - --haddock-option="--base-url=.." |
37 |
| - ) |
| 32 | + --haddock-all |
| 33 | + --haddock-html |
| 34 | + --haddock-hyperlink-source |
| 35 | + --haddock-internal |
| 36 | + --haddock-option "--show-all" |
| 37 | + --haddock-option "--use-unicode" |
| 38 | + --haddock-option="--base-url=.." |
| 39 | + --haddock-quickjump |
| 40 | +) |
38 | 41 |
|
39 |
| -# build documentation of all modules |
40 |
| -if [ ${REGENERATE} == "true" ]; then |
41 |
| - cabal haddock "${HADDOCK_OPTS[@]}" all |
42 |
| -elif [ ${REGENERATE} != "false" ]; then |
43 |
| - cabal haddock "${HADDOCK_OPTS[@]}" ${REGENERATE} |
| 42 | +# Rebuild documentation if requested |
| 43 | +if (( "${#REGENERATE[@]}" > 0 )); then |
| 44 | + cabal build "${CABAL_OPTS[@]}" "${REGENERATE[@]}" |
| 45 | + cabal haddock "${CABAL_OPTS[@]}" "${REGENERATE[@]}" "${HADDOCK_OPTS[@]}" |
44 | 46 | fi
|
45 | 47 |
|
46 |
| -if [[ !( -d ${OUTPUT_DIR} ) ]]; then |
47 |
| - mkdir -p ${OUTPUT_DIR} |
| 48 | +if [[ ! -d "${OUTPUT_DIR}" ]]; then |
| 49 | + mkdir -p "${OUTPUT_DIR}" |
48 | 50 | fi
|
49 | 51 |
|
50 | 52 | # make all files user writable
|
51 | 53 | chmod -R u+w "${OUTPUT_DIR}"
|
52 | 54 |
|
| 55 | +GHC_VERSION=$(ghc --numeric-version) |
| 56 | +OS_ARCH=$(jq -r '"\(.arch)-\(.os)"' "$BUILD_DIR/cache/plan.json") |
| 57 | + |
53 | 58 | # copy the new docs
|
54 |
| -for dir in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}"); do |
55 |
| - package=$(echo "${dir}" | sed 's/-[0-9]\+\(\.[0-9]\+\)*//') |
56 |
| - if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}" ]; then |
57 |
| - cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}" ${OUTPUT_DIR} |
58 |
| - else continue; |
| 59 | +for package_dir in "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}"/*; do |
| 60 | + package=$(basename "${package_dir}" | sed 's/-[0-9]\+\(\.[0-9]\+\)*//') |
| 61 | + if [ -d "${package_dir}/doc/html/${package}" ]; then |
| 62 | + cp -r "${package_dir}/doc/html/${package}" "${OUTPUT_DIR}" |
| 63 | + else continue |
59 | 64 | fi
|
60 | 65 | # copy test packages documentation when it exists
|
61 |
| - if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t" ]; then |
62 |
| - for test_package in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t"); do |
63 |
| - if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t/${test_package}/doc/html/${package}/${test_package}" ]; then |
64 |
| - cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t/${test_package}/doc/html/${package}/${test_package}" "${OUTPUT_DIR}/${package}:${test_package}" |
65 |
| - cp -n "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${test_package}" |
66 |
| - fi |
67 |
| - done |
| 66 | + if [ -d "${package_dir}/t" ]; then |
| 67 | + for test_package_dir in "${package_dir}/t"/*; do |
| 68 | + test_package=$(basename "${test_package_dir}") |
| 69 | + if [ -d "${test_package_dir}/doc/html/${package}/${test_package}" ]; then |
| 70 | + cp -r "${test_package_dir}/doc/html/${package}/${test_package}" "${OUTPUT_DIR}/${package}:${test_package}" |
| 71 | + cp -n "${package_dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${test_package}" |
| 72 | + fi |
| 73 | + done |
68 | 74 | fi
|
69 | 75 | # copy lib packages documentation when it exists
|
70 |
| - if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l" ]; then |
71 |
| - for lib_package in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l"); do |
72 |
| - if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l/${lib_package}/doc/html/${package}" ]; then |
73 |
| - cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l/${lib_package}/doc/html/${package}" "${OUTPUT_DIR}/${package}:${lib_package}" |
74 |
| - cp -n "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${lib_package}" |
75 |
| - fi |
76 |
| - done |
| 76 | + if [ -d "${package_dir}/l" ]; then |
| 77 | + for lib_package_dir in "${package_dir}/l"/*; do |
| 78 | + lib_package=$(basename "${lib_package_dir}") |
| 79 | + if [ -d "${lib_package_dir}/doc/html/${package}" ]; then |
| 80 | + cp -r "${lib_package_dir}/doc/html/${package}" "${OUTPUT_DIR}/${package}:${lib_package}" |
| 81 | + cp -n "${package_dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${lib_package}" |
| 82 | + fi |
| 83 | + done |
77 | 84 | fi
|
78 | 85 | done
|
79 | 86 |
|
80 | 87 | # build read-interface arguments for haddock
|
81 |
| -interface_options () { |
82 |
| - for package in $(ls "${OUTPUT_DIR}"); do |
83 |
| - if [[ -d "${OUTPUT_DIR}/${package}" ]]; then |
84 |
| - haddock_file=$(ls -1 ${OUTPUT_DIR}/${package}/*.haddock | head -1) |
85 |
| - echo "--read-interface=${package},${haddock_file}" |
86 |
| - fi |
87 |
| - done |
88 |
| -} |
| 88 | +interface_options=() |
| 89 | +for package_dir in "${OUTPUT_DIR}"/*; do |
| 90 | + package=$(basename "${package_dir}") |
| 91 | + if [[ -d "${package_dir}" ]]; then |
| 92 | + haddock_files=("${package_dir}"/*.haddock) |
| 93 | + interface_options+=("--read-interface=${package},${haddock_files[0]}") |
| 94 | + fi |
| 95 | +done |
89 | 96 |
|
90 |
| -./scripts/mkprolog.sh ./haddocks ./scripts/prolog |
| 97 | +./scripts/mkprolog.sh "${OUTPUT_DIR}" scripts/prolog |
91 | 98 |
|
92 | 99 | # Generate top level index using interface files
|
93 | 100 | haddock \
|
94 |
| - -o ${OUTPUT_DIR} \ |
| 101 | + -o "${OUTPUT_DIR}" \ |
95 | 102 | --title "cardano-ledger" \
|
96 | 103 | --package-name "Cardano Ledger" \
|
97 | 104 | --gen-index \
|
98 | 105 | --gen-contents \
|
99 | 106 | --quickjump \
|
100 | 107 | --prolog ./scripts/prolog \
|
101 |
| - $(interface_options) |
| 108 | + "${interface_options[@]}" |
102 | 109 |
|
103 | 110 | # Assemble a toplevel `doc-index.json` from package level ones.
|
104 |
| -echo "[]" > "${OUTPUT_DIR}/doc-index.json" |
105 |
| -for file in $(ls $OUTPUT_DIR/*/doc-index.json); do |
106 |
| - project=$(basename $(dirname $file)); |
107 |
| - jq -s \ |
108 |
| - ".[0] + [.[1][] | (. + {link: (\"${project}/\" + .link)}) ]" \ |
109 |
| - "${OUTPUT_DIR}/doc-index.json" \ |
110 |
| - ${file} \ |
111 |
| - > /tmp/doc-index.json |
112 |
| - mv /tmp/doc-index.json "${OUTPUT_DIR}/doc-index.json" |
113 |
| -done |
| 111 | +for file in "$OUTPUT_DIR"/*/doc-index.json; do |
| 112 | + project=$(basename "$(dirname "$file")"); |
| 113 | + jq ".[] | .link = \"${project}/\(.link)\"" "${file}" |
| 114 | +done | |
| 115 | + jq -s . >"${OUTPUT_DIR}/doc-index.json" |
0 commit comments