From 47ade913e2f2c9be8f63c889c5c3d9745569f8dfb83308de3f98e31271918fac Mon Sep 17 00:00:00 2001 From: sisungo Date: Mon, 7 Sep 2026 03:13:55 +0000 Subject: [PATCH] feat: add linux kernel initramfs and related tools Signed-off-by: sisungo --- hooks/autolink.py | 24 ++++++-- lib/cpp.py | 3 + lib/make.py | 7 ++- lib/pkgcomposer.py | 8 +++ packages/airboot-linux-stage2/pkgbuild.py | 32 ++++++++++ packages/bash/pkgbuild.py | 1 + packages/linux/pkgbuild.py | 26 ++++++-- packages/lxdeviced/pkgbuild.py | 74 +++++++++++++++++++++++ packages/pigz/pkgbuild.py | 43 +++++++++++++ packages/quickjs/pkgbuild.py | 26 ++++++++ 10 files changed, 230 insertions(+), 14 deletions(-) create mode 100644 packages/airboot-linux-stage2/pkgbuild.py create mode 100644 packages/lxdeviced/pkgbuild.py create mode 100644 packages/pigz/pkgbuild.py create mode 100644 packages/quickjs/pkgbuild.py diff --git a/hooks/autolink.py b/hooks/autolink.py index b9e962d..d65305d 100644 --- a/hooks/autolink.py +++ b/hooks/autolink.py @@ -10,21 +10,21 @@ def is_abslink(path): return False -def autolink_bin(composer: pkgcomposer.PkgComposer): +def autolink_bin(): if is_abslink("bin"): return for i in common.treedir("bin"): if i.is_file() and os.access(i.path, os.X_OK): make.link(f"bin/{i.name}", "/bin/" + i.name) -def autolink_lib(composer: pkgcomposer.PkgComposer): +def autolink_lib(): if is_abslink("lib"): return for i in common.treedir("lib"): if i.is_file(): make.link(f"lib/{i.name}", "/lib/" + arch.get_target() + "/" + i.name) -def autolink_include(composer: pkgcomposer.PkgComposer): +def autolink_include(): if is_abslink("include"): return for i in common.treedir("include"): @@ -34,21 +34,33 @@ def autolink_include(composer: pkgcomposer.PkgComposer): "/lib/" + arch.get_target() + "/include/" + i.name, ) +def autolink_share_pkgconfig(): + if is_abslink("share/pkgconfig"): + return + for i in common.treedir("share/pkgconfig"): + if i.is_file(): + make.link(f"share/pkgconfig/{i.name}", "/share/pkgconfig/" + i.name) + def autolink(composer: pkgcomposer.PkgComposer): os.chdir(composer.workdir + "/bundle/") try: - autolink_bin(composer) + autolink_bin() except: pass try: - autolink_lib(composer) + autolink_lib() except: pass try: - autolink_include(composer) + autolink_include() + except: + pass + + try: + autolink_share_pkgconfig() except: pass diff --git a/lib/cpp.py b/lib/cpp.py index 85edc99..38ea457 100644 --- a/lib/cpp.py +++ b/lib/cpp.py @@ -145,6 +145,9 @@ def _auto_pack(profiles: list[str], pc: pkgcomposer.PkgComposer): if "dev" in profiles: _do_auto_pack(pc, "lib", "lib", _autopack_filter_dev) _do_auto_pack(pc, "include", "include", _autopack_filter_dev) + if os.path.exists("share/gir-1.0"): + pc.makedirs("include/gir") + pc.add_dir("share/gir-1.0", "include/gir/gir-1.0") def use_auto_pack(profiles: list[str]): diff --git a/lib/make.py b/lib/make.py index d950ff1..a144d41 100644 --- a/lib/make.py +++ b/lib/make.py @@ -1,5 +1,6 @@ import typing import hashlib +import os from lib import arch @@ -46,11 +47,11 @@ def builddep(s: str): _builddep += ["gnu-make", "gnu-sed", "awk", "grep"] elif s == "shortcut/rust": builddep("shortcut/c") - _builddep += ["cargo", "rustc"] + _builddep += ["cargo", "rust"] elif s == "shortcut/cmake": - _builddep += ["cmake", "ninja"] + _builddep += ["cmake", "ninja", "pkgconf"] elif s == "shortcut/meson": - _builddep += ["meson", "ninja"] + _builddep += ["meson", "ninja", "pkgconf"] else: _builddep += [s.replace("@target", f"@{arch.get_target()}")] diff --git a/lib/pkgcomposer.py b/lib/pkgcomposer.py index 1470187..eccdf23 100644 --- a/lib/pkgcomposer.py +++ b/lib/pkgcomposer.py @@ -65,3 +65,11 @@ class PkgComposer: def link_external(self, src: str, dst: str): os.symlink(src, f"{self.workdir}/bundle/{dst}") + + def add(self, src: str, dst: str | None = None): + if dst is None: + dst = src + if os.path.islink(src) or os.path.isfile(src): + self.addfile(src, dst) + else: + self.add_dir(src, dst, True) diff --git a/packages/airboot-linux-stage2/pkgbuild.py b/packages/airboot-linux-stage2/pkgbuild.py new file mode 100644 index 0000000..f16a96f --- /dev/null +++ b/packages/airboot-linux-stage2/pkgbuild.py @@ -0,0 +1,32 @@ +import os + +from lib import arch +from lib.make import * + + +version("0.1.0-alpha.1") +description("AirBoot Linux initramfs generator.") +maintainer("sisungo ") +source_url("https://gitea.semilabs.org/semios/airboot-linux-stage2/archive/0.1.0-alpha.1.tar.gz") + + +def build(): + os.system("./arch-support/build.sh") + +on_build(build) + + +def pack_arch(composer): + composer.add(f"arch-support/target/{arch.get_target().split('-')[0]}", "data") + +def pack_mkinitramfs(composer): + composer.makedir("bin") + composer.add("mkinitramfs.sh", "bin/mkinitramfs") + +package("airboot-linux-stage2-arch") +on_pack(pack_arch) + +package("airboot-linux-stage2-mkinitramfs") +dep("mksh") +arch_any() +on_pack(pack_mkinitramfs) diff --git a/packages/bash/pkgbuild.py b/packages/bash/pkgbuild.py index 208c95d..a979735 100644 --- a/packages/bash/pkgbuild.py +++ b/packages/bash/pkgbuild.py @@ -76,6 +76,7 @@ package("bash") dep("semi-libc @same-arch") dep("libncurses @same-arch") on_pack(pack_bash) +link("bin/bash", "/bin/sh") package("bash-dev") dep("bash (same)") diff --git a/packages/linux/pkgbuild.py b/packages/linux/pkgbuild.py index b62917a..c16ef08 100644 --- a/packages/linux/pkgbuild.py +++ b/packages/linux/pkgbuild.py @@ -1,24 +1,31 @@ import os import shutil +import subprocess -import lib.arch as arch -import lib.cpp as cpp +from lib import cpp, arch, packie from lib.make import * -upstream_version = "6.18.45" + +upstream_version = "7.2.3" version(f"{upstream_version}") description("the Linux operating system kernel") maintainer("sisungo ") source_url( - f"https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-{upstream_version}.tar.xz" + f"https://cdn.kernel.org/pub/linux/kernel/v7.x/linux-{upstream_version}.tar.xz" ) builddep("shortcut/c") builddep("shortcut/autotools") builddep("libncurses-dev") -builddep("aws-lc-dev") +builddep("aws-lc-dev @target") builddep("aws-lc-tools") +builddep("airboot-linux-stage2-mkinitramfs") +builddep("airboot-linux-stage2-arch @target") +builddep("flex") +builddep("bison") +builddep("bc") +builddep("gzip") def get_arch(): @@ -43,6 +50,14 @@ def build(): ) os.remove(f"../kmod_install/lib/modules/{upstream_version}/build") + asp_prefix = packie.prefix_of(f"airboot-linux-stage2-arch @{arch.get_target()}") + subprocess.run([ + "mkinitramfs", + "-a", f"{asp_prefix}/data", + "-o", f"{os.getcwd()}/../initramfs.img", + "-m", f"{os.getcwd()}/../kmod_install", + "-k", upstream_version, + ], check=True) on_build(build) @@ -78,6 +93,7 @@ def pack_linux(composer): except Exception: pass composer.add_dir(f"../kmod_install/lib/modules/{upstream_version}", "modules") + composer.addfile("../initramfs.img", "initramfs.img") package(f"{base_name}") diff --git a/packages/lxdeviced/pkgbuild.py b/packages/lxdeviced/pkgbuild.py new file mode 100644 index 0000000..1ecb23d --- /dev/null +++ b/packages/lxdeviced/pkgbuild.py @@ -0,0 +1,74 @@ +import os + +from lib import rust +from lib.make import * + + +version("0.1.0-alpha.2") +description("Linux device userspace daemon.") +maintainer("sisungo ") +source_url("https://gitea.semilabs.org/semios/lxdeviced/archive/0.1.0-alpha.2.tar.gz") + +builddep("shortcut/rust") + + +def build(): + rust.build() + +on_build(build) + + +PKGCONF_LIBUDEV=""" +prefix=/ +exec_prefix=/ +libdir= +includedir= + +Name: libudev +Description: Udev library -- compatible, powered by lxdeviced +Version: 260 +Cflags: -I${includedir} +Libs: -L${libdir} -ludev +""" + + +def pack(composer): + composer.makedirs("share/device") + composer.add_dir("misc/rules", "share/device/rules") + oldpwd = os.getcwd() + os.chdir(rust.artifacts_dir()) + composer.makedir("bin") + composer.addfile("lxdeviced", "bin/lxdeviced") + composer.addfile("device", "bin/device") + os.chdir(oldpwd) + +def pack_libudev(composer): + oldpwd = os.getcwd() + os.chdir(rust.artifacts_dir()) + composer.makedir("lib") + composer.addfile("libudev.so", "lib/libudev.so") + os.chdir(oldpwd) + +def pack_libudev_dev(composer): + oldpwd = os.getcwd() + composer.makedir("include") + composer.addfile("libcompat/udev/include/libudev.h", "include/libudev.h") + composer.makedirs("lib/pkgconfig") + pkgconf = PKGCONF_LIBUDEV.replace("libdir=", f"libdir={get_prefix('lxdeviced-libudev')}/lib") + pkgconf = PKGCONF_LIBUDEV.replace("includedir=", f"includedir={get_prefix('lxdeviced-libudev-dev')}/include") + with open(f"{composer.workdir}/bundle/lib/pkgconfig/libudev.pc", "wt+") as file: + file.write(pkgconf) + os.chdir(oldpwd) + + +package("lxdeviced") +on_pack(pack) +dep("semi-libc @same-arch") + +package("lxdeviced-libudev") +on_pack(pack_libudev) +dep("semi-libc @same-arch") + +package("lxdeviced-libudev-dev") +on_pack(pack_libudev_dev) +dep("lxdeviced-libudev (same)") diff --git a/packages/pigz/pkgbuild.py b/packages/pigz/pkgbuild.py new file mode 100644 index 0000000..b42899b --- /dev/null +++ b/packages/pigz/pkgbuild.py @@ -0,0 +1,43 @@ +import os + +from lib import cpp +from lib.make import * + + +version("2.8") +description("A parallel implementation of gzip for modern multi-processor, multi-core machines") +maintainer("sisungo ") +source_url("http://zlib.net/pigz/pigz-2.8.tar.gz") + +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep("libz-ng-dev @target") +builddep("pkgconf") + + +def build(): + cc=os.environ.get("CC", "cc") + cpp.make([f"CC={cc}"]) + +on_build(build) + + +def pack(composer): + composer.makedir("bin") + composer.add("pigz", "bin/pigz") + composer.add("unpigz", "bin/unpigz") + +def pack_docs(composer): + composer.makedirs("share/man/man1") + composer.add("pigz.1", "share/man/man1") + +package("pigz") +dep("semi-libc @same-arch") +dep("libz-ng @same-arch") +provide("gzip") +link("bin/pigz", "/bin/gzip") +link("bin/unpigz", "/bin/gunzip") +cpp.use_auto_pack(["bin"]) + +package("pigz-docs") +on_pack(pack_docs) diff --git a/packages/quickjs/pkgbuild.py b/packages/quickjs/pkgbuild.py new file mode 100644 index 0000000..6423968 --- /dev/null +++ b/packages/quickjs/pkgbuild.py @@ -0,0 +1,26 @@ +from lib import cpp +from lib.make import * + + +version("2026.6.4") +description("QuickJS is a small and embeddable Javascript engine. It supports the ES2025 specification.") +maintainer("sisungo ") +source_url("https://bellard.org/quickjs/quickjs-2026-06-04.tar.xz") + +builddep("shortcut/c") + + +def build(): + cpp.make() + cpp.make_install() + +on_build(build) + + +package("quickjs") +dep("semi-libc @same-arch") +cpp.use_auto_pack(["bin"]) + +package("libquickjs-dev") +dep("semi-libc @same-arch") +cpp.use_auto_pack(["dev"]) -- 2.55.0