-
Notifications
You must be signed in to change notification settings - Fork 2
user_cli_docs
extgen is a schema-driven code generator for GameMaker native extensions. It generates language bindings, platform glue code, and CMake build systems for all supported GameMaker targets from a single IDL input.
This document explains how to use extgen, how to configure it, and what each option does.
extgen takes a GMIDL schema (.gmidl, .json, etc.) and produces:
- C++ native bindings
- GML bindings
- Platform glue code (Android, iOS, consoles, etc.)
- A complete CMake project
- Optional documentation
Everything is controlled through a JSON configuration file validated by a generated JSON Schema.
If the schema validates, extgen will run.
extgen --config path/to/config.jsonextgen --init path/to/folderThis creates:
config.jsonextgen.schema.json
The config file automatically references the schema for editor validation and auto-completion.
When you run:
extgen --init ./my-extensionextgen will:
- ๐งพ Generate a JSON Schema describing all supported options
- ๐ Create a minimal
config.json - ๐ Automatically set the
$schemaproperty
You can immediately open config.json in any schema-aware editor
(VS Code recommended).
A simplified configuration file looks like this:
{
"$schema": "./extgen.schema.json",
"input": "./api.gmidl",
"root": "./",
"profile": "Full",
"gml": { ... },
"targets": { ... },
"build": { ... },
"extras": { ... }
}| Field | Description |
|---|---|
$schema |
Path to the JSON schema (auto-managed) |
input |
Path to the GMIDL input file |
root |
Root output directory |
profile |
Controls what extgen emits |
gml |
GML binding configuration |
targets |
Platform targets |
build |
CMake & build settings |
extras |
Optional generators (docs, etc.) |
The profile field controls what categories of output are generated.
"profile": "Full"| Profile | Meaning |
|---|---|
Full |
Emit bindings + native code + build system |
BindingsOnly |
Emit GML / language bindings only |
BuildOnly |
Emit only CMake & build files |
This allows workflows like:
- ๐ Updating bindings without touching native code
- ๐๏ธ Regenerating build files only
Controls GameMaker binding generation.
"gml": {
"enabled": true,
"emitRuntime": true,
"outputFile": "extension.gml",
"declarationsFile": "extension_decl.gml",
"runtimeFilename": "ext_runtime"
}| Field | Description |
|---|---|
enabled |
Enable GML generation |
emitRuntime |
Emit the GML runtime support |
outputFile |
Generated GML API file |
declarationsFile |
Declaration-only GML file |
runtimeFilename |
Runtime script base name |
Note
GML bindings are typically required for any GameMaker extension.
emitRuntime emits the runtime support functions required by generated code
(also known as the official GMExtensionCore).
Important
extgen does not create or register assets inside the GameMaker IDE.
-
outputFilemust point to an existing.gmlasset -
declarationsFileis a.yysnippet that must be manually appended to your extensionโs.yyfile under thefunctionsarray
All native output is target-driven. Each enabled target activates platform-specific emitters and build presets.
| Field | Description |
|---|---|
enabled |
Enable this platform |
outputFolder |
Where the final binary is copied |
"windows": {
"enabled": true,
"outputFolder": "../"
}These targets:
- Require C++
- Emit shared libraries
- Generate CMake presets automatically
"android": {
"enabled": true,
"mode": "jni",
"outputFolder": "../AndroidSource"
}| Mode | Description |
|---|---|
java |
Java bridge (source only) |
kotlin |
Kotlin bridge (source only) |
jni |
Pure JNI (C++ native bindings) |
Note
-
jnimode requires C++ bindings -
javaandkotlinmodes generate source only (no native build presets)
"ios": {
"enabled": true,
"mode": "native",
"sourceFolder": "./ios",
"sourceFilename": "{0}_ios",
"outputFolder": "../iOSSourceFromMac"
}| Mode | Description |
|---|---|
objc |
Objective-C bridge |
swift |
Swift bridge |
native |
Obj-C wrapper over C++ native core |
Note
native mode requires C++ bindings.
Supported consoles:
- Xbox
- PlayStation 4
- PlayStation 5
- Nintendo Switch
Example:
"ps5": {
"enabled": true,
"outputFolder": "../"
}"switch": {
"enabled": true,
"userProps": "path/to/user.props",
"outputFolder": "../"
}Important
-
userPropsis required - extgen does not ship any SDK files
- You must provide your own
.propsfrom the Nintendo SDK
Controls CMake generation.
"build": {
"emitCmake": true,
"cmake": {
"cppStandard": 20,
"cppExtensions": false,
"strictWarnings": true,
"useThirdParty": true,
"emitPresets": true
}
}| Field | Description |
|---|---|
emitCmake |
Generate CMakeLists.txt
|
cppStandard |
C++ standard (e.g. 17, 20) |
cppExtensions |
Allow compiler extensions |
strictWarnings |
Enable strict compiler warnings |
useThirdParty |
Include third_party directory |
emitPresets |
Generate CMakePresets.json
|
"extras": {
"docs": {
"enabled": true,
"outputFolder": "./docs",
"outputFileName": "documentation.json",
"overwrite": true
}
}Generates intermediate documentation data that can be consumed by other tools to produce final user-facing documentation.
All paths:
- May be relative or absolute
-
rootis resolved relative to the config file - All other paths are resolved relative to
root - Support environment variables
- Support
~on Unix systems
extgen --config config.json"profile": "BindingsOnly""profile": "BuildOnly"{
"input": "./api.gmidl",
"root": "./",
"profile": "Full",
"gml": { "enabled": true },
"targets": {
"windows": { "enabled": true },
"android": { "enabled": true, "mode": "jni" }
},
"build": { "emitCmake": true }
}- extgen is target-driven, not language-driven
- C++ is emitted automatically only when required
- The JSON Schema is the source of truth
- If the schema validates, extgen will run โ
GameMaker 2026