1.. _sysbuild: 2 3Sysbuild (System build) 4####################### 5 6Sysbuild is a higher-level build system that can be used to combine multiple 7other build systems together. It is a higher-level layer that combines one 8or more Zephyr build systems and optional additional build systems 9into a hierarchical build system. 10 11For example, you can use sysbuild to build a Zephyr application together 12with the MCUboot bootloader, flash them both onto your device, and 13debug the results. 14 15Sysbuild works by configuring and building at least a Zephyr application and, optionally, as many 16additional projects as you want. The additional projects can be either Zephyr applications 17or other types of builds you want to run. 18 19Like Zephyr's :ref:`build system <build_overview>`, sysbuild is written in 20CMake and uses :ref:`Kconfig <kconfig>`. 21 22Definitions 23*********** 24 25The following are some key concepts used in this document: 26 27Single-image build 28 When sysbuild is used to create and manage just one Zephyr application's 29 build system. 30 31Multi-image build 32 When sysbuild is used to manage multiple build systems. 33 The word "image" is used because your main goal is usually to generate the binaries of the firmware 34 application images from each build system. 35 36Domain 37 Every Zephyr CMake build system managed by sysbuild. 38 39Multi-domain 40 When more than one Zephyr CMake build system (domain) is managed by sysbuild. 41 42Architectural Overview 43********************** 44 45This figure is an overview of sysbuild's inputs, outputs, and user interfaces: 46 47.. figure:: sysbuild.svg 48 :align: center 49 :alt: Sysbuild architectural overview 50 :figclass: align-center 51 :width: 80% 52 53The following are some key sysbuild features indicated in this figure: 54 55- You can run sysbuild either with :ref:`west build 56 <west-building>` or directly via ``cmake``. 57 58- You can use sysbuild to generate application images from each build system, 59 shown above as ELF, BIN, and HEX files. 60 61- You can configure sysbuild or any of the build systems it manages using 62 various configuration variables. These variables are namespaced so that 63 sysbuild can direct them to the right build system. In some cases, such as 64 the ``BOARD`` variable, these are shared among multiple build systems. 65 66- Sysbuild itself is also configured using Kconfig. For example, you can 67 instruct sysbuild to build the MCUboot bootloader, as well as to build and 68 link your main Zephyr application as an MCUboot-bootable image, using sysbuild's 69 Kconfig files. 70 71- Sysbuild integrates with west's :ref:`west-build-flash-debug` commands. It 72 does this by managing the :ref:`west-runner`, and specifically the 73 :file:`runners.yaml` files that each Zephyr build system will contain. These 74 are packaged into a global view of how to flash and debug each build system 75 in a :file:`domains.yaml` file generated and managed by sysbuild. 76 77- Build names are prefixed with the target name and an underscore, for example 78 the sysbuild target is prefixed with ``sysbuild_`` and if MCUboot is enabled 79 as part of sysbuild, it will be prefixed with ``mcuboot_``. This also allows 80 for running things like menuconfig with the prefix, for example (if using 81 ninja) ``ninja sysbuild_menuconfig`` to configure sysbuild or (if using make) 82 ``make mcuboot_menuconfig``. 83 84Building with sysbuild 85********************** 86 87As mentioned above, you can run sysbuild via ``west build`` or ``cmake``. 88 89.. tabs:: 90 91 .. group-tab:: ``west build`` 92 93 Here is an example. For details, see :ref:`west-multi-domain-builds` in 94 the ``west build documentation``. 95 96 .. zephyr-app-commands:: 97 :tool: west 98 :app: samples/hello_world 99 :board: reel_board 100 :goals: build 101 :west-args: --sysbuild 102 :compact: 103 104 .. tip:: 105 106 To configure ``west build`` to use ``--sysbuild`` by default from now on, 107 run: 108 109 .. code-block:: shell 110 111 west config build.sysbuild True 112 113 Since sysbuild supports both single- and multi-image builds, this lets you 114 use sysbuild all the time, without worrying about what type of build you are 115 running. 116 117 To turn this off, run this before generating your build system: 118 119 .. code-block:: shell 120 121 west config build.sysbuild False 122 123 To turn this off for just one ``west build`` command, run: 124 125 .. code-block:: shell 126 127 west build --no-sysbuild ... 128 129 .. group-tab:: ``cmake`` 130 131 Here is an example using CMake and Ninja. 132 133 .. zephyr-app-commands:: 134 :tool: cmake 135 :app: share/sysbuild 136 :board: reel_board 137 :goals: build 138 :gen-args: -DAPP_DIR=samples/hello_world 139 :compact: 140 141 To use sysbuild directly with CMake, you must specify the sysbuild 142 project as the source folder, and give ``-DAPP_DIR=<path-to-sample>`` as 143 an extra CMake argument. ``APP_DIR`` is the path to the main Zephyr 144 application managed by sysbuild. 145 146Configuration namespacing 147************************* 148 149When building a single Zephyr application without sysbuild, all CMake cache 150settings and Kconfig build options given on the command line as 151``-D<var>=<value>`` or ``-DCONFIG_<var>=<value>`` are handled by the Zephyr 152build system. 153 154However, when sysbuild combines multiple Zephyr build systems, there could be 155Kconfig settings exclusive to sysbuild (and not used by any of the applications). 156To handle this, sysbuild has namespaces for configuration variables. You can use these 157namespaces to direct settings either to sysbuild itself or to a specific Zephyr 158application managed by sysbuild using the information in these sections. 159 160The following example shows how to build :ref:`hello_world` with MCUboot enabled, 161applying to both images debug optimizations: 162 163.. tabs:: 164 165 .. group-tab:: ``west build`` 166 167 .. zephyr-app-commands:: 168 :tool: west 169 :app: samples/hello_world 170 :board: reel_board 171 :goals: build 172 :west-args: --sysbuild 173 :gen-args: -DSB_CONFIG_BOOTLOADER_MCUBOOT=y -DCONFIG_DEBUG_OPTIMIZATIONS=y -Dmcuboot_DEBUG_OPTIMIZATIONS=y 174 :compact: 175 176 .. group-tab:: ``cmake`` 177 178 .. zephyr-app-commands:: 179 :tool: cmake 180 :app: share/sysbuild 181 :board: reel_board 182 :goals: build 183 :gen-args: -DAPP_DIR=samples/hello_world -DSB_CONFIG_BOOTLOADER_MCUBOOT=y -DCONFIG_DEBUG_OPTIMIZATIONS=y -Dmcuboot_DEBUG_OPTIMIZATIONS=y 184 :compact: 185 186See the following subsections for more information. 187 188.. _sysbuild_cmake_namespace: 189 190CMake variable namespacing 191========================== 192 193CMake variable settings can be passed to CMake using ``-D<var>=<value>`` on the 194command line. You can also set Kconfig options via CMake as 195``-DCONFIG_<var>=<value>`` or ``-D<namespace>_CONFIG_<var>=<value>``. 196 197Since sysbuild is the entry point for the build system, and sysbuild is written 198in CMake, all CMake variables are first processed by sysbuild. 199 200Sysbuild creates a namespace for each domain. The namespace prefix is the 201domain's application name. See :ref:`sysbuild_zephyr_application` for more 202information. 203 204To set the variable ``<var>`` in the namespace ``<namespace>``, use this syntax:: 205 206 -D<namespace>_<var>=<value> 207 208For example, to set the CMake variable ``FOO`` in the ``my_sample`` application 209build system to the value ``BAR``, run the following commands: 210 211.. tabs:: 212 213 .. group-tab:: ``west build`` 214 215 .. code-block:: shell 216 217 west build --sysbuild ... -- -Dmy_sample_FOO=BAR 218 219 .. group-tab:: ``cmake`` 220 221 .. code-block:: shell 222 223 cmake -Dmy_sample_FOO=BAR ... 224 225.. _sysbuild_kconfig_namespacing: 226 227Kconfig namespacing 228=================== 229 230To set the sysbuild Kconfig option ``<var>`` to the value ``<value>``, use this syntax:: 231 232 -DSB_CONFIG_<var>=<value> 233 234In the previous example, ``SB_CONFIG`` is the namespace prefix for sysbuild's Kconfig 235options. 236 237To set a Zephyr application's Kconfig option instead, use this syntax:: 238 239 -D<namespace>_CONFIG_<var>=<value> 240 241In the previous example, ``<namespace>`` is the application name discussed above in 242:ref:`sysbuild_cmake_namespace`. 243 244For example, to set the Kconfig option ``FOO`` in the ``my_sample`` application 245build system to the value ``BAR``, run the following commands: 246 247.. tabs:: 248 249 .. group-tab:: ``west build`` 250 251 .. code-block:: shell 252 253 west build --sysbuild ... -- -Dmy_sample_CONFIG_FOO=BAR 254 255 .. group-tab:: ``cmake`` 256 257 .. code-block:: shell 258 259 cmake -Dmy_sample_CONFIG_FOO=BAR ... 260 261.. tip:: 262 When no ``<namespace>`` is used, the Kconfig setting is passed to the main 263 Zephyr application ``my_sample``. 264 265 This means that passing ``-DCONFIG_<var>=<value>`` and 266 ``-Dmy_sample_CONFIG_<var>=<value>`` are equivalent. 267 268 This allows you to build the same application with or without sysbuild using 269 the same syntax for setting Kconfig values at CMake time. 270 For example, the following commands will work in the same way: 271 272 .. code-block:: shell 273 274 west build -b <board> my_sample -- -DCONFIG_FOO=BAR 275 276 .. code-block:: shell 277 278 west build -b <board> --sysbuild my_sample -- -DCONFIG_FOO=BAR 279 280Sysbuild flashing using ``west flash`` 281************************************** 282 283You can use :ref:`west flash <west-flashing>` to flash applications with 284sysbuild. 285 286When invoking ``west flash`` on a build consisting of multiple images, each 287image is flashed in sequence. Extra arguments such as ``--runner jlink`` are 288passed to each invocation. 289 290For more details, see :ref:`west-multi-domain-flashing`. 291 292Sysbuild debugging using ``west debug`` 293*************************************** 294 295You can use ``west debug`` to debug the main application, whether you are using sysbuild or not. 296Just follow the existing :ref:`west debug <west-debugging>` guide to debug the main sample. 297 298To debug a different domain (Zephyr application), such as ``mcuboot``, use 299the ``--domain`` argument, as follows:: 300 301 west debug --domain mcuboot 302 303For more details, see :ref:`west-multi-domain-debugging`. 304 305Building a sample with MCUboot 306****************************** 307 308Sysbuild supports MCUboot natively. 309 310To build a sample like ``hello_world`` with MCUboot, 311enable MCUboot and build and flash the sample as follows: 312 313.. tabs:: 314 315 .. group-tab:: ``west build`` 316 317 .. zephyr-app-commands:: 318 :tool: west 319 :app: samples/hello_world 320 :board: reel_board 321 :goals: build 322 :west-args: --sysbuild 323 :gen-args: -DSB_CONFIG_BOOTLOADER_MCUBOOT=y 324 :compact: 325 326 .. group-tab:: ``cmake`` 327 328 .. zephyr-app-commands:: 329 :tool: cmake 330 :app: share/sysbuild 331 :board: reel_board 332 :goals: build 333 :gen-args: -DAPP_DIR=samples/hello_world -DSB_CONFIG_BOOTLOADER_MCUBOOT=y 334 :compact: 335 336This builds ``hello_world`` and ``mcuboot`` for the ``reel_board``, and then 337flashes both the ``mcuboot`` and ``hello_world`` application images to the 338board. 339 340More detailed information regarding the use of MCUboot with Zephyr can be found 341in the `MCUboot with Zephyr`_ documentation page on the MCUboot website. 342 343.. note:: 344 345 The deprecated MCUBoot Kconfig option ``CONFIG_ZEPHYR_TRY_MASS_ERASE`` will 346 perform a full chip erase when flashed. If this option is enabled, then 347 flashing only MCUBoot, for example using ``west flash --domain mcuboot``, may 348 erase the entire flash, including the main application image. 349 350Sysbuild Kconfig file 351********************* 352 353You can set sysbuild's Kconfig options for a single application using 354configuration files. By default, sysbuild looks for a configuration file named 355``sysbuild.conf`` in the application top-level directory. 356 357In the following example, there is a :file:`sysbuild.conf` file that enables building and flashing with 358MCUboot whenever sysbuild is used: 359 360.. code-block:: none 361 362 <home>/application 363 ├── CMakeLists.txt 364 ├── prj.conf 365 └── sysbuild.conf 366 367 368.. code-block:: cfg 369 370 SB_CONFIG_BOOTLOADER_MCUBOOT=y 371 372You can set a configuration file to use with the 373``-DSB_CONF_FILE=<sysbuild-conf-file>`` CMake build setting. 374 375For example, you can create ``sysbuild-mcuboot.conf`` and then 376specify this file when building with sysbuild, as follows: 377 378.. tabs:: 379 380 .. group-tab:: ``west build`` 381 382 .. zephyr-app-commands:: 383 :tool: west 384 :app: samples/hello_world 385 :board: reel_board 386 :goals: build 387 :west-args: --sysbuild 388 :gen-args: -DSB_CONF_FILE=sysbuild-mcuboot.conf 389 :compact: 390 391 .. group-tab:: ``cmake`` 392 393 .. zephyr-app-commands:: 394 :tool: cmake 395 :app: share/sysbuild 396 :board: reel_board 397 :goals: build 398 :gen-args: -DAPP_DIR=samples/hello_world -DSB_CONF_FILE=sysbuild-mcuboot.conf 399 :compact: 400 401Sysbuild targets 402**************** 403 404Sysbuild creates build targets for each image (including sysbuild itself) for 405the following modes: 406 407 * menuconfig 408 * hardenconfig 409 * guiconfig 410 411For the main application (as is the same without using sysbuild) these can be 412ran normally without any prefix. For other images (including sysbuild), these 413are ran with a prefix of the image name and an underscore e.g. ``sysbuild_`` or 414``mcuboot_``, using ninja or make - for details on how to run image build 415targets that do not have mapped build targets in sysbuild, see the 416:ref:`sysbuild_dedicated_image_build_targets` section. 417 418.. _sysbuild_dedicated_image_build_targets: 419 420Dedicated image build targets 421***************************** 422 423Not all build targets for images are given equivalent prefixed build targets 424when sysbuild is used, for example build targets like ``ram_report``, 425``rom_report``, ``footprint``, ``puncover`` and ``pahole`` are not exposed. 426When using :ref:`Trusted Firmware <tfm_build_system>`, this includes build 427targets prefix with ``tfm_`` and ``bl2_``, for example: ``tfm_rom_report`` 428and ``bl2_ram_report``. To run these build targets, the build directory of the 429image can be provided to west/ninja/make along with the name of the build 430target to execute and it will run. 431 432.. tabs:: 433 434 .. group-tab:: ``west`` 435 436 Assuming that a project has been configured and built using ``west`` 437 using sysbuild with mcuboot enabled in the default ``build`` folder 438 location, the ``rom_report`` build target for ``mcuboot`` can be ran 439 with: 440 441 .. code-block:: shell 442 443 west build -d build/mcuboot -t rom_report 444 445 .. group-tab:: ``ninja`` 446 447 Assuming that a project has been configured using ``cmake`` and built 448 using ``ninja`` using sysbuild with mcuboot enabled, the ``rom_report`` 449 build target for ``mcuboot`` can be ran with: 450 451 .. code-block:: shell 452 453 ninja -C mcuboot rom_report 454 455 .. group-tab:: ``make`` 456 457 Assuming that a project has been configured using ``cmake`` and built 458 using ``make`` using sysbuild with mcuboot enabled, the ``rom_report`` 459 build target for ``mcuboot`` can be ran with: 460 461 .. code-block:: shell 462 463 make -C mcuboot rom_report 464 465.. _sysbuild_zephyr_application: 466 467Adding Zephyr applications to sysbuild 468************************************** 469 470You can use the ``ExternalZephyrProject_Add()`` function to add Zephyr 471applications as sysbuild domains. Call this CMake function from your 472application's :file:`sysbuild.cmake` file, or any other CMake file you know will 473run as part sysbuild CMake invocation. 474 475Targeting the same board 476======================== 477 478To include ``my_sample`` as another sysbuild domain, targeting the same board 479as the main image, use this example: 480 481.. code-block:: cmake 482 483 ExternalZephyrProject_Add( 484 APPLICATION my_sample 485 SOURCE_DIR <path-to>/my_sample 486 ) 487 488This could be useful, for example, if your board requires you to build and flash an 489SoC-specific bootloader along with your main application. 490 491Targeting a different board 492=========================== 493 494In sysbuild and Zephyr CMake build system a board may refer to: 495 496* A physical board with a single core SoC. 497* A specific core on a physical board with a multi-core SoC, such as 498 :ref:`nrf5340dk_nrf5340`. 499* A specific SoC on a physical board with multiple SoCs, such as 500 :ref:`nrf9160dk_nrf9160` and :ref:`nrf9160dk_nrf52840`. 501 502If your main application, for example, is built for ``mps2_an521``, and your 503helper application must target the ``mps2_an521_remote`` board (cpu1), add 504a CMake function call that is structured as follows: 505 506.. code-block:: cmake 507 508 ExternalZephyrProject_Add( 509 APPLICATION my_sample 510 SOURCE_DIR <path-to>/my_sample 511 BOARD mps2_an521_remote 512 ) 513 514This could be useful, for example, if your main application requires another 515helper Zephyr application to be built and flashed alongside it, but the helper 516runs on another core in your SoC. 517 518Targeting conditionally using Kconfig 519===================================== 520 521You can control whether extra applications are included as sysbuild domains 522using Kconfig. 523 524If the extra application image is specific to the board or an application, 525you can create two additional files: :file:`sysbuild.cmake` and :file:`Kconfig.sysbuild`. 526 527For an application, this would look like this: 528 529.. code-block:: none 530 531 <home>/application 532 ├── CMakeLists.txt 533 ├── prj.conf 534 ├── Kconfig.sysbuild 535 └── sysbuild.cmake 536 537In the previous example, :file:`sysbuild.cmake` would be structured as follows: 538 539.. code-block:: cmake 540 541 if(SB_CONFIG_SECOND_SAMPLE) 542 ExternalZephyrProject_Add( 543 APPLICATION second_sample 544 SOURCE_DIR <path-to>/second_sample 545 ) 546 endif() 547 548:file:`Kconfig.sysbuild` would be structured as follows: 549 550.. code-block:: kconfig 551 552 source "sysbuild/Kconfig" 553 554 config SECOND_SAMPLE 555 bool "Second sample" 556 default y 557 558This will include ``second_sample`` by default, while still allowing you to 559disable it using the Kconfig option ``SECOND_SAMPLE``. 560 561For more information on setting sysbuild Kconfig options, 562see :ref:`sysbuild_kconfig_namespacing`. 563 564Building without flashing 565========================= 566 567You can mark ``my_sample`` as a build-only application in this manner: 568 569.. code-block:: cmake 570 571 ExternalZephyrProject_Add( 572 APPLICATION my_sample 573 SOURCE_DIR <path-to>/my_sample 574 BUILD_ONLY TRUE 575 ) 576 577As a result, ``my_sample`` will be built as part of the sysbuild build invocation, 578but it will be excluded from the default image sequence used by ``west flash``. 579Instead, you may use the outputs of this domain for other purposes - for example, 580to produce a secondary image for DFU, or to merge multiple images together. 581 582You can also replace ``TRUE`` with another boolean constant in CMake, such as 583a Kconfig option, which would make ``my_sample`` conditionally build-only. 584 585.. note:: 586 587 Applications marked as build-only can still be flashed manually, using 588 ``west flash --domain my_sample``. As such, the ``BUILD_ONLY`` option only 589 controls the default behavior of ``west flash``. 590 591Zephyr application configuration 592================================ 593 594When adding a Zephyr application to sysbuild, such as MCUboot, then the 595configuration files from the application (MCUboot) itself will be used. 596 597When integrating multiple applications with each other, then it is often 598necessary to make adjustments to the configuration of extra images. 599 600Sysbuild gives users the ability of creating Kconfig fragments or devicetree 601overlays that will be used together with the application's default configuration. 602Sysbuild also allows users to change :ref:`application-configuration-directory` 603in order to give users full control of an image's configuration. 604 605Zephyr application Kconfig fragment and devicetree overlay 606---------------------------------------------------------- 607 608In the folder of the main application, create a Kconfig fragment or a devicetree 609overlay under a sysbuild folder, where the name of the file is 610:file:`<image>.conf` or :file:`<image>.overlay`, for example if your main 611application includes ``my_sample`` then create a :file:`sysbuild/my_sample.conf` 612file or a devicetree overlay :file:`sysbuild/my_sample.overlay`. 613 614A Kconfig fragment could look as: 615 616.. code-block:: cfg 617 618 # sysbuild/my_sample.conf 619 CONFIG_FOO=n 620 621Zephyr application configuration directory 622------------------------------------------ 623 624In the folder of the main application, create a new folder under 625:file:`sysbuild/<image>/`. 626This folder will then be used as ``APPLICATION_CONFIG_DIR`` when building 627``<image>``. 628As an example, if your main application includes ``my_sample`` then create a 629:file:`sysbuild/my_sample/` folder and place any configuration files in 630there as you would normally do: 631 632.. code-block:: none 633 634 <home>/application 635 ├── CMakeLists.txt 636 ├── prj.conf 637 └── sysbuild 638 └── my_sample 639 ├── prj.conf 640 ├── app.overlay 641 └── boards 642 ├── <board_A>.conf 643 ├── <board_A>.overlay 644 ├── <board_B>.conf 645 └── <board_B>.overlay 646 647All configuration files under the :file:`sysbuild/my_sample/` folder will now 648be used when ``my_sample`` is included in the build, and the default 649configuration files for ``my_sample`` will be ignored. 650 651This give you full control on how images are configured when integrating those 652with ``application``. 653 654.. _sysbuild_file_suffixes: 655 656Sysbuild file suffix support 657---------------------------- 658 659File suffix support through the makevar:`FILE_SUFFIX` is supported in sysbuild 660(see :ref:`application-file-suffixes` for details on this feature in applications). For sysbuild, 661a globally provided option will be passed down to all images. In addition, the image configuration 662file will have this value applied and used (instead of the build type) if the file exists. 663 664Given the example project: 665 666.. code-block:: none 667 668 <home>/application 669 ├── CMakeLists.txt 670 ├── prj.conf 671 ├── sysbuild.conf 672 ├── sysbuild_test_key.conf 673 └── sysbuild 674 ├── mcuboot.conf 675 ├── mcuboot_max_log.conf 676 └── my_sample.conf 677 678* If ``FILE_SUFFIX`` is not defined and both ``mcuboot`` and ``my_sample`` images are included, 679 ``mcuboot`` will use the ``mcuboot.conf`` Kconfig fragment file and ``my_sample`` will use the 680 ``my_sample.conf`` Kconfig fragment file. Sysbuild itself will use the ``sysbuild.conf`` 681 Kconfig fragment file. 682 683* If ``FILE_SUFFIX`` is set to ``max_log`` and both ``mcuboot`` and ``my_sample`` images are 684 included, ``mcuboot`` will use the ``mcuboot_max_log.conf`` Kconfig fragment file and 685 ``my_sample`` will use the ``my_sample.conf`` Kconfig fragment file (as it will fallback to the 686 file without the suffix). Sysbuild itself will use the ``sysbuild.conf`` Kconfig fragment file 687 (as it will fallback to the file without the suffix). 688 689* If ``FILE_SUFFIX`` is set to ``test_key`` and both ``mcuboot`` and ``my_sample`` images are 690 included, ``mcuboot`` will use the ``mcuboot.conf`` Kconfig fragment file and 691 ``my_sample`` will use the ``my_sample.conf`` Kconfig fragment file (as it will fallback to the 692 files without the suffix). Sysbuild itself will use the ``sysbuild_test_key.conf`` Kconfig 693 fragment file. This can be used to apply a different sysbuild configuration, for example to use 694 a different signing key in MCUboot and when signing the main application. 695 696The ``FILE_SUFFIX`` can also be applied only to single images by prefixing the variable with the 697image name: 698 699.. tabs:: 700 701 .. group-tab:: ``west build`` 702 703 .. zephyr-app-commands:: 704 :tool: west 705 :app: file_suffix_example 706 :board: reel_board 707 :goals: build 708 :west-args: --sysbuild 709 :gen-args: -DSB_CONFIG_BOOTLOADER_MCUBOOT=y -Dmcuboot_FILE_SUFFIX="max_log" 710 :compact: 711 712 .. group-tab:: ``cmake`` 713 714 .. zephyr-app-commands:: 715 :tool: cmake 716 :app: share/sysbuild 717 :board: reel_board 718 :goals: build 719 :gen-args: -DAPP_DIR=<app_dir> -DSB_CONFIG_BOOTLOADER_MCUBOOT=y -Dmcuboot_FILE_SUFFIX="max_log" 720 :compact: 721 722.. _sysbuild_zephyr_application_dependencies: 723 724Adding dependencies among Zephyr applications 725============================================= 726 727Sometimes, in a multi-image build, you may want certain Zephyr applications to 728be configured or flashed in a specific order. For example, if you need some 729information from one application's build system to be available to another's, 730then the first thing to do is to add a configuration dependency between them. 731Separately, you can also add flashing dependencies to control the sequence of 732images used by ``west flash``; this could be used if a specific flashing order 733is required by an SoC, a _runner_, or something else. 734 735By default, sysbuild will configure and flash applications in the order that 736they are added, as ``ExternalZephyrProject_Add()`` calls are processed by CMake. 737You can use the ``sysbuild_add_dependencies()`` function to make adjustments to 738this order, according to your needs. Its usage is similar to the standard 739``add_dependencies()`` function in CMake. 740 741Here is an example of adding configuration dependencies for ``my_sample``: 742 743.. code-block:: cmake 744 745 sysbuild_add_dependencies(IMAGE CONFIGURE my_sample sample_a sample_b) 746 747This will ensure that sysbuild will run CMake for ``sample_a`` and ``sample_b`` 748(in some order) before doing the same for ``my_sample``, when building these 749domains in a single invocation. 750 751If you want to add flashing dependencies instead, then do it like this: 752 753.. code-block:: cmake 754 755 sysbuild_add_dependencies(IMAGE FLASH my_sample sample_a sample_b) 756 757As a result, ``my_sample`` will be flashed after ``sample_a`` and ``sample_b`` 758(in some order), when flashing these domains in a single invocation. 759 760.. note:: 761 762 Adding flashing dependencies is not allowed for build-only applications. 763 If ``my_sample`` had been created with ``BUILD_ONLY TRUE``, then the above 764 call to ``sysbuild_add_dependencies()`` would have produced an error. 765 766Adding non-Zephyr applications to sysbuild 767****************************************** 768 769You can include non-Zephyr applications in a multi-image build using the 770standard CMake module `ExternalProject`_. Please refer to the CMake 771documentation for usage details. 772 773When using ``ExternalProject``, the non-Zephyr application will be built as 774part of the sysbuild build invocation, but ``west flash`` or ``west debug`` 775will not be aware of the application. Instead, you must manually flash and 776debug the application. 777 778.. _MCUboot with Zephyr: https://docs.mcuboot.com/readme-zephyr 779.. _ExternalProject: https://cmake.org/cmake/help/latest/module/ExternalProject.html 780 781Extending sysbuild 782****************** 783 784Sysbuild can be extended by other modules to give it additional functionality 785or include other configuration or images, an example could be to add support 786for another bootloader or external signing method. 787 788Modules can be extended by adding custom CMake or Kconfig files as normal 789:ref:`modules <module-yml>` do, this will cause the files to be included in 790each image that is part of a project. Alternatively, there are 791:ref:`sysbuild-specific module extension <sysbuild_module_integration>` files 792which can be used to include CMake and Kconfig files for the overall sysbuild 793image itself, this is where e.g. a custom image for a particular board or SoC 794can be added. 795