Skip to main content

Sysbuild

A simple Zephyr build produces one binary. The moment you add a bootloader (MCUboot), a TrustZone secure image, or a separate network-core firmware, you're building multiple images that need to be coordinated — same key, same partition map, flashed in the right order.

That's what Sysbuild does. It's a meta-build that drives several CMake builds from one west build invocation.

info


Enable Sysbuild

Per-build:

west build -b esp32s3_devkitc --sysbuild

Or make it the default for this checkout:

west config build.sysbuild True

Once enabled, west build runs Sysbuild instead of building a single image.



Add MCUboot to your build

The most common Sysbuild use case is "build my app and an MCUboot bootloader, same key, same partition table."

Create sysbuild.conf in your application root:

SB_CONFIG_BOOTLOADER_MCUBOOT=y

Then:

west build -b esp32s3_devkitc --sysbuild
west flash

The build output now contains two images:

build/
├── mcuboot/ # bootloader
└── my_app/ # signed application

west flash programs both in the correct order.



Configure the application image

Sysbuild Kconfig symbols (in sysbuild.conf) use the SB_CONFIG_ prefix. To set a Kconfig in a specific image, prefix the symbol with the image name:

west build -b esp32s3_devkitc --sysbuild \
-- -Dmy_app_CONFIG_LOG_DEFAULT_LEVEL=4

Or in sysbuild.conf:

my_app_CONFIG_LOG_DEFAULT_LEVEL=4

The image name is the directory name of the app — the same name that shows up under build/.



Multi-core builds (nRF53/nRF54)

Nordic's dual-core SoCs need this even without a bootloader. The application core runs your code; the network core runs the BLE controller. Sysbuild builds both:

SB_CONFIG_NETCORE_HCI_IPC=y

This pulls in the hci_ipc sample as the network-core image automatically. ESP32-S3 is single-core (well, dual-core symmetric), so this lesson is more about preparing you for what you'll see on nRF parts.



Why this matters

Before Sysbuild, multi-image builds used child images — a fragile mechanism where you crammed extra config into your main app's prj.conf. Sysbuild replaces that with a clean separation: each image is its own build, and sysbuild.conf glues them together.

tip

If you're staying on a single-image build (no bootloader, single core), you don't need Sysbuild. Add it the moment you bring in MCUboot, TF-M, or a separate radio core — that's the threshold where the coordination pays off.