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):