From 6c658c0a2aa4ea2482a13ec4c34218a88cd8242e Mon Sep 17 00:00:00 2001
From: Anders Roxell <anders.roxell@linaro.org>
Date: Tue, 9 Dec 2025 09:14:32 +0100
Subject: [PATCH 1/8] kbuild: Add backend parameter and refactor build logic

The kbuild system only supported make-based kernel builds. To enable
alternative build systems, we needed a way to select different backends
while keeping the existing code working.

Added a 'backend' parameter that defaults to 'make' for compatibility.
Extracted the make build logic from _generate_script() into a dedicated
_build_with_make() method so different backends can have their own build
implementations.

Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
---
 kernelci/kbuild.py | 45 ++++++++++++++++++++++++---------------------
 1 file changed, 24 insertions(+), 21 deletions(-)

diff --git a/kernelci/kbuild.py b/kernelci/kbuild.py
index 0dacb8c683bd..c1b050bc097b 100644
--- a/kernelci/kbuild.py
+++ b/kernelci/kbuild.py
@@ -165,6 +165,7 @@ class KBuild():
             # if defconfig contains '+', it means it is a list
             if isinstance(self._defconfig, str) and '+' in self._defconfig:
                 self._defconfig = self._defconfig.split('+')
+            self._backend = params.get('backend', 'make')
             self._fragments = params['fragments']
             self._fragment_configs = fragment_configs or {}
             if 'coverage' in self._fragments:
@@ -220,6 +221,7 @@ class KBuild():
             self._defconfig = jsonobj['defconfig']
             self._fragments = jsonobj['fragments']
             self._fragment_configs = jsonobj.get('fragment_configs', {})
+            self._backend = jsonobj.get('backend', 'make')
             self._cross_compile = jsonobj['cross_compile']
             self._cross_compile_compat = jsonobj['cross_compile_compat']
             self._steps = jsonobj['steps']
@@ -635,30 +637,10 @@ trap - ERR
 
     def _generate_script(self):
         """ Generate shell script for complete build """
-        # TODO(nuclearcat): Fetch firmware only if needed
         print("Generating shell script")
         fragnum = self._parse_fragments(firmware=True)
         self._merge_frags(fragnum)
-        if not self._dtbs_check:
-            # TODO: verify if CONFIG_EXTRA_FIRMWARE have any files
-            # We can check that if fragments have CONFIG_EXTRA_FIRMWARE
-            self._fetch_firmware()
-            self._build_kernel()
-            self._build_modules()
-            if self._kfselftest:
-                self._build_kselftest()
-            if self._arch not in DTBS_DISABLED:
-                self._build_dtbs()
-            self._package_kimage()
-            self._package_modules()
-            if self._coverage:
-                self._package_coverage()
-            if self._kfselftest:
-                self._package_kselftest()
-            if self._arch not in DTBS_DISABLED:
-                self._package_dtbs()
-        else:
-            self._build_dtbs_check()
+        self._build_with_make()
         self._write_metadata()
         # terminate all active jobs
         self.startjob(None)
@@ -697,6 +679,27 @@ trap 'case $stage in
         # copy to artifacts dir
         os.system(f"cp {filename} {self._af_dir}/build.sh")
 
+    def _build_with_make(self):
+        """ Build kernel using make """
+        if not self._dtbs_check:
+            self._fetch_firmware()
+            self._build_kernel()
+            self._build_modules()
+            if self._kfselftest:
+                self._build_kselftest()
+            if self._arch not in DTBS_DISABLED:
+                self._build_dtbs()
+            self._package_kimage()
+            self._package_modules()
+            if self._coverage:
+                self._package_coverage()
+            if self._kfselftest:
+                self._package_kselftest()
+            if self._arch not in DTBS_DISABLED:
+                self._package_dtbs()
+        else:
+            self._build_dtbs_check()
+
     def _build_kernel(self):
         """ Add kernel build steps """
         self.startjob("build_kernel")
-- 
2.51.0

