sysbuild: Add support for snippets

Adds support for sysbuild loading snippets, these can be included
by using e.g.: cmake ... -DSB_SNIPPET=blah for sysbuild
directly or can be used with an application and sysbuild using
-DSNIPPET. Snippets for sysbuild can use SB_EXTRA_CONF_FILE in the
snippet file to specify an extra Kconfig fragment for sysbuild

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
diff --git a/scripts/snippets.py b/scripts/snippets.py
index 0cdc0d31..d725f08 100644
--- a/scripts/snippets.py
+++ b/scripts/snippets.py
@@ -48,11 +48,11 @@
     appends: Appends = field(default_factory=_new_append)
     board2appends: Dict[str, Appends] = field(default_factory=_new_board2appends)
 
-    def process_data(self, pathobj: Path, snippet_data: dict):
+    def process_data(self, pathobj: Path, snippet_data: dict, sysbuild: bool):
         '''Process the data in a snippet.yml file, after it is loaded into a
         python object and validated by pykwalify.'''
         def append_value(variable, value):
-            if variable in ('EXTRA_DTC_OVERLAY_FILE', 'EXTRA_CONF_FILE'):
+            if variable in ('SB_EXTRA_CONF_FILE', 'EXTRA_DTC_OVERLAY_FILE', 'EXTRA_CONF_FILE'):
                 path = pathobj.parent / value
                 if not path.is_file():
                     _err(f'snippet file {pathobj}: {variable}: file not found: {path}')
@@ -62,14 +62,18 @@
             _err(f'unknown append variable: {variable}')
 
         for variable, value in snippet_data.get('append', {}).items():
-            self.appends[variable].append(append_value(variable, value))
+            if (sysbuild is True and variable[0:3] == 'SB_') or \
+            (sysbuild is False and variable[0:3] != 'SB_'):
+                self.appends[variable].append(append_value(variable, value))
         for board, settings in snippet_data.get('boards', {}).items():
             if board.startswith('/') and not board.endswith('/'):
                 _err(f"snippet file {pathobj}: board {board} starts with '/', so "
                      "it must end with '/' to use a regular expression")
             for variable, value in settings.get('append', {}).items():
-                self.board2appends[board][variable].append(
-                    append_value(variable, value))
+                if (sysbuild is True and variable[0:3] == 'SB_') or \
+                (sysbuild is False and variable[0:3] != 'SB_'):
+                    self.board2appends[board][variable].append(
+                        append_value(variable, value))
 
 class Snippets(UserDict):
     '''Type for all the information we have discovered about all snippets.
@@ -212,6 +216,8 @@
     parser.add_argument('--cmake-out', type=Path,
                         help='''file to write cmake output to; include()
                         this file after calling this script''')
+    parser.add_argument('--sysbuild', action="store_true",
+                        help='''set if this is running as sysbuild''')
     return parser.parse_args()
 
 def setup_logging():
@@ -234,7 +240,7 @@
     # Process each path in snippet_root in order, adjusting
     # snippets as needed for each one.
     for root in args.snippet_root:
-        process_snippets_in(root, snippets)
+        process_snippets_in(root, snippets, args.sysbuild)
 
     return snippets
 
@@ -250,11 +256,11 @@
     # Process each path in snippet_root in order, adjusting
     # snippets as needed for each one.
     for root in snippet_roots:
-        process_snippets_in(root, snippets)
+        process_snippets_in(root, snippets, False)
 
     return snippets
 
-def process_snippets_in(root_dir: Path, snippets: Snippets) -> None:
+def process_snippets_in(root_dir: Path, snippets: Snippets, sysbuild: bool) -> None:
     '''Process snippet.yml files in *root_dir*,
     updating *snippets* as needed.'''
 
@@ -276,7 +282,7 @@
         name = snippet_data['name']
         if name not in snippets:
             snippets[name] = Snippet(name=name)
-        snippets[name].process_data(snippet_yml, snippet_data)
+        snippets[name].process_data(snippet_yml, snippet_data, sysbuild)
         snippets.paths.add(snippet_yml)
 
 def load_snippet_yml(snippet_yml: Path) -> dict: