Files
libretro/CONTRIBUTING.md
T
Abdessamad Derraz 36d93c1750 feat: name the folder of a profile-only file
validate_pr.py built its folder advice from platform lists alone, so a
file only an emulator profile declares got the generic
bios/Manufacturer/Console/ advice. Profiles now feed the same table
through each entry's system, and the contributing guide says the
command answers where a file goes.
2026-10-21 10:13:09 +02:00

3.1 KiB

Contributing to RetroBIOS

Add a BIOS file

  1. Fork this repository
  2. Place the file in bios/Manufacturer/Console/filename. python scripts/validate_pr.py path/to/file names the folder its system is kept in, and whether a platform or an emulator profile declares it
  3. Variants (alternate hashes for the same file): bios/Manufacturer/Console/.variants/
  4. Open a pull request. Its hashes are checked automatically and reported in a comment

The dump provenance page lists catalogued dumps still missing from the collection, with their hashes. A file matching one of those is the most useful contribution.

Add a platform

  1. Write a scraper in scripts/scraper/ (inherit BaseScraper)
  2. Read the platform's upstream source to determine how it checks BIOS files
  3. Register it in platforms/_registry.yml
  4. Generate the platform YAML and test: python scripts/verify.py --platform <name>

Full walkthrough: adding a platform.

Add an emulator profile

  1. Clone the emulator's source code, upstream and libretro port
  2. Trace the file loading from the entry point, not from a keyword grep
  3. Document every file the code loads, with a source_ref line reference
  4. Write the YAML to emulators/<name>.yml
  5. Test: python scripts/cross_reference.py --emulator <name>

Full walkthrough: profiling guide.

File conventions

  • bios/Manufacturer/Console/filename for canonical files
  • bios/Manufacturer/Console/.variants/filename.sha1prefix for alternate versions
  • A file too large for git goes to the large-files GitHub release and its path into .gitignore, the list that decides what is served from the release
  • Trees addressed by path are kept out of deduplication (NODEDUP_DIRS in scripts/dedup.py)
  • Two paths differing only by case break clones on Windows and macOS, and tests/test_no_case_collisions.py enforces this

Before opening a PR

The checks CI runs on a pull request (Python 3.12 or newer):

pip install pyyaml "jsonschema[format-nongpl]" markdown \
    "mkdocs-material>=9.7.5,<10" "pymdown-extensions>=10.14"
python scripts/validate_pr.py --changed          # the BIOS files the branch adds
python scripts/validate_schemas.py --source-only # profiles and platform files
python scripts/profile_sync.py --changed --strict  # each profile the branch adds or edits
python scripts/refresh_data_dirs.py  # data directories the pack-building tests read
python -m unittest discover -s tests -t .

The full pipeline is not needed for a contribution: it rebuilds every pack in dist/, which is why maintainers run it before a release.

PR validation

CI computes SHA1/MD5/CRC32 for every new file, checks them against the platform configs, validates the YAML against the schemas, confronts each added profile with its upstream source, runs the test suite, and posts a report on the PR.

Contributors who add platform support are credited in the README, on the documentation site, and in the BIOS packs.