Make kernel build maximal cross-platform.

This commit is contained in:
andreili 2025-09-07 13:08:20 +02:00
parent 31c8ed75f6
commit 481b7ba028
5 changed files with 130 additions and 107 deletions

View File

@ -51,40 +51,7 @@
"makeopts": "CROSS_COMPILE=%{CROSS_C}% BL31=%{out_dir}%/bl31.bin" "makeopts": "CROSS_COMPILE=%{CROSS_C}% BL31=%{out_dir}%/bl31.bin"
}, },
{ {
"parent": "kernel", "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":
[]
} }
], ],
"install": "install":

View File

@ -1,7 +1,7 @@
{ {
"build": "build":
[ [
"rkbin", "uboot", "kernel" "uboot", "kernel"
], ],
"variables": "variables":
[ [
@ -38,6 +38,10 @@
"version": "@", "version": "@",
"version_type": "head", "version_type": "head",
"patch_dir": "uboot/btt", "patch_dir": "uboot/btt",
"deps":
[
"rkbin"
],
"artifacts": "artifacts":
[ [
{ {
@ -61,31 +65,7 @@
"makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCHV=%{ARCH}% ROCKCHIP_TPL=%{out_dir}%/%{TPL_BIN}% BL31=%{out_dir}%/%{BL31_BIN}%" "makeopts": "CROSS_COMPILE=%{CROSS_C}% ARCHV=%{ARCH}% ROCKCHIP_TPL=%{out_dir}%/%{TPL_BIN}% BL31=%{out_dir}%/%{BL31_BIN}%"
}, },
{ {
"parent": "kernel", "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"
} }
], ],
"install": "install":

View File

@ -22,7 +22,51 @@
"url": "https://github.com/torvalds/linux.git", "url": "https://github.com/torvalds/linux.git",
"config": true, "config": true,
"config_target": "menuconfig", "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", "url": "https://github.com/jwrdegoede/rtl8189ES_linux.git",
"config": false, "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":
[]
} }
}, },
{ {

View File

@ -21,6 +21,12 @@ class Board:
Logger.error("Unable to find parent for package!") Logger.error("Unable to find parent for package!")
t.load_detail(self.name, target, self.parse_variables) t.load_detail(self.name, target, self.parse_variables)
self.targets.append(t) 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() self.__scan_deps()
def __scan_deps(self): def __scan_deps(self):
@ -74,6 +80,26 @@ class Board:
for target in self.targets: for target in self.targets:
target.source_sync() 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): def build(self, target_name):
sub_target = "" sub_target = ""
if (target_name == "all"): if (target_name == "all"):
@ -83,16 +109,6 @@ class Board:
target_list = [ targets[0] ] target_list = [ targets[0] ]
if (len(targets) > 1): if (len(targets) > 1):
sub_target = targets[1] sub_target = targets[1]
is_finded = False is_finded = self.__build(target_list, sub_target)
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
if (not is_finded): if (not is_finded):
Logger.error("Don't find target!") Logger.error("Don't find target!")

View File

@ -5,17 +5,27 @@ from . import *
class Target: class Target:
def __init__(self, meta_js): def __init__(self, meta_js):
self.name = '' 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(): for key in meta_js.keys():
if (self.name != ''): if (self.name != ''):
raise "Invalid target definition!" raise "Invalid target definition!"
self.name = key self.name = key
self.sources = Sources(self.name, meta_js[key]["url"]) meta_info = meta_js[key]
self.have_config = meta_js[key]["config"] self.sources = Sources(self.name, meta_info["url"])
self.have_config = meta_info["config"]
if (self.have_config): if (self.have_config):
self.config_target = meta_js[key]["config_target"] self.config_target = meta_info["config_target"]
else: self.is_shared = meta_info["is_shared"]
self.config_target = "" self.__load_info(meta_info)
self.is_shared = meta_js[key]["is_shared"]
def load_meta(meta_fn): def load_meta(meta_fn):
with open(meta_fn) as json_data: with open(meta_fn) as json_data:
@ -27,43 +37,42 @@ class Target:
res.append(t) res.append(t)
return res 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): def load_detail(self, board_name, detail_js, parse_variables):
self.board_name = board_name self.board_name = board_name
self.sources.init_source_path(board_name, self.is_shared) self.sources.init_source_path(board_name, self.is_shared)
self.sources.set_git_params(detail_js["version"], detail_js["version_type"]) if (detail_js != None):
self.target = detail_js["target"] self.__load_info(detail_js, parse_variables)
self.version = detail_js["version"]
if (self.is_shared): if (self.is_shared):
self.config_name = f"{ROOT_DIR}/cfg/{self.name}" self.config_name = f"{ROOT_DIR}/cfg/{self.name}"
else: else:
self.config_name = f"{ROOT_DIR}/cfg/{board_name}/{self.name}" self.config_name = f"{ROOT_DIR}/cfg/{board_name}/{self.name}"
if (self.version != "") and (self.version != "@"): if (self.version != "") and (self.version != "@"):
self.config_name += f"_{self.version}" self.config_name += f"_{self.version}"
if ("patch_dir" in detail_js): self.makeopts = parse_variables(self.makeopts)
self.patch_dir = detail_js["patch_dir"] for art in self.artifacts:
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:
art["file"] = parse_variables(art["file"]) art["file"] = parse_variables(art["file"])
self.artifacts.append(art)
def source_sync(self): def source_sync(self):
Logger.build(f"'{self.name}': Source prepare") Logger.build(f"'{self.name}': Source prepare")
@ -90,7 +99,8 @@ class Target:
opts_tmp.append(target) opts_tmp.append(target)
self.sources.compile(opts_tmp, self.config_name) self.sources.compile(opts_tmp, self.config_name)
if (sub_target != "config"): 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): def install_files(self, dir, tmp_dir, part_name, on_file, on_dd):
Logger.install(f"'{self.name}': Install artifacts") Logger.install(f"'{self.name}': Install artifacts")