94 lines
3.5 KiB
Bash
Executable file
94 lines
3.5 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License.
|
|
# See LICENSE.md for license information.
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
# verify-amiga-icon.sh - a program's Workbench icon: read and drawn by the
|
|
# Amiga's own icon.library, and the program started from it.
|
|
#
|
|
# make bakes Name.info beside every Amiga program (tools/iconBake info:
|
|
# a tool's icon in Workbench's four colours, with the stack it starts
|
|
# with). WBLAUNCH (examples/wblaunch) runs under FS-UAE on an A500 with
|
|
# PALPROBE and its icon in a folder of their own, Prog/. It reads the icon
|
|
# with GetDiskObject -- it must be a tool's, of AMIGA_ICON_STACK bytes of
|
|
# stack and the baked size -- and draws it; the screenshot must show every
|
|
# pixel of the icon the file holds, in Workbench's colours. Then it starts
|
|
# PALPROBE as Workbench starts a tool, from RAM:, and its message must come
|
|
# back with PALPROBE's log, which opens in the current directory, in Prog/:
|
|
# libnix's start-up moves into the folder Workbench names.
|
|
#
|
|
# Usage: scripts/verify-amiga-icon.sh
|
|
# Env: TIMEOUT seconds to wait for each step (default 120)
|
|
# AMIGA_ICON_KEEP keep the screenshot as build/amiga/amiga-icon.png
|
|
# Exit: 0 PASS, 1 FAIL, 2 SKIP (FS-UAE or the Kickstart not installed)
|
|
set -uo pipefail
|
|
|
|
repo=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
source "$repo/scripts/lib/joeyEnv.sh"
|
|
joeyNeed FSUAE fsuae
|
|
source "$repo/scripts/lib/amigaGate.sh"
|
|
amigaMachine
|
|
timeout_s=${TIMEOUT:-120}
|
|
test_dir=$repo/build/amiga/test
|
|
label=verify-amiga-icon
|
|
# make/amiga.mk's AMIGA_ICON_STACK, and WBTOOL (workbench/workbench.h).
|
|
want_stack=$(make -s -f "$repo/make/amiga.mk" --eval 'printStack: ; @echo $(AMIGA_ICON_STACK)' printStack)
|
|
WBTOOL=3
|
|
|
|
make -s -f "$repo/make/amiga.mk" "$test_dir/Wblaunch" "$test_dir/Palprobe" "$test_dir/Palprobe.info" || {
|
|
echo "$label: FAIL - building Wblaunch, Palprobe or its icon failed" >&2
|
|
exit 1
|
|
}
|
|
|
|
work=$(mktemp -d -t joeylib-amiga-icon.XXXXXX)
|
|
mkdir -p "$work/s" "$work/Prog"
|
|
cp "$test_dir/Wblaunch" "$work/"
|
|
cp "$test_dir/Palprobe" "$test_dir/Palprobe.info" "$work/Prog/"
|
|
printf 'stack 32768\nWblaunch Prog Palprobe\n' > "$work/s/startup-sequence"
|
|
display=:$((RANDOM % 400 + 1300))
|
|
Xvfb "$display" -screen 0 800x600x24 -nolisten tcp > /dev/null 2>&1 &
|
|
xvfb_pid=$!
|
|
fs_pid=
|
|
cleanup() {
|
|
[[ -n $fs_pid ]] && joeyStop "$fs_pid"
|
|
kill "$xvfb_pid" 2>/dev/null || true
|
|
wait 2>/dev/null || true
|
|
rm -rf "$work"
|
|
}
|
|
trap cleanup EXIT
|
|
sleep 0.5
|
|
|
|
DISPLAY=$display "$FSUAE" "${AMIGA_MACHINE_ARGS[@]}" --fast_memory=2048 \
|
|
--hard_drive_0="$work" --hard_drive_0_label=JOEYLIB \
|
|
--automatic_input_grab=0 \
|
|
--fullscreen=0 --fade_out_duration=0 > "$work/fsuae.log" 2>&1 &
|
|
fs_pid=$!
|
|
|
|
log=$work/wblaunch.txt
|
|
# waitFor TEXT: true once the probe's log holds TEXT, or holds a FAIL.
|
|
waitFor() {
|
|
local waited
|
|
for ((waited = 0; waited < timeout_s; waited++)); do
|
|
if grep -q "$1\|WBLAUNCH: FAIL" "$log" 2>/dev/null; then
|
|
return 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
return 1
|
|
}
|
|
|
|
if ! waitFor "WBLAUNCH: drawn"; then
|
|
echo "$label: FAIL - the probe never drew the icon within ${timeout_s}s" >&2
|
|
exit 1
|
|
fi
|
|
# A second into the probe's five-second hold.
|
|
sleep 1
|
|
DISPLAY=$display import -window root "$work/screen.png"
|
|
[[ -n ${AMIGA_ICON_KEEP:-} ]] && cp "$work/screen.png" "$repo/build/amiga/amiga-icon.png"
|
|
if ! waitFor "WBLAUNCH: returned"; then
|
|
echo "$label: FAIL - Palprobe's Workbench message never came back within ${timeout_s}s" >&2
|
|
exit 1
|
|
fi
|
|
cat "$log"
|
|
|
|
"$(joeyTool amigaCheck)" icon "$work" "$want_stack" "$WBTOOL" "$label"
|