From e7d9079a93c9847dbedf71e624e7699a94ddeba0 Mon Sep 17 00:00:00 2001 From: Torsten Rasmussen Date: Thu, 23 May 2024 14:37:09 +0200 Subject: [PATCH 1/3] sysbuild: use ARGN instead of ARGV1 Use of ARGV1 is undefined when number of arguments to function is less than 2. Therefore switch to ARGN which holds arguments beyond required arguments. If there are no optional arguments, then ARGN is just an empty list, thus making it safe to use. Signed-off-by: Torsten Rasmussen --- share/sysbuild/cmake/modules/sysbuild_extensions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/sysbuild/cmake/modules/sysbuild_extensions.cmake b/share/sysbuild/cmake/modules/sysbuild_extensions.cmake index ce0af2fe7b339..acbc5706e69fd 100644 --- a/share/sysbuild/cmake/modules/sysbuild_extensions.cmake +++ b/share/sysbuild/cmake/modules/sysbuild_extensions.cmake @@ -661,7 +661,7 @@ function(sysbuild_add_subdirectory source_dir) " (expected at most 2, got ${ARGC})" ) endif() - set(binary_dir ${ARGV1}) + set(binary_dir ${ARGN}) # Update SYSBUILD_CURRENT_SOURCE_DIR in this scope, to support nesting # of sysbuild_add_subdirectory() and even regular add_subdirectory(). From cfcb4f9204ec3e981d1f1e9f8a924fe82d2529fd Mon Sep 17 00:00:00 2001 From: Torsten Rasmussen Date: Fri, 17 May 2024 10:26:44 +0200 Subject: [PATCH 2/3] sysbuild: support sysbuild/CMakeLists.txt as entry point for samples This commit refactors sysbuild entry code by creating a CMake sysbuild module for image processing and place sysbuild entry code in a /sysbuild/CMakeLists.txt file. A template/CMakeLists.txt file will be use as template for applications which doesn't provide their own entry file. An application may create a sysbuild/CMakeLists.txt file. The sysbuild/CMakeLists.txt file is similar in nature to the toplevel CMakeLists.txt file but intended to used by sysbuild. This allows application developers to adjust how an application is built with sysbuild. Signed-off-by: Torsten Rasmussen --- .../cmake/SysbuildConfig.cmake | 9 +++++ .../cmake/SysbuildConfigVersion.cmake | 5 +++ share/sysbuild/CMakeLists.txt | 40 ++++--------------- .../cmake/modules/sysbuild_default.cmake | 19 +++++++++ .../cmake/modules/sysbuild_images.cmake | 27 +++++++++++++ .../cmake/modules/sysbuild_kconfig.cmake | 2 +- share/sysbuild/template/CMakeLists.txt | 12 ++++++ 7 files changed, 80 insertions(+), 34 deletions(-) create mode 100644 share/sysbuild-package/cmake/SysbuildConfig.cmake create mode 100644 share/sysbuild-package/cmake/SysbuildConfigVersion.cmake create mode 100644 share/sysbuild/cmake/modules/sysbuild_default.cmake create mode 100644 share/sysbuild/cmake/modules/sysbuild_images.cmake create mode 100644 share/sysbuild/template/CMakeLists.txt diff --git a/share/sysbuild-package/cmake/SysbuildConfig.cmake b/share/sysbuild-package/cmake/SysbuildConfig.cmake new file mode 100644 index 0000000000000..37343583bd80c --- /dev/null +++ b/share/sysbuild-package/cmake/SysbuildConfig.cmake @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +if(Sysbuild_FIND_COMPONENTS) + set(Zephyr_FIND_COMPONENTS ${Sysbuild_FIND_COMPONENTS}) +else() + set(Zephyr_FIND_COMPONENTS sysbuild_default) +endif() +include(${CMAKE_CURRENT_LIST_DIR}/../../zephyr-package/cmake/ZephyrConfig.cmake) +set(Sysbuild_FOUND True) diff --git a/share/sysbuild-package/cmake/SysbuildConfigVersion.cmake b/share/sysbuild-package/cmake/SysbuildConfigVersion.cmake new file mode 100644 index 0000000000000..1dede077c1d16 --- /dev/null +++ b/share/sysbuild-package/cmake/SysbuildConfigVersion.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 + +include(${CMAKE_CURRENT_LIST_DIR}/../../zephyr-package/cmake/ZephyrConfigVersion.cmake) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/../../sysbuild/cmake/modules) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} PARENT_SCOPE) diff --git a/share/sysbuild/CMakeLists.txt b/share/sysbuild/CMakeLists.txt index 4a6fde214d511..f4d5178448b29 100644 --- a/share/sysbuild/CMakeLists.txt +++ b/share/sysbuild/CMakeLists.txt @@ -12,38 +12,12 @@ endif() # If APP_DIR is a relative path, then CMake will adjust to absolute path based # on current working dir. set(APP_DIR ${APP_DIR} CACHE PATH "Main Application Source Directory") +set(Sysbuild_DIR ${CMAKE_CURRENT_LIST_DIR}/../sysbuild-package/cmake) -# Add sysbuild/cmake/modules to CMAKE_MODULE_PATH which allows us to integrate -# sysbuild CMake modules with general Zephyr CMake modules. -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/modules) -# List of Zephyr and sysbuild CMake modules we need for sysbuild. -# Note: sysbuild_kconfig will internally load kconfig CMake module. -set(zephyr_modules extensions - sysbuild_extensions python west root zephyr_module boards shields hwm_v2 - sysbuild_kconfig native_simulator_sb_extensions - ) +project(sysbuild_toplevel LANGUAGES) -find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE} COMPONENTS ${zephyr_modules}) - -project(sysbuild LANGUAGES) - -get_filename_component(APP_DIR ${APP_DIR} ABSOLUTE) -get_filename_component(app_name ${APP_DIR} NAME) -set(DEFAULT_IMAGE "${app_name}") - -# This is where all Zephyr applications are added to the multi-image build. -sysbuild_add_subdirectory(images) - -get_property(IMAGES GLOBAL PROPERTY sysbuild_images) -sysbuild_module_call(PRE_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) -sysbuild_images_order(IMAGES_CONFIGURATION_ORDER CONFIGURE IMAGES ${IMAGES}) -foreach(image ${IMAGES_CONFIGURATION_ORDER}) - sysbuild_module_call(PRE_IMAGE_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES} IMAGE ${image}) - ExternalZephyrProject_Cmake(APPLICATION ${image}) - sysbuild_module_call(POST_IMAGE_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES} IMAGE ${image}) -endforeach() -sysbuild_module_call(POST_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) - -sysbuild_module_call(PRE_DOMAINS MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) -include(cmake/domains.cmake) -sysbuild_module_call(POST_DOMAINS MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) +if(EXISTS ${APP_DIR}/sysbuild/CMakeLists.txt) + add_subdirectory(${APP_DIR}/sysbuild sysbuild/application) +else() + add_subdirectory(template sysbuild/application) +endif() diff --git a/share/sysbuild/cmake/modules/sysbuild_default.cmake b/share/sysbuild/cmake/modules/sysbuild_default.cmake new file mode 100644 index 0000000000000..6bcf714de952c --- /dev/null +++ b/share/sysbuild/cmake/modules/sysbuild_default.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: Apache-2.0 + +# +# Sysbuild default list of CMake modules to include in a regular sysbuild session. +# +include(extensions) +include(sysbuild_extensions) +include(python) +include(west) +include(root) +include(zephyr_module) +include(boards) +include(shields) +include(hwm_v2) +include(sysbuild_kconfig) +include(native_simulator_sb_extensions) +include(sysbuild_images) diff --git a/share/sysbuild/cmake/modules/sysbuild_images.cmake b/share/sysbuild/cmake/modules/sysbuild_images.cmake new file mode 100644 index 0000000000000..eb73ec994483f --- /dev/null +++ b/share/sysbuild/cmake/modules/sysbuild_images.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: Apache-2.0 + +# This module is responsible for including images into sysbuild and to call +# pre and post hooks. + +get_filename_component(APP_DIR ${APP_DIR} ABSOLUTE) +get_filename_component(app_name ${APP_DIR} NAME) +set(DEFAULT_IMAGE "${app_name}") + +# This is where all Zephyr applications are added to the multi-image build. +sysbuild_add_subdirectory(${sysbuild_toplevel_SOURCE_DIR}/images sysbuild/images) + +get_property(IMAGES GLOBAL PROPERTY sysbuild_images) +sysbuild_module_call(PRE_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) +sysbuild_images_order(IMAGES_CONFIGURATION_ORDER CONFIGURE IMAGES ${IMAGES}) +foreach(image ${IMAGES_CONFIGURATION_ORDER}) + sysbuild_module_call(PRE_IMAGE_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES} IMAGE ${image}) + ExternalZephyrProject_Cmake(APPLICATION ${image}) + sysbuild_module_call(POST_IMAGE_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES} IMAGE ${image}) +endforeach() +sysbuild_module_call(POST_CMAKE MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) + +sysbuild_module_call(PRE_DOMAINS MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) +include(${sysbuild_toplevel_SOURCE_DIR}/cmake/domains.cmake) +sysbuild_module_call(POST_DOMAINS MODULES ${SYSBUILD_MODULE_NAMES} IMAGES ${IMAGES}) diff --git a/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake b/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake index d18b5b7978d02..531e670dbc9f7 100644 --- a/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake +++ b/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake @@ -56,7 +56,7 @@ endif() # Empty files to make kconfig.py happy. file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/empty.conf) -set(APPLICATION_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(APPLICATION_SOURCE_DIR ${sysbuild_toplevel_SOURCE_DIR}) set(AUTOCONF_H ${CMAKE_CURRENT_BINARY_DIR}/autoconf.h) set(CONF_FILE ${SB_CONF_FILE}) set(EXTRA_CONF_FILE "${SB_EXTRA_CONF_FILE}") diff --git a/share/sysbuild/template/CMakeLists.txt b/share/sysbuild/template/CMakeLists.txt new file mode 100644 index 0000000000000..fc348a8dafb2e --- /dev/null +++ b/share/sysbuild/template/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: Apache-2.0 + +# Generic sysbuild CMakeLists.txt file used as sysbuild entry point for multi-image builds. +# +# Applications which requires custom handling when built using sysbuild may copy this +# file to the folder `/sysbuild` and use as a template and extend as needed. + +find_package(Sysbuild REQUIRED HINTS $ENV{ZEPHYR_BASE}) + +project(sysbuild LANGUAGES) From 8093a4ebd3428410875b11b315cc8be15a32da4a Mon Sep 17 00:00:00 2001 From: Torsten Rasmussen Date: Fri, 17 May 2024 11:27:40 +0200 Subject: [PATCH 3/3] sysbuild: add support for APPLICATION_CONFIG_DIR in sysbuild APPLICATION_CONFIG_DIR is supported in Zephyr and allows to adjust the location from which prj.conf and friends are picked up. This also works for images when using sysbuild, however sysbuild itself ignores the value of APPLICATION_CONFIG_DIR, meaning that sysbuild only accepts sysbuild.conf located directly in the sample folder. Extend sysbuild to support APPLICATION_CONFIG_DIR so sysbuild follows regular Zephyr CMake behavior. Introduce SB_APPLICATION_CONFIG_DIR to allow changing the location for sysbuild only, without propagating the value to images. Signed-off-by: Torsten Rasmussen --- .../cmake/modules/sysbuild_kconfig.cmake | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake b/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake index 531e670dbc9f7..6d55e8c8997d0 100644 --- a/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake +++ b/share/sysbuild/cmake/modules/sysbuild_kconfig.cmake @@ -13,13 +13,37 @@ set(EXTRA_KCONFIG_TARGET_COMMAND_FOR_sysbuild_guiconfig set(KCONFIG_TARGETS sysbuild_menuconfig sysbuild_guiconfig) list(TRANSFORM EXTRA_KCONFIG_TARGETS PREPEND "sysbuild_") +if(DEFINED APPLICATION_CONFIG_DIR AND NOT DEFINED CACHE{APPLICATION_CONFIG_DIR}) + set(APPLICATION_CONFIG_DIR "${APPLICATION_CONFIG_DIR}" CACHE INTERNAL "Application config dir") +elseif(DEFINED CACHE{APPLICATION_CONFIG_DIR} AND + NOT (APPLICATION_CONFIG_DIR STREQUAL "$CACHE{APPLICATION_CONFIG_DIR}")) + message(WARNING + "Sysbuild scoped APPLICATION_CONFIG_DIR and cached APPLICATION_CONFIG_DIR differs.\n" + "Setting value used internally by Sysbuild (sysbuild scoped):\n" + " - ${APPLICATION_CONFIG_DIR}\n" + "Setting value used by images (cached):\n" + " - $CACHE{APPLICATION_CONFIG_DIR}\n" + ) +endif() + +# If there is a dedicated SB_APPLICATION_CONFIG_DIR, then create a local +# scoped APPLICATION_CONFIG_DIR hiding any cache variant. +# The cache setting is the setting passed to sysbuild image cache files +if(DEFINED SB_APPLICATION_CONFIG_DIR) + set(APPLICATION_CONFIG_DIR ${SB_APPLICATION_CONFIG_DIR}) +elseif(NOT DEFINED APPLICATION_CONFIG_DIR) + get_filename_component(APP_DIR ${APP_DIR} ABSOLUTE) + set(APPLICATION_CONFIG_DIR ${APP_DIR}) +endif() +string(CONFIGURE ${APPLICATION_CONFIG_DIR} APPLICATION_CONFIG_DIR) + if(DEFINED SB_CONF_FILE) # SB_CONF_FILE already set so nothing to do. elseif(DEFINED ENV{SB_CONF_FILE}) set(SB_CONF_FILE $ENV{SB_CONF_FILE}) else() # sysbuild.conf is an optional file, because sysbuild is an opt-in feature. - zephyr_file(CONF_FILES ${APP_DIR} KCONF SB_CONF_FILE NAMES "sysbuild.conf" SUFFIX ${FILE_SUFFIX}) + zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR} KCONF SB_CONF_FILE NAMES "sysbuild.conf" SUFFIX ${FILE_SUFFIX}) endif() if(NOT DEFINED SB_EXTRA_CONF_FILE AND DEFINED SB_OVERLAY_CONFIG)