sdlparser-scrap/docs/GETTING_STARTED.md

279 lines
5.5 KiB
Markdown

# Getting Started with SDL3 Parser
This guide will help you get up and running with the SDL3 header parser.
## Prerequisites
- Zig 0.15 or later
- SDL3 headers (included in `../SDL/include/SDL3/`)
## Installation
1. Navigate to the parser directory:
```bash
cd lib/sdl3/parser
```
2. Build the parser:
```bash
zig build
```
3. Run tests to verify installation:
```bash
zig build test
```
You should see: `All tests passed.`
## Your First Parse
### Step 1: Parse SDL_gpu.h
```bash
zig build run -- ../SDL/include/SDL3/SDL_gpu.h --output=my_gpu.zig
```
You'll see output like:
```
SDL3 Header Parser
==================
Parsing: ../SDL/include/SDL3/SDL_gpu.h
Found 169 declarations
- Opaque types: 13
- Typedefs: 6
- Enums: 24
- Structs: 35
- Flags: 3
- Functions: 94
Analyzing dependencies...
Found 5 missing types:
- SDL_FColor
- SDL_PropertiesID
- SDL_Rect
- SDL_Window
- SDL_FlipMode
Resolving dependencies from included headers...
✓ Found SDL_FColor in SDL_pixels.h
✓ Found SDL_PropertiesID in SDL_properties.h
✓ Found SDL_Rect in SDL_rect.h
✓ Found SDL_Window in SDL_video.h
✓ Found SDL_FlipMode in SDL_surface.h
Combining 5 dependency declarations with primary declarations...
Generated: my_gpu.zig
```
### Step 2: Examine the Output
```bash
head -50 my_gpu.zig
```
You'll see clean Zig bindings:
```zig
pub const c = @import("c.zig").c;
// Dependencies (automatically included)
pub const FColor = extern struct {
r: f32,
g: f32,
b: f32,
a: f32,
};
pub const PropertiesID = u32;
pub const Rect = extern struct {
x: c_int,
y: c_int,
w: c_int,
h: c_int,
};
pub const Window = opaque {};
// Primary declarations
pub const GPUDevice = opaque {
pub inline fn destroyGPUDevice(gpudevice: *GPUDevice) void {
return c.SDL_DestroyGPUDevice(gpudevice);
}
// ... 93 more methods
};
```
### Step 3: Create c.zig Wrapper
Create a file `c.zig` that imports SDL:
```zig
pub const c = @cImport({
@cInclude("SDL3/SDL.h");
});
```
### Step 4: Use in Your Project
```zig
const std = @import("std");
const gpu = @import("my_gpu.zig");
pub fn main() !void {
const device = gpu.createGPUDevice(true);
if (device) |d| {
defer d.destroyGPUDevice();
const driver = d.getGPUDeviceDriver();
std.debug.print("GPU Driver: {s}\n", .{driver});
}
}
```
## Command-Line Options
### Basic Options
```bash
# Output to file
zig build run -- header.h --output=output.zig
# Output to stdout
zig build run -- header.h
```
### Mock Generation
```bash
# Generate C mocks for testing
zig build run -- header.h --output=bindings.zig --mocks=mocks.c
```
The mock file contains stub implementations that return zero/null:
```c
void SDL_DestroyGPUDevice(SDL_GPUDevice *device) {
// Mock implementation
}
```
## Understanding the Output
### Type Name Conversion
The parser follows consistent naming rules:
| C Name | Zig Name | Rule |
|--------|----------|------|
| `SDL_GPUDevice` | `GPUDevice` | Strip `SDL_` prefix |
| `SDL_GPU_PRIMITIVE_TYPE_TRIANGLELIST` | `primitiveTypeTrianglelist` | Strip prefix, camelCase |
| `SDL_CreateGPUDevice` | `createGPUDevice` | Strip `SDL_`, camelCase |
### Method Grouping
Functions are organized as methods when possible:
**C API**:
```c
void SDL_DestroyGPUDevice(SDL_GPUDevice *device);
const char* SDL_GetGPUDeviceDriver(SDL_GPUDevice *device);
```
**Generated Zig**:
```zig
pub const GPUDevice = opaque {
pub inline fn destroyGPUDevice(self: *GPUDevice) void { ... }
pub inline fn getGPUDeviceDriver(self: *GPUDevice) [*c]const u8 { ... }
};
```
Usage becomes:
```zig
device.destroyGPUDevice(); // Instead of SDL_DestroyGPUDevice(device)
```
### Dependency Inclusion
Dependencies are automatically detected and included at the top of the file:
```zig
// Dependencies from included headers
pub const FColor = extern struct { ... };
pub const Rect = extern struct { ... };
pub const Window = opaque {};
// Primary declarations from SDL_gpu.h
pub const GPUDevice = opaque { ... };
```
## Common Workflows
### Generate Bindings for a Module
```bash
# From lib/sdl3 directory
zig build regenerate-zig
```
This generates bindings for configured headers in `v2/` directory.
### Test Your Changes
After modifying the parser:
```bash
# Run unit tests
zig build test
# Test with a real header
zig build run -- ../SDL/include/SDL3/SDL_gpu.h --output=test.zig
# Verify output compiles
zig ast-check test.zig
```
### Debug Issues
If you encounter errors:
1. Check the console output for warnings about missing types
2. Look at the generated file for syntax errors
3. See [Known Issues](docs/KNOWN_ISSUES.md) for common problems
## Next Steps
- Read [Architecture](docs/ARCHITECTURE.md) to understand how it works
- See [Dependency Resolution](docs/DEPENDENCY_RESOLUTION.md) for details on automatic type extraction
- Check [Known Issues](docs/KNOWN_ISSUES.md) for current limitations
- Review [Development](docs/DEVELOPMENT.md) to contribute
## Quick Reference
```bash
# Build
zig build
# Test
zig build test
# Generate bindings
zig build run -- <header> --output=<output>
# Generate with mocks
zig build run -- <header> --output=<output> --mocks=<mocks>
# Generate all configured headers
cd .. && zig build regenerate-zig
```
## Getting Help
- **Documentation**: See `docs/` directory
- **Examples**: Check `test/` directory for usage examples
- **Issues**: See `docs/KNOWN_ISSUES.md`
---
**Next**: Read [Architecture](docs/ARCHITECTURE.md) to understand the parser internals.