This PR adds comprehensive firmware manifest metadata to PX4 builds, enabling be…tter firmware discovery and management for tools like QGroundControl. Per-build metadata is generated from the defconfig and CMake board variables, embedded into each `.px4` file, and aggregated into a single unified manifest on S3 that QGC and other tools can consume.
## Changes
### 1. Board-level manifest generation
**Files:** `Tools/manifest/gen_board_manifest_from_defconfig.py`, `platforms/nuttx/CMakeLists.txt`
- Generates per-build manifest JSON with hardware and variant metadata
- Extracts architecture, USB vendor/product IDs, chip type, manufacturer from defconfig
- `variant` field sourced from CMake's `${LABEL}` (the `.px4board` filename stem, e.g. `multicopter.px4board` → `"multicopter"`)
- Integrated into CMake build system via `add_custom_command`
### 2. Manifest bundled into *.px4 files
**Files:** `Tools/px_mkfw.py`
- Each `.px4` file now contains a `manifest` object with board metadata
- Adds `manifest_version` and `sha256sum` fields
- `_merge_manifest` helper merges the per-build JSON fragment into the firmware descriptor
- Backward compatible: tested with QGC 4.4.5 and daily builds
### 3. Label and category fields
**Files:** `Kconfig`, `Tools/manifest/gen_board_manifest_from_defconfig.py`, `boards/px4/fmu-v6x/*.px4board`
- `CONFIG_BOARD_LABEL_PRETTY`: human-readable variant name shown in QGC (e.g. "Multicopter")
- `CONFIG_BOARD_FIRMWARE_CATEGORY`: override for auto-detected category (`vehicle`, `peripheral`, `dev`, `bootloader`)
- Auto-detection from variant label and `CONFIG_BOARD_ROMFSROOT` (`cannode` → peripheral)
- Phase 1 rollout on all `px4/fmu-v6x` variants; follow-up PR will cover the remaining ~258 `.px4board` files
- `artifact_type` discriminator (flat field, value `"px4"`) to allow future non-`.px4` producers (VOXL2 `.deb`, Linux tarballs) to coexist in the same manifest without a `format_version` bump
### 4. Unified firmware manifest
**Files:** `Tools/manifest/update_firmware_manifest.py`
- Scans all `*.px4` files in an artifacts directory and extracts their embedded metadata
- Fetches the existing unified manifest from S3 and upserts the current release inline
- Single file at `s3://px4-travis/Firmware/manifest.json` contains all releases and all builds for O(1) lookup
- Schema uses `format_version: 2` with `releases` as a dict keyed by version
- Auto-detects release channels (stable, beta, dev) from version string and tracks `latest_*` per channel
### 5. CI integration
**Files:** `.github/workflows/build_all_targets.yml`
On version tag releases:
1. Backs up the existing `manifest.json` from S3 as a workflow artifact (90-day retention)
2. Runs `update_firmware_manifest.py` to upsert this release into the unified manifest
3. Uploads the updated `manifest.json` to S3 and attaches it to the GitHub release
## Architecture
```
s3://px4-travis/Firmware/
├── manifest.json # Unified: all releases × all builds, O(1) lookup
├── v1.15.0/
│ ├── px4_fmu-v6x_default.px4
│ ├── px4_fmu-v6x_multicopter.px4
│ └── ...
├── v1.16.1/
│ └── ...
└── stable/ # Symlink to latest stable
```
## Example Manifest
```json
{
"format_version": 2,
"updated_at": 1738890000,
"latest_stable": "v1.16.1",
"latest_beta": "v1.17.0-beta1",
"latest_dev": "v1.17.0-alpha1",
"releases": {
"v1.16.1": {
"channel": "stable",
"release_date": "2026-01-15",
"build_count": 170,
"builds": [
{
"filename": "px4_fmu-v6x_multicopter.px4",
"url": "https://github.com/PX4/PX4-Autopilot/releases/download/v1.16.1/px4_fmu-v6x_multicopter.px4",
"sha256sum": "abc123...",
"image_size": 1234567,
"board_id": 53,
"artifact_type": "px4",
"manifest": {
"name": "px4_fmu-v6x",
"target": "px4_fmu-v6x_multicopter",
"variant": "multicopter",
"label_pretty": "Multicopter",
"firmware_category": "vehicle",
"manufacturer": "Holybro",
"hardware": {
"architecture": "arm",
"chip": "stm32h753ii",
"vendor_id": "0x3185",
"product_id": "0x0038",
"productstr": "Pixhawk 6X"
}
}
}
]
}
}
}
```
A live test manifest with 5 real releases and 891 firmware builds is published at [px4-travis.s3.amazonaws.com/Firmware/manifest.json](https://px4-travis.s3.amazonaws.com/Firmware/manifest.json).
## Scope
Manifest generation currently runs only for NuttX targets (via `platforms/nuttx/CMakeLists.txt`). VOXL2 (qurt/posix), Linux SBCs, and SITL targets are not yet indexed; extending coverage to non-NuttX producers is a follow-up. The `artifact_type` discriminator is in place so those can land additively without a schema break.
## Related
- QGC companion PR: [mavlink/qgroundcontrol#13966](https://github.com/mavlink/qgroundcontrol/pull/13966)
- Follow-up: populate `CONFIG_BOARD_LABEL_PRETTY` across remaining ~258 `.px4board` files
- Follow-up: extend manifest producers to VOXL2 / Linux / SITL targets