# Build Sitl

> Build INAV SITL (Software In The Loop) firmware for testing without hardware

- Skill: `sensei-hacker/build-sitl` (Agent Skill)
- Install (CLI): `npx skillmds@latest add sensei-hacker/build-sitl`
- Raw SKILL.md: https://api.skillmd.com/api/skills/sensei-hacker/build-sitl/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: sensei-hacker (https://skillmd.com/u/sensei-hacker)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/sensei-hacker/build-sitl

---


# Building INAV SITL

SITL (Software In The Loop) allows testing the full firmware on your host system without hardware.

## Quick Build (Recommended)

Use the build script which handles cmake configuration and toolchain compatibility:

```bash
claude/developer/scripts/build/build_sitl.sh
```

To clean and rebuild:
```bash
claude/developer/scripts/build/build_sitl.sh clean
```

The binary will be at: `inav/build_sitl/bin/SITL.elf`

## Manual Build (Alternative)

Use a separate build directory to avoid conflicts with hardware target builds:

```bash
cd inav
mkdir -p build_sitl
cd build_sitl
cmake -DSITL=ON ..
make SITL.elf -j4
```

## Rebuild After Code Changes

```bash
cd inav/build_sitl
make SITL.elf -j4
```

No need to run cmake again unless CMakeLists.txt files changed.

## Alternative - Shared Build Directory

If you must use the shared `build/` directory:

```bash
cd inav/build
rm -f CMakeCache.txt  # If switching from hardware build
cmake -DSITL=ON ..
make SITL.elf -j4     # MUST specify target!
```

**WARNING:** Running `make` without `SITL.elf` target will attempt to build all 281 hardware targets.


## You already have permission
You have permission to build. Do not ask the user for permission each time


## Running SITL

### Quick Start (Recommended)

Use the start script which handles killing existing instances and waiting for ready:

```bash
claude/developer/scripts/testing/start_sitl.sh
```

This will:
1. Kill any existing SITL process
2. Start SITL in background
3. Wait for it to be ready (port listening)
4. Report connection info

### Manual Start

```bash
cd inav/build_sitl
./bin/SITL.elf
```

SITL will:
- Bind TCP to ports 5760-5767 (UART1-8)
- Bind WebSocket to ports 5770-5777 (UART1-8) [if WebSocket support compiled in]
- Listen on all interfaces [::]
- Load/save eeprom.bin in current directory

### Connect Configurator

Once SITL is running, connect via: `tcp://127.0.0.1:5760`

Or select "SITL" from the port dropdown in INAV Configurator.

## Common Issues

| Problem | Solution |
|---------|----------|
| Build tries to compile all 281 targets | Use separate `build_sitl/` dir OR specify `make SITL.elf` |
| CMake path errors | `rm CMakeCache.txt && cmake -DSITL=ON ..` |
| Wrong toolchain (ARM instead of host) | Ensure `-DSITL=ON` in cmake command |
| Hardware builds disappeared | Use separate `build_sitl/` directory |
| Linker error: `unrecognized option '--no-warn-rwx-segments'` | Older ld versions (< 2.39) don't support this flag. Use `build_sitl.sh` which handles this automatically |

## Full Documentation

```bash
cat claude/test_tools/inav/BUILDING_SITL.md
```

## Related Skills

- **sitl-arm** - Arming SITL via MSP for automated testing
- **test-crsf-sitl** - Complete CRSF telemetry testing workflow with SITL
- **run-configurator** - Using INAV Configurator with SITL
- **msp-protocol** - MSP protocol reference for SITL testing
- **pr-review** - Build SITL to test firmware PRs

