From c5d3e85baced8d516daa5f39b495a7c7d13d3689 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Wed, 11 Nov 2026 11:04:02 +0100 Subject: [PATCH] feat: record config installs in shell extractors ROCKNIX, EmuELEC, AmberELEC, EmuDeck and RetroDECK records citing a config now carry the code installing it, whether that keeps a file already there, and the launch code rewriting its keys. Rescraped at the pinned revisions. Records the shipped code never reads are no longer written: EmuELEC's mame.ini folders (MAME.opt turns paths off), AmberELEC's atari800.cfg (read only under an option that is off), the six RetroDECK XRoar ROM lists no machine looks up, and the ROCKNIX melonDS DSi BIOS keys (DSiExternalBIOSEnable is set by no shipped ini). Conditions added: ROCKNIX and AmberELEC amiberry kickstarts hold only outside a WHDLoad --autoload boot, ROCKNIX NanoBoyAdvance exits without its BIOS, the EmuELEC scummvm.ini copy runs from an action no launch passes, and the EmuDeck melonDS.toml keys need ExternalBIOSEnable (DS) or ConsoleType 1 (DSi). --- platforms/amberelec.yml | 45 ++-- platforms/emudeck.yml | 107 ++++++++- platforms/emuelec.yml | 229 ++++++++++-------- platforms/retrodeck.yml | 312 ++++++++++++++++++------- platforms/rocknix.yml | 152 ++++++++++-- scripts/scraper/amberelec_launchers.py | 84 ++++--- scripts/scraper/configgen_launchers.py | 11 +- scripts/scraper/emudeck_launchers.py | 63 ++++- scripts/scraper/emuelec_launchers.py | 119 +++++----- scripts/scraper/retrodeck_launchers.py | 48 +++- scripts/scraper/retropie_launchers.py | 8 +- scripts/scraper/rocknix_launchers.py | 177 +++++++++++--- tests/test_launchers_amberelec.py | 60 ++--- tests/test_launchers_emudeck.py | 33 ++- tests/test_launchers_emuelec.py | 37 +-- tests/test_launchers_rocknix.py | 86 ++++--- 16 files changed, 1153 insertions(+), 418 deletions(-) diff --git a/platforms/amberelec.yml b/platforms/amberelec.yml index a4085d839..dbbe87c88 100644 --- a/platforms/amberelec.yml +++ b/platforms/amberelec.yml @@ -3180,6 +3180,11 @@ launchers: search_dir: ~/roms/bios passes_to: retroarch.cfg system_directory fails_when_missing: false + installs: + path: /storage/.config/retroarch/retroarch.cfg + source_ref: "packages/sysutils/systemd/scripts/userconfig-setup:20" + kept_if_present: true + overrides: [] source_ref: "packages/games/tools/retroarch/sources/retroarch.cfg:611" - emulator: retrorun build: libretro @@ -3198,25 +3203,6 @@ launchers: fails_when_missing: false depends_on_option: self.emulator == 'mame' source_ref: "packages/amberelec/sources/scripts/runemu.py:233, 252, 255" -- emulator: atari800 - build: libretro - kind: fixed_name - names: - - ATARIOSA.ROM - - ATARIXL.ROM - - 5200.rom - - 5200a.rom - - BASIC_Rev_A.rom - - BASIC_Rev_B.rom - - ATARIBAS.ROM - - ATARIOSB.ROM - case_insensitive: false - search_dir: /storage/roms/bios - passes_to: atari800.cfg ROM_OS_A_PAL, ROM_OS_BB01R2, ROM_5200, ROM_5200_A, ROM_BASIC_A, - ROM_BASIC_B, ROM_BASIC_C, ROM_400/800_CUSTOM - fails_when_missing: false - source_ref: "packages/games/libretro/atari800/patches/atari800-01-add-emuelec-platform.patch:27,\ - \ packages/amberelec/config/distribution/configs/atari800.cfg:3, 8, 16-22" - emulator: scummvm build: libretro kind: passes_path @@ -3291,7 +3277,13 @@ launchers: passes_to: "AmigaA1200-default.uae kickstart_rom_file, $(FILE_PATH) = /storage/.config/amiberry/kickstarts/" fails_when_missing: false depends_on_option: "[ `echo $1 | egrep 'AGA|CD32' | wc -l` -eq 1 -o `echo \"$AMIBERRY_TMP_DIR\"\ - /* | egrep 'AGA|CD32' | wc -l` -eq 1 ]" + /* | egrep 'AGA|CD32' | wc -l` -eq 1 ], content not booted with --autoload, a\ + \ WHDLoad .lha or .zip (amiberry.sh:83, 122)" + installs: + path: /tmp/emulation/amiberry/.amiberry_conf.uae + source_ref: "packages/games/emulators/amiberry/scripts/amiberry.sh:59" + kept_if_present: false + overrides: [] source_ref: "packages/amberelec/sources/scripts/runemu.py:111, packages/games/emulators/amiberry/scripts/amiberry.sh:57-59,\ \ packages/games/emulators/amiberry/config/conf/AmigaA1200-default.uae:35, 85" - emulator: AMIBERRY @@ -3305,7 +3297,13 @@ launchers: passes_to: "AmigaA500-default.uae kickstart_rom_file, $(FILE_PATH) = /storage/.config/amiberry/kickstarts/" fails_when_missing: false depends_on_option: "not ([ `echo $1 | egrep 'AGA|CD32' | wc -l` -eq 1 -o `echo \"\ - $AMIBERRY_TMP_DIR\"/* | egrep 'AGA|CD32' | wc -l` -eq 1 ])" + $AMIBERRY_TMP_DIR\"/* | egrep 'AGA|CD32' | wc -l` -eq 1 ]), content not booted\ + \ with --autoload, a WHDLoad .lha or .zip (amiberry.sh:83, 122)" + installs: + path: /tmp/emulation/amiberry/.amiberry_conf.uae + source_ref: "packages/games/emulators/amiberry/scripts/amiberry.sh:62" + kept_if_present: false + overrides: [] source_ref: "packages/amberelec/sources/scripts/runemu.py:111, packages/games/emulators/amiberry/scripts/amiberry.sh:60-62,\ \ packages/games/emulators/amiberry/config/conf/AmigaA500-default.uae:35, 85" - emulator: HATARISA @@ -3317,6 +3315,11 @@ launchers: search_dir: /storage/roms/bios passes_to: "Atari-ST-default.cfg [ROM] szTosImageFileName" fails_when_missing: false + installs: + path: /tmp/hatari/.hatari-temp.cfg + source_ref: "packages/games/emulators/hatarisa/scripts/hatari.sh:36" + kept_if_present: false + overrides: [] source_ref: "packages/amberelec/sources/scripts/runemu.py:113, packages/games/emulators/hatarisa/scripts/hatari.sh:36,\ \ 66, packages/games/emulators/hatarisa/config/conf/Atari-ST-default.cfg:200" - emulator: pico8 diff --git a/platforms/emudeck.yml b/platforms/emudeck.yml index 5ef9d2ebd..6513cf18f 100644 --- a/platforms/emudeck.yml +++ b/platforms/emudeck.yml @@ -937,6 +937,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml ColecoVision/Firmware/BIOS.World fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:270, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -948,6 +954,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml MSX/Firmware/BIOS.Japan fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:278, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -959,6 +971,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml MSX2/Firmware/BIOS.Japan fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:283, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -971,6 +989,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml PCEngineCD/Firmware/BIOS.US, PCEngineCD/Firmware/BIOS.Japan fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:291-292, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -982,6 +1006,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml SuperGrafxCD/Firmware/BIOS.Japan fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:300, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -993,6 +1023,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml FamicomDiskSystem/Firmware/BIOS.Japan fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:308, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1007,6 +1043,12 @@ launchers: passes_to: settings.bml Nintendo64DD/Firmware/BIOS.Japan, Nintendo64DD/Firmware/BIOS.US, Nintendo64DD/Firmware/BIOS.DEV fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:319-321, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1018,6 +1060,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml GameBoyAdvance/Firmware/BIOS.World fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:332, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1032,6 +1080,12 @@ launchers: passes_to: settings.bml MasterSystem/Firmware/BIOS.US, MasterSystem/Firmware/BIOS.Japan, MasterSystem/Firmware/BIOS.Europe fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:340-342, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1043,6 +1097,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml GameGear/Firmware/BIOS.World fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:347, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1056,6 +1116,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml MegaCD/Firmware/BIOS.US, MegaCD/Firmware/BIOS.Japan, MegaCD/Firmware/BIOS.Europe fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:358-360, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1067,6 +1133,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml NeoGeoAES/Firmware/BIOS.World fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:368, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1078,6 +1150,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml NeoGeoPocket/Firmware/BIOS.World fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:378, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1089,6 +1167,12 @@ launchers: search_dir: "${biosPath}" passes_to: settings.bml NeoGeoPocketColor/Firmware/BIOS.World fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:383, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: ares @@ -1103,6 +1187,12 @@ launchers: passes_to: settings.bml PlayStation/Firmware/BIOS.US, PlayStation/Firmware/BIOS.Japan, PlayStation/Firmware/BIOS.Europe fails_when_missing: false + installs: + path: "${HOME}/.var/app/dev.ares.ares/data/ares/settings.bml" + source_ref: "functions/EmuScripts/emuDeckares.sh:26, 42, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "configs/dev.ares.ares/data/ares/settings.bml:388-390, functions/EmuScripts/emuDeckares.sh:6,\ \ 63-64" - emulator: melonds @@ -1121,6 +1211,12 @@ launchers: DSiFirmwarePath, DSiNANDPath fails_when_missing: false depends_on_option: ExternalBIOSEnable = 0 in the shipped melonDS.ini + installs: + path: "${HOME}/.var/app/net.kuribo64.melonDS/config/melonDS/melonDS.ini" + source_ref: "functions/EmuScripts/emuDeckMelonDS.sh:29, 48, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] source_ref: "functions/EmuScripts/emuDeckMelonDS.sh:7, 62-68, 71-77, configs/net.kuribo64.melonDS/config/melonDS/melonDS.ini:77" - emulator: melonds build: standalone @@ -1137,8 +1233,15 @@ launchers: passes_to: "melonDS.toml [DS] FirmwarePath, BIOS7Path, BIOS9Path [DSi] FirmwarePath,\ \ NANDPath, BIOS7Path, BIOS9Path" fails_when_missing: false - depends_on_option: ExternalBIOSEnable = false in the shipped melonDS.toml - source_ref: "configs/net.kuribo64.melonDS/config/melonDS/melonDS.toml:176, 181-183,\ + depends_on_option: "[DS] keys: ExternalBIOSEnable = true, false in the shipped melonDS.toml;\ + \ [DSi] keys: ConsoleType = 1, 0 in the shipped melonDS.toml" + installs: + path: "${HOME}/.var/app/net.kuribo64.melonDS/config/melonDS/melonDS.toml" + source_ref: "functions/EmuScripts/emuDeckMelonDS.sh:29, 48, functions/configEmuFP.sh:11,\ + \ 15" + kept_if_present: true + overrides: [] + source_ref: "configs/net.kuribo64.melonDS/config/melonDS/melonDS.toml:176-178, 181-183,\ \ 186-189, functions/EmuScripts/emuDeckMelonDS.sh:8, 32" - emulator: mupen64plus_next build: standalone diff --git a/platforms/emuelec.yml b/platforms/emuelec.yml index 1c0622059..3c181e6a4 100644 --- a/platforms/emuelec.yml +++ b/platforms/emuelec.yml @@ -4241,96 +4241,6 @@ launchers: fails_when_missing: false depends_on_option: /storage/roms/bios/mame/ini/mame.ini absent source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame - passes_to: mame.ini homepath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:10, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/bios - passes_to: mame.ini rompath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:11, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/hash - passes_to: mame.ini hashpath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:12, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/samples - passes_to: mame.ini samplepath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:13, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/artwork - passes_to: mame.ini artpath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:14, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/ini - passes_to: mame.ini inipath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:16, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/cheat - passes_to: mame.ini cheatpath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:18, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/crosshair - passes_to: mame.ini crosshairpath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:19, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" -- emulator: mame - build: libretro - kind: passes_path - names: [] - search_dir: /storage/roms/bios/mame/plugins - passes_to: mame.ini pluginspath - fails_when_missing: false - depends_on_option: mame_read_config = enabled - source_ref: "packages/sx05re/libretro/mame/config/ini/mame.ini:20, packages/sx05re/libretro/mame/config/MAME/MAME.opt:19,\ - \ packages/sx05re/emuelec/bin/emuelecRunEmu.sh:357-358, packages/sx05re/libretro/mame/scripts/mame.sh:21-23" - emulator: pico8 build: standalone kind: moves @@ -4384,6 +4294,11 @@ launchers: passes_to: "settings.ini [BIOS] SearchDirectory (-settings), [BIOS] PathNTSCU, PathNTSCJ,\ \ PathPAL unset" fails_when_missing: false + installs: + path: /emuelec/configs/duckstation/settings.ini + source_ref: "packages/sx05re/emulators/duckstation/scripts/duckstation.sh:15" + kept_if_present: true + overrides: [] source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:207-209, packages/sx05re/emulators/duckstation/config/settings.ini:6-9,\ \ packages/sx05re/emulators/duckstation/package.mk:56, packages/sx05re/emulators/duckstation/scripts/duckstation.sh:40" - emulator: yabasanshiroSA @@ -4439,6 +4354,11 @@ launchers: search_dir: /storage/roms/bios passes_to: "Atari-ST-default.cfg [ROM] szTosImageFileName (--configfile)" fails_when_missing: false + installs: + path: /tmp/hatari/.hatari-temp.cfg + source_ref: "packages/sx05re/emulators/hatarisa/scripts/hatari.start:36" + kept_if_present: false + overrides: [] source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:172-174, packages/sx05re/emulators/hatarisa/config/conf/Atari-ST-default.cfg:200,\ \ packages/sx05re/emulators/hatarisa/package.mk:39, packages/sx05re/emulators/hatarisa/scripts/hatari.start:36,\ \ 66, 73" @@ -4450,6 +4370,12 @@ launchers: passes_to: advmame.rc dir_artwork fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4463,6 +4389,12 @@ launchers: search_dir: /storage/roms/arcade/artwork passes_to: advmame.rc dir_artwork fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4475,6 +4407,12 @@ launchers: passes_to: advmame.rc dir_diff fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4488,6 +4426,12 @@ launchers: search_dir: /storage/roms/arcade/diff passes_to: advmame.rc dir_diff fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4500,6 +4444,12 @@ launchers: passes_to: advmame.rc dir_hi fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4513,6 +4463,12 @@ launchers: search_dir: /storage/roms/arcade/hi passes_to: advmame.rc dir_hi fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4525,6 +4481,12 @@ launchers: passes_to: advmame.rc dir_image fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4538,6 +4500,12 @@ launchers: search_dir: /storage/roms/arcade/image passes_to: advmame.rc dir_image fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4550,6 +4518,12 @@ launchers: passes_to: advmame.rc dir_inp fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4563,6 +4537,12 @@ launchers: search_dir: /storage/roms/arcade/inp passes_to: advmame.rc dir_inp fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4575,6 +4555,12 @@ launchers: passes_to: advmame.rc dir_memcard fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4588,6 +4574,12 @@ launchers: search_dir: /storage/roms/arcade/memcard passes_to: advmame.rc dir_memcard fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4600,6 +4592,12 @@ launchers: passes_to: advmame.rc dir_nvram fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4613,6 +4611,12 @@ launchers: search_dir: /storage/roms/arcade/nvram passes_to: advmame.rc dir_nvram fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4625,6 +4629,12 @@ launchers: passes_to: advmame.rc dir_rom fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4638,6 +4648,12 @@ launchers: search_dir: /storage/roms/arcade passes_to: advmame.rc dir_rom fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4649,6 +4665,12 @@ launchers: search_dir: /storage/roms/bios/advmame/samples passes_to: advmame.rc dir_sample fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:80" @@ -4660,6 +4682,12 @@ launchers: passes_to: advmame.rc dir_snap fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4673,6 +4701,12 @@ launchers: search_dir: /storage/roms/arcade/snap passes_to: advmame.rc dir_snap fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4685,6 +4719,12 @@ launchers: passes_to: advmame.rc dir_sta fails_when_missing: false depends_on_option: system != arcade + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4698,6 +4738,12 @@ launchers: search_dir: /storage/roms/arcade/nvram passes_to: advmame.rc dir_sta fails_when_missing: false + installs: + path: /emuelec/configs/advmame/advmame.rc + source_ref: "packages/sx05re/emulators/advancemame/bin/advmame.sh:17, 21" + kept_if_present: false + overrides: + - "packages/sx05re/emulators/advancemame/bin/advmame.sh:27" source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\ \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\ \ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\ @@ -4720,7 +4766,8 @@ launchers: search_dir: /storage/.config/scummvm passes_to: /storage/roms/bios/scummvm.ini fails_when_missing: false - depends_on_option: scummvm.start add + depends_on_option: "scummvm.start add, an action no launch runs (emuelecRunEmu.sh\ + \ passes libretro, sa)" source_ref: "packages/sx05re/emulators/scummvmsa/bin/scummvm.start:9, 49-51, 54" - emulator: dolphin build: standalone diff --git a/platforms/retrodeck.yml b/platforms/retrodeck.yml index 3592a2537..5df006cdd 100644 --- a/platforms/retrodeck.yml +++ b/platforms/retrodeck.yml @@ -16763,6 +16763,11 @@ launchers: search_dir: $roms_path/doom passes_to: "gzdoom.ini [IWADSearch.Directories] Path" fails_when_missing: false + installs: + path: $gzdoom_config + source_ref: "gzdoom/component_prepare.sh:23, 26-30" + kept_if_present: false + overrides: [] source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:9, gzdoom/component_prepare.sh:23,\ \ 27-28" - emulator: gzdoom @@ -16772,6 +16777,11 @@ launchers: search_dir: $roms_path/doom passes_to: "gzdoom.ini [FileSearch.Directories] Path" fails_when_missing: false + installs: + path: $gzdoom_config + source_ref: "gzdoom/component_prepare.sh:23, 26-30" + kept_if_present: false + overrides: [] source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:18, gzdoom/component_prepare.sh:23,\ \ 27-28" - emulator: gzdoom @@ -16781,6 +16791,11 @@ launchers: search_dir: $bios_path/gzdoom passes_to: "gzdoom.ini [FileSearch.Directories] Path" fails_when_missing: false + installs: + path: $gzdoom_config + source_ref: "gzdoom/component_prepare.sh:23, 26-30" + kept_if_present: false + overrides: [] source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:19, gzdoom/component_prepare.sh:23,\ \ 28" - emulator: gzdoom @@ -16790,6 +16805,11 @@ launchers: search_dir: $roms_path/bios/gzdoom passes_to: "gzdoom.ini [SoundfontSearch.Directories] Path" fails_when_missing: false + installs: + path: $gzdoom_config + source_ref: "gzdoom/component_prepare.sh:23, 26-30" + kept_if_present: false + overrides: [] source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:31, gzdoom/component_prepare.sh:23,\ \ 27-28" - emulator: mame @@ -17023,6 +17043,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: xroar.conf rompath fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:290, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17033,6 +17058,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragon fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:291, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17048,6 +17078,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist d64_1 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:292, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17062,6 +17097,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist d64_2 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:293, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17075,6 +17115,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist d32 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:294, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17087,6 +17132,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist d200e_1 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:295, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17099,6 +17149,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist d200e_2 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:296, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17115,6 +17170,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragon64 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:297, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17129,6 +17189,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragon64_alt fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:298, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17143,6 +17208,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragon32 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:299, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17162,6 +17232,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragon200e fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:300, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17179,6 +17254,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragon200e_alt fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:301, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17190,6 +17270,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragon200e_charset fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:302, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17204,6 +17289,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragonpro_boot fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:303, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17222,6 +17312,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragonpro_basic fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:304, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17236,6 +17331,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist coco fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:305, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17249,89 +17349,12 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist coco_ext fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:306, xroar/component_prepare.sh:13-15" -- emulator: xroar - build: standalone - kind: names_searched - slot: coco1 - names: - - bas10 - - bas13 - - bas12 - - "Color Basic v1.2 (1982)(Tandy)" - - bas11 - search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" - passes_to: romlist coco1 - fails_when_missing: false - source_ref: "xroar/rd_assets/rd_config/xroar.conf:307, xroar/component_prepare.sh:13-15" -- emulator: xroar - build: standalone - kind: names_searched - slot: coco1e - names: - - bas11 - - bas13 - - bas12 - - "Color Basic v1.2 (1982)(Tandy)" - - bas10 - search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" - passes_to: romlist coco1e - fails_when_missing: false - source_ref: "xroar/rd_assets/rd_config/xroar.conf:308, xroar/component_prepare.sh:13-15" -- emulator: xroar - build: standalone - kind: names_searched - slot: coco1e_ext - names: - - extbas10 - - extbas11 - - coco - - COCO - search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" - passes_to: romlist coco1e_ext - fails_when_missing: false - source_ref: "xroar/rd_assets/rd_config/xroar.conf:309, xroar/component_prepare.sh:13-15" -- emulator: xroar - build: standalone - kind: names_searched - slot: coco2 - names: - - bas12 - - bas13 - - "Color Basic v1.2 (1982)(Tandy)" - - bas11 - - bas10 - search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" - passes_to: romlist coco2 - fails_when_missing: false - source_ref: "xroar/rd_assets/rd_config/xroar.conf:310, xroar/component_prepare.sh:13-15" -- emulator: xroar - build: standalone - kind: names_searched - slot: coco2_ext - names: - - extbas11 - - extbas10 - - coco - - COCO - search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" - passes_to: romlist coco2_ext - fails_when_missing: false - source_ref: "xroar/rd_assets/rd_config/xroar.conf:311, xroar/component_prepare.sh:13-15" -- emulator: xroar - build: standalone - kind: names_searched - slot: coco2b - names: - - bas13 - - bas12 - - "Color Basic v1.2 (1982)(Tandy)" - - bas11 - - bas10 - search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" - passes_to: romlist coco2b - fails_when_missing: false - source_ref: "xroar/rd_assets/rd_config/xroar.conf:312, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone kind: names_searched @@ -17342,6 +17365,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist deluxecoco fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:313, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17352,6 +17380,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist deluxecoco1 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:314, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17362,6 +17395,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist deluxecoco2 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:315, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17373,6 +17411,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist deluxecoco3 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:316, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17384,6 +17427,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist mx1600 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:317, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17394,6 +17442,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist mx1600ext fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:318, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17404,6 +17457,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist coco3 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:319, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17414,6 +17472,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist coco3p fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:320, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17425,6 +17488,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist glenside_ide fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:321, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17435,6 +17503,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist mc10 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:322, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17445,6 +17518,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist alice fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:323, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17460,6 +17538,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragondos fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:324, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17473,6 +17556,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dosplus fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:325, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17486,6 +17574,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist superdos fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:326, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17498,6 +17591,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist cumana fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:327, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17524,6 +17622,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist dragondos_compat fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:328, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17535,6 +17638,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist rsdos fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:329, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17550,6 +17658,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist delta fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:330, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17560,6 +17673,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist rsdos_becker fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:331, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17571,6 +17689,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist mcx128 fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:332, xroar/component_prepare.sh:13-15" - emulator: xroar build: standalone @@ -17582,6 +17705,11 @@ launchers: search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path" passes_to: romlist mcx128_azerty fails_when_missing: false + installs: + path: $xroar_config + source_ref: "xroar/component_prepare.sh:13-15" + kept_if_present: false + overrides: [] source_ref: "xroar/rd_assets/rd_config/xroar.conf:333, xroar/component_prepare.sh:13-15" - emulator: retroarch build: libretro @@ -17590,6 +17718,11 @@ launchers: - scph5500.bin passes_to: core option duckstation_BIOS.PathNTSCJ fails_when_missing: false + installs: + path: $retroarch_config_core_options + source_ref: "retroarch/component_prepare.sh:24" + kept_if_present: false + overrides: [] source_ref: "retroarch/rd_assets/rd_config/retroarch-core-options.cfg:165, retroarch/component_prepare.sh:24" - emulator: retroarch build: libretro @@ -17598,6 +17731,11 @@ launchers: - scph5501.bin passes_to: core option duckstation_BIOS.PathNTSCU fails_when_missing: false + installs: + path: $retroarch_config_core_options + source_ref: "retroarch/component_prepare.sh:24" + kept_if_present: false + overrides: [] source_ref: "retroarch/rd_assets/rd_config/retroarch-core-options.cfg:166, retroarch/component_prepare.sh:24" - emulator: retroarch build: libretro @@ -17606,6 +17744,11 @@ launchers: - scph5502.bin passes_to: core option duckstation_BIOS.PathPAL fails_when_missing: false + installs: + path: $retroarch_config_core_options + source_ref: "retroarch/component_prepare.sh:24" + kept_if_present: false + overrides: [] source_ref: "retroarch/rd_assets/rd_config/retroarch-core-options.cfg:167, retroarch/component_prepare.sh:24" - emulator: retroarch build: libretro @@ -17614,4 +17757,9 @@ launchers: - scph10000.bin passes_to: core option pcsx2_bios fails_when_missing: false + installs: + path: $retroarch_config_core_options + source_ref: "retroarch/component_prepare.sh:24" + kept_if_present: false + overrides: [] source_ref: "retroarch/rd_assets/rd_config/retroarch-core-options.cfg:515, retroarch/component_prepare.sh:24" diff --git a/platforms/rocknix.yml b/platforms/rocknix.yml index b01c2b45d..9f85b7126 100644 --- a/platforms/rocknix.yml +++ b/platforms/rocknix.yml @@ -570,6 +570,11 @@ launchers: passes_to: retroarch.cfg system_directory = "~/roms/bios", systemfiles_in_content_dir = "false" fails_when_missing: false + installs: + path: /storage/.config/retroarch/retroarch.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/libretro/retroarch/sources/AMD64/retroarch.cfg:3395-3396,\ \ projects/ROCKNIX/packages/emulators/libretro/retroarch/sources/H700/retroarch.cfg:711-712,\ \ projects/ROCKNIX/packages/emulators/libretro/retroarch/sources/RK3326/retroarch.cfg:716-717,\ @@ -594,7 +599,13 @@ launchers: search_dir: /storage/roms/bios passes_to: "AmigaA1200-default.uae kickstart_rom_file (amiberry -f)" fails_when_missing: false - depends_on_option: game name matches AGA|CD32 + depends_on_option: "game name matches AGA|CD32, content not booted with --autoload,\ + \ a WHDLoad .lha or .zip (start_amiberry.sh:90, 129)" + installs: + path: /tmp/emulation/amiberry/.amiberry_conf.uae + source_ref: "projects/ROCKNIX/packages/emulators/standalone/amiberry/scripts/start_amiberry.sh:64" + kept_if_present: false + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/amiberry/scripts/start_amiberry.sh:17,\ \ 62-69, projects/ROCKNIX/packages/emulators/standalone/amiberry/config/conf/AmigaA1200-default.uae:114" - emulator: amiberry @@ -606,7 +617,13 @@ launchers: search_dir: /storage/roms/bios passes_to: "AmigaA500-default.uae kickstart_rom_file (amiberry -f)" fails_when_missing: false - depends_on_option: game name does not match AGA|CD32 + depends_on_option: "game name does not match AGA|CD32, content not booted with --autoload,\ + \ a WHDLoad .lha or .zip (start_amiberry.sh:90, 129)" + installs: + path: /tmp/emulation/amiberry/.amiberry_conf.uae + source_ref: "projects/ROCKNIX/packages/emulators/standalone/amiberry/scripts/start_amiberry.sh:67" + kept_if_present: false + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/amiberry/scripts/start_amiberry.sh:17,\ \ 62-69, projects/ROCKNIX/packages/emulators/standalone/amiberry/config/conf/AmigaA500-default.uae:114" - emulator: amiberry @@ -645,6 +662,11 @@ launchers: search_dir: /storage/roms/bios passes_to: "Atari-ST-default.cfg [ROM] szTosImageFileName (--configfile)" fails_when_missing: false + installs: + path: /tmp/hatari/.hatari-temp.cfg + source_ref: "projects/ROCKNIX/packages/emulators/standalone/hatarisa/scripts/start_hatarisa.sh:35" + kept_if_present: false + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/hatarisa/config/conf/Atari-ST-default.cfg:200,\ \ projects/ROCKNIX/packages/emulators/standalone/hatarisa/scripts/start_hatarisa.sh:35,\ \ 65" @@ -652,13 +674,20 @@ launchers: build: standalone kind: fixed_name names: [] - passes_to: melonDS.ini BIOS9Path, BIOS7Path, FirmwarePath, DSiBIOS9Path, DSiBIOS7Path, - DSiFirmwarePath, DSiNANDPath left empty + passes_to: melonDS.ini BIOS9Path, BIOS7Path, FirmwarePath, DSiNANDPath left empty fails_when_missing: false depends_on_option: direct_boot = 0 sets ExternalBIOSEnable=1, otherwise 0 device: AMD64 - source_ref: "projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/AMD64/melonDS.ini:84-90,\ - \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/package.mk:60, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/scripts/start_melonds.sh:41,\ + installs: + path: /storage/.config/melonDS/melonDS.ini + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/scripts/start_melonds.sh:20,\ + \ 34" + kept_if_present: true + overrides: [] + source_ref: "projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/AMD64/melonDS.ini:84-86,\ + \ 90, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/package.mk:60,\ + \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/scripts/start_melonds.sh:41,\ \ 71-73" - emulator: melonds build: standalone @@ -667,24 +696,28 @@ launchers: - bios9.bin - bios7.bin - firmware.bin - - dsi_bios9.bin - - dsi_bios7.bin - - dsi_firmware.bin - dsi_nand.bin search_dir: /storage/roms/bios - passes_to: melonDS.ini BIOS9Path, BIOS7Path, FirmwarePath, DSiBIOS9Path, DSiBIOS7Path, - DSiFirmwarePath, DSiNANDPath + passes_to: melonDS.ini BIOS9Path, BIOS7Path, FirmwarePath, DSiNANDPath fails_when_missing: false depends_on_option: direct_boot = 0 sets ExternalBIOSEnable=1, otherwise 0 device: RK3399, RK3566, RK3576, RK3588, S922X, SDM845, SM4450, SM6115, SM8250, SM8550, SM8650, SM8750 - source_ref: "projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/InputPlumber/melonDS.ini:94-100,\ - \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/RK3399/melonDS.ini:93-99,\ - \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/RK3566/melonDS.ini:93-99,\ - \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/RK3588/melonDS.ini:93-99,\ - \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/S922X/melonDS.ini:95-101,\ - \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/SM4450/melonDS.ini:90-96,\ - \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/package.mk:60, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/scripts/start_melonds.sh:41,\ + installs: + path: /storage/.config/melonDS/melonDS.ini + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/scripts/start_melonds.sh:20,\ + \ 34" + kept_if_present: true + overrides: [] + source_ref: "projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/InputPlumber/melonDS.ini:94-96,\ + \ 100, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/RK3399/melonDS.ini:93-95,\ + \ 99, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/RK3566/melonDS.ini:93-95,\ + \ 99, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/RK3588/melonDS.ini:93-95,\ + \ 99, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/S922X/melonDS.ini:95-97,\ + \ 101, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/config/SM4450/melonDS.ini:90-92,\ + \ 96, projects/ROCKNIX/packages/emulators/standalone/melonds-sa/package.mk:60,\ + \ projects/ROCKNIX/packages/emulators/standalone/melonds-sa/scripts/start_melonds.sh:41,\ \ 71-73" - emulator: dsperate build: standalone @@ -701,6 +734,12 @@ launchers: passes_to: "dsperate.ini [paths] bios9, bios7, firmware, bios9i, bios7i, dsi_firmware,\ \ dsi_nand (--config)" fails_when_missing: false + installs: + path: /storage/.config/dsperate/dsperate.ini + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/dsperate-sa/scripts/start_dsperate.sh:19" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/dsperate-sa/config/H700/dsperate.ini:11-17,\ \ projects/ROCKNIX/packages/emulators/standalone/dsperate-sa/config/InputPlumber/dsperate.ini:11-17,\ \ projects/ROCKNIX/packages/emulators/standalone/dsperate-sa/config/RK3326/dsperate.ini:11-17,\ @@ -716,7 +755,13 @@ launchers: - gba_bios.bin search_dir: /storage/roms/bios passes_to: "config.toml [general] bios_path" - fails_when_missing: false + fails_when_missing: true + installs: + path: /storage/.config/nanoboyadvance/config.toml + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/nanoboyadvance-sa/scripts/start_nanoboyadvance.sh:12" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/nanoboyadvance-sa/config/config.toml:2,\ \ projects/ROCKNIX/packages/emulators/standalone/nanoboyadvance-sa/package.mk:30" - emulator: xemu @@ -731,6 +776,13 @@ launchers: passes_to: "xemu.toml [sys.files] bootrom_path, flashrom_path, eeprom_path, hdd_path\ \ (copied at each launch)" fails_when_missing: false + installs: + path: /storage/.config/xemu/xemu.toml + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/xemu-sa/scripts/start_xemu.sh:15,\ + \ 19" + kept_if_present: false + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/xemu-sa/config/AMD64/xemu.toml:28-31,\ \ projects/ROCKNIX/packages/emulators/standalone/xemu-sa/config/SM4450/xemu.toml:29-32,\ \ projects/ROCKNIX/packages/emulators/standalone/xemu-sa/config/SM8250/xemu.toml:29-32,\ @@ -747,6 +799,12 @@ launchers: search_dir: /storage/roms/bios/ passes_to: mednafen.cfg gba.bios fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 729, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: mednafen @@ -758,6 +816,12 @@ launchers: search_dir: /storage/roms/bios/ passes_to: mednafen.cfg md.cdbios fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 1050, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: mednafen @@ -769,6 +833,12 @@ launchers: search_dir: /storage/roms/bios/ passes_to: mednafen.cfg nes.ggrom fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 2292, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: mednafen @@ -781,6 +851,12 @@ launchers: search_dir: /storage/roms/bios/ passes_to: mednafen.cfg pce.cdbios, pce.gecdbios fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 3309, 3342, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: mednafen @@ -792,6 +868,12 @@ launchers: search_dir: /storage/roms/bios/ passes_to: mednafen.cfg pce_fast.cdbios fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 4128, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: mednafen @@ -803,6 +885,12 @@ launchers: search_dir: /storage/roms/bios/ passes_to: mednafen.cfg pcfx.bios fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 4611, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: mednafen @@ -816,6 +904,12 @@ launchers: search_dir: /storage/roms/bios/ passes_to: mednafen.cfg psx.bios_eu, psx.bios_jp, psx.bios_na fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 7366-7370, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: mednafen @@ -834,6 +928,12 @@ launchers: passes_to: mednafen.cfg ss.bios_jp, ss.bios_na_eu, ss.bios_stv_eu, ss.bios_stv_jp, ss.bios_stv_na, ss.cart.kof95_path, ss.cart.ultraman_path fails_when_missing: false + installs: + path: /storage/.config/mednafen/mednafen.cfg + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:21" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/mednafen/config/common/mednafen.template:570,\ \ 9818-9820, 9824-9828, 9834-9836, projects/ROCKNIX/packages/emulators/standalone/mednafen/scripts/start_mednafen.sh:19-21" - emulator: yabasanshiro @@ -861,6 +961,13 @@ launchers: passes_to: "settings.ini [BIOS] SearchDirectory = /storage/roms/bios, [BIOS] PathNTSCU,\ \ PathNTSCJ, PathPAL unset" fails_when_missing: false + installs: + path: /storage/.config/duckstation/settings.ini + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/duckstation-sa/scripts/start_duckstation.sh:19,\ + \ 22" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/duckstation-sa/config/AMD64/settings.ini:134,\ \ projects/ROCKNIX/packages/emulators/standalone/duckstation-sa/config/H700/settings.ini:24,\ \ projects/ROCKNIX/packages/emulators/standalone/duckstation-sa/config/InputPlumber/settings.ini:29-32,\ @@ -878,6 +985,13 @@ launchers: passes_to: "PCSX2.ini [Folders] Bios = /storage/roms/bios/armsx2, [Filenames] BIOS\ \ unset" fails_when_missing: false + installs: + path: /storage/.config/ARMSX2/inis/PCSX2.ini + source_ref: "projects/ROCKNIX/packages/sysutils/systemd/scripts/userconfig-setup:13,\ + \ projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/scripts/start_armsx2.sh:11,\ + \ 16" + kept_if_present: true + overrides: [] source_ref: "projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/S922X/ARMSX2/inis/PCSX2.ini:21,\ \ 475, projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/inputplumber/ARMSX2/inis/PCSX2.ini:21,\ \ 473, projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/package.mk:117-118" diff --git a/scripts/scraper/amberelec_launchers.py b/scripts/scraper/amberelec_launchers.py index 259d46cd4..f4f7819a0 100644 --- a/scripts/scraper/amberelec_launchers.py +++ b/scripts/scraper/amberelec_launchers.py @@ -7,7 +7,7 @@ runs the script its standalone_emulators table names (/usr/bin/.sh, installed from the package). Those scripts, and the configs their packages install, say which file under /storage/roms/bios is opened: yabasanshiro.sh tests saturn_bios.bin and passes it with -b, Hatari's default config names -tos.img, the atari800 core is built to read a config naming its OS ROMs. +tos.img. runemu.py is read with ast, the scripts with shell_launchers' readers. An extractor whose construct is gone raises instead of returning nothing. @@ -26,7 +26,9 @@ try: from .shell_launchers import ( LauncherPatternMissing, Script, + config_placement, describe_keys, + evidence_fields, settings, source_ref, ) @@ -35,7 +37,9 @@ except ImportError: from shell_launchers import ( # type: ignore[no-redef] LauncherPatternMissing, Script, + config_placement, describe_keys, + evidence_fields, settings, source_ref, ) @@ -45,8 +49,8 @@ RUNEMU = "packages/amberelec/sources/scripts/runemu.py" RETROARCH_CFG = "packages/games/tools/retroarch/sources/retroarch.cfg" RETRORUN = "packages/games/tools/retrorun/retrorun.sh" HATARI_CONFIG = "packages/games/emulators/hatarisa/config/conf/Atari-ST-default.cfg" -ATARI800_CONFIG = "packages/amberelec/config/distribution/configs/atari800.cfg" -ATARI800_PATCH = "packages/games/libretro/atari800/patches/atari800-01-add-emuelec-platform.patch" +# The first-boot copy of every package's /usr/config into /storage/.config. +USERCONFIG = "packages/sysutils/systemd/scripts/userconfig-setup" AMIBERRY_PACKAGE = "packages/games/emulators/amiberry/package.mk" AMIBERRY_CONFIGS = "packages/games/emulators/amiberry/config/conf" FREEJ2ME = ( @@ -103,16 +107,35 @@ class Runemu: return path, line +def _evidence( + read: Read, record: Launcher, target: str, keys: list[str], + start: Script | None = None, source_name: str = "", +) -> Launcher: + """A config record with the steps that put its file at ``target``: the + first-boot copy of /usr/config, then the start script's own copy.""" + setup = Script(USERCONFIG, read(USERCONFIG)) + placements = [config_placement(setup, target, required=False, sources=("/usr/config/",))] + if start is not None: + placements.append( + config_placement(start, target, keys, source_name=source_name, required=False) + ) + fields = evidence_fields(placements) + record.installs = fields["installs"] + record.kept_if_present = fields["kept_if_present"] + record.overrides = fields["overrides"] + return record + + def retroarch(read: Read) -> list[Launcher]: """system_directory of the retroarch.cfg the retroarch package installs.""" found = [s for s in settings(read(RETROARCH_CFG)) if s.key == "system_directory"] if len(found) != 1: raise LauncherPatternMissing(RETROARCH_CFG, "one system_directory") - return [Launcher( + return [_evidence(read, Launcher( emulator="retroarch", build="libretro", kind="passes_path", names=[], search_dir=found[0].value, passes_to="retroarch.cfg system_directory", fails_when_missing=False, source_ref=source_ref([(RETROARCH_CFG, [found[0].line])]), - )] + ), "/storage/.config/retroarch/retroarch.cfg", ["system_directory"])] def retrorun(read: Read) -> list[Launcher]: @@ -170,10 +193,12 @@ def hatari(read: Read, runemu: Runemu) -> list[Launcher]: path, table_line = runemu.script("HATARISA") script = Script(path, read(path)) name = posixpath.basename(HATARI_CONFIG) - copied, _ = script.find(rf"^\s*cp\s+\S*/{re.escape(name)}\s", f"cp of {name}") + copied, copy = script.find( + rf"^\s*cp\s+\S*/{re.escape(name)}\s+\"?(\$\{{?\w+\}}?)", f"cp of {name}" + ) passed, _ = script.find(r"\shatari\s+--configfile\s", "hatari --configfile") files, lines = _bios_files(HATARI_CONFIG, read(HATARI_CONFIG)) - return [Launcher( + return [_evidence(read, Launcher( emulator="HATARISA", build="standalone", kind="fixed_name", names=[n for _k, n in files], case_insensitive=False, search_dir=BIOS, passes_to=describe_keys(name, tuple(k for k, _n in files)), @@ -181,24 +206,8 @@ def hatari(read: Read, runemu: Runemu) -> list[Launcher]: source_ref=source_ref([ (RUNEMU, [table_line]), (path, [copied, passed]), (HATARI_CONFIG, lines), ]), - )] - - -def atari800(read: Read) -> list[Launcher]: - """The ROM keys of the config the atari800 core is built to read.""" - patch = Script(ATARI800_PATCH, read(ATARI800_PATCH)) - line, found = patch.find(r'DEFAULT_CFG_NAME="\\"([^"\\]+)\\""', "DEFAULT_CFG_NAME") - built = found.group(1) - if not built.endswith("/" + ATARI800_CONFIG.split("/config/", 1)[1]): - raise LauncherPatternMissing(ATARI800_PATCH, f"DEFAULT_CFG_NAME naming {ATARI800_CONFIG}") - files, lines = _bios_files(ATARI800_CONFIG, read(ATARI800_CONFIG)) - return [Launcher( - emulator="atari800", build="libretro", kind="fixed_name", - names=[n for _k, n in files], case_insensitive=False, search_dir=BIOS, - passes_to=describe_keys(posixpath.basename(ATARI800_CONFIG), tuple(k for k, _n in files)), - fails_when_missing=False, - source_ref=source_ref([(ATARI800_PATCH, [line]), (ATARI800_CONFIG, lines)]), - )] + ), script.expand(copy.group(1), copied, set()), + [f"[{s}] {k}" if s else k for (s, k), _n in files], script, name)] def yabasanshiro(read: Read, runemu: Runemu) -> list[Launcher]: @@ -279,6 +288,15 @@ def amiberry(read: Read, runemu: Runemu) -> list[Launcher]: installed = re.sub(r"^\$\{INSTALL\}", "", link.link) path, table_line = runemu.script("AMIBERRY") script = Script(path, read(path)) + # A WHDLoad archive is booted by --autoload, which builds its own setup + # over the config: the kickstart records hold for the other content. + autoload = [n for n, text in script.code() if re.search(r"amiberry .*--autoload", text)] + if not autoload: + raise script.missing("WHDLoad boot with --autoload") + content = ( + "content not booted with --autoload, a WHDLoad .lha or .zip " + f"({posixpath.basename(path)}:{', '.join(map(str, autoload))})" + ) launchers = [Launcher( emulator="AMIBERRY", build="standalone", kind="links", names=[], case_insensitive=False, search_dir=BIOS, @@ -314,19 +332,23 @@ def amiberry(read: Read, runemu: Runemu) -> list[Launcher]: else: test = _shell_test(script, condition_line) condition = test - launchers.append(Launcher( + target = re.search(r'"?(\$\{?\w+\}?)"?\s*$', line) + if target is None: + raise script.missing(f"destination of the copy at line {number}") + launchers.append(_evidence(read, Launcher( emulator="AMIBERRY", build="standalone", kind="fixed_name", slot=copied.group(1).removesuffix("-default.uae").removeprefix("Amiga"), names=[found[0].value.removeprefix("$(FILE_PATH)/")], case_insensitive=False, search_dir=BIOS, passes_to=f"{copied.group(1)} kickstart_rom_file, $(FILE_PATH) = {rom_path[0].value}", fails_when_missing=False, - depends_on_option=condition, + depends_on_option=f"{condition}, {content}", source_ref=source_ref([ (RUNEMU, [table_line]), (path, [condition_line, number]), (config, [rom_path[0].line, found[0].line]), ]), - )) + ), script.expand(target.group(1), number, set()), ["kickstart_rom_file"], + script, copied.group(1))) if len(launchers) == 1: raise script.missing("cp of a default .uae config") return launchers @@ -420,9 +442,13 @@ def easyrpg(read: Read) -> list[Launcher]: def extract_launchers(read: Read) -> list[dict[str, Any]]: """Every launcher record, read through `read(repo-relative path)`.""" runemu = Runemu(read) + # The atari800.cfg AmberELEC ships names the OS ROMs, but the core opens + # it only under its atari800_cfg option, off by default, and finds the + # ROMs by a scan of the content folder (libretro-atari800 atari.c:512-516, + # 537, libretro_core_options.h:1203): no record reads it. launchers = [ *retroarch(read), *retrorun(read), *mame(runemu), - *atari800(read), *scummvm(read), *freej2me(read), *easyrpg(read), + *scummvm(read), *freej2me(read), *easyrpg(read), *amiberry(read, runemu), *hatari(read, runemu), *pico8(read, runemu), *piemu(read, runemu), *yabasanshiro(read, runemu), ] diff --git a/scripts/scraper/configgen_launchers.py b/scripts/scraper/configgen_launchers.py index 03957145e..4f6d05442 100644 --- a/scripts/scraper/configgen_launchers.py +++ b/scripts/scraper/configgen_launchers.py @@ -39,6 +39,14 @@ class Launcher: machines: list[str] | None = None # The platform systems the record is written for, none for every one. systems: list[str] | None = None + # For a record citing a config: where the platform's code puts it + # ({path, source_ref}), whether that leaves a file already there, and + # the launch code rewriting its keys ([] when none does). + installs: dict[str, str] | None = None + kept_if_present: bool | None = None + overrides: list[str] | None = None + # The feature or option file listing the values the option written takes. + choices_from: str | None = None def entry(self) -> dict[str, Any]: """The platform YAML form, in a fixed key order, unset keys left out.""" @@ -46,7 +54,8 @@ class Launcher: "emulator", "systems", "build", "kind", "slot", "names", "expands", "case_insensitive", "search_dir", "passes_to", "fails_when_missing", "fails_scope", "depends_on_option", - "device", "machines", "source_ref", + "device", "machines", "installs", "kept_if_present", "overrides", + "choices_from", "source_ref", ) return {key: getattr(self, key) for key in order if getattr(self, key) is not None} diff --git a/scripts/scraper/emudeck_launchers.py b/scripts/scraper/emudeck_launchers.py index 2723d62d8..b8f42696f 100644 --- a/scripts/scraper/emudeck_launchers.py +++ b/scripts/scraper/emudeck_launchers.py @@ -44,6 +44,8 @@ BIOS = "${biosPath}" EMULATION_BIOS = "${emulationPath}/bios" STORAGE = "${storagePath}" FLATPAK_DATA = "${HOME}/.var/app/" +# The function every EmuScript installs its Flatpak config with. +CONFIG_EMU_FP = "functions/configEmuFP.sh" # EmuScripts file names that differ from the emulator profile they set up. # The platform and target scrapers both read them here. @@ -95,6 +97,31 @@ def _is_bios(value: str) -> bool: return any(value == root or value.startswith(root + "/") for root in (BIOS, EMULATION_BIOS)) +def with_evidence(tree: RepoTree, script: Script, record: Launcher, config: str) -> Launcher: + """A record citing a shipped config, with the steps that install it. + + configEmuFP rsyncs the repository's configs/ over the Flatpak's: + the _init call overwrites (keeping a .bak), every other call passes + --ignore-existing and leaves the user's file in place. + """ + fp = Script(CONFIG_EMU_FP, tree.read(CONFIG_EMU_FP)) + rsync_line, _ = fp.find(r"^\s*rsync .*\$emudeckBackend/configs/", "rsync of the configs") + keep_line, _ = fp.find(r'overwrite="--ignore-existing"', "--ignore-existing") + calls = {n for n, line in script.code() if re.match(r"\s*configEmuFP\s", line)} + if not calls: + raise script.missing("configEmuFP call") + variable = script.assignment_ending("/" + config) + if variable is None: + raise script.missing(f"config variable for {config}") + record.installs = { + "path": script.expand(variable.value, variable.line, set()), + "source_ref": source_ref([(script.path, calls), (fp.path, {keep_line, rsync_line})]), + } + record.kept_if_present = True + record.overrides = [] + return record + + def _repo_config(script: Script, path: str) -> str: """The repository copy of a Flatpak config EmuDeck installs.""" if not path.startswith(FLATPAK_DATA): @@ -268,7 +295,8 @@ def ares(tree: RepoTree) -> list[Launcher]: raise LauncherPatternMissing(path, f"Firmware path under {old}") for system, found in entries.items(): folder = posixpath.commonpath([posixpath.dirname(t) for _, t, _ in found]) - records.append( + records.append(with_evidence( + tree, script, Launcher( emulator="ares", build="standalone", @@ -281,16 +309,20 @@ def ares(tree: RepoTree) -> list[Launcher]: search_dir=folder, passes_to="settings.bml " + ", ".join(f"{system}/Firmware/{k}" for k, _, _ in found), - ) - ) + ), + posixpath.basename(path), + )) return records def melonds(tree: RepoTree) -> list[Launcher]: """melonDS.ini paths set by changeLine, melonDS.toml paths shipped and rewritten by sed.""" name = "emuDeckMelonDS.sh" - records = setter_records(tree, name, option_key="ExternalBIOSEnable") script = _script(tree, name) + records = [ + with_evidence(tree, script, record, str(record.passes_to or "").split(" ", 1)[0]) + for record in setter_records(tree, name, option_key="ExternalBIOSEnable") + ] # A config whose BIOS keys the setters write again keeps their values. set_by_setters = {file for file, _, _, value, _ in setters(script) if _is_bios(value)} for file, old, new, sed_lines in sed_rewrites(script, "melonDS_init"): @@ -306,22 +338,29 @@ def melonds(tree: RepoTree) -> list[Launcher]: continue folder = posixpath.commonpath([posixpath.dirname(t) for _, t in found]) config = posixpath.basename(path) - option = next((s for s in settings(tree.read(path)) if s.key == "ExternalBIOSEnable"), None) - if option is None: - raise LauncherPatternMissing(path, "ExternalBIOSEnable") + shipped = {s.key: s for s in settings(tree.read(path))} + if "ExternalBIOSEnable" not in shipped or "ConsoleType" not in shipped: + raise LauncherPatternMissing(path, "ExternalBIOSEnable and ConsoleType") + option, console = shipped["ExternalBIOSEnable"], shipped["ConsoleType"] + # The DS keys are read under ExternalBIOSEnable, the DSi keys only + # when the console is a DSi (ConsoleType 1). record = Launcher( emulator="melonds", build="standalone", kind="fixed_name", names=[posixpath.relpath(t, folder) for _, t in found], - source_ref=source_ref( - [(path, {option.line, *(s.line for s, _ in found)}), (script.path, sed_lines)] - ), + source_ref=source_ref([ + (path, {option.line, console.line, *(s.line for s, _ in found)}), + (script.path, sed_lines), + ]), search_dir=folder, passes_to=describe_keys(config, tuple((s.section, s.key) for s, _ in found)), - depends_on_option=f"ExternalBIOSEnable = {option.value} in the shipped {config}", + depends_on_option=( + f"[DS] keys: ExternalBIOSEnable = true, {option.value} in the shipped {config}; " + f"[DSi] keys: ConsoleType = 1, {console.value} in the shipped {config}" + ), ) - records.append(record) + records.append(with_evidence(tree, script, record, config)) if len(records) < 2: raise script.missing("melonDS.toml BIOS paths rewritten by sed") return records diff --git a/scripts/scraper/emuelec_launchers.py b/scripts/scraper/emuelec_launchers.py index f4aed1e60..e52a23fc9 100644 --- a/scripts/scraper/emuelec_launchers.py +++ b/scripts/scraper/emuelec_launchers.py @@ -14,7 +14,7 @@ from __future__ import annotations import posixpath import re -from collections.abc import Callable +from collections.abc import Callable, Iterable from dataclasses import dataclass, field from .configgen_launchers import Launcher @@ -22,6 +22,8 @@ from .rocknix_launchers import fixed_paths from .shell_launchers import ( LauncherPatternMissing, Link, + config_placement, + evidence_fields, RepoTree, Script, describe_keys, @@ -104,6 +106,28 @@ class Runs: return (RUN_EMU, set(self.of(name).lines)) +def _evidence( + record: Launcher, + script: Script, + target: str, + keys: list[str], + source_name: str = "", + rewrites: Iterable[int] = (), +) -> Launcher: + """A config record with the start script lines that put its file in place. + + ``rewrites`` are lines the extractor read as rewriting the record's + values without naming their keys (advmame.sh's sed of /roms/mame). + """ + placement = config_placement(script, target, keys, source_name=source_name) + placement.overrides |= set(rewrites) + fields = evidence_fields([placement]) + record.installs = fields["installs"] + record.kept_if_present = fields["kept_if_present"] + record.overrides = fields["overrides"] + return record + + def _read(tree: RepoTree, path: str) -> Script: return Script(path, tree.read(path)) @@ -317,7 +341,7 @@ def duckstation(tree: RepoTree, runs: Runs) -> list[Launcher]: name = posixpath.basename(script.path) lines = {found[k].line for k in (folder_key, *file_keys) if k in found} unset = describe_keys("", file_keys).strip() - return [ + return [_evidence( Launcher( emulator=runs.emulator(name), build="standalone", @@ -328,8 +352,11 @@ def duckstation(tree: RepoTree, runs: Runs) -> list[Launcher]: ), search_dir=found[folder_key].value, passes_to=f"settings.ini [BIOS] SearchDirectory (-settings), {unset} unset", - ) - ] + ), + script, + script.expand("${CONFIG_DIR}/settings.ini", run_line, set()), + [f"[{s}] {k}" for s, k in (folder_key, *file_keys)], + )] YABASANSHIRO_SCRIPTS = ( @@ -473,7 +500,7 @@ def hatari(tree: RepoTree, runs: Runs) -> list[Launcher]: mk = _read(tree, f"{package}/package.mk") mk_line, _ = mk.find(r"cp -R \$\{PKG_DIR\}/config/\* ", "config install") name = posixpath.basename(script.path) - return [ + return [_evidence( Launcher( emulator=runs.emulator(name), build="standalone", @@ -485,8 +512,12 @@ def hatari(tree: RepoTree, runs: Runs) -> list[Launcher]: ), search_dir=value.search_dir, passes_to=f"{describe_keys(copy.group(1), value.keys)} (--configfile)", - ) - ] + ), + script, + script.expand("${" + copy.group(2) + "}", copy_line, set()), + [f"[{s}] {k}" if s else k for s, k in value.keys], + source_name=copy.group(1), + )] _ADVMAME_SYSTEM = re.compile(r'^\s*if \[\[ "\$\{1\}" = "([\w-]+)" \]\]; then$') @@ -535,29 +566,34 @@ def advancemame(tree: RepoTree, runs: Runs) -> list[Launcher]: (script.path, {run_line, *lines}), ]) - found = [] + target = script.expand("${CONFIG_DIR}/advmame.rc", run_line, set()) + + def proved(record: Launcher, key: str) -> Launcher: + return _evidence(record, script, target, [key], rewrites={sed_line}) + + records = [] for key, folder in value: rewritten = folder.replace(sed.group(1), sed.group(2)) if rewritten != folder: # Every system but the one the script rewrites the key for, and # that system with the rewritten folder. - found.append(Launcher( + records.append(proved(Launcher( emulator=runs.emulator(name), build="standalone", kind="passes_path", names=[], source_ref=refs(test_line, sed_line), search_dir=folder, passes_to=f"advmame.rc {key}", depends_on_option=f"system != {test.group(1)}", - )) - found.append(Launcher( + ), key)) + records.append(proved(Launcher( emulator=runs.emulator(name), build="standalone", kind="passes_path", names=[], source_ref=refs(test_line, sed_line), search_dir=rewritten, passes_to=f"advmame.rc {key}", systems=[test.group(1)], - )) + ), key)) continue - found.append(Launcher( + records.append(proved(Launcher( emulator=runs.emulator(name), build="standalone", kind="passes_path", names=[], source_ref=refs(), search_dir=folder, passes_to=f"advmame.rc {key}", - )) - return found + ), key)) + return records def mame(tree: RepoTree, runs: Runs) -> list[Launcher]: @@ -594,42 +630,11 @@ def mame(tree: RepoTree, runs: Runs) -> list[Launcher]: ) if not records: raise script.missing(f"copy into {BIOS_ROOT}") - ini = next((r for r in records if r.names == ["mame*"]), None) - if ini is None: - raise script.missing("copy of mame.ini") - option_path = f"{package}/config/MAME/MAME.opt" - option = next( - (s for s in settings(tree.read(option_path)) if s.key == "mame_read_config"), None - ) - if option is None: - raise LauncherPatternMissing(option_path, "mame_read_config") - ini_path = f"{package}/config/ini/mame.ini" - # MAME reads from the folders its *path options name and writes to its - # *_directory ones. - folders = [ - (s, [p for p in s.value.split(";") if _under(p)]) - for s in settings(tree.read(ini_path), separator=" ") - if s.key.endswith("path") - ] - folders = [(s, parts) for s, parts in folders if parts] - if not folders: - raise LauncherPatternMissing(ini_path, f"path under {BIOS_ROOT}") - for setting, parts in folders: - for part in parts: - records.append( - Launcher( - emulator=emulator, - build="libretro", - kind="passes_path", - names=[], - source_ref=source_ref( - [(ini_path, {setting.line}), (option_path, {option.line})] - ) + f", {ini.source_ref}", - search_dir=part.rstrip("/"), - passes_to=f"mame.ini {setting.key}", - depends_on_option=f"mame_read_config = {option.value}", - ) - ) + # mame.ini hands the core no folder: MAME.opt turns on + # mame_mame_paths_enable, so the core passes no path option + # (libretro mame src/osd/libretro/libretro-internal/retro_init.cpp:554-555), + # and the ini MAME would read sits under a working directory no launcher + # sets (src/emu/emuopts.cpp:49). Only the copies are the launcher's. return records @@ -644,6 +649,16 @@ def scummvm(tree: RepoTree, runs: Runs) -> list[Launcher]: core_line, core = script.find(r"-L /tmp/cores/(\w+)_libretro\.so", "libretro start") arm_line, arm = script.find(r'^\s*"(\w+)"\)', "setup arm", core_line) copy_line, copy = script.find(r"^\s*cp (\S+) (\S+)$", "copy into the BIOS folder", arm_line) + launched = sorted({ + m.group(1) for _, line in runs.script.code() + if (m := re.search(rf"\b{re.escape(name)} (\w+)", line)) + }) + if not launched: + raise runs.script.missing(f"start of {name} with an action") + action = f"{name} {arm.group(1)}" + if arm.group(1) not in launched: + # The copy runs from the setup action, never from a launch. + action += f", an action no launch runs ({RUN_EMU.rsplit('/', 1)[-1]} passes {', '.join(launched)})" used = {copy_line} source = script.expand(copy.group(1), copy_line, used) target = script.expand(copy.group(2), copy_line, used) @@ -669,7 +684,7 @@ def scummvm(tree: RepoTree, runs: Runs) -> list[Launcher]: search_dir=posixpath.dirname(source), passes_to=target, fails_when_missing=False, - depends_on_option=f"{name} {arm.group(1)}", + depends_on_option=action, ), ] diff --git a/scripts/scraper/retrodeck_launchers.py b/scripts/scraper/retrodeck_launchers.py index 51b6cf06b..3d7ed0a52 100644 --- a/scripts/scraper/retrodeck_launchers.py +++ b/scripts/scraper/retrodeck_launchers.py @@ -35,6 +35,8 @@ PLACEHOLDER = "RETRODECKBIOSDIR" # gzdoom/component_prepare.sh:27 rewrites to $roms_path. ROMS_PLACEHOLDER = "RETRODECKROMSDIR" CORE_OPTIONS = "retroarch/rd_assets/rd_config/retroarch-core-options.cfg" +# XRoar ROM lists RetroDECK's xroar.conf defines that no machine looks up. +UNREAD_ROMLISTS = frozenset({"coco1", "coco1e", "coco1e_ext", "coco2", "coco2_ext", "coco2b"}) # The component that runs libretro cores. LIBRETRO_COMPONENT = "retroarch" # Values of a core option that name a file rather than a setting. @@ -301,6 +303,19 @@ class Component: if copied is None: raise LauncherPatternMissing(f"{script.path}:{number}", f"no preset copied to {target}") preset = f"{self.name}/rd_assets/rd_config/{copied[1]}" + # The reset copies the preset over the user's file, then fills its + # placeholders: that is the install, and nothing keeps an older file. + evidence: dict[str, Any] = { + "installs": { + "path": target, + "source_ref": source_ref( + [(script.path, copied[0])] + + [(script.path, line) for _v, line in substitutions.values()] + ), + }, + "kept_if_present": False, + "overrides": self.launch_rewrites(target), + } text = self.read(preset) if text is None: raise LauncherPatternMissing(preset, "preset is missing") @@ -332,10 +347,10 @@ class Component: self.record( "passes_path", [], [(preset, line_no)] + applied, search_dir=value, passes_to=f"{self.config_name(target)} {where}", - fails_when_missing=False, + fails_when_missing=False, **evidence, ) if key == "rompath": - self.romlists(preset, text, value, applied) + self.romlists(preset, text, value, applied, evidence) if not found: raise LauncherPatternMissing(preset, f"no {PLACEHOLDER} line") @@ -349,10 +364,28 @@ class Component: found[m.group(1)] = (f"${m.group(2)}", line_no) return found + def launch_rewrites(self, target: str) -> list[str]: + """The sed lines of the component launcher rewriting ``target``.""" + path = f"{self.name}/component_launcher.sh" + text = self.read(path) + if text is None: + return [] + return [ + source_ref([(path, number)]) + for number, line in enumerate(text.splitlines(), 1) + if re.search(r"\bsed\b.*\s-i\b", line) and target in line + ] + def romlists( - self, preset: str, text: str, rompath: str, applied: list[tuple[str, int]] + self, preset: str, text: str, rompath: str, applied: list[tuple[str, int]], + evidence: dict[str, Any], ) -> None: - """XRoar's `romlist NAME=a,b,@other`: the names tried for each ROM, in order.""" + """XRoar's `romlist NAME=a,b,@other`: the names tried for each ROM, in order. + + A list no XRoar machine or cartridge looks up is no read: coco1, + coco1e, coco1e_ext, coco2, coco2_ext and coco2b are defined by XRoar + (src/xroar.c:663-670) and named by nothing else. + """ lists: dict[str, tuple[int, list[str]]] = {} for line_no, line in enumerate(text.splitlines(), 1): found = re.match(r"^romlist\s+([\w-]+)=(.*)$", line.strip()) @@ -375,10 +408,12 @@ class Component: return list(dict.fromkeys(names)) for name, (line_no, _items) in lists.items(): + if name in UNREAD_ROMLISTS: + continue self.record( "names_searched", expand(name, (name,)), [(preset, line_no)] + applied, slot=name, search_dir=rompath, passes_to=f"romlist {name}", - fails_when_missing=False, + fails_when_missing=False, **evidence, ) def read_launcher(self) -> None: @@ -480,6 +515,7 @@ def core_options(read: Read) -> list[Launcher]: ] if not copied: raise LauncherPatternMissing(prepare_path, "the core options preset is never copied") + target = _words(prepare.splitlines()[copied[0] - 1].strip())[-1] records = [] for line_no, line in enumerate(text.splitlines(), 1): found = re.match(r'^([\w.-]+)\s*=\s*"([^"]*)"$', line.strip()) @@ -489,6 +525,8 @@ def core_options(read: Read) -> list[Launcher]: records.append(Launcher( emulator=LIBRETRO_COMPONENT, build="libretro", kind="core_option", names=[value], passes_to=f"core option {key}", fails_when_missing=False, + installs={"path": target, "source_ref": source_ref([(prepare_path, copied[0])])}, + kept_if_present=False, overrides=[], source_ref=source_ref([(CORE_OPTIONS, line_no), (prepare_path, copied[0])]), )) if not records: diff --git a/scripts/scraper/retropie_launchers.py b/scripts/scraper/retropie_launchers.py index 1f48b28c0..e6462323c 100644 --- a/scripts/scraper/retropie_launchers.py +++ b/scripts/scraper/retropie_launchers.py @@ -94,6 +94,11 @@ class Launcher: passes_to: str | None = None fails_when_missing: bool | str | None = None depends_on_option: str | None = None + # For a record citing a config: where the platform's code puts it, whether + # that leaves a file already there, and the launch code rewriting it. + installs: dict[str, str] | None = None + kept_if_present: bool | None = None + overrides: list[str] | None = None lines: list[tuple[str, int]] = field(default_factory=list, repr=False) def entry(self) -> dict[str, Any]: @@ -101,7 +106,8 @@ class Launcher: order = ( "emulator", "package", "repo", "systems", "build", "kind", "slot", "names", "case_insensitive", "search_dir", "passes_to", - "fails_when_missing", "depends_on_option", "source_ref", + "fails_when_missing", "depends_on_option", "installs", "kept_if_present", + "overrides", "source_ref", ) return {key: getattr(self, key) for key in order if getattr(self, key) is not None} diff --git a/scripts/scraper/rocknix_launchers.py b/scripts/scraper/rocknix_launchers.py index 303d92365..eb18cba3e 100644 --- a/scripts/scraper/rocknix_launchers.py +++ b/scripts/scraper/rocknix_launchers.py @@ -18,6 +18,7 @@ from dataclasses import dataclass try: from .configgen_launchers import Launcher + from .shell_launchers import config_placement, evidence_fields from .shell_launchers import ( LauncherPatternMissing, Link, @@ -30,6 +31,7 @@ try: ) except ImportError: from configgen_launchers import Launcher + from shell_launchers import config_placement, evidence_fields # type: ignore[no-redef] from shell_launchers import ( LauncherPatternMissing, Link, @@ -46,6 +48,9 @@ DEVICES = f"{ROCKNIX}/devices" STANDALONE = f"{ROCKNIX}/packages/emulators/standalone" RETROARCH = f"{ROCKNIX}/packages/emulators/libretro/retroarch" BIOS_ROOT = "/storage/roms/bios" +CONFIG_ROOT = "/storage/.config" +# The first-boot step copying every package's /usr/config to /storage/.config. +USERCONFIG = f"{ROCKNIX}/packages/sysutils/systemd/scripts/userconfig-setup" Lines = list[tuple[str, set[int]]] @@ -186,6 +191,38 @@ def bios_keys(tree: RepoTree, paths: list[str], root: str = BIOS_ROOT) -> list[t return keys +def with_evidence( + tree: RepoTree, + record: Launcher, + target: str, + keys: list[str], + start: Script | None = None, + writers: tuple[str, ...] = (), + source_name: str = "", +) -> Launcher: + """A config record with the steps that put its file at ``target``. + + The first boot copies /usr/config to /storage/.config, leaving a file + already there. A start script can copy or generate it again, and its + sed lines rewriting one of the record's keys are the overrides. + """ + setup = Script(USERCONFIG, tree.read(USERCONFIG)) + placements = [config_placement(setup, target, required=False, sources=("/usr/config/",))] + if start is not None: + placements.append(config_placement( + start, target, keys, writers, source_name, required=False + )) + fields = evidence_fields(placements) + record.installs = fields["installs"] + record.kept_if_present = fields["kept_if_present"] + record.overrides = fields["overrides"] + return record + + +def _keys(value: FixedPaths) -> list[str]: + return [f"[{section}] {key}" if section else key for section, key in value.keys] + + def config_records( tree: RepoTree, emulator: str, @@ -193,10 +230,17 @@ def config_records( file: str, passes_to_suffix: str = "", depends_on_option: str | None = None, + target: str = "", + start: Script | None = None, + unread: Callable[[tuple[str, str]], bool] = lambda key: False, ) -> list[Launcher]: - """fixed_name records for the bios paths of a config installed per device.""" + """fixed_name records for the bios paths of a config installed per device. + + ``unread`` drops the keys the shipped configs leave the emulator + reading no file from. + """ configs = device_configs(tree, package, file) - keys = bios_keys(tree, [c.path for c in configs]) + keys = [k for k in bios_keys(tree, [c.path for c in configs]) if not unread(k)] name = posixpath.basename(file) def read(path: str, text: str) -> tuple[object, set[int]]: @@ -206,7 +250,8 @@ def config_records( for device, value, refs in per_device(tree, configs, f"{package}/package.mk", read): assert isinstance(value, FixedPaths) described = describe_keys(name, value.keys) - records.append( + records.append(with_evidence( + tree, Launcher( emulator=emulator, build="standalone", @@ -219,8 +264,11 @@ def config_records( ), device=device, depends_on_option=depends_on_option, - ) - ) + ), + target or f"{CONFIG_ROOT}/{posixpath.basename(package)}/{name}", + _keys(value), + start, + )) return records @@ -241,7 +289,8 @@ def retroarch(tree: RepoTree) -> list[Launcher]: for device, value, refs in per_device(tree, configs, f"{RETROARCH}/package.mk", read): assert isinstance(value, tuple) values = dict(value) - records.append( + records.append(with_evidence( + tree, Launcher( emulator="retroarch", build="libretro", @@ -251,8 +300,10 @@ def retroarch(tree: RepoTree) -> list[Launcher]: search_dir=values["system_directory"], passes_to="retroarch.cfg " + ", ".join(f'{k} = "{v}"' for k, v in value), device=device, - ) - ) + ), + f"{CONFIG_ROOT}/retroarch/retroarch.cfg", + [k for k, _ in value], + )) return records @@ -275,6 +326,19 @@ def amiberry(tree: RepoTree) -> list[Launcher]: ) used: set[int] = {test_line, then_line, else_line, other_line, sed_line} root = script.expand("${" + sed.group(2) + "}", sed_line, used) + written = re.search(r'"?(\$\{?\w+\}?)"?\s*$', script.lines[then_line - 1]) + if written is None: + raise script.missing("destination of the config copy") + target = script.expand(written.group(1), then_line, set()) + # A WHDLoad archive is booted by --autoload, which builds its own setup + # (kickstart included) over the config: the record holds for floppies. + autoload = [n for n, line in script.code() if re.search(r"amiberry .*--autoload", line)] + if not autoload: + raise script.missing("WHDLoad boot with --autoload") + content = ( + "content not booted with --autoload, a WHDLoad .lha or .zip " + f"({posixpath.basename(script.path)}:{', '.join(map(str, autoload))})" + ) records = [] for config, condition in ( (then.group(1), f"game name matches {test.group(1)}"), @@ -290,7 +354,8 @@ def amiberry(tree: RepoTree) -> list[Launcher]: raise LauncherPatternMissing(path, f"key naming a file under {sed.group(1)}") value, lines = fixed_paths(found, keys, path) slot = re.fullmatch(r"Amiga(\w+)-default\.uae", config) - records.append( + records.append(with_evidence( + tree, Launcher( emulator="amiberry", build="standalone", @@ -300,9 +365,13 @@ def amiberry(tree: RepoTree) -> list[Launcher]: slot=slot.group(1) if slot else config, search_dir=value.search_dir, passes_to=f"{describe_keys(config, value.keys)} (amiberry -f)", - depends_on_option=condition, - ) - ) + depends_on_option=f"{condition}, {content}", + ), + target, + _keys(value), + script, + source_name=config, + )) mk = Script(f"{package}/package.mk", tree.read(f"{package}/package.mk")) links = mk.links(BIOS_ROOT, fixed={"INSTALL": ""}) if not links: @@ -375,7 +444,11 @@ def hatari(tree: RepoTree) -> list[Launcher]: if not keys: raise LauncherPatternMissing(path, f"key naming a file under {BIOS_ROOT}") value, lines = fixed_paths(found, keys, path) - return [ + copied = re.search(r'"?(\$\{?\w+\}?)"?\s*$', script.lines[copy_line - 1]) + if copied is None: + raise script.missing("destination of the default config copy") + return [with_evidence( + tree, Launcher( emulator="hatari", build="standalone", @@ -384,8 +457,12 @@ def hatari(tree: RepoTree) -> list[Launcher]: source_ref=source_ref([(path, lines), (script.path, {copy_line, run_line})]), search_dir=value.search_dir, passes_to=f"{describe_keys(copy.group(1), value.keys)} (--configfile)", - ) - ] + ), + script.expand(copied.group(1), copy_line, set()), + _keys(value), + script, + source_name=copy.group(1), + )] def melonds(tree: RepoTree) -> list[Launcher]: @@ -406,7 +483,22 @@ def melonds(tree: RepoTree) -> list[Launcher]: rf"^\s*{test.group(1)}=\$\(get_setting (\w+) ", f"setting read into {test.group(1)}" ) condition = f"{setting.group(1)} = {test.group(2)} sets ExternalBIOSEnable=1, otherwise 0" - records = config_records(tree, "melonds", package, "melonDS.ini", depends_on_option=condition) + configs = [c.path for c in device_configs(tree, package, "melonDS.ini")] + # melonDS opens the DSi BIOS and firmware keys only under + # DSiExternalBIOSEnable, off unless a config sets it. + dsi_external = any( + s.key == "DSiExternalBIOSEnable" and s.value not in ("", "0") + for path in configs for s in settings(tree.read(path)) + ) + + def unread(key: tuple[str, str]) -> bool: + return not dsi_external and key[1] in ("DSiBIOS9Path", "DSiBIOS7Path", "DSiFirmwarePath") + + conf_line, conf = script.find(r'^\s*CONF_DIR="([^"]+)"', "CONF_DIR") + records = config_records( + tree, "melonds", package, "melonDS.ini", depends_on_option=condition, + target=f"{conf.group(1)}/melonDS.ini", start=script, unread=unread, + ) for record in records: record.source_ref += ( f", {source_ref([(script.path, {setting_line, test_line, enable_line})])}" @@ -420,7 +512,10 @@ def dsperate(tree: RepoTree) -> list[Launcher]: f"{package}/scripts/start_dsperate.sh", tree.read(f"{package}/scripts/start_dsperate.sh") ) run_line, _ = script.find(r"/usr/bin/dsperate --config ", "dsperate --config") - records = config_records(tree, "dsperate", package, "dsperate.ini", " (--config)") + records = config_records( + tree, "dsperate", package, "dsperate.ini", " (--config)", + target=script.expand("${DSPERATE_INI}", run_line, set()), start=script, + ) for record in records: record.source_ref += f", {source_ref([(script.path, {run_line})])}" return records @@ -434,7 +529,10 @@ def xemu(tree: RepoTree) -> list[Launcher]: copy_line, _ = script.find( r'cp -r "\$\{SOURCE_DIR\}/\$\{XEMU_INI\}"', "xemu.toml copy at launch" ) - records = config_records(tree, "xemu", package, "xemu.toml", " (copied at each launch)") + records = config_records( + tree, "xemu", package, "xemu.toml", " (copied at each launch)", + target=script.expand("${CONF_DIR}/${XEMU_INI}", copy_line, set()), start=script, + ) for record in records: record.source_ref += f", {source_ref([(script.path, {copy_line})])}" return records @@ -452,7 +550,9 @@ def nanoboyadvance(tree: RepoTree) -> list[Launcher]: mk_line, _ = Script(mk_path, tree.read(mk_path)).find( r"config/config\.toml", "config.toml install" ) - return [ + start_path = f"{package}/scripts/start_nanoboyadvance.sh" + return [with_evidence( + tree, Launcher( emulator="nanoboyadvance", build="standalone", @@ -461,8 +561,14 @@ def nanoboyadvance(tree: RepoTree) -> list[Launcher]: source_ref=source_ref([(path, lines), (mk_path, {mk_line})]), search_dir=value.search_dir, passes_to=describe_keys("config.toml", value.keys), - ) - ] + # NanoBoyAdvance exits when its BIOS cannot be read + # (src/platform/sdl/main.cpp:180-185 at the build ROCKNIX ships). + fails_when_missing=True, + ), + f"{CONFIG_ROOT}/nanoboyadvance/config.toml", + _keys(value), + Script(start_path, tree.read(start_path)), + )] def mednafen(tree: RepoTree) -> list[Launcher]: @@ -486,7 +592,9 @@ def mednafen(tree: RepoTree) -> list[Launcher]: modules: dict[str, list[Setting]] = {} for setting in firmware: modules.setdefault(setting.key.split(".", 1)[0], []).append(setting) - return [ + home = script.expand("${MEDNAFEN_HOME}", gen_line, set()) + return [with_evidence( + tree, Launcher( emulator="mednafen", build="standalone", @@ -501,9 +609,12 @@ def mednafen(tree: RepoTree) -> list[Launcher]: slot=module, search_dir=folder.value, passes_to="mednafen.cfg " + ", ".join(s.key for s in group), - ) - for module, group in modules.items() - ] + ), + f"{home}/mednafen.cfg", + [s.key for s in group], + script, + writers=("mednafen_gen_config.sh",), + ) for module, group in modules.items()] def yabasanshiro(tree: RepoTree) -> list[Launcher]: @@ -549,6 +660,8 @@ def directory_records( file: str, folder_key: tuple[str, str], file_keys: tuple[tuple[str, str], ...], + target: str = "", + start: str = "", ) -> list[Launcher]: """scans_dir records: the config hands a directory and leaves the file keys empty.""" configs = device_configs(tree, package, file) @@ -568,7 +681,8 @@ def directory_records( records = [] for device, folder, refs in per_device(tree, configs, f"{package}/package.mk", read): passes = f"{name} [{folder_key[0]}] {folder_key[1]} = {folder}, {unset} unset" - records.append( + records.append(with_evidence( + tree, Launcher( emulator=emulator, build="standalone", @@ -578,8 +692,11 @@ def directory_records( search_dir=folder, passes_to=passes, device=device, - ) - ) + ), + target, + [f"[{s}] {k}" for s, k in (folder_key, *file_keys)], + Script(start, tree.read(start)) if start else None, + )) return records @@ -591,6 +708,8 @@ def duckstation(tree: RepoTree) -> list[Launcher]: "settings.ini", ("BIOS", "SearchDirectory"), (("BIOS", "PathNTSCU"), ("BIOS", "PathNTSCJ"), ("BIOS", "PathPAL")), + f"{CONFIG_ROOT}/duckstation/settings.ini", + f"{STANDALONE}/duckstation-sa/scripts/start_duckstation.sh", ) @@ -602,6 +721,8 @@ def armsx2(tree: RepoTree) -> list[Launcher]: "ARMSX2/inis/PCSX2.ini", ("Folders", "Bios"), (("Filenames", "BIOS"),), + f"{CONFIG_ROOT}/ARMSX2/inis/PCSX2.ini", + f"{STANDALONE}/armsx2-sa/scripts/start_armsx2.sh", ) diff --git a/tests/test_launchers_amberelec.py b/tests/test_launchers_amberelec.py index c0ba27d36..39ce37130 100644 --- a/tests/test_launchers_amberelec.py +++ b/tests/test_launchers_amberelec.py @@ -105,22 +105,6 @@ HATARI_CFG = text( """ ) -ATARI800_CFG = text( - """ - Atari 800 Emulator, Version 3.1.0 - ROM_OS_A_NTSC= - ROM_OS_A_PAL=/storage/roms/bios/ATARIOSA.ROM - ROM_5200=/storage/roms/bios/5200.rom - """ -) - -ATARI800_PATCH = text( - """ - + LDFLAGS += -static-libgcc - + CFLAGS += -DDEFAULT_CFG_NAME="\\"/storage/.config/distribution/configs/atari800.cfg\\"" - """ -) - AMIBERRY_MK = text( """ makeinstall_target() { @@ -141,6 +125,17 @@ AMIBERRY_SH = text( cp $AMIBERRY_CONFIG_DIR/AmigaA500-default.uae "$AMIBERRY_TMP_CONFIG" fi } + amiberry -f "$AMIBERRY_TMP_CONFIG" --autoload "$1" >> $AMIBERRY_LOG 2>&1 + """ +) + +USERCONFIG = text( + """ + #!/bin/bash + if [ ! -e "/storage/.configured" ] + then + rsync -a --ignore-existing --exclude=es_systems.cfg /usr/config/* /storage/.config/ || exit 1 + fi """ ) @@ -195,8 +190,7 @@ def tree(**overrides: str) -> dict[str, str]: al.SCRIPTS["piemu"]: PIEMU, al.SCRIPTS["HATARISA"]: HATARI_SH, al.HATARI_CONFIG: HATARI_CFG, - al.ATARI800_CONFIG: ATARI800_CFG, - al.ATARI800_PATCH: ATARI800_PATCH, + al.USERCONFIG: USERCONFIG, al.AMIBERRY_PACKAGE: AMIBERRY_MK, al.SCRIPTS["AMIBERRY"]: AMIBERRY_SH, f"{al.AMIBERRY_CONFIGS}/AmigaA1200-default.uae": uae("kick40068.A1200.rom"), @@ -218,6 +212,13 @@ class Frontends(unittest.TestCase): (record,) = al.retroarch(read()) self.assertEqual(record.search_dir, "~/roms/bios") self.assertEqual(record.source_ref, f"{al.RETROARCH_CFG}:2") + # The first boot copies /usr/config and leaves a file already there. + self.assertEqual(record.installs, { + "path": "/storage/.config/retroarch/retroarch.cfg", + "source_ref": f"{al.USERCONFIG}:4", + }) + self.assertIs(record.kept_if_present, True) + self.assertEqual(record.overrides, []) def test_retrorun_directory(self): (record,) = al.retrorun(read()) @@ -266,6 +267,9 @@ class Standalone(unittest.TestCase): record.source_ref, f"{al.RUNEMU}:3, {al.SCRIPTS['HATARISA']}:3-4, {al.HATARI_CONFIG}:2", ) + # Copied over at each launch: nothing the user edits survives. + self.assertEqual(record.installs["source_ref"], f"{al.SCRIPTS['HATARISA']}:3") + self.assertIs(record.kept_if_present, False) def test_amiberry_link_and_one_kickstart_per_config(self): link, a1200, a500 = al.amiberry(read(), al.Runemu(read())) @@ -273,7 +277,11 @@ class Standalone(unittest.TestCase): self.assertEqual(link.passes_to, "/usr/config/amiberry/kickstarts is a symlink to it") self.assertEqual((a1200.slot, a1200.names), ("A1200", ["kick40068.A1200.rom"])) self.assertEqual((a500.slot, a500.names), ("A500", ["kick34005.A500.rom"])) - self.assertEqual(a500.depends_on_option, f"not ({a1200.depends_on_option})") + self.assertTrue(a500.depends_on_option.startswith("not (")) + # A WHDLoad boot replaces the setup the config gives. + self.assertIn("--autoload", a1200.depends_on_option) + self.assertEqual(a1200.installs["source_ref"], f"{al.SCRIPTS['AMIBERRY']}:5") + self.assertEqual(a500.installs["source_ref"], f"{al.SCRIPTS['AMIBERRY']}:7") def test_a_table_running_another_script_raises(self): broken = RUNEMU.replace("/usr/bin/yabasanshiro.sh", "/usr/bin/yaba.sh") @@ -287,15 +295,9 @@ class Standalone(unittest.TestCase): class Cores(unittest.TestCase): - def test_atari800_built_to_read_the_shipped_config(self): - (record,) = al.atari800(read()) - self.assertEqual(record.names, ["ATARIOSA.ROM", "5200.rom"]) - self.assertEqual(record.source_ref, f"{al.ATARI800_PATCH}:2, {al.ATARI800_CONFIG}:3-4") - - def test_atari800_built_for_another_config_raises(self): - broken = ATARI800_PATCH.replace("atari800.cfg", "other.cfg") - with self.assertRaises(LauncherShapeError): - al.atari800(read(**{al.ATARI800_PATCH: broken})) + def test_atari800_config_is_no_record(self): + # The core reads atari800.cfg only under an option that is off. + self.assertFalse(any(r["emulator"] == "atari800" for r in al.extract_launchers(read()))) def test_scummvm_paths_written_under_bios(self): theme, extra = al.scummvm(read()) @@ -319,7 +321,7 @@ class Cores(unittest.TestCase): def test_every_extractor_runs_on_the_fixture(self): records = al.extract_launchers(read()) # One easyrpg runtime in the fixture, two at the pinned commit. - self.assertEqual(len(records), 16) + self.assertEqual(len(records), 15) class PlatformFile(unittest.TestCase): diff --git a/tests/test_launchers_emudeck.py b/tests/test_launchers_emudeck.py index 1dd106f6c..acd606440 100644 --- a/tests/test_launchers_emudeck.py +++ b/tests/test_launchers_emudeck.py @@ -40,6 +40,9 @@ ARES_SH = text( UserBIOSPath='/home/deck/Emulation/bios/' sed -i "s|$UserBIOSPath|${biosPath}\\/|g" "$ares_configFile" } + ares_init(){ + configEmuFP "${ares_emuName}" "${ares_emuPath}" "true" + } """ ) @@ -87,6 +90,9 @@ MELONDS_SH = text( buttonA='Joy_A=' changeLine "$buttonA" "$buttonA""0" "${melonDS_configFile}" } + melonDS_update(){ + configEmuFP "${melonDS_emuName}" "${melonDS_emuPath}" + } """ ) @@ -103,6 +109,7 @@ MELONDS_TOML = text( LastROMFolder = "/run/media/mmcblk0p1/Emulation/roms/ds" [Emu] ExternalBIOSEnable = false + ConsoleType = 0 [DS] FirmwarePath = "/run/media/mmcblk0p1/Emulation/bios/firmware.bin" BIOS7Path = "/run/media/mmcblk0p1/Emulation/bios/bios7.bin" @@ -206,8 +213,23 @@ SHADPS4_SH = text( ) +CONFIG_EMU_FP = text( + """ + configEmuFP(){ + if [[ $overwrite == 'true' ]]; then + overwrite="--backup --suffix=.bak" + else + overwrite="--ignore-existing" + fi + rsync -avhp --mkpath "$emudeckBackend/configs/${ID}" "$HOME/.var/app/" $overwrite + } +""" +) + + def tree(**scripts: str) -> RepoTree: files = {f"{S}/{name}": body for name, body in scripts.items()} + files[el.CONFIG_EMU_FP] = CONFIG_EMU_FP files[f"{el.CONFIGS}/dev.ares.ares/data/ares/settings.bml"] = ARES_BML files[f"{el.CONFIGS}/net.kuribo64.melonDS/config/melonDS/melonDS.ini"] = MELONDS_INI files[f"{el.CONFIGS}/net.kuribo64.melonDS/config/melonDS/melonDS.toml"] = MELONDS_TOML @@ -253,8 +275,17 @@ class WrittenIntoTheConfig(unittest.TestCase): self.assertEqual( toml["passes_to"], "melonDS.toml [DS] FirmwarePath, BIOS7Path [DSi] NANDPath" ) + # The DS keys wait for ExternalBIOSEnable, the DSi keys for a DSi. self.assertEqual( - toml["depends_on_option"], "ExternalBIOSEnable = false in the shipped melonDS.toml" + toml["depends_on_option"], + "[DS] keys: ExternalBIOSEnable = true, false in the shipped melonDS.toml; " + "[DSi] keys: ConsoleType = 1, 0 in the shipped melonDS.toml", + ) + # configEmuFP's update call passes --ignore-existing. + self.assertIs(toml["kept_if_present"], True) + self.assertEqual( + toml["installs"]["path"], + "${HOME}/.var/app/net.kuribo64.melonDS/config/melonDS/melonDS.toml", ) def test_a_config_the_setters_rewrite_keeps_their_values(self): diff --git a/tests/test_launchers_emuelec.py b/tests/test_launchers_emuelec.py index ae6315c98..630547701 100644 --- a/tests/test_launchers_emuelec.py +++ b/tests/test_launchers_emuelec.py @@ -228,6 +228,9 @@ DUCKSTATION_SH = text( """ CONFIG_DIR="/emuelec/configs/duckstation" duckstation-nogui -fullscreen -settings "${CONFIG_DIR}/settings.ini" -- "${1}" + if [ ! -d "${CONFIG_DIR}" ]; then + cp -rf /usr/config/emuelec/configs/duckstation/* "${CONFIG_DIR}" + fi """ ) @@ -319,6 +322,9 @@ ADVMAME_SH = text( sed -i "s|/roms/arcade|/roms/mame|g" ${CONFIG_DIR}/advmame.rc fi SDL_AUDIODRIVER=alsa advmame ${ARG} -quiet + if [ ! -d "${CONFIG_DIR}" ]; then + cp -rf /usr/config/emuelec/configs/advmame/* "${CONFIG_DIR}/" + fi """ ) @@ -480,24 +486,12 @@ class LibretroRecords(unittest.TestCase): self.assertEqual(jar["passes_to"], "${HOME}/roms/bios") self.assertEqual(jar["depends_on_option"], "/storage/roms/bios/jdk/eeversion exists") - def test_mame_copies_its_own_files_and_reads_only_path_options(self): + def test_mame_copies_its_own_files_and_hands_no_folder(self): + # The core passes no path option and reads no mame.ini: only the + # copies are the launcher's. found = records(el.mame) - copies = [r for r in found if r["kind"] == "copies"] - self.assertEqual([r["names"] for r in copies], [["fm*"], ["mame*"]]) - folders = [(r["passes_to"], r["search_dir"]) for r in found if r["kind"] == "passes_path"] - self.assertEqual( - folders, - [ - ("mame.ini rompath", "/storage/roms/bios/mame/bios"), - ("mame.ini samplepath", "/storage/roms/bios/mame/samples"), - ], - ) - self.assertTrue(all(r["depends_on_option"] == "mame_read_config = enabled" - for r in found if r["kind"] == "passes_path")) - - def test_mame_without_the_read_config_option_raises(self): - with self.assertRaises(LauncherPatternMissing): - records(el.mame, **{f"{el.LIBRETRO}/mame/config/MAME/MAME.opt": "x = 1\n"}) + self.assertEqual([r["kind"] for r in found], ["copies", "copies"]) + self.assertEqual([r["names"] for r in found], [["fm*"], ["mame*"]]) class StandaloneRecords(unittest.TestCase): @@ -546,6 +540,12 @@ class StandaloneRecords(unittest.TestCase): (record,) = records(el.duckstation) self.assertEqual((record["kind"], record["search_dir"]), ("scans_dir", "/storage/roms/bios")) + def test_duckstation_config_is_kept_when_present(self): + (record,) = records(el.duckstation) + self.assertEqual(record["installs"]["path"], "/emuelec/configs/duckstation/settings.ini") + self.assertIs(record["kept_if_present"], True) + self.assertEqual(record["overrides"], []) + def test_duckstation_with_a_fixed_bios_path_raises(self): changed = DUCKSTATION_INI.replace("PathPAL =", "PathPAL = /storage/roms/bios/scph5502.bin") with self.assertRaises(LauncherPatternMissing): @@ -631,7 +631,8 @@ class StandaloneRecords(unittest.TestCase): def test_every_extractor_runs_on_the_fixtures(self): found = el.extract_launchers(tree()) - self.assertEqual(len(found), 28) + # The two mame.ini folders are no longer records. + self.assertEqual(len(found), 26) class Revision(unittest.TestCase): diff --git a/tests/test_launchers_rocknix.py b/tests/test_launchers_rocknix.py index 29d31dce7..730645c63 100644 --- a/tests/test_launchers_rocknix.py +++ b/tests/test_launchers_rocknix.py @@ -85,13 +85,14 @@ MELONDS_SH = text( sed -i '/^ExternalBIOSEnable=/c\\ExternalBIOSEnable=0' /storage/.config/melonDS/melonDS.ini fi fi + CONF_DIR="/storage/.config/melonDS" """ ) def melonds_tree() -> RepoTree: pkg = f"{SA}/melonds-sa" - return RepoTree.from_files( + return rocknix_tree( { **devices("AMD64", "H700", "RK3576", "S922X"), f"{pkg}/package.mk": MELONDS_MK, @@ -148,6 +149,7 @@ AMIBERRY_SH = text( cp -rf /usr/config/amiberry ${AMIBERRY_DIR} fi cd ${AMIBERRY_DIR} + amiberry -f "${AMIBERRY_TMP_CONFIG}" --autoload "$1" >> ${AMIBERRY_LOG} 2>&1 """ ) @@ -291,6 +293,22 @@ FLYCAST_SH = text( ) +USERCONFIG = text( + """ + #!/bin/bash + if [ ! -e "/storage/.configured" ] + then + rsync -a --ignore-existing --exclude={es_features.cfg,es_systems.cfg} /usr/config/* /storage/.config/ >/var/log/configure.log 2>&1 + fi + """ +) + + +def rocknix_tree(files: dict[str, str], links: dict[str, str] | None = None) -> RepoTree: + """A ROCKNIX tree holding the first-boot copy every config record cites.""" + return RepoTree.from_files({rl.USERCONFIG: USERCONFIG, **files}, links) + + def by(records: list[dict], emulator: str) -> list[dict]: return [r for r in records if r["emulator"] == emulator] @@ -302,23 +320,26 @@ class ConfigsPerDevice(unittest.TestCase): empty, named = records self.assertEqual(empty["names"], []) self.assertTrue(empty["passes_to"].endswith("DSiNANDPath left empty")) + # melonDS opens the DSi BIOS and firmware keys only under + # DSiExternalBIOSEnable, which no shipped config sets. self.assertEqual( - named["names"], - [ - "bios9.bin", - "bios7.bin", - "firmware.bin", - "dsi_bios9.bin", - "dsi_bios7.bin", - "dsi_firmware.bin", - "dsi_nand.bin", - ], + named["names"], ["bios9.bin", "bios7.bin", "firmware.bin", "dsi_nand.bin"] ) self.assertEqual(named["search_dir"], "/storage/roms/bios") + self.assertEqual(named["installs"]["path"], "/storage/.config/melonDS/melonDS.ini") + self.assertIs(named["kept_if_present"], True) + self.assertEqual(named["overrides"], []) + + def test_a_config_setting_the_dsi_switch_keeps_the_dsi_keys(self): + tree = melonds_tree() + path = f"{SA}/melonds-sa/config/S922X/melonDS.ini" + tree._texts[path] = tree.read(path) + "DSiExternalBIOSEnable=1\n" + named = rl.melonds(tree)[1].entry() + self.assertIn("dsi_bios9.bin", named["names"]) def test_a_linked_device_directory_reads_its_target(self): named = rl.melonds(melonds_tree())[1].entry() - self.assertIn(f"{SA}/melonds-sa/config/InputPlumber/melonDS.ini:2-8", named["source_ref"]) + self.assertIn(f"{SA}/melonds-sa/config/InputPlumber/melonDS.ini:2-4, 8", named["source_ref"]) self.assertNotIn("config/RK3576", named["source_ref"]) def test_the_external_bios_switch_is_the_option(self): @@ -330,11 +351,14 @@ class ConfigsPerDevice(unittest.TestCase): def test_identical_configs_give_one_record_without_device(self): pkg = f"{SA}/dsperate-sa" - tree = RepoTree.from_files( + tree = rocknix_tree( { **devices("H700", "RK3576", "S922X"), f"{pkg}/package.mk": DSPERATE_MK, - f"{pkg}/scripts/start_dsperate.sh": '${EMUPERF} /usr/bin/dsperate --config "${DSPERATE_INI}" "${ROM}"\n', + f"{pkg}/scripts/start_dsperate.sh": ( + '${EMUPERF} /usr/bin/dsperate --config "${DSPERATE_INI}" "${ROM}"\n' + 'DSPERATE_INI="/storage/.config/dsperate/dsperate.ini"\n' + ), f"{pkg}/config/H700/dsperate.ini": DSPERATE_INI, f"{pkg}/config/InputPlumber/dsperate.ini": DSPERATE_INI, f"{pkg}/config/S922X/dsperate.ini": DSPERATE_INI, @@ -352,10 +376,11 @@ class ConfigsPerDevice(unittest.TestCase): def test_an_absent_key_and_an_empty_one_hand_over_the_same(self): pkg = f"{SA}/duckstation-sa" - tree = RepoTree.from_files( + tree = rocknix_tree( { **devices("AMD64", "S922X"), f"{pkg}/package.mk": DUCKSTATION_MK, + f"{pkg}/scripts/start_duckstation.sh": "#!/bin/bash\n", f"{pkg}/config/AMD64/settings.ini": "[BIOS]\nSearchDirectory = /storage/roms/bios\n", f"{pkg}/config/S922X/settings.ini": text( """ @@ -375,10 +400,11 @@ class ConfigsPerDevice(unittest.TestCase): def test_a_bios_written_into_a_path_key_is_an_unknown_shape(self): pkg = f"{SA}/duckstation-sa" - tree = RepoTree.from_files( + tree = rocknix_tree( { **devices("S922X"), f"{pkg}/package.mk": DUCKSTATION_MK, + f"{pkg}/scripts/start_duckstation.sh": "#!/bin/bash\n", f"{pkg}/config/S922X/settings.ini": "[BIOS]\nSearchDirectory = /storage/roms/bios\nPathNTSCU = scph5501.bin\n", } ) @@ -387,7 +413,7 @@ class ConfigsPerDevice(unittest.TestCase): def test_a_package_without_a_device_copy_raises(self): pkg = f"{SA}/duckstation-sa" - tree = RepoTree.from_files( + tree = rocknix_tree( { **devices("S922X"), f"{pkg}/package.mk": "makeinstall_target() {\n true\n}\n", @@ -402,7 +428,7 @@ class NamesTheConfigsFix(unittest.TestCase): def test_amiberry_machine_follows_the_game_name(self): pkg = f"{SA}/amiberry" uae = "amiberry.rom_path=/storage/.config/amiberry/kickstarts/\nkickstart_rom_file=@BIOS_PATH@/{}\nkickstart_ext_rom_file=\n" - tree = RepoTree.from_files( + tree = rocknix_tree( { f"{pkg}/scripts/start_amiberry.sh": AMIBERRY_SH, f"{pkg}/package.mk": AMIBERRY_MK, @@ -412,9 +438,15 @@ class NamesTheConfigsFix(unittest.TestCase): ) a1200, a500, link, entered, copied = (r.entry() for r in rl.amiberry(tree)) self.assertEqual((a1200["slot"], a1200["names"]), ("A1200", ["kick40068.A1200.rom"])) - self.assertEqual(a1200["depends_on_option"], "game name matches AGA|CD32") + self.assertEqual( + a1200["depends_on_option"], + "game name matches AGA|CD32, content not booted with --autoload, " + "a WHDLoad .lha or .zip (start_amiberry.sh:17)", + ) + self.assertEqual(a1200["installs"]["path"], "${AMIBERRY_TMP_CONFIG}") + self.assertIs(a1200["kept_if_present"], False) self.assertEqual((a500["slot"], a500["names"]), ("A500", ["kick34005.A500.rom"])) - self.assertEqual(a500["depends_on_option"], "game name does not match AGA|CD32") + self.assertTrue(a500["depends_on_option"].startswith("game name does not match AGA|CD32")) self.assertEqual(a500["search_dir"], "/storage/roms/bios") self.assertEqual( a1200["source_ref"], @@ -443,7 +475,7 @@ class NamesTheConfigsFix(unittest.TestCase): def test_mednafen_one_record_per_module(self): pkg = f"{SA}/mednafen" - tree = RepoTree.from_files( + tree = rocknix_tree( { f"{pkg}/config/common/mednafen.template": MEDNAFEN_TEMPLATE, f"{pkg}/scripts/start_mednafen.sh": MEDNAFEN_SH, @@ -461,7 +493,7 @@ class NamesTheConfigsFix(unittest.TestCase): def test_mednafen_without_a_firmware_directory_raises(self): pkg = f"{SA}/mednafen" - tree = RepoTree.from_files( + tree = rocknix_tree( { f"{pkg}/config/common/mednafen.template": "psx.bios_eu scph5502.bin\n", f"{pkg}/scripts/start_mednafen.sh": MEDNAFEN_SH, @@ -473,7 +505,7 @@ class NamesTheConfigsFix(unittest.TestCase): class SearchedNames(unittest.TestCase): def tree(self, script: str) -> RepoTree: - return RepoTree.from_files({f"{SA}/yabasanshiro-sa/scripts/start_yabasanshiro.sh": script}) + return rocknix_tree({f"{SA}/yabasanshiro-sa/scripts/start_yabasanshiro.sh": script}) def test_yabasanshiro_tries_its_names_in_order(self): (record,) = [r.entry() for r in rl.yabasanshiro(self.tree(YABASANSHIRO_SH))] @@ -514,7 +546,7 @@ class Links(unittest.TestCase): def tree(self) -> RepoTree: scripts = self.all_scripts() - return RepoTree.from_files({p: scripts[e] for e, p in rl.LINK_SCRIPTS}) + return rocknix_tree({p: scripts[e] for e, p in rl.LINK_SCRIPTS}) def emulator(self, name: str) -> list[dict]: return by([r.entry() for r in rl.links(self.tree())], name) @@ -566,7 +598,7 @@ class Links(unittest.TestCase): def test_a_script_without_a_bios_link_raises(self): scripts = self.all_scripts() scripts["flycast"] = 'ln -sf "/storage/.config/flycast" "/storage/.local/share/flycast"\n' - tree = RepoTree.from_files({p: scripts[e] for e, p in rl.LINK_SCRIPTS}) + tree = rocknix_tree({p: scripts[e] for e, p in rl.LINK_SCRIPTS}) with self.assertRaises(LauncherPatternMissing): rl.links(tree) @@ -603,7 +635,7 @@ class ProgramsRunOutsideTheBiosFolder(unittest.TestCase): PATH = f"{SA}/pico-8/scripts/start_pico8.sh" def test_pico8_runs_its_binary_from_roms(self): - (record,) = [r.entry() for r in rl.pico8(RepoTree.from_files({self.PATH: START_PICO8}))] + (record,) = [r.entry() for r in rl.pico8(rocknix_tree({self.PATH: START_PICO8}))] self.assertEqual( (record["emulator"], record["kind"], record["names"], record["search_dir"], record["passes_to"]), @@ -615,7 +647,7 @@ class ProgramsRunOutsideTheBiosFolder(unittest.TestCase): def test_a_script_without_its_binary_choice_raises(self): broken = START_PICO8.replace('STATIC_BIN="pico8_dyn"', "STATIC_BIN=$OTHER") with self.assertRaises(LauncherPatternMissing): - rl.pico8(RepoTree.from_files({self.PATH: broken})) + rl.pico8(rocknix_tree({self.PATH: broken})) class Revision(unittest.TestCase):