Migrating a Zephyr Project from Child/Parent Build System to Sysbuild: First Steps and Questions

I'm trying to migrate my project from the child/parent build system to the new sysbuild system in Zephyr, and I'm finding it a bit unclear. I came across a helpful post that partially explains how to structure the new project. Let me start by showing my current project, which has a structure similar to the one described in the post I found:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
application
├── CMakeLists.txt
├── prj.conf
├── boards
└── arm
└── board_A
└── board_B
├── child_image
└── mcuboot
├── prj.conf
└── boards
├── board_A.conf
├── board_B.conf
└── keys
├── board_A.pem
└── board_B.pem
├── src
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

CMakeLists.txt is:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(gravity_sensor)
target_sources(app PRIVATE src/main.c)
target_sources(app PRIVATE src/app.c)
target_sources(app PRIVATE src/status_led.c)
target_sources(app PRIVATE src/ble_connection.c)
target_sources(app PRIVATE src/icm20948.c)
target_sources(app PRIVATE src/error_managing.c)
target_sources(app PRIVATE src/memory.c)
target_sources(app PRIVATE src/bsm.c)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

prj.conf is:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
################################################
### SYSTEM CONFIGURATION #######################
################################################
CONFIG_LOG=y
CONFIG_LOG_MAX_LEVEL=2
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_UART_CONSOLE=n
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
CONFIG_USB_MASS_STORAGE_LOG_LEVEL_ERR=y
CONFIG_RING_BUFFER=y
CONFIG_HEAP_MEM_POOL_SIZE=2048
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_REBOOT=y
# CONFIG_DISABLE_FLASH_PATCH=y
# printf floats support
CONFIG_CBPRINTF_LIBC_SUBSTS=y
CONFIG_CBPRINTF_FP_SUPPORT=y
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

child_image/mcuboot/prj.conf is:

Fullscreen
1
2
3
CONFIG_BOOT_SIGNATURE_TYPE_RSA=y
CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=n
CONFIG_BOOT_SIGNATURE_KEY_FILE="Path/to/key.pem"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

child_image/mcuboot/board/gravity_sensor.conf is:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CONFIG_PM_PARTITION_SIZE_MCUBOOT=0x10000
CONFIG_MULTITHREADING=y
CONFIG_MAIN_STACK_SIZE=10240
CONFIG_LOG=y
CONFIG_LOG_MODE_MINIMAL=y
# Clock configuration
# CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
# CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
# CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH=y
# Configure MCUboot features
CONFIG_BOOT_MAX_IMG_SECTORS=2048
# Change default flash erase size for flexible flash layout
CONFIG_BOOT_ERASE_PROGRESSIVELY=y
CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y
# Configure QSPI for external flash
CONFIG_FLASH=y
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

From what I understand, the first step is to delete the child_image folder, create a sysbuild folder, and add a sysbuild.conf file. But what exactly should I include in these two elements, and what modifications, if any, do I need to make to prj.conf and CMakeLists.txt?

Following the post I found, I modified the project as follows:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
application
├── CMakeLists.txt
├── prj.conf
├── sysbuild.conf
├── boards
└── arm
└── board_A
└── board_B
├── sysbuild
└── mcuboot
├── prj.conf
└── boards
├── board_A.conf
├── board_B.conf
└── keys
├── board_A.pem
└── board_B.pem
├── src
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

CMakeLists.txt is:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(gravity_sensor)
target_sources(app PRIVATE src/main.c)
target_sources(app PRIVATE src/app.c)
target_sources(app PRIVATE src/status_led.c)
target_sources(app PRIVATE src/ble_connection.c)
target_sources(app PRIVATE src/icm20948.c)
target_sources(app PRIVATE src/error_managing.c)
target_sources(app PRIVATE src/memory.c)
target_sources(app PRIVATE src/bsm.c)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

prj.conf is:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
################################################
### SYSTEM CONFIGURATION #######################
################################################
CONFIG_LOG=y
CONFIG_LOG_MAX_LEVEL=2
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_UART_CONSOLE=n
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
CONFIG_USB_MASS_STORAGE_LOG_LEVEL_ERR=y
CONFIG_RING_BUFFER=y
CONFIG_HEAP_MEM_POOL_SIZE=2048
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_REBOOT=y
# CONFIG_DISABLE_FLASH_PATCH=y
# printf floats support
CONFIG_CBPRINTF_LIBC_SUBSTS=y
CONFIG_CBPRINTF_FP_SUPPORT=y
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

sysbuild/mcuboot/prj.conf is void and sysbuild.conf is:

Fullscreen
1
2
3
4
5
6
SB_CONFIG_BOOTLOADER_MCUBOOT=y
SB_CONFIG_MCUBOOT_MODE_OVERWRITE_ONLY=y
SB_CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=n
SB_CONFIG_BOOT_SIGNATURE_TYPE_RSA=y
SB_CONFIG_BOOT_SIGNATURE_KEY_FILE="path/to/key.pem"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

sysbuild/mcuboot/board/gravity_sensor.conf is:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CONFIG_PM_PARTITION_SIZE_MCUBOOT=0x10000
CONFIG_MULTITHREADING=y
CONFIG_MAIN_STACK_SIZE=10240
CONFIG_LOG=y
CONFIG_LOG_MODE_MINIMAL=y
# Clock configuration
# CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
# CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
# CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH=y
# Configure MCUboot features
CONFIG_BOOT_MAX_IMG_SECTORS=2048
# Change default flash erase size for flexible flash layout
CONFIG_BOOT_ERASE_PROGRESSIVELY=y
CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y
# Configure QSPI for external flash
CONFIG_FLASH=y
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

However, when I try to build the project, I still get an error:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- west build: generating a build system
Loading Zephyr module(s) (Zephyr base): sysbuild_default
-- Found Python3: C:/ncs/toolchains/b620d30767/opt/bin/python.exe (found suitable version "3.12.4", minimum required is "3.8") found components: Interpreter
-- Cache files will be written to: C:/ncs/v2.9.0/zephyr/.cache
-- Found west (found suitable version "1.2.0", minimum required is "0.14.0")
-- Board: gravity_sensor
Parsing C:/ncs/v2.9.0/zephyr/share/sysbuild/Kconfig
Loaded configuration 'C:/Users/Andrea/Desktop/gravity_sensor/build/_sysbuild/empty.conf'
Merged configuration 'c:/Users/Andrea/Desktop/gravity_sensor/sysbuild.conf'
Configuration saved to 'C:/Users/Andrea/Desktop/gravity_sensor/build/zephyr/.config'
Kconfig header saved to 'C:/Users/Andrea/Desktop/gravity_sensor/build/_sysbuild/autoconf.h'
CMake Error at C:/ncs/v2.9.0/nrf/sysbuild/CMakeLists.txt:117 (list):
list GET given empty list
Call Stack (most recent call first):
cmake/modules/sysbuild_extensions.cmake:583 (nrf_PRE_CMAKE)
cmake/modules/sysbuild_extensions.cmake:583 (cmake_language)
cmake/modules/sysbuild_images.cmake:16 (sysbuild_module_call)
cmake/modules/sysbuild_default.cmake:20 (include)
C:/ncs/v2.9.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:75 (include)
C:/ncs/v2.9.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:92 (include_boilerplate)
C:/ncs/v2.9.0/zephyr/share/sysbuild-package/cmake/SysbuildConfig.cmake:8 (include)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

What am I doing wrong?