---
title: "Build, size and build records"
---

# Build, size and build records

Building firmware with CMake presets or in place with IAR iarbuild, Keil uVision and STM32CubeIDE's headless builder, the size report and Firmware Memory editor, the build record, and vendor licence failures.

## Build with one key

Press **Cmd+Shift+B** (Ctrl+Shift+B on Windows and Linux), click **Build** in the title bar, or run **Build Firmware**. With a vendor keymap, F7 (Keil, IAR) or Ctrl+B (Eclipse) does the same. The module builds the configuration selected in the status bar (see [Choose the build configuration](https://neuralinverse.com/docs/modules/embedded/projects/#choose-the-build-configuration)):

| Configuration | What runs |
|---|---|
| CMake preset | `cmake --preset` and `cmake --build --preset`, as a native task |
| IAR configuration, in place | `iarbuild <project> -make\|-build\|-clean <configuration> -log info [-varfile]`; the workspace's `.custom_argvars` is passed with `-varfile` |
| Keil target, in place | uVision's batch mode, `UV4 -b\|-r\|-c <project> -j0 -t <target> -o <log>`, the only builder Keil provides for `.uvprojx`. It runs through a generated batch file in the target's output folder that waits for UV4 and prints its log; no vendor window opens. Windows only, as uVision is |
| STM32CubeIDE configuration, in place | STM32CubeIDE's headless builder (`org.eclipse.cdt.managedbuilder.core.headlessbuild`) in a temporary workspace of its own, so your STM32CubeIDE workspace is not touched |

**Clean Firmware Build** cleans the configuration. STM32CubeIDE's headless builder has no clean-only mode, so for those projects a rebuild cleans.

![The STM32CubeIDE Debug configuration in the status bar, with its tooltip saying it builds in place with STM32CubeIDE's headless builder in a temporary workspace.](https://neuralinverse.com/docs-images/modules/embedded/cubeide-status.webp)

Compiler and linker errors go to Problems at their line. The vendor build, rebuild and clean tasks carry problem matchers for iccarm, ILINK, armclang, armcc, armasm and armlink messages; uVision's own log is read too. Flash, debugging and the size report use the configuration's image (`.elf`, `.out`, `.axf`).

| Path | State |
|---|---|
| CMake and Ninja with the Arm GNU Toolchain | Task and problem-matcher generation unit-tested; the integration test exists and has not run in a verified audit |
| IAR `iarbuild` in place | Tested on build output captured from published IAR logs; kit shipped (iar-keil-build); **not yet run against IAR** |
| Keil `UV4` in place | Tested on published uVision logs; kit shipped (iar-keil-build); **not yet run against Keil** |
| STM32CubeIDE headless build | Option ids checked on real `.cproject` files; kit shipped (stm32cubeide-build); **not yet run against STM32CubeIDE**; the `stm32cubeidec.exe` launcher options are unverified |
| IAR or Arm Compiler 6 through CMake presets | Detected in unit tests on CMake snippets; no real IAR-only or Arm Compiler-only CMake project configured |

Each build task builds one configuration or target.

## Size report

After a successful build the status bar shows flash and RAM use, for example **Flash 1.6% · RAM 19.1%**, with a per-region table in its hover. A region that overflows is reported ("does not fit"). **Analyze Firmware Memory** opens the Firmware Memory editor: memory regions, sections and the largest symbols, each linked to its source line, and per-function stack frames where `.su` files exist.

![A CMake preset built as a task, with flash and RAM use in the status bar and its hover.](https://neuralinverse.com/docs-images/modules/embedded/build-size.webp)

![The Firmware Memory editor: memory regions, sections and the largest symbols, each linked to its source line.](https://neuralinverse.com/docs-images/modules/embedded/firmware-memory.webp)

- Regions come from the GNU linker script's `MEMORY` command. The module takes the `-T` script from the build; set `neuralInverse.embedded.linkerScript` to use another.
- Section and symbol sizes come from `size`, `objdump` and `nm` output on the image.
- For Keil projects built in place, uVision's Program Size line becomes the size report, with the IROM and IRAM regions; region use is shown only when the target dialog sets one flash and one RAM region.
- The image is the newest `.elf` in the preset's build folder unless `neuralInverse.embedded.elfFile` names it. Vendor builds use the configuration's image.

State: verified only on fixtures; not on a firmware of realistic size.

## Build record

After every successful CMake build the module writes `neuralinverse-build-record.json` in the preset's build folder; an in-place vendor build run by an agent writes one next to the image. It records, with sorted keys:

- the CMake, build tool and compilers used, with versions, from CMake's own detection and the toolchain;
- the preset and its cache variables;
- the distinct compiler options from `compile_commands.json`;
- the image with its SHA-256;
- the start and end times.

A later flash logs whether its image is the recorded one, by SHA-256. Keep the record with your release evidence; it is evidence toward the build reproducibility your process requires, not a certification. State: unit-tested.

## Vendor licence failures

When an Arm Compiler 6, Keil MDK or IAR build stops at the licence, the module puts a Problem on the project and shows one notification that names the product, the licensed feature, where the tool looked for its licence (the licence server, licence file or IAR License Manager settings folder, and the environment variable that named it) and what to check, such as `lmutil lmstat -a -c <port@host>`, `armlm inspect` or `lightlicensemanager setup --host <server>`. Nothing is retried. Covered: FlexNet floating licences, Arm user-based licensing (guidance only), IAR LMS2, the IAR License Server and network licences.

The recognised forms come from build output that engineers published and from the vendors' own repositories. This is **not yet run against Arm Compiler 6, Keil MDK or IAR**. The vendor-licences kit prints your tools' licence status and captures their real failure output so it can be checked.

Agents can read the last build's licence failures and diagnose a licence failure in build output (**Read the Last Build's Licence Failures**, **Diagnose a Licence Failure in Build Output**).

## Agents and the vendor build

An agent can build an IAR, Keil or STM32CubeIDE configuration in place with **Build Vendor Project** (build, rebuild or clean) after you confirm. It gets the exit code and its meaning, the image, the size report and the build record.
