From 8eaffcfead83a08aaee6b466676653e584922df1 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 10 Nov 2026 13:07:12 +0100 Subject: [PATCH] fix: place AdvanceMAME's sets in EmuELEC's dir_rom AdvanceMAME reads its sets from dir_rom, a list of folders (advance/osd/fileio.c:74, doc/advmame.d:680,699-701). EmuELEC's advmame.rc sets dir_rom /storage/roms/mame (advmame.rc:11), and advmame.sh rewrites /roms/mame to /roms/arcade when it is started for the arcade system (advmame.sh:26-30). The extractor kept the keys under the BIOS root alone: it now records those under the roms root too, and a key the script rewrites gives one record for arcade and one for every other system. A configgen record carries the systems it is written for. The profile lays its 29 sets out at the top of dir_rom. On EmuELEC they land in roms/mame. The 12 root archives AdvanceMAME alone claimed there now hold the copies of the cores that also declare them (mame, geolith), none of them lost. A destination outside the BIOS tree is no proof of content: the moved entry resolves by its layout path alone. roms/mame/konamigv.zip took bios/Arcade/MAME/konamigv.zip, MAME 0.289's set, by that tail. --- emulators/advancemame.yml | 32 ++++ platforms/emuelec.yml | 254 ++++++++++++++++++++++++- scripts/common.py | 5 +- scripts/scraper/configgen_launchers.py | 4 +- scripts/scraper/emuelec_launchers.py | 70 +++++-- tests/test_launcher_placement.py | 27 +++ tests/test_launchers_emuelec.py | 21 +- 7 files changed, 384 insertions(+), 29 deletions(-) diff --git a/emulators/advancemame.yml b/emulators/advancemame.yml index 1099540d8..11e2e4482 100644 --- a/emulators/advancemame.yml +++ b/emulators/advancemame.yml @@ -52,6 +52,9 @@ systems: - atari-system1 - efo-cedar-magnet +standalone_pools: + dir_rom: "" + notes: | MAME 0.106 core (src/version.c:11) carrying its own video layer and driver backports from later MAME releases. Twenty-nine BIOS root sets, each a @@ -156,6 +159,7 @@ files: # SNK Neo Geo MVS - name: neogeo.zip + path: "neogeo.zip" required: true category: bios_zip system: snk-neogeo-mvs @@ -223,6 +227,7 @@ files: # IGS PGM - name: pgm.zip + path: "pgm.zip" required: true category: bios_zip system: igs-pgm @@ -246,6 +251,7 @@ files: # Sega ST-V - name: stvbios.zip + path: "stvbios.zip" required: true category: bios_zip system: sega-stv @@ -302,6 +308,7 @@ files: # Sega Mega Play - name: megaplay.zip + path: "megaplay.zip" required: true category: bios_zip system: sega-megaplay @@ -323,6 +330,7 @@ files: # Sega Mega-Tech - name: megatech.zip + path: "megatech.zip" required: true category: bios_zip system: sega-megatech @@ -335,6 +343,7 @@ files: # DECO Cassette System - name: decocass.zip + path: "decocass.zip" required: true category: bios_zip system: deco-cassette @@ -387,6 +396,7 @@ files: # Nintendo PlayChoice-10 - name: playch10.zip + path: "playch10.zip" required: true category: bios_zip system: nintendo-playch10 @@ -438,6 +448,7 @@ files: # Nintendo Super System - name: nss.zip + path: "nss.zip" required: true category: bios_zip system: nintendo-nss @@ -466,6 +477,7 @@ files: # Super Kaneko Nova System - name: skns.zip + path: "skns.zip" required: true category: bios_zip system: super-kaneko-nova @@ -501,6 +513,7 @@ files: # Konami System GX - name: konamigx.zip + path: "konamigx.zip" required: true category: bios_zip system: konami-gx @@ -513,6 +526,7 @@ files: # Konami Baby Phoenix/GV System - name: konamigv.zip + path: "konamigv.zip" required: true category: bios_zip system: konami-gv @@ -525,6 +539,7 @@ files: # Century Electronics CVS - name: cvs.zip + path: "cvs.zip" required: true category: bios_zip system: century-cvs @@ -548,6 +563,7 @@ files: # Capcom ZN1 - name: cpzn1.zip + path: "cpzn1.zip" required: true category: bios_zip system: capcom-zn1 @@ -560,6 +576,7 @@ files: # Capcom ZN2 - name: cpzn2.zip + path: "cpzn2.zip" required: true category: bios_zip system: capcom-zn2 @@ -572,6 +589,7 @@ files: # Tecmo TPS - name: tps.zip + path: "tps.zip" required: true category: bios_zip system: tecmo-tps @@ -584,6 +602,7 @@ files: # Taito FX1 - name: taitofx1.zip + path: "taitofx1.zip" required: true category: bios_zip system: taito-fx1 @@ -596,6 +615,7 @@ files: # Eighting/Raizing PS Arcade 95 - name: psarc95.zip + path: "psarc95.zip" required: true category: bios_zip system: eighting-zn1 @@ -608,6 +628,7 @@ files: # Atlus PSX - name: atluspsx.zip + path: "atluspsx.zip" required: true category: bios_zip system: atlus-zn1 @@ -620,6 +641,7 @@ files: # Atari PSX - name: atpsx.zip + path: "atpsx.zip" required: true category: bios_zip system: atari-zn1 @@ -632,6 +654,7 @@ files: # Acclaim PSX - name: acpsx.zip + path: "acpsx.zip" required: true category: bios_zip system: acclaim-zn1 @@ -644,6 +667,7 @@ files: # Video System PSX - name: coh1002v.zip + path: "coh1002v.zip" required: true category: bios_zip system: videosystem-zn1 @@ -656,6 +680,7 @@ files: # Seta Aleck64 - name: aleck64.zip + path: "aleck64.zip" required: true category: bios_zip system: nintendo-aleck64 @@ -668,6 +693,7 @@ files: # Atari System 1 - name: atarisy1.zip + path: "atarisy1.zip" required: true category: bios_zip system: atari-system1 @@ -691,6 +717,7 @@ files: # EFO Cedar Magnet System - name: cedmag.zip + path: "cedmag.zip" required: true category: bios_zip system: efo-cedar-magnet @@ -703,6 +730,7 @@ files: # Arcadia Systems - name: ar_bios.zip + path: "ar_bios.zip" required: true category: bios_zip system: arcadia-systems @@ -770,6 +798,7 @@ files: # Exidy Max-A-Flex - name: maxaflex.zip + path: "maxaflex.zip" required: true category: bios_zip system: exidy-maxaflex @@ -793,6 +822,7 @@ files: # Brezzasoft Crystal System - name: crysbios.zip + path: "crysbios.zip" required: true category: bios_zip system: brezzasoft-crystal @@ -805,6 +835,7 @@ files: # I'Max Multi Amenity Cassette System - name: macsbios.zip + path: "macsbios.zip" required: true category: bios_zip system: imax-macs @@ -823,6 +854,7 @@ files: # Barcrest MPU4 Video - name: bctvidbs.zip + path: "bctvidbs.zip" required: true category: bios_zip system: barcrest-mpu4 diff --git a/platforms/emuelec.yml b/platforms/emuelec.yml index a9cbdf1ee..1c0622059 100644 --- a/platforms/emuelec.yml +++ b/platforms/emuelec.yml @@ -4442,6 +4442,206 @@ launchers: 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" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/artwork + passes_to: advmame.rc dir_artwork + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/artwork + passes_to: advmame.rc dir_artwork + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/diff + passes_to: advmame.rc dir_diff + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/diff + passes_to: advmame.rc dir_diff + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/hi + passes_to: advmame.rc dir_hi + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/hi + passes_to: advmame.rc dir_hi + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/image + passes_to: advmame.rc dir_image + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/image + passes_to: advmame.rc dir_image + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/inp + passes_to: advmame.rc dir_inp + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/inp + passes_to: advmame.rc dir_inp + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/memcard + passes_to: advmame.rc dir_memcard + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/memcard + passes_to: advmame.rc dir_memcard + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/nvram + passes_to: advmame.rc dir_nvram + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/nvram + passes_to: advmame.rc dir_nvram + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame + passes_to: advmame.rc dir_rom + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade + passes_to: advmame.rc dir_rom + fails_when_missing: false + 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,\ + \ 80" - emulator: AdvanceMame build: standalone kind: passes_path @@ -4449,9 +4649,59 @@ launchers: search_dir: /storage/roms/bios/advmame/samples passes_to: advmame.rc dir_sample fails_when_missing: false - source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:9,\ - \ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:9, packages/sx05re/emulators/advancemame/config/advmame.rc:12,\ + 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" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/snap + passes_to: advmame.rc dir_snap + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/snap + passes_to: advmame.rc dir_snap + fails_when_missing: false + 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,\ + \ 80" +- emulator: AdvanceMame + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/mame/nvram + passes_to: advmame.rc dir_sta + fails_when_missing: false + depends_on_option: system != arcade + 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,\ + \ 80" +- emulator: AdvanceMame + systems: + - arcade + build: standalone + kind: passes_path + names: [] + search_dir: /storage/roms/arcade/nvram + passes_to: advmame.rc dir_sta + fails_when_missing: false + 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,\ + \ 80" - emulator: SCUMMVMSA build: standalone kind: passes_path diff --git a/scripts/common.py b/scripts/common.py index 9be55a3f3..e3ee69033 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -1541,12 +1541,15 @@ def resolve_local_file( layout = file_entry.get("layout_path") if layout and layout != dest_hint: plain = {k: v for k, v in file_entry.items() if k != "layout_path"} + # A destination outside the BIOS tree says nothing of the collection: + # EmuELEC's roms/mame/konamigv.zip is not bios/Arcade/MAME's set. + outside = file_entry.get("unprefixed") or file_entry.get("root") answers = [ resolve_local_file( plain, db, zip_contents, dest_hint=hint, _depth=_depth, data_dir_registry=data_dir_registry, ) - for hint in (dest_hint, str(layout)) + for hint in ((str(layout),) if outside else (dest_hint, str(layout))) ] for found in answers: if found[0] is not None and ( diff --git a/scripts/scraper/configgen_launchers.py b/scripts/scraper/configgen_launchers.py index 5c9e3a70c..03957145e 100644 --- a/scripts/scraper/configgen_launchers.py +++ b/scripts/scraper/configgen_launchers.py @@ -37,11 +37,13 @@ class Launcher: device: str | None = None # The machines the platform offers under the record's systems. machines: list[str] | None = None + # The platform systems the record is written for, none for every one. + systems: list[str] | None = None def entry(self) -> dict[str, Any]: """The platform YAML form, in a fixed key order, unset keys left out.""" order = ( - "emulator", "build", "kind", "slot", "names", "expands", + "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", diff --git a/scripts/scraper/emuelec_launchers.py b/scripts/scraper/emuelec_launchers.py index 440e02818..f4aed1e60 100644 --- a/scripts/scraper/emuelec_launchers.py +++ b/scripts/scraper/emuelec_launchers.py @@ -38,6 +38,8 @@ EMULATORS = f"{SX05RE}/emulators" LIBRETRO = f"{SX05RE}/libretro" RETROARCH_MK = f"{SX05RE}/libretro_base/retroarch/package.mk" BIOS_ROOT = "/storage/roms/bios" +# The roms root that holds it (packages/sx05re/libretro_base/retroarch/package.mk:112,117). +ROMS_ROOT = "/storage/roms" _EMU_TEST = re.compile(r'\$\{?EMU\}?"?\s*==?\s*"([^"]+)"') _ARM = re.compile(r'^\s*((?:"[^"]+"\|?)+)\)\s*$') @@ -487,8 +489,18 @@ def hatari(tree: RepoTree, runs: Runs) -> list[Launcher]: ] +_ADVMAME_SYSTEM = re.compile(r'^\s*if \[\[ "\$\{1\}" = "([\w-]+)" \]\]; then$') +_ADVMAME_SED = re.compile(r'^\s*sed -i "s\|([^|]+)\|([^|]+)\|g" \$\{CONFIG_DIR\}/advmame\.rc$') + + def advancemame(tree: RepoTree, runs: Runs) -> list[Launcher]: - """Folder keys of the advmame.rc package.mk installs, one per device branch.""" + """Folder keys of the advmame.rc package.mk installs, one per device branch. + + A key under the roms root is one too: dir_rom is /storage/roms/mame. The + start script rewrites the config for the system it is launched for + (advmame.sh:26-30): /roms/mame becomes /roms/arcade for arcade, so that + system reads its own record. + """ package = f"{EMULATORS}/advancemame" mk = _read(tree, f"{package}/package.mk") installs = [ @@ -501,8 +513,8 @@ def advancemame(tree: RepoTree, runs: Runs) -> list[Launcher]: by_value: dict[tuple[tuple[str, str], ...], list[tuple[str, set[int], int]]] = {} for mk_line, file in installs: path = f"{package}/config/{file}" - keys = [s for s in settings(tree.read(path), separator=" ") if _under(s.value)] - if not keys: + keys = [s for s in settings(tree.read(path), separator=" ") if _under(s.value, ROMS_ROOT)] + if not any(_under(s.value) for s in keys): raise LauncherPatternMissing(path, f"key naming a folder under {BIOS_ROOT}") value = tuple((s.key, s.value) for s in keys) by_value.setdefault(value, []).append((path, {s.line for s in keys}, mk_line)) @@ -511,25 +523,41 @@ def advancemame(tree: RepoTree, runs: Runs) -> list[Launcher]: ((value, configs),) = by_value.items() script = _read(tree, f"{package}/bin/advmame.sh") run_line, _ = script.find(r"^\s*(?:\w+=\S+ )*advmame ", "advmame start") + test_line, test = script.find(_ADVMAME_SYSTEM.pattern, "system test", end=run_line) + sed_line, sed = script.find(_ADVMAME_SED.pattern, "system rewrite", test_line + 1, test_line + 1) name = posixpath.basename(script.path) - refs = [ - runs.ref(name), - *((path, lines) for path, lines, _ in configs), - (mk.path, {mk_line for _, _, mk_line in configs}), - (script.path, {run_line}), - ] - return [ - Launcher( - emulator=runs.emulator(name), - build="standalone", - kind="passes_path", - names=[], - source_ref=source_ref(refs), - search_dir=folder, - passes_to=f"advmame.rc {key}", - ) - for key, folder in value - ] + + def refs(*lines: int) -> str: + return source_ref([ + runs.ref(name), + *((path, lines) for path, lines, _ in configs), + (mk.path, {mk_line for _, _, mk_line in configs}), + (script.path, {run_line, *lines}), + ]) + + found = [] + 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( + 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( + 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)], + )) + continue + found.append(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 def mame(tree: RepoTree, runs: Runs) -> list[Launcher]: diff --git a/tests/test_launcher_placement.py b/tests/test_launcher_placement.py index 2ffa4d23c..b02453c77 100644 --- a/tests/test_launcher_placement.py +++ b/tests/test_launcher_placement.py @@ -879,5 +879,32 @@ class GzdoomOnRetroDECK(unittest.TestCase): self.assertFalse(any(e.get("standalone_path") for e in view["files"])) +class AdvanceMameOnEmuELEC(unittest.TestCase): + """advmame.rc sets dir_rom /storage/roms/mame, /storage/roms/arcade for + the arcade system (advmame.rc:11, advmame.sh:26-30).""" + + def test_the_sets_land_in_roms_mame(self) -> None: + view = standalone_view("advancemame", "emuelec") + sets = [e for e in view["files"] if e.get("category") == "bios_zip"] + self.assertEqual(len(sets), 29) + for entry in sets: + self.assertEqual(entry["standalone_path"], "mame/" + entry["name"]) + self.assertTrue(entry.get("unprefixed")) + + def test_the_roms_folder_is_no_proof_of_content(self) -> None: + # bios/Arcade/MAME/konamigv.zip is MAME 0.289's set, not AdvanceMAME's. + from common import load_database, resolve_local_file + + db = load_database(str(REPO_ROOT / "database.json")) + view = standalone_view("advancemame", "emuelec") + (entry,) = [e for e in view["files"] if e["name"] == "konamigv.zip"] + moved, _status = resolve_local_file(entry, db, dest_hint=entry["standalone_path"]) + plain = {k: v for k, v in entry.items() + if k not in ("layout_path", "standalone_path", "unprefixed")} + root, _status = resolve_local_file(plain, db, dest_hint=entry["name"]) + self.assertEqual(moved, root) + self.assertNotIn("/MAME/", moved) + + if __name__ == "__main__": unittest.main() diff --git a/tests/test_launchers_emuelec.py b/tests/test_launchers_emuelec.py index 18cf54160..ae6315c98 100644 --- a/tests/test_launchers_emuelec.py +++ b/tests/test_launchers_emuelec.py @@ -313,6 +313,11 @@ ADVMAME_RC = text( ADVMAME_SH = text( """ + if [[ "${1}" = "arcade" ]]; then + sed -i "s|/roms/mame|/roms/arcade|g" ${CONFIG_DIR}/advmame.rc + else + sed -i "s|/roms/arcade|/roms/mame|g" ${CONFIG_DIR}/advmame.rc + fi SDL_AUDIODRIVER=alsa advmame ${ARG} -quiet """ ) @@ -580,9 +585,17 @@ class StandaloneRecords(unittest.TestCase): ) def test_advancemame_one_record_when_every_device_agrees(self): - (record,) = records(el.advancemame) - self.assertEqual(record["search_dir"], "/storage/roms/bios/advmame/samples") - self.assertNotIn("device", record) + roms, arcade, samples = records(el.advancemame) + self.assertEqual(samples["search_dir"], "/storage/roms/bios/advmame/samples") + self.assertNotIn("device", samples) + # advmame.sh rewrites /roms/mame to /roms/arcade for the arcade system. + self.assertEqual( + (roms["search_dir"], roms["passes_to"], roms["depends_on_option"]), + ("/storage/roms/mame", "advmame.rc dir_rom", "system != arcade"), + ) + self.assertNotIn("systems", roms) + self.assertEqual((arcade["search_dir"], arcade["systems"]), ("/storage/roms/arcade", ["arcade"])) + self.assertTrue(arcade["source_ref"].endswith("bin/advmame.sh:1-2, 6")) def test_advancemame_devices_that_disagree_raise(self): changed = ADVMAME_RC.replace("bios/advmame", "bios/other") @@ -618,7 +631,7 @@ class StandaloneRecords(unittest.TestCase): def test_every_extractor_runs_on_the_fixtures(self): found = el.extract_launchers(tree()) - self.assertEqual(len(found), 26) + self.assertEqual(len(found), 28) class Revision(unittest.TestCase):