mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-11 20:43:50 -06:00
Three changes to the search-list model, one commit because the readers
and the profiles must move together for the schema to hold.
Set requirement in a groups map. pom2 falls back on apple2.rom for the
][ and the ][+, and on apple2e.rom for the //e it boots and for the
unenhanced //e: one required on the file could not say both. A profile
now declares groups: {name: {required}}, a member writes no required
of its own (schema and validate_schemas refuse one) and load_emulator_
profiles derives it, true when one of its sets is. group takes a name,
a list, or a map from set to rank where the rank differs per set. pom2
is grouped from SystemProfile.cpp and MainWindow.cpp:246-296 at its pin.
One member per required set under --required-only. The pick is the
first the code reads among the held members the region filter leaves,
by rank then declaration order; a set the platform declares a member
of is carried by that declaration. The emulator pack, verify
--emulator, the platform pack, its manifest and verify --platform read
alternatives.required_only_spares or core_file_spares.
variant_group is now selection_slot: files a core chooses between by
a rule other than first found (disc territory for PicoDrive and
Pizza Boy SC, the o2em_bios option, a WebAssembly probe in SWF
Player). Where the code takes any one, the field became a group:
ARMSX1 (ArmSxBackend.java:149-157, name order), ePSXe (load_bios
0x433540-0x433621 of the 2.0.5 Linux x64 binary, one configured path,
HLE when BiosHLE is set), FPse and FPse-NG, DXX-Rebirth's HOGs
(inferno.cpp:472-512). odin and zesarux carried it with no effect.
slot.py compares ranks only between candidates that share a set.
1312 lines
40 KiB
JSON
1312 lines
40 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://abdess.github.io/retrobios/api/v1/schemas/emulator.schema.json",
|
|
"title": "Emulator BIOS Profile",
|
|
"description": "One YAML per emulator core or engine, documenting every external file the code loads. Field reference: https://abdess.github.io/retrobios/wiki/profiling/",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"emulator",
|
|
"type"
|
|
],
|
|
"allOf": [
|
|
{
|
|
"comment": "A build reference documents why a pin is held: it never stands without the pin_frozen that says so.",
|
|
"if": {
|
|
"required": [
|
|
"pin_build"
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"pin_frozen"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "An alias profile points at another profile and carries no files of its own.",
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "alias"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"alias_of"
|
|
]
|
|
},
|
|
"else": {
|
|
"required": [
|
|
"files"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "Per-file mode separates the two builds of a dual profile. A profile with only a standalone build has no libretro side to separate it from, and a file marked standalone there drops out of the gap analysis and of the packs of every platform that lists the emulator without standalone_cores.",
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "standalone"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"files": {
|
|
"items": {
|
|
"not": {
|
|
"properties": {
|
|
"mode": {
|
|
"const": "standalone"
|
|
}
|
|
},
|
|
"required": [
|
|
"mode"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"comment": "A profile whose code states no version says so with version_basis kind none and a null core_version, never a placeholder.",
|
|
"if": {
|
|
"properties": {
|
|
"version_basis": {
|
|
"properties": {
|
|
"kind": {
|
|
"const": "none"
|
|
}
|
|
},
|
|
"required": [
|
|
"kind"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"version_basis"
|
|
]
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"core_version": {
|
|
"type": "null"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"properties": {
|
|
"emulator": {
|
|
"type": "string"
|
|
},
|
|
"display_name": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"description": "Operational: resolve_platform_cores() filters on it. Not a classification.",
|
|
"type": "string",
|
|
"enum": [
|
|
"libretro",
|
|
"standalone",
|
|
"standalone + libretro",
|
|
"alias",
|
|
"launcher",
|
|
"game",
|
|
"utility",
|
|
"test"
|
|
]
|
|
},
|
|
"core_classification": {
|
|
"description": "Descriptive only, no effect on tooling.",
|
|
"type": "string",
|
|
"enum": [
|
|
"pure_libretro",
|
|
"official_port",
|
|
"community_fork",
|
|
"frozen_snapshot",
|
|
"enhanced_fork",
|
|
"game_engine",
|
|
"embedded_hle",
|
|
"launcher",
|
|
"alias",
|
|
"other"
|
|
]
|
|
},
|
|
"built_by": {
|
|
"description": "The platforms that ship this build under its core name, compiled by them or installed from the project's own release (Recalbox's mame0278, the GSplus legacy build Recalbox, Batocera and RetroBat run). On those platforms the name resolves to this profile. It is never reached by all_libretro: the libretro buildbot does not publish it.",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"minItems": 1,
|
|
"uniqueItems": true
|
|
},
|
|
"source": {
|
|
"type": [
|
|
"string",
|
|
"object"
|
|
]
|
|
},
|
|
"upstream": {
|
|
"type": [
|
|
"string",
|
|
"object",
|
|
"null"
|
|
]
|
|
},
|
|
"source_commit": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
],
|
|
"description": "Revision the profile was read at. An object keys it by build mode when the builds live in different repositories."
|
|
},
|
|
"upstream_commit": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
],
|
|
"description": "Revision the profile was read at. An object keys it by build mode when the builds live in different repositories."
|
|
},
|
|
"profiled_date": {
|
|
"description": "Quote it: an unquoted YAML date parses to a date object.",
|
|
"type": [
|
|
"string",
|
|
"object"
|
|
]
|
|
},
|
|
"core_version": {
|
|
"description": "The version of the code at the pin, read where version_basis says: the string the program states, git describe's form of the nearest tag, or the package read. Never a branch or VCS name (Git, SVN, master, latest, dev, unknown). null when version_basis is kind none. An object keys it by build mode, like source.",
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^(?!([Gg][Ii][Tt]|[Ss][Vv][Nn]|[Uu][Nn][Kk][Nn][Oo][Ww][Nn]|[Mm][Aa][Ss][Tt][Ee][Rr]|[Mm][Aa][Ii][Nn]|[Ll][Aa][Tt][Ee][Ss][Tt]|[Dd][Ee][Vv]|[Hh][Ee][Aa][Dd])([\\s(]|$)).*\\S"
|
|
},
|
|
{
|
|
"type": "null"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^(?!([Gg][Ii][Tt]|[Ss][Vv][Nn]|[Uu][Nn][Kk][Nn][Oo][Ww][Nn]|[Mm][Aa][Ss][Tt][Ee][Rr]|[Mm][Aa][Ii][Nn]|[Ll][Aa][Tt][Ee][Ss][Tt]|[Dd][Ee][Vv]|[Hh][Ee][Aa][Dd])([\\s(]|$)).*\\S"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"version_basis": {
|
|
"description": "Where core_version is read, so a tool reads it again at any pin. An object keyed by build mode when core_version is.",
|
|
"oneOf": [
|
|
{
|
|
"$ref": "#/$defs/version_basis"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"not": {
|
|
"required": [
|
|
"kind"
|
|
]
|
|
},
|
|
"additionalProperties": {
|
|
"$ref": "#/$defs/version_basis"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"alias_of": {
|
|
"type": "string"
|
|
},
|
|
"cores": {
|
|
"description": "Upstream names the core is known by. A dict maps each name to per-variant metadata. Names are strings: an unquoted 81 or 2048 parses as a number and stops matching the buildbot name.",
|
|
"oneOf": [
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"uniqueItems": true
|
|
},
|
|
{
|
|
"type": "object",
|
|
"propertyNames": {
|
|
"minLength": 1
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"systems": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"verification": {
|
|
"type": "string",
|
|
"enum": [
|
|
"existence",
|
|
"md5",
|
|
"sha1",
|
|
"crc32"
|
|
]
|
|
},
|
|
"exclusion_note": {
|
|
"type": "string"
|
|
},
|
|
"analysis": {
|
|
"type": "object"
|
|
},
|
|
"analysis_commit": {
|
|
"type": "string"
|
|
},
|
|
"analysis_date": {
|
|
"type": "string"
|
|
},
|
|
"archive_prefix": {
|
|
"type": "string"
|
|
},
|
|
"author": {
|
|
"type": "string"
|
|
},
|
|
"based_on": {
|
|
"type": "string"
|
|
},
|
|
"bios_directory": {
|
|
"type": "string"
|
|
},
|
|
"bios_identical_to": {
|
|
"type": "string"
|
|
},
|
|
"found_by": {
|
|
"description": "How the code finds the file: by the name it opens, or by content in a folder it scans, the name then being a label. Keyed by build when the libretro and standalone builds differ.",
|
|
"oneOf": [
|
|
{"type": "string", "enum": ["name", "content"]},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {"type": "string", "enum": ["name", "content"]},
|
|
"standalone": {"type": "string", "enum": ["name", "content"]}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"bios_mode": {
|
|
"type": "string"
|
|
},
|
|
"bios_size": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"builtin_boot_roms": {
|
|
"type": "object"
|
|
},
|
|
"core": {
|
|
"type": "string"
|
|
},
|
|
"core_name": {
|
|
"type": "string"
|
|
},
|
|
"data_directories": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"ref"
|
|
],
|
|
"properties": {
|
|
"ref": {
|
|
"type": "string"
|
|
},
|
|
"destination": {
|
|
"type": "string"
|
|
},
|
|
"required": {
|
|
"type": "boolean",
|
|
"description": "false when the core runs without the tree; --required-only leaves it out"
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"bundled": {
|
|
"type": "boolean",
|
|
"description": "Installed with the emulator for the build mode names, so packs leave the tree out."
|
|
},
|
|
"installed_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose own package installs this beside the emulator, so their packs leave it out."
|
|
},
|
|
"not_bundled_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose package leaves out a file the emulator's release bundles, so their packs bring it."
|
|
},
|
|
"unread_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose launcher points the emulator at other files, so this entry is never opened there."
|
|
},
|
|
"load_from": {
|
|
"description": "Where the emulator reads the tree when not below the system directory, keyed by build when the builds differ (content_dir: beside the content). A platform pack carries only a tree read from the system directory.",
|
|
"oneOf": [
|
|
{"type": "string"},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {"type": "string"},
|
|
"standalone": {"type": "string"}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"source_ref": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"dev_flash": {
|
|
"type": "object"
|
|
},
|
|
"dev_flash2": {
|
|
"type": "object"
|
|
},
|
|
"dev_flash3": {
|
|
"type": "object"
|
|
},
|
|
"firmware_titles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"game_count": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"library_name": {
|
|
"description": "The library_name the libretro core reports in retro_get_system_info. A frontend sorting saves by core (RetroArch's sort_savefiles_enable) hands the core <save directory>/<library_name>, so a profile with a file the libretro build reads below the save directory (load_from: save_dir) declares it. Empty when the core reports an empty name, which RetroArch appends nothing for.",
|
|
"type": "string",
|
|
"pattern": "^[^/\\\\]*$"
|
|
},
|
|
"save_folder_once": {
|
|
"description": "true when the core adds its own folder to the save directory only where the directory it is handed is not already named so (Cemu's in_named_dir), so it reads the same place whether the frontend sorts saves by core or not. Every load_from: save_dir path then starts with that folder, the library_name.",
|
|
"const": true
|
|
},
|
|
"logo": {
|
|
"type": "string"
|
|
},
|
|
"machine_directories": {
|
|
"type": "object"
|
|
},
|
|
"machine_properties": {
|
|
"type": "object"
|
|
},
|
|
"mame_version": {
|
|
"type": "string"
|
|
},
|
|
"memory_layout": {
|
|
"type": "object"
|
|
},
|
|
"mlc_structure": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"model_kickstart_map": {
|
|
"type": "object"
|
|
},
|
|
"note": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": [
|
|
"string",
|
|
"array",
|
|
"object"
|
|
]
|
|
},
|
|
"pack_structure": {
|
|
"type": "object"
|
|
},
|
|
"platform_details": {
|
|
"type": "object"
|
|
},
|
|
"resources_directory": {
|
|
"type": "string"
|
|
},
|
|
"rom_path": {
|
|
"type": "string"
|
|
},
|
|
"source_ref": {
|
|
"type": "string"
|
|
},
|
|
"valid_bios_crc32": {
|
|
"type": "object"
|
|
},
|
|
"whdload_kickstarts": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"groups": {
|
|
"description": "The sets of entries the code takes one of, by name, with the requirement of each. A member names its sets with group and writes no required of its own: it is required when one of its sets is.",
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["required"],
|
|
"properties": {
|
|
"required": {"type": "boolean"}
|
|
}
|
|
}
|
|
},
|
|
"files": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"required": {
|
|
"type": "boolean"
|
|
},
|
|
"system": {
|
|
"type": "string"
|
|
},
|
|
"systems": {
|
|
"type": "array",
|
|
"minItems": 2,
|
|
"uniqueItems": true,
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "The systems of the profile this entry serves, when it serves several and not all: a MAME device set the machines of two systems load. One system is written as system:."
|
|
},
|
|
"path": {
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"destination": {
|
|
"type": "string"
|
|
},
|
|
"aliases": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"archive": {
|
|
"description": "ROM set the file lives in, for arcade entries.",
|
|
"type": "string"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"bios",
|
|
"game_data",
|
|
"bios_zip"
|
|
]
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"storage": {
|
|
"type": "string",
|
|
"enum": [
|
|
"embedded",
|
|
"external",
|
|
"user_provided",
|
|
"large_file",
|
|
"release"
|
|
]
|
|
},
|
|
"hle_fallback": {
|
|
"type": "boolean"
|
|
},
|
|
"evidence": {
|
|
"description": "Real-condition runs that settled a field of this entry, by field: the ids of the core probe records in measurements/<emulator>.jsonl. Written by scripts/campaign.py when its rule table settles the field.",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"required": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}},
|
|
"hle_fallback": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}},
|
|
"path": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}},
|
|
"aliases": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}},
|
|
"validation": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}}
|
|
}
|
|
},
|
|
"adler32_byteswap": {
|
|
"type": "boolean"
|
|
},
|
|
"adler32_pairs_with": {
|
|
"description": "The file hashed together with this one. adler32_pairs lists the combinations the code accepts.",
|
|
"type": "string"
|
|
},
|
|
"adler32_pairs": {
|
|
"description": "Accepted Adler-32 combinations, this file's value first, in the code's table order.",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"minItems": 2,
|
|
"maxItems": 2
|
|
},
|
|
"minItems": 1
|
|
},
|
|
"agnostic": {
|
|
"type": "boolean"
|
|
},
|
|
"bundled": {
|
|
"type": "boolean",
|
|
"description": "Installed with the emulator for the build mode names (all builds when mode is absent): already on the user's machine, so packs and install manifests leave it out."
|
|
},
|
|
"installed_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose own package installs this beside the emulator, so their packs leave it out."
|
|
},
|
|
"not_bundled_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose package leaves out a file the emulator's release bundles, so their packs bring it."
|
|
},
|
|
"unread_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose launcher points the emulator at other files, so this entry is never opened there."
|
|
},
|
|
"config_key": {
|
|
"type": "string"
|
|
},
|
|
"embedded": {
|
|
"type": "boolean"
|
|
},
|
|
"fast_boot": {
|
|
"type": "string"
|
|
},
|
|
"has_builtin": {
|
|
"type": "boolean"
|
|
},
|
|
"found_by": {
|
|
"description": "How the code finds the file: by the name it opens, or by content in a folder it scans, the name then being a label. Keyed by build when the libretro and standalone builds differ.",
|
|
"oneOf": [
|
|
{"type": "string", "enum": ["name", "content"]},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {"type": "string", "enum": ["name", "content"]},
|
|
"standalone": {"type": "string", "enum": ["name", "content"]}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"load_from": {
|
|
"description": "Where the emulator reads the file when not from the system directory, keyed by build when the libretro and standalone builds read it from different places. save_dir: path is relative to the directory the frontend returns for RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, and packs and the installer place the libretro build's file there.",
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {
|
|
"type": "string"
|
|
},
|
|
"standalone": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"priority": {
|
|
"description": "Preference order among the BIOS a system accepts, lowest first. DuckStation's FindBIOSImageInDirectory keeps the image whose priority is lower. A search list the code walks in order maps onto it as 1, 2, 3. The order only: which entries stand in for one another is group.",
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"group": {
|
|
"description": "The sets of the profile's groups map this entry belongs to. A set is one need: the code loads one member (the first it finds, in priority order where the source states one) and holding any member fills it. A list puts a file in several sets, a fallback two machine models share, and a map from set to rank gives its place in each when the places differ (priority otherwise). The entry writes no required: it is derived from its sets.",
|
|
"oneOf": [
|
|
{"type": "string", "minLength": 1},
|
|
{"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "minLength": 1}},
|
|
{"type": "object", "minProperties": 1, "additionalProperties": {"type": ["integer", "null"], "minimum": 0}}
|
|
]
|
|
},
|
|
"region_check": {
|
|
"type": "boolean"
|
|
},
|
|
"size_note": {
|
|
"type": "string"
|
|
},
|
|
"standalone_path": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"description": "Set on an entry that names a directory the code reads whole. The entry then stands for every file under path.",
|
|
"type": "string",
|
|
"enum": [
|
|
"directory"
|
|
]
|
|
},
|
|
"selection_slot": {
|
|
"description": "Files one core chooses between by a rule other than first found: the disc's territory, a core option, a feature probe. They fill one slot of the core whatever system each is filed under, region filtering compares them together, and same-named entries in different slots stay apart. A member does not stand in for another: entries that do are a group.",
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"size": {
|
|
"type": [
|
|
"integer",
|
|
"array",
|
|
"null"
|
|
],
|
|
"minimum": 0,
|
|
"items": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"minItems": 1
|
|
},
|
|
"min_size": {
|
|
"type": "integer"
|
|
},
|
|
"max_size": {
|
|
"type": "integer"
|
|
},
|
|
"md5": {
|
|
"oneOf": [
|
|
{
|
|
"type": "null"
|
|
},
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{32}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{32}$"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"sha1": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"sha256": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{64}(,[a-fA-F0-9]{64})*$"
|
|
},
|
|
"crc32": {
|
|
"description": "CRC32 the code accepts, as a list when several dumps pass.",
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
"minItems": 1
|
|
}
|
|
]
|
|
},
|
|
"known_hash_adler32": {
|
|
"description": "Adler-32 values the code accepts, as a list when several revisions pass.",
|
|
"oneOf": [
|
|
{
|
|
"type": [
|
|
"string",
|
|
"integer"
|
|
]
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": [
|
|
"string",
|
|
"integer"
|
|
]
|
|
},
|
|
"minItems": 1
|
|
}
|
|
]
|
|
},
|
|
"validation": {
|
|
"description": "Checks the code performs. A dict splits core from upstream when they diverge.",
|
|
"oneOf": [
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
]
|
|
},
|
|
"region": {
|
|
"description": "Region the emulator code selects this file for, never the region of the dump.",
|
|
"type": "array",
|
|
"items": {
|
|
"enum": [
|
|
"world",
|
|
"north-america",
|
|
"canada",
|
|
"latin-america",
|
|
"brazil",
|
|
"mexico",
|
|
"argentina",
|
|
"europe",
|
|
"uk",
|
|
"france",
|
|
"germany",
|
|
"italy",
|
|
"spain",
|
|
"netherlands",
|
|
"portugal",
|
|
"greece",
|
|
"poland",
|
|
"russia",
|
|
"sweden",
|
|
"norway",
|
|
"denmark",
|
|
"finland",
|
|
"asia",
|
|
"japan",
|
|
"south-korea",
|
|
"china",
|
|
"taiwan",
|
|
"hong-kong",
|
|
"singapore",
|
|
"india",
|
|
"asia-ntsc",
|
|
"asia-pal",
|
|
"oceania",
|
|
"australia",
|
|
"new-zealand"
|
|
]
|
|
}
|
|
},
|
|
"contents": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"size": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"sha1": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
},
|
|
"crc32": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"bad_dump": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"source_ref": {
|
|
"description": "A dict splits core from upstream when the two diverge.",
|
|
"type": [
|
|
"string",
|
|
"array",
|
|
"object"
|
|
]
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"note": {
|
|
"type": "string"
|
|
},
|
|
"unsourceable": {
|
|
"type": "string"
|
|
},
|
|
"on_mismatch": {
|
|
"description": "What the code does when a declared check fails: reject the file (default) or warn and run with it, for every check or check by check.",
|
|
"oneOf": [
|
|
{
|
|
"enum": [
|
|
"reject",
|
|
"warn"
|
|
]
|
|
},
|
|
{
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^(size|crc32|md5|sha1|sha256|adler32|signature|crypto)$": {
|
|
"enum": [
|
|
"reject",
|
|
"warn"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"allOf": [
|
|
{
|
|
"not": {
|
|
"required": [
|
|
"system",
|
|
"systems"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"not": {"required": ["group", "required"]}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"name": {
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"anyOf": [
|
|
{
|
|
"required": [
|
|
"path"
|
|
],
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"required": [
|
|
"standalone_path"
|
|
],
|
|
"properties": {
|
|
"standalone_path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"source_branch": {
|
|
"type": "string",
|
|
"description": "Branch the port was read from, when it is not the default one."
|
|
},
|
|
"standalone_directories": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "What the standalone build resolves standalone_path against, as its code names it: a directory ($XDG_DATA_HOME/flycast), a setting (Dreamcast.BiosPath), an environment variable or the function returning the directory. A platform launcher record that links or passes a folder of its BIOS tree under one of these puts the standalone files in that folder."
|
|
},
|
|
"prose_written_at": {
|
|
"type": "string",
|
|
"pattern": "^[0-9a-f]{40}$",
|
|
"description": "The pin a reader confirmed every prose citation against. When the profile's history shows several pins under one text, profile_sync takes this one as the revision the text describes. It never overrides a single candidate."
|
|
},
|
|
"pin_frozen": {
|
|
"type": "string",
|
|
"description": "Why source_commit is held on purpose rather than followed. The profile is then judged against its own revision, like one pinned to a superseded tag: comparing it to HEAD says nothing and recaling would repoint its refs at code the build it documents never had."
|
|
},
|
|
"pin_build": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"description": "The build file each platform that ships a pin_frozen build reads its revision from, so check_freshness can read it again where the platform's YAML now stands and say when the platform builds another revision.",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["platform", "repo", "revision", "path", "variable", "value"],
|
|
"properties": {
|
|
"platform": {
|
|
"type": "string",
|
|
"description": "Registry slug of the platform (platforms/<platform>.yml)."
|
|
},
|
|
"repo": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "The platform's own repository, the one its YAML is scraped from."
|
|
},
|
|
"revision": {
|
|
"type": "string",
|
|
"description": "Tag or commit of that repository the build file was read at."
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "The build file, from the repository root (package.mk, a Buildroot .mk, a RetroPie scriptmodule)."
|
|
},
|
|
"variable": {
|
|
"type": "string",
|
|
"description": "The variable the file sets to the revision it builds (PKG_VERSION, <PKG>_VERSION, rp_module_repo)."
|
|
},
|
|
"value": {
|
|
"type": "string",
|
|
"description": "What the variable held at revision, quotes and trailing comment removed."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"pin_follows": {
|
|
"type": "string",
|
|
"description": "Why source_commit follows the branch tip although a single platform ships the profile: that platform builds the tip, cited by its build file. Without it or pin_frozen, a bump refuses a profile one platform ships."
|
|
},
|
|
"data_root": {
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"propertyNames": {"enum": ["android", "ios", "windows", "macos", "linux"]},
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["path", "source_ref"],
|
|
"properties": {
|
|
"path": {"type": "string", "minLength": 1, "description": "The folder as the user finds it on that OS, with the environment variable or home prefix the code expands (%APPDATA%, ~, Android/data/<package>)."},
|
|
"source_ref": {"type": "string", "minLength": 1},
|
|
"note": {"type": "string"}
|
|
}
|
|
},
|
|
"description": "Per operating system, the folder the app reads its user data from, under which standalone_path destinations sit. Only the systems the app runs on are keyed."
|
|
},
|
|
"upstream_frozen": {
|
|
"type": "string",
|
|
"description": "Why upstream_commit is held on purpose rather than followed: the port vendors that upstream tree, synced to that release, or merged that commit. The upstream view is judged against its own revision and a bump leaves it, the way pin_frozen holds source_commit."
|
|
},
|
|
"version_source": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["url", "pattern"],
|
|
"properties": {
|
|
"url": {"type": "string", "format": "uri"},
|
|
"pattern": {"type": "string", "description": "Regular expression whose first group is the latest version the page announces."},
|
|
"no_genuine_copy": {"type": "string", "description": "An announced version a search found only rebuilt or re-signed copies of. While the page announces it, the profile is not stale. A later version makes it stale again."}
|
|
},
|
|
"description": "For a project published outside any forge, the page that announces its releases. profile_sync --check-version compares the version read there with core_version."
|
|
},
|
|
"upstream_gone": {
|
|
"type": "string",
|
|
"description": "Why the declared upstream can no longer be reached, when that is settled rather than transient. Records the death instead of leaving the profile failing every pass. profile_sync reports the contradiction if the forge answers again."
|
|
},
|
|
"source_mirror": {
|
|
"type": "string",
|
|
"description": "Repository carrying the same tree, consulted after source and upstream. The only thing that keeps a profile checkable once its own forge is withdrawn or its host stops resolving."
|
|
}
|
|
},
|
|
"$defs": {
|
|
"version_basis": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"kind"
|
|
],
|
|
"properties": {
|
|
"kind": {
|
|
"enum": [
|
|
"file",
|
|
"tag",
|
|
"alias",
|
|
"package",
|
|
"none",
|
|
"unverified"
|
|
],
|
|
"description": "file: a pattern in one file at the pin. tag: the nearest tag in the pin's history. alias: the version of the profile it aliases. package: an artefact read outside any source tree. none: the code at the pin states no version and no tag reaches it. unverified: no reading could be made, for the reason why gives. core_version stays as written, unconfirmed."
|
|
},
|
|
"why": {
|
|
"enum": [
|
|
"no_pin",
|
|
"host_unsupported",
|
|
"host_gone",
|
|
"host_unreachable",
|
|
"pin_off_branch",
|
|
"no_artifact",
|
|
"no_source"
|
|
],
|
|
"description": "Why a basis is unverified: no pinned commit, a host the tools cannot read, a forge gone, a forge that did not answer, a pin on another branch than the build the profile describes, no build or package named as read, no source declared."
|
|
},
|
|
"repo": {
|
|
"enum": [
|
|
"source",
|
|
"upstream",
|
|
"source_mirror"
|
|
],
|
|
"description": "The declared repository the version describes, pinned by source_commit (source, source_mirror) or upstream_commit. Default source."
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "kind file: a repository outside the profile's own, read at commit (the package file of a build a platform ships). kind package: where the artefact was obtained."
|
|
},
|
|
"commit": {
|
|
"type": "string",
|
|
"pattern": "^[0-9a-f]{7,40}$",
|
|
"description": "The revision of url the file is read at."
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "File read at the pin."
|
|
},
|
|
"pattern": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Regular expression, multiline, whose groups hold the version."
|
|
},
|
|
"format": {
|
|
"type": "string",
|
|
"pattern": "\\{\\d+",
|
|
"description": "How the groups are laid out, {1}.{2} or {4:02d}. Default: group 1."
|
|
},
|
|
"match": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Glob a tag must fit to count, as git describe --match takes it."
|
|
},
|
|
"tag": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "The nearest tag in the pin's history."
|
|
},
|
|
"distance": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"description": "Commits the pin has that the tag lacks."
|
|
},
|
|
"of": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "The profile this one aliases."
|
|
},
|
|
"artifact": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "The package, binary or archive the version was read from."
|
|
}
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"kind": {
|
|
"const": "file"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"path",
|
|
"pattern"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"kind": {
|
|
"const": "tag"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"tag",
|
|
"distance"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"kind": {
|
|
"const": "alias"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"of"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"kind": {
|
|
"const": "package"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"artifact"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"kind": {
|
|
"const": "file"
|
|
}
|
|
},
|
|
"required": [
|
|
"url"
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"commit"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"kind": {
|
|
"const": "unverified"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"why"
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|