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"
},
{
"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":

View File

@ -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":

View File

@ -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":
[]
}
},
{

View File

@ -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!")

View File

@ -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")