Files
libretro/platforms
Abdessamad Derraz c71378a71c feat: shared groups, scraper subdir prefixes, arcade + emulator profiles
shared groups in _shared.yml: np2kai, keropi, quasi88, kronos, ep128emu
with source references for each subdirectory requirement.

libretro_scraper: CORE_SUBDIR_MAP applies subdirectory prefixes at
generation time (np2kai/, keropi/, dc/). EXTRA_SYSTEMS adds QUASI88.
SYSTEM_SHARED_GROUPS injects includes for kronos/np2kai/keropi.

new BIOS: CPS3 (23 ZIPs), Cannonball OutRun (40 ROMs), PCem PC BIOS
(73 files), VICE Commodore ROMs, Spectrum ZIPs, dc_bios.bin, X1 fonts.

new emulator profiles: redream, melonds_ds, lrps2 with doc vs source
notes. platforms/README.md documents shared groups architecture.
2026-03-18 13:49:59 +01:00
..

Platform Configs

How platform YAML files work and where subdirectory requirements come from.

Files

  • _registry.yml -- platform metadata (name, status, display order)
  • _shared.yml -- shared file groups with canonical destinations
  • <platform>.yml -- per-platform BIOS declarations
  • Inheritance: lakka.yml inherits retroarch, retropie.yml inherits retroarch

Shared groups (_shared.yml)

The subdirectory a BIOS goes into is determined by the libretro core, not the platform. NP2kai expects np2kai/BIOS.ROM whether you're on RetroArch, Batocera, or Recalbox. Only base_destination varies (system/ vs bios/).

Shared groups define files with correct destinations once. Platforms reference them via includes: [group_name] in their system definitions. load_platform_config() in common.py resolves includes at load time, deduplicating by filename.

When to use shared groups: whenever 2+ platforms share files that a core expects in a specific subdirectory. The group carries the correct destination so platforms can't drift.

For RetroArch specifically, libretro_scraper.py injects includes: references and applies subdirectory prefixes via CORE_SUBDIR_MAP during generation. Manual edits to retroarch.yml will be overwritten on next scrape.

Subdirectory reference

Each entry documents where the requirement comes from. Check these source files to verify or update the paths.

Core Subdirectory Source
NP2kai np2kai/ libretro-np2kai/sdl/libretro.c
PX68k keropi/ px68k/libretro/libretro.c
QUASI88 quasi88/ quasi88/src/libretro.c
Kronos kronos/ libretro-kronos/libretro/libretro.c
ep128emu ep128emu/rom/ ep128emu-core/src/libretro.cpp
Flycast dc/ flycast/shell/libretro/libretro.cpp
FBNeo NeoCD neocd/ fbneo/src/burn/drv/neogeo/neo_run.cpp
Fuse fuse/ fuse-libretro/fuse/settings.c
hatari hatari/tos/ hatari/src/tos.c

Full libretro docs: https://docs.libretro.com/library/<core>/

Adding a platform

  1. Create platforms/<name>.yml
  2. Set base_destination (system or bios), verification_mode, hash_type
  3. Use includes: [group] for systems with subdirectory requirements
  4. Use inherits: retroarch to share RetroArch's file set
  5. Add platform-specific overrides in overrides.systems
  6. Test: python scripts/verify.py --platform <name>

Adding a shared group

  1. Add the group to _shared.yml with a source ref comment
  2. Include: filename, destination with subdirectory prefix, required flag, hashes
  3. Reference via includes: [group_name] in platform system definitions
  4. For scraper-generated platforms, add the mapping in the scraper's SYSTEM_SHARED_GROUPS dict so it persists across regeneration

Verification modes

Platform Mode Native logic Upstream source
RetroArch existence path_is_valid() -- file exists core_info.c
Lakka existence inherits RetroArch idem
RetroPie existence inherits RetroArch idem
Batocera md5 md5sum() + checkInsideZip() batocera-systems
RetroBat md5 MD5 check via JSON config batocera-systems.json
EmuDeck md5 MD5 whitelist per system checkBIOS.sh
Recalbox md5 multi-hash comma-separated es_bios.xml + Bios.cpp