The rendered manual was in the repository and nowhere else, so an installed application still had nothing to open. Each packager now carries docs/manual/index.html and its pictures, to where the application will look for them: /usr/share/darkroom/manual on Arch, manual\ beside darkroom.exe on Windows (where the models already are, and where dr_plat::system_data_dirs points), and assets/manual in the APK, stored rather than deflated since a GIF or PNG is already compressed. The manual is about 27 MB, which the APK and the installer both grow by; the pictures are 1600x1100 screenshots and short GIFs, and against an APK that already carries 170 MB of inference runtime and 70 MB of models they are not worth re-encoding for. The pictures are LFS objects, so each packager refuses a pointer where a picture should be, as it already does for the models: shipped, a pointer is a manual of broken images that nothing reports. The Android and Windows CI legs therefore fetch docs/manual/media, which they excluded while nothing they built read it, and the installer smoke test checks that the page and every picture were installed.
105 lines
4.8 KiB
Bash
Executable File
105 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Assemble the Windows installer from a finished cross-build.
|
|
#
|
|
# ./docker/windows/build.sh docker/windows/package.sh
|
|
#
|
|
# Expects `cargo build --release --target x86_64-pc-windows-gnu -p darkroom-desktop`
|
|
# to have run in the same target directory. Produces
|
|
# DarkRoom-<version>-x86_64-setup.exe in $OUT (default: target-windows/installer).
|
|
#
|
|
# Runs inside the container, where makensis is; docs/dev/windows.md §5 is the
|
|
# specification this implements.
|
|
set -euo pipefail
|
|
|
|
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO="$(cd "${HERE}/../.." && pwd)"
|
|
# Absolute, whatever CARGO_TARGET_DIR was. NSIS on a POSIX host translates
|
|
# the backslashes in `${STAGE}\LICENSE` only when it can tell the path is a
|
|
# POSIX one, which it decides from a leading `/`; a relative `target-windows`
|
|
# — which is exactly what CI sets — reaches it as a name with a literal
|
|
# backslash in it and "LicenseData: open failed". The first CI run died there,
|
|
# after every step before it had passed.
|
|
TARGET_DIR="$(realpath -m "${CARGO_TARGET_DIR:-${REPO}/target}")"
|
|
TARGET="${TARGET_DIR}/x86_64-pc-windows-gnu/release"
|
|
OUT="$(realpath -m "${OUT:-${TARGET_DIR}/installer}")"
|
|
|
|
EXE="${TARGET}/darkroom-desktop.exe"
|
|
[[ -f "${EXE}" ]] || { echo "error: ${EXE} not built" >&2; exit 1; }
|
|
|
|
# The version, from the workspace rather than restated here — the same single
|
|
# source tools/set-version.sh writes and the APK packager reads.
|
|
VERSION="$(sed -n 's/^version = "\(.*\)"$/\1/p' "${REPO}/Cargo.toml" | head -1)"
|
|
[[ -n "${VERSION}" ]] || { echo "error: no version in Cargo.toml" >&2; exit 1; }
|
|
echo "==> version ${VERSION}"
|
|
|
|
# Staging: exactly what the installer carries (windows.md §5.2), and nothing
|
|
# from a previous run — a model dropped from the tree must not linger here
|
|
# and go on shipping.
|
|
STAGE="${OUT}/stage"
|
|
rm -rf "${STAGE}"
|
|
mkdir -p "${STAGE}/models"
|
|
cp "${EXE}" "${STAGE}/darkroom.exe"
|
|
# CRLF for the licence page: it is shown in a Windows edit control, which
|
|
# draws a bare LF as nothing and runs the whole GPL together.
|
|
sed 's/$/\r/' "${REPO}/LICENSE" > "${STAGE}/LICENSE"
|
|
|
|
# The models, with the guard every other packager carries: an LFS pointer is
|
|
# ~130 bytes and looks exactly like a model to `cp`. Shipped, it fails inside
|
|
# tract on the user's machine with a message about a broken graph rather than
|
|
# a checkout that needed `git lfs pull`. Only the weights are checked; the
|
|
# scene model's vocabulary and category descriptor are legitimately small.
|
|
#
|
|
# The directories are the ones the APK stages (assemble-apk.sh) and the Arch
|
|
# package installs: the face pair and its eye-state models, the scene model
|
|
# with its two descriptors, and the panorama border filler. The installer
|
|
# smoke test counts the same directories, so a model added here is expected
|
|
# there without a number to update.
|
|
for dir in face scene inpaint; do
|
|
for f in "${REPO}/models/${dir}"/*; do
|
|
case "$(basename "${f}")" in
|
|
README.md) continue ;;
|
|
esac
|
|
if [[ "${f}" == *.onnx && "$(stat -c%s "${f}")" -lt 100000 ]]; then
|
|
echo "error: $(basename "${f}") is $(stat -c%s "${f}") bytes — an LFS pointer, not a model." >&2
|
|
echo " run: git lfs pull" >&2
|
|
exit 1
|
|
fi
|
|
cp "${f}" "${STAGE}/models/"
|
|
done
|
|
done
|
|
echo "==> staged $(ls "${STAGE}/models" | wc -l) model file(s)"
|
|
|
|
# The manual: the rendered page and its pictures, beside the executable where
|
|
# dr_ui::manual looks on Windows (dr_plat::system_data_dirs is the exe's own
|
|
# directory there). The pictures are LFS objects; a pointer is ~130 bytes of
|
|
# text that every browser draws as a broken image, so refuse it here rather
|
|
# than ship a manual with no pictures in it.
|
|
mkdir -p "${STAGE}/manual/media"
|
|
cp "${REPO}/docs/manual/index.html" "${STAGE}/manual/"
|
|
for f in "${REPO}/docs/manual/media"/*; do
|
|
if head -c 40 "${f}" | grep -q '^version https://git-lfs'; then
|
|
echo "error: $(basename "${f}") is an LFS pointer, not a picture." >&2
|
|
echo " run: git lfs pull --include='docs/manual/media/**'" >&2
|
|
exit 1
|
|
fi
|
|
cp "${f}" "${STAGE}/manual/media/"
|
|
done
|
|
echo "==> staged the manual and $(ls "${STAGE}/manual/media" | wc -l) picture(s)"
|
|
|
|
# One installer in the output directory, the one just built. The directory
|
|
# is cached between CI runs, so after a version bump a glob over it would find
|
|
# two and the smoke test would hand Wine both names as one path.
|
|
rm -f "${OUT}"/DarkRoom-*-x86_64-setup.exe
|
|
INSTALLER="${OUT}/DarkRoom-${VERSION}-x86_64-setup.exe"
|
|
# NSIS wants Windows-style paths in File directives even on a POSIX host, and
|
|
# the script takes its inputs by define so nothing about the layout here is
|
|
# written into it.
|
|
makensis -V2 \
|
|
-DVERSION="${VERSION}" \
|
|
-DSTAGE="${STAGE}" \
|
|
-DOUT="${INSTALLER}" \
|
|
"${REPO}/packaging/windows/darkroom.nsi"
|
|
|
|
ls -la "${INSTALLER}"
|
|
echo "==> ${INSTALLER}"
|