Files
RetroArch/docs/retroarch.6
T
Davey HughesandLibretroAdmin 08e5b72a88 Scan from the command line: exit status, Manual Scan options, playlist refresh (#19977)
* file_path: stop at the end of the path after '~'

fill_pathname_expand_special() skipped two characters after a leading
'~' or ':', so a bare "~" read past its NUL and "~x" lost the x. It
now skips the prefix and a slash after it, if there is one.

* scan: hand the callback user data and what the scan did

task_push_dbscan() and task_push_manual_content_scan() take user data
for their callback, and the callback's task_data is now a
task_dbscan_result_t: how many entries the scan added, how many its
playlists already held, and how many files matched nothing. A file is
counted by what became of it, so an archive that is expanded is not
counted as unmatched, and a loose scan's unmatched files count as
added. Callers pass NULL for now.

* scan: say in the result when a scan failed

A scan that ends before it runs (bad setup, no valid content, a DAT
that will not load) or ends with a task error now sets the result's
failed flag. A database folder that is missing or unset is treated as
an empty one, so it reports the same "no database" error instead of
finishing as if it had scanned.

* scan: count the files a scan could not read

A file whose scan fails (an unreadable file, a failed lookup) was in
no count. The result now carries an errors count for them. They do
not fail the scan.

* scan: print --scan errors on stderr and totals on stdout

A command-line scan now ends with a totals line on stdout, or with the
reason it failed on stderr. A file it could not read is listed on
stderr. The ++/==/?? marks are coloured only when their stream is a
terminal, so pipes and redirected output get plain text; on Windows
redirected output keeps its marks instead of losing them to
WriteConsole.

* scan: the manual scan finder skips a finished task

A finished scan stays in the task queue while its callback runs, and
the finder that refuses a second scan for the same playlist still
matched it, so a scan pushed from that callback was refused.

* retroarch: run every --scan, then exit with what the scans did

Each --scan is collected while the command line is parsed and run in
turn once it is done, so later options and further --scan flags are
no longer dropped. A path is expanded and made absolute first; one
that does not exist, or a scan that cannot start, is reported on
stderr and the next path still runs. --scan with --cloudsync or
--command is refused.

Without --menu the exit status is 1 if any scan failed, else 0 if any
added an entry, else 2, and a content path given with the scans is
ignored, with a line on stderr. With --menu each finished scan starts
the next, as a second scan is refused while one runs.

* manual_content_scan: clear the database name a refresh did not save

A playlist with no saved database name left the name buffer
uninitialised, and the refresh compared it against every installed
database, so whatever was on the stack could pick a database the
playlist never named.

* scan: Skip Database References names the scan's one playlist

The option was meant to put the playlist's name in each entry's
db_name, even for a database match (#18641), for users who build
their own thumbnail sets. When the scan picks the playlists, db_name
also picks the playlist an entry goes to, so with the option on every
match went to one playlist named after the content folder.

It now applies only when the scan writes one playlist, and gives
that playlist's name, a loose scan's unmatched entries included. With
the target on <Automatic>, or Fully Automatic with the option left on
from a Custom scan, matches go to their databases' playlists as with
it off; the entries of a custom playlist look their thumbnails up
under its name, not the folder's.

* scan: name the scanned folder in the start line

The "Scanning content" line, in the log and in --scan's output, has
named the database folder since the manual scan and the database scan
were merged (2fdf736d51); before, it named the path being scanned. It
names the content folder again.

* manual_content_scan: reset, scan overrides and their apply

The command line's scan options need each scan to start from the
defaults and to lay their values over them, or over a playlist's saved
settings. Add a reset, a record of those options and a function that
applies it through the existing setters: a core named by path, file
name or display name, a database, a playlist, the database check or a
DAT, extensions and the switches, stopping with a reason at the first
that does not resolve.

A core path is normalised before it is compared. A core's file name
matches in the case given first, then ignoring case, on every
platform; a display name matches exactly. Given another database, a
playlist named after its database keeps that name as a custom one, so
a refresh still writes the same playlist.

The core setter's copy step becomes its own function, so a core found
by path or file name can be set. Nothing calls the new functions yet.

* scan: run --scan items through one chain

The --scan paths ran through a loop in retroarch.c, and with --menu
through a second chain of their own. The scan options and playlist
refreshes to come need one runner for every item, from the command
line and from the menu.

task_push_dbscan_chain() runs a list of items one task at a time: a
prep task lists the databases, then each step is pushed from the last
task's callback on the main thread, so nothing waits and nothing
locks. An item that fails is reported and the run goes on; a
cancelled task ends it. retroarch.c builds the items in the first
argument pass and hands them to the chain; without --menu it waits
for the chain's end and exits as before.

Running out of memory prints "out of memory" on stderr: for an item's
path the item fails, and for the chain itself nothing runs, which
without --menu exits 1.

The chain also prints a scan's override errors, and the warnings for
an option that needs one playlist or does nothing for a single file,
which the scan options of the next commit can trigger.

* retroarch: Manual Scan options for --scan

--scan-playlist, --scan-database, --scan-match, --scan-dat, --scan-core,
--scan-exts and the five switches set the Manual Scan settings of the
--scan before them; a --scan without any stays Fully Automatic.

Values are checked in the first pass, so an option before any --scan,
an empty or bad value, or one too long for its setting ends the run
with its reason on stderr and status 1, before the config loads and
before anything is scanned. Cores, databases and DAT files are
resolved when their scan runs, and one that does not resolve fails
only that scan.

* scan: refresh playlists in the chain

A refresh item rescans one playlist with its saved scan settings, as
the menu's Refresh Playlist does, with the item's scan options laid
over them and written back by the scan. A refresh-all item does the
same for every playlist in the playlist folder that has saved
settings, in the order Manage Playlists lists them, histories and
favorites left out.

A refresh item names its playlist by name or by a path in the playlist
folder. A bare "name.lpl" is the playlist folder's file, and an
absolute path is normalised before it is checked against the folder.
The name is looked up in the folder's listing on every platform, the
exact name first, then ignoring case, since macOS and FAT/exFAT cards
ignore case; the refresh then takes the file's own name, so a
database's playlist stays one. Two or more playlists that match only
in other cases fail the item.

The playlist folder walk and each playlist load run in prep tasks: on
the worker with a threaded queue, under the shared I/O window without
one, each pushed from the previous step's callback. A playlist whose
saved content folder is gone is skipped rather than failed. A listing
that runs out of memory fails the refresh-all; a playlist folder that
is missing or cannot be read lists nothing, and the refresh-all ends
with "no playlists with saved scan settings". A refresh's start line
names its content folder; its totals and failure lines name the
playlist.

* retroarch: --scan-refresh and --scan-refresh-all

--scan-refresh=NAME|PATH rescans a playlist with its saved scan
settings, as the menu's Refresh Playlist does, and --scan-refresh-all
rescans every playlist that has them. Both are items of the same run
as --scan: the scan options after one are laid over the saved
settings and written back, and the exit status follows the same rule.

--scan-playlist after a refresh is refused, so a refresh always
updates its own playlist, and an empty --scan-refresh is refused as
the other empty values are. Like --scan, the refresh options cannot be
combined with --cloudsync or --command; the error names whichever of
the three comes first on the command line.

* menu: Refresh All Playlists

Manage Playlists gets Refresh All Playlists as its first entry when it
lists any playlist, so an empty list still says there are no entries.
It rescans every playlist that has saved scan settings, with those
settings, through the same chain as --scan-refresh-all, and ends with
one notification saying how many playlists were refreshed, skipped
(content folder gone) and failed.

While a content scan runs it is refused with a new message; a refused
scan had none. Other languages come through Crowdin.

While a scan chain runs (Refresh All, or a command-line scan with
--menu), Start Scan, a playlist's Refresh, Scan Directory and Scan
File are refused with the same message, as they would run with the
settings the chain last loaded. task_push_dbscan() returns false then
too, which covers the companion and the iOS caller.

* docs: --scan, refresh and the Manual Scan options in the man page

--help lists the options but not what a script needs: the order the
scans run in, the exit status and what the options set. The man page
now has them, next to --cloudsync, and CHANGES.md has the entry.

* scan chain: writes from workers reach the playlist cache by note

A playlist written by a task - the chain's prep parse, a scan, a
playlist-manager task, whatever thread it runs on - leaves a note on a
lock-free stack instead of reading the cached playlist; the main
thread applies the notes when it next decides whether the cache may
stand in, so no worker reads playlist_cached while the main thread
frees or installs it. Without threads or pointer atomics a write
applies at once.

The chain's prep tasks set their handlers by name, and
thread_read_audit.py fails on a handler set from a
retro_task_handler_t parameter, which would hide every handler passed
in. The chain puts the Manual Scan settings it found back when it
ends, and is no longer running when its done callback runs, so that
callback may start another. task_push_dbscan() says why it refuses,
so the menu and the companions show the same reason, and the
companions' status line takes it from companion_core. --scan and
--scan-refresh set the verbosity override, so a config with logging
off cannot detach the console the totals go to, and refuse a path too
long for the chain's buffers. The Refresh All notification passes the
length written, and fill_pathname_expand_special() stops at the end of
a buffer shorter than the home or application directory.

Lanes: playlist_parity_test writes the cached file from a worker,
once at the same size and then while the main thread reuses and frees
the cache; database_scan_test checks the refusal message, the restored
settings and a done callback that starts the next chain;
fill_pathname_test expands into a buffer shorter than the home
directory.

* playlist: header-only parse for the scan chain's prep

The prep task needs a playlist's saved scan settings and nothing else,
yet parsed every entry and, through autofix, could write the file back
from a worker. playlist_parse_begin_header() stops at "items", rebases
the scan record in memory when the base content directory moved, and
marks the playlist so playlist_write_file() refuses it.

Lane: playlist_parity_test header_only (entries skipped, scan dir
rebased, file bytes untouched, old format).

* scan chain: ask the file system nothing on the main thread

The chain's steps ran on the main thread between its tasks and stat'd
and realpath'd there: a --scan path's resolve and stat, a
--scan-refresh path's two realpaths, the content folder's stat, the
saved and override DATs' stat and size, an override core path's
realpath.  On a network share each of those can stall a frame.

- manual_content_scan_fs_read() reads them on any thread, touching
  nothing but its arguments; the _fs variants of the content-folder,
  playlist and override setters take its answers instead of asking.
  The plain setters pass NULL and behave as before, so the menu is
  unchanged.
- A --scan path gets its own prep task (dbscan_path_handler); a
  --scan-refresh resolves its path inside the load task, and the load
  reads the folder, the saved DAT and the overrides' paths once the
  header is parsed.  The worker gets copies of the item's strings.
- The prep's state is freed in one place.

Lane: database_scan_test "fs off main": six items that each stop
before their scan, on a threaded queue, with path_stat, path_is_valid,
path_is_directory, path_get_size and path_resolve_realpath wrapped:
no call on the main thread.

Not moved: the scan task's own push still stats the content folder
and the DAT (manual_content_scan_get_task_config), shared with the
menu.

* samples: the scan chain's lanes hold on Windows and without realpath

From a native Windows run of both tests:

- database_scan_test "fs off main" refreshed f_gone.lpl through
  "pl/../pl/", which only a realpath folds; the sample builds without
  RARCH_INTERNAL, where path_resolve_realpath() folds nothing, so the
  item was rightly not in the playlist folder.  It names the playlist
  by its plain path now, which the check still realpaths on the
  worker.
- "another case, a database's playlist" read the system name type
  after the chain ended, and the chain puts the Manual Scan settings
  back then.  The item callback records each scan's type instead.
- playlist_parity_test's header lane expected "/moved/snes"; autofix
  converts the suffix to the local form, "/moved\snes" on Windows.
- The worker lane's stress read required a core name of every read.
  Windows replaces the file with MoveFileExW, and an open that meets
  the replace fails: that read is an empty playlist, which has none.

---------

Co-authored-by: LibretroAdmin <[email protected]>
2026-11-04 19:34:05 +01:00

363 lines
14 KiB
Plaintext

.\" retroarch.6:
.TH "RETROARCH" "6" "January 20, 2025" "RETROARCH" "System Manager's Manual: retroarch"
.SH NAME
retroarch \- The reference frontend for the libretro API.
.SH SYNOPSIS
\fBretroarch\fR [rom file(s)] [OPTIONS]...
.SH "DESCRIPTION"
\fBretroarch\fR is the reference frontend for the libretro API.
libretro is an abstraction of a game system, and can be implemented by any frontend.
The libretro API is designed for games, emulators and multimedia.
\fBretroarch\fR focuses on exposing needed functionality for the game system through the use of command line and configuration files.
It also features a simple built-in UI.
.SH "EXAMPLE COMMANDLINE"
.TP
\fBLoad content, using a specific libretro core and config file.\fR
retroarch --config ~/.config/retroarch/retroarch.cfg --libretro /path/to/libretro/core.so /path/to/rom.rom --verbose
.TP
\fBNo command line options will start RetroArch in menu mode.\fR
retroarch
.TP
\fBStart RetroArch in menu mode, with verbose logging.\fR
retroarch --menu --verbose
.SH "Menu"
Refers to the built-in GUI system for RetroArch. It is aimed at being controlled with a gamepad only.
.SH "DEFAULT CONTROLS"
By default, only keyboard input is accepted.
.SH "GENERAL OPTIONS"
.TP
\fB[rom file]\fR
If no rom file path is defined on the command line, \fBretroarch\fR will try to load a core with no rom. This will only work with some libretro cores.
\fBretroarch\fR use uncompressed content, but can uncompress content in the .zip/deflate format if support for it is compiled in.
Content types supported depend on the libretro implementation used.
.TP
\fB--help, -h\fR
Prints help text.
.TP
\fB--menu\fR
Starts directly in in-game menu if enabled.
Does not require content or libretro implementation to be set.
These can be loaded afterwards in the menu.
If no arguments are passed to retroarch, it is equivalent to calling retroarch with this as only argument.
.TP
\fB--features\fR
Prints available features compiled into RetroArch, then exits.
.TP
\fB--cloudsync\fR
Runs a cloud sync with the configured cloud sync driver, then exits.
.TP
\fB--scan PATH\fR
Scans the folder or file PATH for content and adds it to playlists, as Manual Scan does.
Can be given more than once.
.TP
\fB--scan-refresh NAME|PATH\fR
Rescans one playlist with the scan settings it saved, as Refresh Playlist does.
NAME matches a playlist's name exactly first, then ignoring case. PATH must be in the playlist folder.
Like Refresh Playlist, it drops entries whose files are gone or whose extension the saved settings no longer include.
A playlist whose saved content folder is missing is skipped instead, so an unplugged drive does not empty it.
.TP
\fB--scan-refresh-all\fR
Does --scan-refresh for every playlist that has saved scan settings, as Refresh All Playlists does.
.IP
These run in the order given, and one that fails does not stop the rest.
Each prints a totals line on stdout, or its error on stderr.
Without --menu, RetroArch exits when they are done and does not load content given on the command line.
The exit status is then 1 if any failed, 0 if any added an entry, and 2 if none added anything; a skipped playlist does not count.
With --menu, they run while the menu does.
They cannot be combined with --cloudsync or --command.
.IP
The options below set the Manual Scan settings of the --scan, --scan-refresh or --scan-refresh-all before them.
On a refresh they override the saved settings, and the refresh saves them.
A --scan without any is Fully Automatic.
.TP
\fB--scan-playlist NAME\fR
Sets Target Playlist: a database's name, or a custom playlist name. Not allowed on a refresh.
.TP
\fB--scan-database NAME|first\fR
Sets Database To Match: the database NAME, or the first database that matches.
.TP
\fB--scan-match strict|loose|none\fR
Sets Database Check.
.TP
\fB--scan-dat FILE\fR
Sets Arcade DAT File. Matching is strict unless --scan-match loose is given.
.TP
\fB--scan-core CORE\fR
Sets Default Core: a core's path, its file name (with or without _libretro and the extension) or its display name.
.TP
\fB--scan-exts EXTS\fR
Sets File Extensions, separated by commas or spaces.
.TP
\fB--scan-no-recursive, --scan-no-archives\fR
Turn off Scan Recursively and Scan Inside Archives.
.TP
\fB--scan-overwrite, --scan-validate, --scan-omit-db-ref\fR
Turn on Overwrite Existing Playlist, Validate Existing Entries and Skip Database References From Playlist.
They act only when the scan has one playlist, and --scan-overwrite only on a folder; otherwise they print a warning and are ignored.
.TP
\fB-L PATH, --libretro PATH\fR
Path to a libretro implementation which is to be used.
This option will override any setting in a config file.
This option is only available if RetroArch is compiled with dynamic libretro loading.
.TP
\fB--save PATH, -s PATH\fR
Overrides the path used for save ram (*.srm) (deprecated).
Without this flag, the save ram path will be inferred from the rom path name, and put in the same directory as the rom file with the extension replaced with '.srm'.
If PATH is a directory, RetroArch will treat this as the save file directory, where the save file name will be inferred from the rom name.
.TP
\fB--savestate PATH, -S PATH\fR
Overrides the path used for save states (deprecated).
Without this flag, the save state path will be inferred from the rom path name, and put in the same directory as the rom file with the extension replace with '.state'.
If PATH is a directory, RetroArch will treat this as the save state directory, where the state file name will be inferred from the rom name.
Do note that save states are bound to the libretro implementation being used. Using a different libretro could invalidate the save state file.
.TP
\fB--fullscreen, -f\fR
Always starts RetroArch in fullscreen. Disregards settings in configuration file.
.TP
\fB--config PATH, -c PATH\fR
Sets the configuration file path. \fBretroarch\fR will use this path to load the configuration file.
Should this not be defined, \fBretroarch\fR will look in platform specific paths to attempt finding the config file.
/etc/retroarch.cfg (when installed), or retroarch.cfg in the source tarball serves as a skeleton configuration file.
/etc/retroarch.cfg should serve as a skeleton config only.
.IP
Unix-like systems will look in $XDG_CONFIG_HOME/retroarch/retroarch.cfg first. If $XDG_CONFIG_HOME is not defined, it is assumed to be $HOME/.config as per specification. Then it will try $HOME/.retroarch.cfg. If both paths fail, RetroArch will try to create a new, default config file in $XDG_CONFIG_HOME/retroarch/retroarch.cfg (or the $HOME/.config default for $XDG_CONFIG_HOME).
If all fails, default settings will be assumed.
If RetroArch creates a new default config file, it will attempt to load the skeleton config file /etc/retroarch.cfg and use that as a basis.
This allows distributions to set up default paths for libretro cores, and similar things.
A configuration file does not need to define every possible option, only those which should be overridden.
If config_save_on_exit = true is set in the config file, RetroArch will overwrite the config file on exit. Settings can be changed from within the menu.
If RetroArch overwrites a config file, formatting, comments, etc will be lost.
If RetroArch creates a default config file, it will have config_save_on_exit set automatically.
.IP
Windows will look in retroarch.cfg in same folder where retroarch.exe resides.
A default config file will also be created in the same manner as Unix.
.TP
\fB--appendconfig PATH\fR
Appends a different set of config files to the config file loaded in -c (or default).
Multiple config files are delimited by '|'.
Every config file will be appended in order where the key-value pairs of the next config file takes priority over the old ones.
The appended settings are not kept apart once loaded. Whenever the main config file is saved - on exit, if config_save_on_exit is set, or from the menu - they are written to it with everything else, and are there the next time RetroArch starts without --appendconfig.
To use an appended config for one session only, put config_save_on_exit = "false" in the appended file.
.TP
\fB--subsystem SUBSYSTEM\fR
Use a subsystem of the loaded libretro core. Multiple content files are loaded as multiple arguments.
If content is skipped, use a blank ("") command line argument.
Content must be loaded in an order which depends on the particular subsystem used.
See verbose log output to learn how a particular subsystem wants content to be loaded.
.TP
\fB--nodevice PORT, -N PORT\fR
Disconnects an input device from port number PORT. Possible values for PORT are 1 to 8. This may be needed for some odd games to run properly.
If set explicitly here, overrides config file for that port.
.TP
\fB--dualanalog PORT, -A PORT\fR
Connects a DualAnalog controller into port PORT. Possible values are 1 to 8.
If set explicitly here, overrides config file for that port.
.TP
\fB--device PORT:ID, -d PORT:ID\fR
Connects a generic input device ID into port PORT. Possible values for port are 1 to 8.
If set explicitly here, overrides config file for that port.
ID is an unsigned number corresponding to the device for a libretro core.
.TP
\fB--record PATH, -r PATH\fR
Activates video recording of gameplay into PATH. Using .mkv extension is recommended.
Codecs used are (FFV1 or H264 RGB lossless (x264))/FLAC, suitable for processing the material further.
.TP
\fB--recordconfig PATH\fR
Sets path to a config file for use during recording.
.TP
\fB--size WIDTHxHEIGHT\fR
Allows specifying the exact output width and height of recording. This option will override any configuration settings.
The video input is scaled with point filtering before being encoded at the correct size.
.TP
\fB--play-replay PATH, -P PATH\fR
Play back a movie recorded in the .replay format. Cart ROM and movie file need to correspond.
It also requires to play back with the same libretro backend that was used for recording.
.TP
\fB--record-replay PATH, -R PATH\fR
Start recording a .replay video to PATH immediately after startup.
.TP
\fB--sram-mode MODE, -M MODE\fR
MODE designates how to handle SRAM.
The format of the second parameter is {no,}load-{no,}save.
These two boolean values tell if SRAM loading and SRAM saving should take place.
Note that noload-save implies that the SRAM will be overwritten with new data.
.TP
\fB--verbose, -v\fR
Activates verbose logging.
.TP
\fB--host, -H\fR
Be the host of netplay. Waits until a user connects. The host will always assume user 1.
.TP
\fB--connect SERVER, -C SERVER\fR
Connect to a host of netplay. Will always assume user 2.
.TP
\fB--frames FRAMES, -F FRAMES\fR
Sync frames to use when using netplay. More frames allow for more latency, but requires more CPU power.
Set FRAMES to 0 to have perfect sync. 0 frames is only suitable for LAN. Defaults to 0.
.TP
\fB--port PORT\fR
Network port used for netplay. This defaults to 55435. This option affects both TCP and UDP.
.TP
\fB--spectate\fR
If netplay is used, it will go into a spectator mode.
Spectator mode allows one host to live stream game playback to multiple clients.
Essentially, clients receive a live streamed replay movie file.
Clients can connect and disconnect at any time.
Clients thus cannot interact as user 2.
For spectating mode to work, both host and clients will need to use this flag.
.TP
\fB--command CMD\fR
Sends a command over UDP to an already running RetroArch application, and exit.
The command is formatted as "COMMAND;HOST;PORT".
HOST and PORT are both optional. "COMMAND;HOST" will set PORT to
"network_cmd_port" default setting.
If only "COMMAND" is used, HOST and PORT will be assumed to be "localhost" and "network_cmd_port" respectively.
HOST and PORT are read from the end, and only where they cannot be part of a STEPS list (no space, no "|", not "checkpoint"), so such a list is sent whole.
The available commands are listed if "COMMAND" is invalid.
.TP
\fB--nick NICK\fR
Pick a nickname for use with netplay.
This is purely cosmetic, and only serves to help users identify each other.
.TP
\fB--ups PATCH, -U PATCH\fR
Attempts to apply an UPS patch to the current content image. No files are altered.
If this flag is not specified, RetroArch will look for a .ups file with same basename as content specified.
.TP
\fB--bps PATCH\fR
Attempts to apply a BPS patch to the current content image. No files are altered.
If this flag is not specified, RetroArch will look for a .bps file with same basename as content specified.
.TP
\fB--ips PATCH\fR
Attempts to apply a IPS patch to the current content image. No files are altered.
If this flag is not specified, RetroArch will look for a .ips file with same basename as content specified.
Note that RetroArch cannot perform any error checking if patching was successful due to how IPS works.
.TP
\fB--xdelta PATCH\fR
Attempts to apply an Xdelta patch to the current content image. No files are altered.
If this flag is not specified, RetroArch will look for a .xdelta file with same basename as content specified.
Only available if RetroArch was built with Xdelta support.
.TP
\fB--no-patch\fR
Disables all kinds of content patching.
.TP
\fB-D, --detach\fR
Detach from the current console. This is currently only relevant for Microsoft Windows.
.SH ENVIRONMENT
\fBretroarch\fR honors the following environment variables:
.TP
\fBLIBRETRO_DIRECTORY\fR
Specify the directory where RetroArch looks for core and info files,
overriding the value of the "libretro_directory" configuration file
option.
.TP
\fBLIBRETRO_ASSETS_DIRECTORY\fR
Specify the directory where RetroArch looks for assets, overriding
the value of the "assets_directory" configuration file
option.
.TP
\fBLIBRETRO_AUTOCONFIG_DIRECTORY\fR
Specify the directory where RetroArch looks for controller
auto-configuration files, overriding the value of the
"joypad_autoconfig_dir" configuration file option.
.TP
\fBLIBRETRO_CHEATS_DIRECTORY\fR
Specify the directory where RetroArch looks for cheat files,
overriding the value of the "cheat_database_path" configuration file
option.
.TP
\fBLIBRETRO_DATABASE_DIRECTORY\fR
Specify the directory where RetroArch looks for database files,
overriding the value of the "content_database_path" configuration file
option.
.TP
\fBLIBRETRO_SYSTEM_DIRECTORY\fR
Specify the directory where RetroArch looks for system files,
overriding the value of the "system_directory" configuration file
option.
.TP
\fBLIBRETRO_VIDEO_FILTER_DIRECTORY\fR
Specify the directory where RetroArch looks for video filters,
overriding the value of the "video_filter_dir" configuration file
option.
.TP
\fBLIBRETRO_VIDEO_SHADER_DIRECTORY\fR
Specify the directory where RetroArch looks for video shaders,
overriding the value of the "video_shader_dir" configuration file
option.