#!/bin/bash set -x function cleanup_jobs() { # shellcheck disable=SC2317 # Unreachable because it's only used in trap if [ -n "$(jobs -p)" ]; then sleep 5 & wait -n # shellcheck disable=SC2046 # We want to expand jobs here and for `wait` kill -9 $(jobs -p) # shellcheck disable=SC2046 wait $(jobs -p) &>/dev/null fi } trap cleanup_jobs EXIT EXE_ELF=$1 EXE_3DSX="$(dirname "$EXE")/$(basename "$EXE" .elf).3dsx" EXE_TO_RUN="$EXE_ELF" if [ -f "$EXE_3DSX" ]; then echo >&2 "Found $(basename "$EXE_3DSX"), it will be run instead of $(basename "$EXE_ELF")" EXE_TO_RUN="$EXE_3DSX" fi VIDEO_OUT="$(dirname "$EXE_ELF")/$(basename "$EXE_ELF" .elf)_capture.webm" CITRA_LOG_DIR=~/.local/share/citra-emu/log CITRA_OUT="$CITRA_LOG_DIR/citra_output.txt" xvfb-run --auto-servernum \ citra \ --appimage-extract-and-run \ --dump-video="$VIDEO_OUT" \ "$EXE_TO_RUN" \ &>"$CITRA_OUT" & CITRA_PID=$! # Citra takes a little while to start up, so wait a little before we try to connect sleep 5 arm-none-eabi-gdb --silent --batch-silent --command /app/test-runner.gdb "$EXE_ELF" STATUS=$? kill $CITRA_PID cleanup_jobs CITRA_LOG="$CITRA_LOG_DIR/citra_log.txt" for f in "$CITRA_LOG" "$CITRA_OUT"; do OUT="$(dirname "$EXE_ELF")/$(basename "$EXE_ELF" .elf)_$(basename "$f")" if test -f "$f"; then cp "$f" "$OUT" if [ $STATUS -ne 0 ]; then echo >&2 "$(basename $f) copied to $OUT" fi else echo >&2 "WARNING: $(basename "$f") not found" fi done exit $STATUS