From 481b7ba028d896b1012239f4873960d9de8b319a Mon Sep 17 00:00:00 2001 From: andreili Date: Sun, 7 Sep 2025 13:08:20 +0200 Subject: [PATCH] Make kernel build maximal cross-platform. --- config/board/btt_cb1.json | 35 +----------------- config/board/btt_pi2.json | 32 +++------------- config/target_meta.json | 54 ++++++++++++++++++++++++++- scripts/board.py | 38 +++++++++++++------ scripts/target.py | 78 ++++++++++++++++++++++----------------- 5 files changed, 130 insertions(+), 107 deletions(-) diff --git a/config/board/btt_cb1.json b/config/board/btt_cb1.json index 3339ee9..c94a881 100644 --- a/config/board/btt_cb1.json +++ b/config/board/btt_cb1.json @@ -51,40 +51,7 @@ "makeopts": "CROSS_COMPILE=%{CROSS_C}% BL31=%{out_dir}%/bl31.bin" }, { - "parent": "kernel", - "version": "v6.16-rc2", - "version_type": "tag", - "patch_dir": [ "kernel", "kernel/sunxi-6.16", "kernel/rockchip64-6.16" ], - "config_def": "printer_defconfig", - "target": [ "clean", "Image", "modules", "dtbs", "modules_install" ], - "artifacts": - [ - { - "file": "arch/arm64/boot/Image", - "store_type": "boot" - }, - { - "file": "arch/arm64/boot/dts/%{DTB_FILE}%", - "store_type": "boot", - "subdir": "dtb/allwinner", - "destdir": "dtb" - }, - { - "file": "arch/arm64/boot/dts/allwinner/overlay/%{DTO_FILES}%", - "store_type": "none", - "subdir": "dtb/allwinner/overlay" - } - ], - "makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCH=arm64 INSTALL_MOD_PATH=%{out_dir}%/kmods/usr" - }, - { - "parent": "rtl8189ES_linux", - "version": "rtl8189fs", - "version_type": "branch", - "target": [ "modules", "install" ], - "makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCH=arm64 MODDESTDIR=%{out_dir}%/kmods/usr/lib/modules/*/kernel/drivers/net/wireless KSRC=%{common_dir}%/kernel", - "artifacts": - [] + "parent": "kernel" } ], "install": diff --git a/config/board/btt_pi2.json b/config/board/btt_pi2.json index f879a96..2cafa09 100644 --- a/config/board/btt_pi2.json +++ b/config/board/btt_pi2.json @@ -1,7 +1,7 @@ { "build": [ - "rkbin", "uboot", "kernel" + "uboot", "kernel" ], "variables": [ @@ -38,6 +38,10 @@ "version": "@", "version_type": "head", "patch_dir": "uboot/btt", + "deps": + [ + "rkbin" + ], "artifacts": [ { @@ -61,31 +65,7 @@ "makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCHV=%{ARCH}% ROCKCHIP_TPL=%{out_dir}%/%{TPL_BIN}% BL31=%{out_dir}%/%{BL31_BIN}%" }, { - "parent": "kernel", - "version": "v6.16-rc2", - "version_type": "tag", - "patch_dir": [ "kernel", "kernel/sunxi-6.16", "kernel/rockchip64-6.16" ], - "config_def": "printer_defconfig", - "target": [ "Image", "modules", "dtbs", "modules_install" ], - "artifacts": - [ - { - "file": "arch/arm64/boot/Image", - "store_type": "boot" - }, - { - "file": "arch/arm64/boot/dts/%{DTB_FILE}%", - "store_type": "boot", - "subdir": "dtb/rockchip", - "destdir": "dtb" - }, - { - "file": "arch/arm64/boot/dts/%{DTO_FILES}%", - "store_type": "none", - "subdir": "dtb/rockchip/overlays" - } - ], - "makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCH=arm64 INSTALL_MOD_PATH=%{out_dir}%/kmods/usr" + "parent": "kernel" } ], "install": diff --git a/config/target_meta.json b/config/target_meta.json index fbcab08..283082f 100644 --- a/config/target_meta.json +++ b/config/target_meta.json @@ -22,7 +22,51 @@ "url": "https://github.com/torvalds/linux.git", "config": true, "config_target": "menuconfig", - "is_shared": true + "is_shared": true, + "version": "v6.16-rc2", + "version_type": "tag", + "patch_dir": [ "kernel", "kernel/sunxi-6.16", "kernel/rockchip64-6.16" ], + "config_def": "printer_defconfig", + "target": [ "Image", "modules", "dtbs", "modules_install" ], + "common": true, + "artifacts": + [ + { + "file": "", + "kmods": true + }, + { + "file": "arch/arm64/boot/Image", + "store_type": "boot" + }, + { + "file": "arch/arm64/boot/dts/rockchip/rk3566-bigtreetech-pi2.dtb", + "store_type": "boot", + "subdir": "dtb/rockchip", + "destdir": "dtb" + }, + { + "file": "arch/arm64/boot/dts/rockchip/rk3566-*.dtbo", + "store_type": "none", + "subdir": "dtb/rockchip/overlays" + }, + { + "file": "arch/arm64/boot/dts/allwinner/sun50i-h616-bigtreetech-cb1*.dtb", + "store_type": "boot", + "subdir": "dtb/allwinner", + "destdir": "dtb" + }, + { + "file": "arch/arm64/boot/dts/allwinner/overlay/sun50i-h616*.dtbo", + "store_type": "none", + "subdir": "dtb/allwinner/overlay" + } + ], + "makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCH=arm64 INSTALL_MOD_PATH=%{out_sh}%/kmods/usr", + "modules": + [ + "rtl8189ES_linux" + ] } }, { @@ -39,7 +83,13 @@ { "url": "https://github.com/jwrdegoede/rtl8189ES_linux.git", "config": false, - "is_shared": false + "is_shared": true, + "version": "rtl8189fs", + "version_type": "branch", + "target": [ "modules", "install" ], + "makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCH=arm64 MODDESTDIR=%{out_sh}%/kmods/usr/lib/modules/*/kernel/drivers/net/wireless KSRC=%{common_dir}%/kernel", + "artifacts": + [] } }, { diff --git a/scripts/board.py b/scripts/board.py index 7181c71..afc145f 100644 --- a/scripts/board.py +++ b/scripts/board.py @@ -21,6 +21,12 @@ class Board: Logger.error("Unable to find parent for package!") t.load_detail(self.name, target, self.parse_variables) self.targets.append(t) + for module in t.modules: + m = self.__find_meta(targets_meta, module) + if (m == 0): + Logger.error("Unable to find parent for module!") + m.load_detail(self.name, None, self.parse_variables) + self.targets.append(m) self.__scan_deps() def __scan_deps(self): @@ -74,6 +80,26 @@ class Board: for target in self.targets: target.source_sync() + def __build(self, target_list, sub_target): + is_finded = False + for t_name in target_list: + for target in self.targets: + if (t_name == target.name): + is_finded = True + if (target.is_shared): + out_dir = self.out_sh + else: + out_dir = self.out_dir + for dep in target.depends: + if (sub_target == ""): + #when run sub-target - not need to check a deps + dep.build("", out_dir) + target.build(sub_target, out_dir) + for module in target.modules: + self.__build([module], "") + break + return is_finded + def build(self, target_name): sub_target = "" if (target_name == "all"): @@ -83,16 +109,6 @@ class Board: target_list = [ targets[0] ] if (len(targets) > 1): sub_target = targets[1] - is_finded = False - for t_name in target_list: - for target in self.targets: - if (t_name == target.name): - is_finded = True - for dep in target.depends: - if (sub_target == ""): - #when run sub-target - not need to check a deps - dep.build("", self.out_dir) - target.build(sub_target, self.out_dir) - break + is_finded = self.__build(target_list, sub_target) if (not is_finded): Logger.error("Don't find target!") diff --git a/scripts/target.py b/scripts/target.py index 85bdc3f..fcdc849 100644 --- a/scripts/target.py +++ b/scripts/target.py @@ -5,17 +5,27 @@ from . import * class Target: def __init__(self, meta_js): self.name = '' + self.config_target = "" + self.patch_dir = "" + self.dep_names = [] + self.makeopts = "" + self.defconfig = "" + self.version = "" + self.no_build = False + self.artifacts = [] + self.modules = [] + self.have_config = False for key in meta_js.keys(): if (self.name != ''): raise "Invalid target definition!" self.name = key - self.sources = Sources(self.name, meta_js[key]["url"]) - self.have_config = meta_js[key]["config"] + meta_info = meta_js[key] + self.sources = Sources(self.name, meta_info["url"]) + self.have_config = meta_info["config"] if (self.have_config): - self.config_target = meta_js[key]["config_target"] - else: - self.config_target = "" - self.is_shared = meta_js[key]["is_shared"] + self.config_target = meta_info["config_target"] + self.is_shared = meta_info["is_shared"] + self.__load_info(meta_info) def load_meta(meta_fn): with open(meta_fn) as json_data: @@ -27,43 +37,42 @@ class Target: res.append(t) return res + def __load_info(self, info_js, parse_variables=None): + if ("version" in info_js): + self.sources.set_git_params(info_js["version"], info_js["version_type"]) + self.target = info_js["target"] + self.version = info_js["version"] + if ("patch_dir" in info_js): + self.patch_dir = info_js["patch_dir"] + if ("deps" in info_js): + self.dep_names = info_js["deps"] + if ("makeopts" in info_js): + self.makeopts = info_js["makeopts"] + if ("config_def" in info_js): + self.defconfig = info_js["config_def"] + if ("no_build" in info_js): + self.no_build = True + if ("artifacts" in info_js): + _artifacts = info_js["artifacts"] + for art in _artifacts: + self.artifacts.append(art) + if ("modules" in info_js): + self.modules = info_js["modules"] + def load_detail(self, board_name, detail_js, parse_variables): self.board_name = board_name self.sources.init_source_path(board_name, self.is_shared) - self.sources.set_git_params(detail_js["version"], detail_js["version_type"]) - self.target = detail_js["target"] - self.version = detail_js["version"] + if (detail_js != None): + self.__load_info(detail_js, parse_variables) if (self.is_shared): self.config_name = f"{ROOT_DIR}/cfg/{self.name}" else: self.config_name = f"{ROOT_DIR}/cfg/{board_name}/{self.name}" if (self.version != "") and (self.version != "@"): self.config_name += f"_{self.version}" - if ("patch_dir" in detail_js): - self.patch_dir = detail_js["patch_dir"] - else: - self.patch_dir = "" - if ("deps" in detail_js): - self.dep_names = detail_js["deps"] - else: - self.dep_names = [] - if ("makeopts" in detail_js): - self.makeopts = parse_variables(detail_js["makeopts"]) - else: - self.makeopts = "" - if ("config_def" in detail_js): - self.defconfig = detail_js["config_def"] - else: - self.defconfig = "" - if ("no_build" in detail_js): - self.no_build = True - else: - self.no_build = False - _artifacts = detail_js["artifacts"] - self.artifacts = [] - for art in _artifacts: + self.makeopts = parse_variables(self.makeopts) + for art in self.artifacts: art["file"] = parse_variables(art["file"]) - self.artifacts.append(art) def source_sync(self): Logger.build(f"'{self.name}': Source prepare") @@ -90,7 +99,8 @@ class Target: opts_tmp.append(target) self.sources.compile(opts_tmp, self.config_name) if (sub_target != "config"): - self.sources.copy_artifacts(self.artifacts, out_dir) + print(f"Copy '{self.artifacts}' to '{out_dir}'") + #self.sources.copy_artifacts(self.artifacts, out_dir) def install_files(self, dir, tmp_dir, part_name, on_file, on_dd): Logger.install(f"'{self.name}': Install artifacts")