Files
basic1/AGENT.md
T
2026-01-28 20:12:41 -05:00

312 lines
6.8 KiB
Markdown

# Agent Guide - Building and Compiling
This document provides the correct procedures for building this RP2350 project. Follow these instructions to avoid common pitfalls.
## Build System
This project uses:
- **CMake** for configuration
- **Ninja** as the build system (not Make)
- **Pico SDK 2.2.0** with the VS Code extension
## Initial Setup
The project must be configured with CMake using the **Ninja generator** before building:
```bash
cd /Users/adolforeyna/Projects/pico-bare-metal/Adolfo/basic1
rm -rf build # Clean start
cmake -B build -G Ninja -DPICO_BOARD=adafruit_feather_rp2350
```
**IMPORTANT:** Always specify `-G Ninja` when running cmake. Without it, CMake generates Makefiles which won't work with the ninja command.
## Building
### Using Ninja Directly
After cmake configuration:
```bash
cd /Users/adolforeyna/Projects/pico-bare-metal/Adolfo/basic1/build
ninja
```
Or from project root:
```bash
cd /Users/adolforeyna/Projects/pico-bare-metal/Adolfo/basic1
ninja -C build
```
### Using VS Code Task
The project has a "Compile Project" task that runs:
```bash
/Users/adolforeyna/.pico-sdk/ninja/v1.12.1/ninja -C /path/to/build
```
However, this task will fail if `build.ninja` doesn't exist. You must run cmake first.
### Quick Rebuild
If you only changed source files (not CMakeLists.txt):
```bash
cd build
ninja
```
If you changed CMakeLists.txt or added/removed files:
```bash
cd build
cmake -G Ninja ..
ninja
```
## Building for Different Boards
### Single Board
```bash
# Clean and configure for specific board
rm -rf build
cmake -B build -G Ninja -DPICO_BOARD=pico2
cd build && ninja
```
Available boards:
- `adafruit_feather_rp2350` (default)
- `pico2`
- `pico2_w`
### All Boards at Once
Use the provided script:
```bash
./build_all_boards.sh
```
This creates:
- `build_adafruit_feather_rp2350/basic1.uf2``basic1_adafruit_feather_rp2350.uf2`
- `build_pico2/basic1.uf2``basic1_pico2.uf2`
- `build_pico2_w/basic1.uf2``basic1_pico2_w.uf2`
## Verifying Build Success
### Check for Output Files
```bash
ls -lh build/basic1.{uf2,elf,bin}
```
Successful build produces:
- `basic1.uf2` - Flash file for bootloader (≈150KB)
- `basic1.elf` - Executable with debug symbols (≈1.1MB)
- `basic1.bin` - Raw binary (≈74KB)
- `basic1.hex` - Intel HEX format
- `basic1.dis` - Disassembly (≈877KB)
### Check File Timestamp
```bash
stat build/basic1.uf2
```
Verify the modification time is recent.
### Look for Ninja Success Message
Successful build ends with:
```
[90/90] Linking CXX executable basic1.elf
```
Failed build shows:
```
ninja: build stopped: subcommand failed.
```
## Common Issues and Solutions
### Issue: "ninja: error: loading 'build.ninja': No such file or directory"
**Cause:** CMake wasn't run or didn't generate Ninja files
**Solution:**
```bash
cd /Users/adolforeyna/Projects/pico-bare-metal/Adolfo/basic1
cmake -B build -G Ninja -DPICO_BOARD=adafruit_feather_rp2350
```
### Issue: Build directory has Makefiles instead of build.ninja
**Cause:** CMake was run without `-G Ninja`
**Solution:**
```bash
rm -rf build
cmake -B build -G Ninja -DPICO_BOARD=adafruit_feather_rp2350
```
### Issue: Compilation errors after adding new files
**Cause:** CMakeLists.txt not updated or cmake not re-run
**Solution:**
1. Add new files to `CMakeLists.txt` in the `add_executable()` section
2. Re-run cmake:
```bash
cd build
cmake -G Ninja ..
ninja
```
### Issue: Changes not reflected in build
**Cause:** Stale build cache
**Solution:**
```bash
cd build
ninja clean
ninja
```
Or full rebuild:
```bash
rm -rf build
cmake -B build -G Ninja -DPICO_BOARD=adafruit_feather_rp2350
cd build && ninja
```
## Checking for Errors
### Compilation Errors
Look for errors in ninja output:
```
[12/90] Building CXX object CMakeFiles/basic1.dir/basic1.cpp.o
FAILED: CMakeFiles/basic1.dir/basic1.cpp.o
...
error: 'foo' was not declared in this scope
```
### Viewing Recent Build Output
```bash
cd build
ninja 2>&1 | tail -50 # Last 50 lines
```
### Viewing Full Build Output
```bash
cd build
ninja 2>&1 | tee build.log
```
## Build Output Location
```
build/
├── basic1.uf2 # Main flash file
├── basic1.elf # Executable with symbols
├── basic1.bin # Raw binary
├── basic1.hex # Intel HEX
├── basic1.dis # Disassembly
├── basic1.elf.map # Memory map
├── build.ninja # Ninja build file (must exist!)
├── CMakeCache.txt # CMake configuration
└── compile_commands.json # For IDE integration
```
## Integration with Tools
### VS Code Tasks
The project includes pre-configured tasks in `.vscode/tasks.json`:
- **Compile Project** - Runs ninja in build directory
These tasks expect `build/build.ninja` to exist.
### CMake Extension
If using CMake Tools extension:
1. Select kit: "Pico ARM GCC"
2. Configure with Ninja generator
3. Build target: "basic1"
## Quick Reference Commands
```bash
# Full clean build (default board)
rm -rf build && cmake -B build -G Ninja && ninja -C build
# Full clean build (specific board)
rm -rf build && cmake -B build -G Ninja -DPICO_BOARD=pico2 && ninja -C build
# Incremental build
ninja -C build
# Build all boards
./build_all_boards.sh
# Check build output
ls -lh build/basic1.uf2
# View compile commands
cat build/compile_commands.json | grep -A5 basic1.cpp
```
## Testing Build Success
After building, you can verify the binary contains expected symbols:
```bash
arm-none-eabi-nm build/basic1.elf | grep -i main
arm-none-eabi-size build/basic1.elf
```
## Important Notes
1. **Always use `-G Ninja`** when running cmake
2. **The build directory must be recreated** when switching boards
3. **ninja must be run from the build directory** or with `-C build`
4. **CMake must be re-run** after modifying CMakeLists.txt
5. **The Pico SDK path** is at `~/.pico-sdk/sdk/2.2.0`
6. **The toolchain** is at `~/.pico-sdk/toolchain/14_2_Rel1`
7. **Output files** are always in the `build/` directory (or board-specific build dirs)
## When Making Changes
| Change Type | Required Action |
|-------------|-----------------|
| Source code (.cpp, .c) | `ninja -C build` |
| Header files (.h) | `ninja -C build` |
| CMakeLists.txt | `cd build && cmake -G Ninja .. && ninja` |
| New board | `rm -rf build && cmake -B build -G Ninja -DPICO_BOARD=<board> && ninja -C build` |
| New files | Update CMakeLists.txt, then re-run cmake |
| board_config.h | `ninja -C build` |
## Flashing
After successful build:
1. **Manual:** Hold BOOTSEL, connect USB, copy `build/basic1.uf2` to mounted drive
2. **Script:** `./build_and_flash.sh` (requires openocd or picotool)
3. **VS Code:** Use "Run Project" or "Flash" tasks
## Serial Monitor
View serial output:
```bash
screen /dev/cu.usbmodem101
# Exit: Ctrl-A, then K, then Y
```
Or use VS Code's serial monitor extension.