Files
ppsspp/docs/command-line.md
T
2026-09-15 11:21:02 -06:00

37 lines
1.8 KiB
Markdown

# Command-line parsing
All command-line parsing for both the main app and the headless build belongs in `Core/CmdLine.cpp` /
`Core/CmdLine.h` (`CommandLineOptions`), not in the platform entry points (`Windows/main.cpp`,
`headless/Headless.cpp`, `UI/NativeApp.cpp`, etc.). Don't re-parse `argv` in those files - add a field
to `CommandLineOptions` instead.
## Declaring an option
Most options are declared in the `g_autoParams` table in `CmdLine.cpp` as:
```cpp
{offsetof(...), type, longName, shortName, docString, mode}
```
`mode` gates the option to `CmdLineMode::Application`, `::Headless`, or `::Both` (the default if the
field is omitted from the initializer).
The same long name can be reused for both modes with different types and meanings, because a given
`Parse()` call only matches params whose mode is `Both` or equal to the current mode. `--log` is the
example to know: a `String` "log to FILE" option in Application mode, a `Bool` "full log output" option
in Headless mode. They don't collide.
Options that can be repeated (e.g. `--ignore TESTNAME`, collected into a `std::vector<std::string>`), or
that don't fit the generic single-value table, need manual handling in the `else if` chain inside
`CommandLineOptions::Parse()` - the same way `--graphics=` and the `boot` filenames are handled.
## Getting a parsed option into the emulator
`ApplyToConfig()` is where parsed options are pushed into `g_Config` / `g_logManager`. Prefer wiring a
new option through there, so every platform gets it for free, rather than reading `CommandLineOptions`
fields ad-hoc at each call site.
`NativeInit()` in `UI/NativeApp.cpp` still takes `argc`/`argv`, because several platform entry points
pass them in, but it shouldn't read them directly: by the time `NativeInit()` runs,
`CommandLineOptions` should already hold everything.