samples: sysbuild: add hello world for multiple board targets

Add a new "hello world" sample that can be built for multiple board
targets. This sample can be used to see if Zephyr boots successfully
with _minimal_ configuration on SoCs with multiple cores, or boards with
multiple SoCs.

The following configurations are provided for now:

- nRF5340 DK: cpuapp+cpunet
- nRF54H20 DK: cpuapp+cpurad, cpuapp+cpuppr, cpuapp+cpuppr(xip)

Note that because of a quoting bug somewhere in the build system,
SB_CONFIG_REMOTE_BOARD is specified in .conf files (see the sysbuild/
directory). This should be fixed in the near future.

Signed-off-by: Gerard Marull-Paretas <gerard@teslabs.com>
diff --git a/samples/sysbuild/hello_world/CMakeLists.txt b/samples/sysbuild/hello_world/CMakeLists.txt
new file mode 100644
index 0000000..f58082a
--- /dev/null
+++ b/samples/sysbuild/hello_world/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright (c) 2024 Nordic Semiconductor ASA
+# SPDX-License-Identifier: Apache-2.0
+
+cmake_minimum_required(VERSION 3.20.0)
+find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
+
+project(hello_world)
+target_sources(app PRIVATE src/main.c)
diff --git a/samples/sysbuild/hello_world/Kconfig.sysbuild b/samples/sysbuild/hello_world/Kconfig.sysbuild
new file mode 100644
index 0000000..edec01b
--- /dev/null
+++ b/samples/sysbuild/hello_world/Kconfig.sysbuild
@@ -0,0 +1,7 @@
+# Copyright (c) 2024 Nordic Semiconductor ASA
+# SPDX-License-Identifier: Apache-2.0
+
+source "${ZEPHYR_BASE}/share/sysbuild/Kconfig"
+
+config REMOTE_BOARD
+	string "The board used for remote target"
diff --git a/samples/sysbuild/hello_world/README.rst b/samples/sysbuild/hello_world/README.rst
new file mode 100644
index 0000000..2cb0208
--- /dev/null
+++ b/samples/sysbuild/hello_world/README.rst
@@ -0,0 +1,69 @@
+.. zephyr:code-sample:: sysbuild_hello_world
+   :name: Hello World for multiple board targets using Sysbuild
+
+   Run a hello world sample on multiple board targets
+
+Overview
+********
+
+The sample demonstrates how to build a Hello World application for two board
+targets with :ref:`sysbuild`. This sample can be useful to test, for example,
+SoCs with multiple cores as each core is exposed as a board target. Other
+scenarios could include boards embedding multiple SoCs. When building with
+Zephyr Sysbuild, the build system adds additional images based on the options
+selected in the project's additional configuration and build files.
+
+All images use the same :file:`main.c` that prints the board target on which the
+application is programmed.
+
+Building and Running
+********************
+
+This sample needs to be built with Sysbuild by using the ``--sysbuild`` option.
+The remote board needs to be specified using ``SB_CONFIG_REMOTE_BOARD``. Some
+additional settings may be required depending on the platform, for example,
+to boot a remote core.
+
+.. note::
+   It is recommended to use sample setups from
+   :zephyr_file:`samples/basic/multitarget_hello_world/sample.yaml` using the
+   ``-T`` option.
+
+Here's an example to build and flash the sample for the
+:ref:`nrf54h20dk_nrf54h20`, using application and radio cores:
+
+.. zephyr-app-commands::
+   :zephyr-app: samples/basic/multitarget_hello_world
+   :board: nrf54h20dk/nrf54h20/cpuapp
+   :west-args: --sysbuild
+   :gen-args: -DSB_CONFIG_REMOTE_BOARD='"nrf54h20dk/nrf54h20/cpurad"'
+   :goals: build flash
+   :compact:
+
+The same can be achieved by using the
+:zephyr_file:`samples/basic/multitarget_hello_world/sample.yaml` setup:
+
+.. zephyr-app-commands::
+   :zephyr-app: samples/basic/multitarget_hello_world
+   :board: nrf54h20dk/nrf54h20/cpuapp
+   :west-args: -T sample.basic.multitarget_hello_world.nrf54h20dk_cpuapp_cpurad
+   :goals: build flash
+   :compact:
+
+After programming the sample to your board, you should observe a hello world
+message in the Zephyr console configured on each target. For example, for the
+sample above:
+
+Application core
+
+   .. code-block:: console
+
+      *** Booting Zephyr OS build v3.6.0-274-g466084bd8c5d ***
+      Hello world from nrf54h20dk/nrf54h20/cpuapp
+
+Radio core
+
+   .. code-block:: console
+
+      *** Booting Zephyr OS build v3.6.0-274-g466084bd8c5d ***
+      Hello world from nrf54h20dk/nrf54h20/cpurad
diff --git a/samples/sysbuild/hello_world/boards/nrf5340dk_nrf5340_cpuapp.conf b/samples/sysbuild/hello_world/boards/nrf5340dk_nrf5340_cpuapp.conf
new file mode 100644
index 0000000..046b18c
--- /dev/null
+++ b/samples/sysbuild/hello_world/boards/nrf5340dk_nrf5340_cpuapp.conf
@@ -0,0 +1,4 @@
+# Copyright (c) 2024 Nordic Semiconductor ASA
+# SPDX-License-Identifier: Apache-2.0
+
+CONFIG_BOARD_ENABLE_CPUNET=y
diff --git a/samples/sysbuild/hello_world/prj.conf b/samples/sysbuild/hello_world/prj.conf
new file mode 100644
index 0000000..becd6a5
--- /dev/null
+++ b/samples/sysbuild/hello_world/prj.conf
@@ -0,0 +1 @@
+# no additional configuration is required
diff --git a/samples/sysbuild/hello_world/remote/CMakeLists.txt b/samples/sysbuild/hello_world/remote/CMakeLists.txt
new file mode 100644
index 0000000..62961af
--- /dev/null
+++ b/samples/sysbuild/hello_world/remote/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright (c) 2024 Nordic Semiconductor ASA
+# SPDX-License-Identifier: Apache-2.0
+
+cmake_minimum_required(VERSION 3.20.0)
+find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
+
+project(remote)
+target_sources(app PRIVATE ../src/main.c)
diff --git a/samples/sysbuild/hello_world/remote/prj.conf b/samples/sysbuild/hello_world/remote/prj.conf
new file mode 100644
index 0000000..becd6a5
--- /dev/null
+++ b/samples/sysbuild/hello_world/remote/prj.conf
@@ -0,0 +1 @@
+# no additional configuration is required
diff --git a/samples/sysbuild/hello_world/sample.yaml b/samples/sysbuild/hello_world/sample.yaml
new file mode 100644
index 0000000..5add79c
--- /dev/null
+++ b/samples/sysbuild/hello_world/sample.yaml
@@ -0,0 +1,44 @@
+sample:
+  name: Hello World for multiple board targets using Sysbuild
+  description: |
+    Hello World application that builds for multiple targets. Both images print
+    the board target they were run on.
+
+common:
+  build_only: true
+  sysbuild: true
+
+tests:
+  sample.sysbuild.hello_world.nrf5340dk_cpuapp_cpunet:
+    platform_allow:
+      - nrf5340dk/nrf5340/cpuapp
+    integration_platforms:
+      - nrf5340dk/nrf5340/cpuapp
+    extra_args:
+      SB_CONF_FILE=sysbuild/nrf5340dk_nrf5340_cpunet.conf
+
+  sample.sysbuild.hello_world.nrf54h20dk_cpuapp_cpurad:
+    platform_allow:
+      - nrf54h20dk/nrf54h20/cpuapp
+    integration_platforms:
+      - nrf54h20dk/nrf54h20/cpuapp
+    extra_args:
+      SB_CONF_FILE=sysbuild/nrf54h20dk_nrf54h20_cpurad.conf
+
+  sample.sysbuild.hello_world.nrf54h20dk_cpuapp_cpuppr:
+    platform_allow:
+      - nrf54h20dk/nrf54h20/cpuapp
+    integration_platforms:
+      - nrf54h20dk/nrf54h20/cpuapp
+    extra_args:
+      SB_CONF_FILE=sysbuild/nrf54h20dk_nrf54h20_cpuppr.conf
+      hello_world_SNIPPET=nordic-ppr
+
+  sample.sysbuild.hello_world.nrf54h20dk_cpuapp_cpuppr_xip:
+    platform_allow:
+      - nrf54h20dk/nrf54h20/cpuapp
+    integration_platforms:
+      - nrf54h20dk/nrf54h20/cpuapp
+    extra_args:
+      SB_CONF_FILE=sysbuild/nrf54h20dk_nrf54h20_cpuppr_xip.conf
+      hello_world_SNIPPET=nordic-ppr-xip
diff --git a/samples/sysbuild/hello_world/src/main.c b/samples/sysbuild/hello_world/src/main.c
new file mode 100644
index 0000000..af5b6fd
--- /dev/null
+++ b/samples/sysbuild/hello_world/src/main.c
@@ -0,0 +1,13 @@
+/*
+ * Copyright (c) 2024 Nordic Semiconductor ASA
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <zephyr/sys/printk.h>
+
+int main(void)
+{
+	printk("Hello world from %s\n", CONFIG_BOARD_TARGET);
+
+	return 0;
+}
diff --git a/samples/sysbuild/hello_world/sysbuild.cmake b/samples/sysbuild/hello_world/sysbuild.cmake
new file mode 100644
index 0000000..b59062d
--- /dev/null
+++ b/samples/sysbuild/hello_world/sysbuild.cmake
@@ -0,0 +1,15 @@
+# Copyright (c) 2024 Nordic Semiconductor ASA
+# SPDX-License-Identifier: Apache-2.0
+
+if("${SB_CONFIG_REMOTE_BOARD}" STREQUAL "")
+  message(FATAL_ERROR "REMOTE_BOARD must be set to a valid board name")
+endif()
+
+ExternalZephyrProject_Add(
+  APPLICATION remote
+  SOURCE_DIR ${APP_DIR}/remote
+  BOARD ${SB_CONFIG_REMOTE_BOARD}
+)
+
+add_dependencies(hello_world remote)
+sysbuild_add_dependencies(FLASH hello_world remote)
diff --git a/samples/sysbuild/hello_world/sysbuild/nrf5340dk_nrf5340_cpunet.conf b/samples/sysbuild/hello_world/sysbuild/nrf5340dk_nrf5340_cpunet.conf
new file mode 100644
index 0000000..b8ae05d
--- /dev/null
+++ b/samples/sysbuild/hello_world/sysbuild/nrf5340dk_nrf5340_cpunet.conf
@@ -0,0 +1 @@
+SB_CONFIG_REMOTE_BOARD="nrf5340dk/nrf5340/cpunet"
diff --git a/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpuppr.conf b/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpuppr.conf
new file mode 100644
index 0000000..f50bc85
--- /dev/null
+++ b/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpuppr.conf
@@ -0,0 +1 @@
+SB_CONFIG_REMOTE_BOARD="nrf54h20dk/nrf54h20/cpuppr"
diff --git a/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpuppr_xip.conf b/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpuppr_xip.conf
new file mode 100644
index 0000000..270c92c
--- /dev/null
+++ b/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpuppr_xip.conf
@@ -0,0 +1 @@
+SB_CONFIG_REMOTE_BOARD="nrf54h20dk/nrf54h20/cpuppr/xip"
diff --git a/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpurad.conf b/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpurad.conf
new file mode 100644
index 0000000..dd863e7
--- /dev/null
+++ b/samples/sysbuild/hello_world/sysbuild/nrf54h20dk_nrf54h20_cpurad.conf
@@ -0,0 +1 @@
+SB_CONFIG_REMOTE_BOARD="nrf54h20dk/nrf54h20/cpurad"