From 0c26fc60d1ee9f758a6607ed767cf3c78c4bb92a Mon Sep 17 00:00:00 2001 From: sisungo Date: Tue, 14 Jul 2026 00:51:30 +0800 Subject: [PATCH 01/23] feat: add package libnl Signed-off-by: sisungo --- packages/libnl/pkgbuild.py | 123 +++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 packages/libnl/pkgbuild.py diff --git a/packages/libnl/pkgbuild.py b/packages/libnl/pkgbuild.py new file mode 100644 index 0000000..9e3956f --- /dev/null +++ b/packages/libnl/pkgbuild.py @@ -0,0 +1,123 @@ +import os + +from lib import cpp, arch +from lib.make import * + +upstream_version = "3.2.25" + +version(upstream_version) +source_url("https://www.infradead.org/~tgr/libnl/files/libnl-3.2.25.tar.gz") + +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep("flex") +builddep("bison") +builddep(f"linux-dev @{arch.get_target()}") + +def build(): + cpp.configure([ + "--prefix=/", + "--sysconfdir=/var/config", + f"--includedir={get_prefix('libnl-dev')}/include", + ]) + cpp.make() + cpp.make_install() + + +on_build(build) + +SO_SUFFIX = ["", ".200", ".200.20.0"] + + +def pack_core(composer): + composer.makedir("lib") + for i in SO_SUFFIX: + composer.addfile(f"lib/libnl-3.so{i}", f"lib/libnl-3.so{i}") + +package("libnl-core") +dep("semi-libc @same-arch") +on_pack(pack_core) + +def pack_genl(composer): + composer.makedir("lib") + for i in SO_SUFFIX: + composer.addfile(f"lib/libnl-genl-3.so{i}", f"lib/libnl-genl-3.so{i}") + +package("libnl-genl") +dep("libnl-core (same)") +on_pack(pack_genl) + +def pack_idiag(composer): + composer.makedir("lib") + for i in SO_SUFFIX: + composer.addfile(f"lib/libnl-idiag-3.so{i}", f"lib/libnl-idiag-3.so{i}") + +package("libnl-idiag") +dep("libnl-core (same)") +on_pack(pack_idiag) + +def pack_route(composer): + composer.makedir("lib") + for i in SO_SUFFIX: + composer.addfile(f"lib/libnl-route-3.so{i}", f"lib/libnl-route-3.so{i}") + +package("libnl-route") +dep("libnl-core (same)") +on_pack(pack_route) + +def pack_nf(composer): + composer.makedir("lib") + for i in SO_SUFFIX: + composer.addfile(f"lib/libnl-nf-3.so{i}", f"lib/libnl-nf-3.so{i}") + +package("libnl-nf") +dep("libnl-core (same)") +dep("libnl-route (same)") +on_pack(pack_nf) + +def pack_cli(composer): + composer.makedir("lib") + for i in SO_SUFFIX: + composer.addfile(f"lib/libnl-cli-3.so{i}", f"lib/libnl-cli-3.so{i}") + +package("libnl-cli") +dep("libnl-core (same)") +dep("libnl-nf (same)") +dep("libnl-route (same)") +on_pack(pack_cli) + +def pack_libnl(composer): + composer.makedir("lib") + for soname in ["-3", "-nf-3", "-route-3", "-idiag-3", "-genl-3"]: + if soname == "-3": + pkgname = "libnl-core" + elif "nf" in soname: + pkgname = "libnl-nf" + elif "route" in soname: + pkgname = "libnl-route" + elif "idiag" in soname: + pkgname = "libnl-idiag" + elif "genl" in soname: + pkgname = "libnl-genl" + for suffix in SO_SUFFIX: + fullname = f"libnl{soname}.so{suffix}" + os.symlink( + f"/pkg/{pkgname}={upstream_version}@{arch.get_target()}/lib/{fullname}", + f"{composer.workdir}/bundle/lib/{fullname}", + ) + +package("libnl") +dep("libnl-core (same)") +dep("libnl-nf (same)") +dep("libnl-route (same)") +dep("libnl-idiag (same)") +dep("libnl-genl (same)") +on_pack(pack_libnl) + +package("libnl-tools") +dep("libnl (same)") +cpp.use_auto_pack(["bin"]) + +package("libnl-dev") +dep("libnl (same)") +cpp.use_auto_pack(["dev"]) -- 2.55.0 From b09d172ff92f187bf965a6efe3d3f4de6c0b6413 Mon Sep 17 00:00:00 2001 From: sisungo Date: Fri, 14 Aug 2026 10:08:12 +0800 Subject: [PATCH 02/23] feat: change llvm triple to unknown- vendor Signed-off-by: sisungo --- lib/arch.py | 12 ++++++------ packages/llvm-project/pkgbuild.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/arch.py b/lib/arch.py index c53c189..f52aa97 100644 --- a/lib/arch.py +++ b/lib/arch.py @@ -4,16 +4,16 @@ from . import packie all: dict[str, dict[str, str]] = { "aarch64-semios-linux": { - "CC": "clang -target aarch64-semios-linux-musl", - "CXX": "clang++ -target aarch64-semios-linux-musl", + "CC": "clang -target aarch64-unknown-linux-musl", + "CXX": "clang++ -target aarch64-unknown-linux-musl", }, "x86_64-semios-linux": { - "CC": "clang -target x86_64-semios-linux-musl", - "CXX": "clang++ -target x86_64-semios-linux-musl", + "CC": "clang -target x86_64-unknown-linux-musl", + "CXX": "clang++ -target x86_64-unknown-linux-musl", }, "riscv64-semios-linux": { - "CC": "clang -target riscv64-semios-linux-musl", - "CXX": "clang++ -target riscv64-semios-linux-musl", + "CC": "clang -target riscv64-unknown-linux-musl", + "CXX": "clang++ -target riscv64-unknown-linux-musl", }, } _target: str = packie.host_arch() diff --git a/packages/llvm-project/pkgbuild.py b/packages/llvm-project/pkgbuild.py index 12e0062..a1e9a77 100644 --- a/packages/llvm-project/pkgbuild.py +++ b/packages/llvm-project/pkgbuild.py @@ -28,7 +28,7 @@ srcdir = None packname = None def llvm_host_triple(): - return arch.get_target().replace("-semios-linux", "-semios-linux-musl") + return arch.get_target().replace("-semios-linux", "-unknown-linux-musl") def cmake(sourcedir, args): builddir = os.getcwd() + f"/../_build_{sourcedir}" @@ -76,7 +76,7 @@ def auto_pack_dev(composer, name, devbins=[], extdirs=["lib/cmake"]): composer.makedir("lib") for i in os.listdir("lib"): prefix = None - if os.path.isdir(i) and f"lib/{i}" in extdirs: + if os.path.isdir(f"lib/{i}") and f"lib/{i}" in extdirs: composer.add_dir(f"lib/{i}", f"lib/{i}") elif ".so" in i: prefix = get_prefix(f"lib{name}") @@ -132,7 +132,7 @@ def build_clang(): "-DCLANG_DEFAULT_CXX_STDLIB=libc++", "-DCLANG_DEFAULT_RTLIB=compiler-rt", "-DLLVM_INCLUDE_TESTS=OFF", - f"-DC_INCLUDE_DIRS=/lib/{arch.get_target()}/include", + f"-DC_INCLUDE_DIRS=/lib/{arch.get_target()}/include:{get_prefix('clang')}/lib/clang/{pkgver_major}/include", ] cmake("clang", import_llvm() + options) -- 2.55.0 From 9c432fcabb9ddd4bec85ea33e3b328680645577c Mon Sep 17 00:00:00 2001 From: sisungo Date: Fri, 14 Aug 2026 17:10:36 +0800 Subject: [PATCH 03/23] fix: bad dependencies for git Signed-off-by: sisungo --- packages/git/pkgbuild.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/git/pkgbuild.py b/packages/git/pkgbuild.py index 1a2fbcf..0d10952 100644 --- a/packages/git/pkgbuild.py +++ b/packages/git/pkgbuild.py @@ -10,8 +10,11 @@ source_url("https://www.kernel.org/pub/software/scm/git/git-2.55.0.tar.gz") builddep("shortcut/c") builddep("shortcut/autotools") +builddep("rust") builddep(f"libintl-dev @{arch.get_target()}") builddep(f"libz-dev @{arch.get_target()}") +builddep(f"aws-lc-dev @{arch.get_target()}") +builddep(f"linux-dev @{arch.get_target()}") def build(): -- 2.55.0 From 21dedb356890234bfa564da7adadd355837ed56f Mon Sep 17 00:00:00 2001 From: sisungo Date: Fri, 14 Aug 2026 19:11:44 +0800 Subject: [PATCH 04/23] feat: add package cargo Signed-off-by: sisungo --- packages/cargo/pkgbuild.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 packages/cargo/pkgbuild.py diff --git a/packages/cargo/pkgbuild.py b/packages/cargo/pkgbuild.py new file mode 100644 index 0000000..d179971 --- /dev/null +++ b/packages/cargo/pkgbuild.py @@ -0,0 +1,33 @@ +from lib.make import * +from lib import rust + + +version("0.98.0") +description("The Rust package manager") +maintainer("sisungo ") +source_url("https://github.com/rust-lang/cargo/archive/refs/tags/0.98.0.tar.gz") + +builddep("shortcut/c") +builddep("cargo") +builddep("rust") +builddep(f"aws-lc-dev @{arch.get_target()}") +builddep(f"pkgconf @{arch.get_target()}") +builddep(f"libz-ng-dev @{arch.get_target()}") +builddep(f"libcurl-dev @{arch.get_target()}") +builddep(f"libgit2-dev @{arch.get_target()}") +builddep(f"libssh2-dev @{arch.get_target()}") + + +def build(): + rust.build() + +on_build(build) + + +package("cargo") +dep("libssl @same-arch") +dep("libcrypto @same-arch") +dep("libz @same-arch") +dep("semi-libc @same-arch") +recommend("rust") +rust.use_auto_pack(["bin"]) -- 2.55.0 From ad3a7e8372bae0c1e8a724a8a56d2f69c09bb0d5 Mon Sep 17 00:00:00 2001 From: sisungo Date: Fri, 14 Aug 2026 21:24:28 +0800 Subject: [PATCH 05/23] fix: git build dependencies are invalid Signed-off-by: sisungo --- packages/git/pkgbuild.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/git/pkgbuild.py b/packages/git/pkgbuild.py index 0d10952..db55123 100644 --- a/packages/git/pkgbuild.py +++ b/packages/git/pkgbuild.py @@ -1,5 +1,3 @@ -import subprocess - from lib import arch, cpp from lib.make import * @@ -11,10 +9,13 @@ source_url("https://www.kernel.org/pub/software/scm/git/git-2.55.0.tar.gz") builddep("shortcut/c") builddep("shortcut/autotools") builddep("rust") +builddep("cargo") builddep(f"libintl-dev @{arch.get_target()}") builddep(f"libz-dev @{arch.get_target()}") builddep(f"aws-lc-dev @{arch.get_target()}") builddep(f"linux-dev @{arch.get_target()}") +builddep("gettext") +builddep("libarchive-tools") def build(): -- 2.55.0 From a405253451ac00018863646ee9b12072bba9a843 Mon Sep 17 00:00:00 2001 From: sisungo Date: Sat, 15 Aug 2026 12:47:13 +0800 Subject: [PATCH 06/23] fix: autostrip breaks hard links Signed-off-by: sisungo --- hooks/autostrip.py | 41 +++++++++++++++++++++++++++++++++++++---- lib/atombuild.py | 39 +++++++++++++++------------------------ lib/pkgcomposer.py | 21 +++++++++++---------- 3 files changed, 63 insertions(+), 38 deletions(-) diff --git a/hooks/autostrip.py b/hooks/autostrip.py index 8f93261..19deb12 100644 --- a/hooks/autostrip.py +++ b/hooks/autostrip.py @@ -1,6 +1,8 @@ import os import stat import subprocess +import tempfile +import shutil from lib import common @@ -13,6 +15,8 @@ def _is_elf(filepath): def autostrip(composer): + processed_inodes = {} + for ent in common.treedir(composer.workdir): if not ent.is_file(follow_symlinks=False): continue @@ -20,7 +24,36 @@ def autostrip(composer): continue if not _is_elf(ent.path): continue - oldperm = stat.S_IMODE(os.stat(ent.path).st_mode) - os.chmod(ent.path, 0o777) - subprocess.run([strip, ent.path], check=True) - os.chmod(ent.path, oldperm) + + stat_info = os.stat(ent.path) + inode_key = (stat_info.st_dev, stat_info.st_ino) + if inode_key in processed_inodes: + continue + processed_inodes[inode_key] = True + + oldperm = stat.S_IMODE(stat_info.st_mode) + + try: + with tempfile.NamedTemporaryFile(mode='wb', delete=False) as tmp_file: + tmp_path = tmp_file.name + shutil.copy2(ent.path, tmp_path) + os.chmod(tmp_path, 0o777) + + subprocess.run([strip, tmp_path], check=True) + + with open(tmp_path, 'rb') as tmp_file: + stripped_data = tmp_file.read() + + with open(ent.path, 'r+b') as original_file: + original_file.truncate(0) + original_file.write(stripped_data) + original_file.flush() + os.fsync(original_file.fileno()) + + os.chmod(ent.path, oldperm) + os.unlink(tmp_path) + + except Exception as e: + if 'tmp_path' in locals() and os.path.exists(tmp_path): + os.unlink(tmp_path) + raise RuntimeError(f"Failed to strip {ent.path}: {e}") from e diff --git a/lib/atombuild.py b/lib/atombuild.py index 86f9796..d75108c 100644 --- a/lib/atombuild.py +++ b/lib/atombuild.py @@ -13,8 +13,11 @@ BASE_REQUIREMENTS = [ # Packages for running `semios-packages` scripts "python", "packie", - "patch", "zstd", + "libarchive-tools", + # Packages for building packages that require patching + "patch", + # Packages for downloading various formats of tarballs "libz-ng", "liblzma", "libbzip2", @@ -92,32 +95,20 @@ def enter_build_env(root: str, cmd: list[str], chdir: str = "/"): subprocess.run( [ "bwrap", - "--bind", - root, - "/", + "--bind", root, "/", "--unshare-pid", "--unshare-user", - "--uid", - "0", - "--gid", - "0", - "--dev", - "/dev", - "--bind", - "/sys", - "/sys", - "--proc", - "/proc", + "--uid", "0", + "--gid", "0", + "--dev", "/dev", + "--bind", "/sys", "/sys", + "--proc", "/proc", "--clearenv", - "--setenv", - "HOME", - "/home/root", - "--setenv", - "PATH", - "/bin", - "--setenv", - "SEMIOS_PKGBUILD_IN_ATOMIC", - "1", + "--setenv", "HOME", "/home/root", + "--setenv", "PATH", "/bin", + "--setenv", "SEMIOS_PKGBUILD_IN_ATOMIC", "1", + "--setenv", "USER", "root", + "--setenv", "LOGNAME", "root", "--chdir", chdir, ] diff --git a/lib/pkgcomposer.py b/lib/pkgcomposer.py index 28aace4..0de456e 100644 --- a/lib/pkgcomposer.py +++ b/lib/pkgcomposer.py @@ -4,17 +4,10 @@ import shutil import subprocess import sys -if sys.version_info >= (3, 14): - _archive_format = "zstdtar" - _archive_suffix = ".tar.zst" -else: - _archive_format = "gztar" - _archive_suffix = ".tar.gz" - class PkgComposer: def __init__(self, pkgfile: str): - self.pkgfile = pkgfile + self.pkgfile = os.path.abspath(pkgfile) def setworkdir(self, workdir: str): self.workdir = workdir @@ -33,8 +26,16 @@ class PkgComposer: f.write("\n") def compose(self): - shutil.make_archive(self.pkgfile, _archive_format, self.workdir) - shutil.move(self.pkgfile + _archive_suffix, self.pkgfile) + subprocess.run( + [ + "tar", "cpf", f"{self.pkgfile}.tar", + "-C", self.workdir, + "--numeric-owner", + ".", + ], + check=True, + ) + subprocess.run(["zstd", "--rm", "-f", f"{self.pkgfile}.tar", "-o", self.pkgfile], check=True) def makedir(self, name: str): os.mkdir(f"{self.workdir}/bundle/{name}") -- 2.55.0 From 9810303b7130330d5b135dc2fd82294521dc7540 Mon Sep 17 00:00:00 2001 From: sisungo Date: Sat, 15 Aug 2026 17:41:38 +0800 Subject: [PATCH 07/23] feat: add package SPIRV-LLVM-Translator Signed-off-by: sisungo --- packages/SPIRV-LLVM-Translator/pkgbuild.py | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/SPIRV-LLVM-Translator/pkgbuild.py diff --git a/packages/SPIRV-LLVM-Translator/pkgbuild.py b/packages/SPIRV-LLVM-Translator/pkgbuild.py new file mode 100644 index 0000000..8fd6dd8 --- /dev/null +++ b/packages/SPIRV-LLVM-Translator/pkgbuild.py @@ -0,0 +1,37 @@ +from lib.make import * +from lib import cpp, arch + + +version("22.1.5") +description("A tool and a library for bi-directional translation between SPIR-V and LLVM IR") +maintainer("sisungo ") +source_url("https://github.com/KhronosGroup/SPIRV-LLVM-Translator/archive/refs/tags/v22.1.5.tar.gz") + +builddep("shortcut/cmake") +builddep("shortcut/c++") +builddep(f"libllvm-dev (~22.1.0) @{arch.get_target()}") +builddep(f"libllvm-static (~22.1.0) @{arch.get_target()}") +builddep("pkgconf") +builddep("spirv-headers") + + +def build(): + cpp.cmake([ + "-DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=ON", + f"-DLLVM_DIR=/lib/{arch.get_target()}/cmake/llvm", + f"-DSPIRV-Headers_SOURCE_DIR=/lib/{arch.get_target()}", + f"-DCMAKE_INSTALL_PREFIX={get_prefix('libllvmspirv-dev')}", + ]) + cpp.ninja() + cpp.ninja_install() + +on_build(build) + + +package("libllvmspirv-dev") +cpp.use_auto_pack(["dev"]) + +package("llvm-spirv") +dep("libllvm (~22.1.0) @same-arch") +dep("libcxx @same-arch") +cpp.use_auto_pack(["bin"]) -- 2.55.0 From d05fce73dcbc58a633c9b0b77488abd6c587e287 Mon Sep 17 00:00:00 2001 From: sisungo Date: Sat, 15 Aug 2026 20:49:02 +0800 Subject: [PATCH 08/23] feat: add python packaging lib Signed-off-by: sisungo --- lib/python.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 lib/python.py diff --git a/lib/python.py b/lib/python.py new file mode 100644 index 0000000..2939330 --- /dev/null +++ b/lib/python.py @@ -0,0 +1,62 @@ +import os +import shutil +import subprocess + +from . import make, arch + + +PY3_VERSION = "3.14" + + +def build(): + subprocess.run(["python3", "-m", "build", "."], check=True) + +def install(): + if os.path.exists("../pyinstall"): + shutil.rmtree("../pyinstall") + for i in os.listdir("dist"): + if not i.endswith(".whl"): + continue + subprocess.run(["python3", "-m", "installer", f"--destdir=../pyinstall", f"dist/{i}"], check=True) + os.chdir("../pyinstall") + while len(os.listdir(".")) == 1: + os.chdir(os.listdir(".")[0]) + +def version(s: str): + make.version(f"{s}+python{PY3_VERSION}") + +def _depcommon(s: str): + if s == "python": + return f"python (~{PY3_VERSION}.0) @{arch.get_target()}" + elif ".py" in s: + if ")" in s: + return s.replace(")", f", +python{PY3_VERSION})") + else: + return s.replace(".py", f" (+python{PY3_VERSION})") + else: + return None + +def builddep(s: str): + if s == "$shortcut": + builddep("python") + builddep("build.py") + builddep("installer.py") + elif _depcommon(s): + make.builddep(_depcommon(s)) + else: + raise RuntimeError("unrecognized python dep") + +def dep(s: str): + if _depcommon(s): + make.dep(_depcommon(s)) + else: + raise RuntimeError("unrecognized python dep") + +def _auto_pack(composer): + base = f"lib/python{PY3_VERSION}/site-packages" + composer.makedirs(base) + for i in os.listdir("."): + composer.add_dir(i, f"{base}/{i}") + +def use_auto_pack(): + make.on_pack(_auto_pack) -- 2.55.0 From b368f771d2aba93bbbf03b695e6e167b98772ab9 Mon Sep 17 00:00:00 2001 From: sisungo Date: Sat, 15 Aug 2026 20:53:42 +0800 Subject: [PATCH 09/23] feat: add package packaging-py Signed-off-by: sisungo --- packages/packaging-py/pkgbuild.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 packages/packaging-py/pkgbuild.py diff --git a/packages/packaging-py/pkgbuild.py b/packages/packaging-py/pkgbuild.py new file mode 100644 index 0000000..6631be9 --- /dev/null +++ b/packages/packaging-py/pkgbuild.py @@ -0,0 +1,22 @@ +from lib.make import * +from lib import python + + +python.version("26.3") +description("Core utilities for Python packages") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz") + +python.builddep("$shortcut") + + +def build(): + python.build() + python.install() + +on_build(build) + + +package("packaging.py") +python.dep("python") +python.use_auto_pack() -- 2.55.0 From 8a1a62599d2cfb57531530fce4890522f548ee5d Mon Sep 17 00:00:00 2001 From: sisungo Date: Sat, 15 Aug 2026 21:02:38 +0800 Subject: [PATCH 10/23] feat: add package build-py Signed-off-by: sisungo --- packages/build-py/pkgbuild.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 packages/build-py/pkgbuild.py diff --git a/packages/build-py/pkgbuild.py b/packages/build-py/pkgbuild.py new file mode 100644 index 0000000..290b2cc --- /dev/null +++ b/packages/build-py/pkgbuild.py @@ -0,0 +1,24 @@ +from lib.make import * +from lib import python + + +python.version("1.5.0") +description("A simple, correct Python build frontend") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz") + +python.builddep("$shortcut") +python.builddep("packaging.py (>=25.0)") + + +def build(): + python.build() + python.install() + +on_build(build) + + +package("build.py") +python.dep("python") +python.dep("packaging.py (>=25.0)") +python.use_auto_pack() -- 2.55.0 From 633bf71cb18d9d8a9f1683147c1e95d8e8378c9c Mon Sep 17 00:00:00 2001 From: sisungo Date: Sat, 15 Aug 2026 21:08:10 +0800 Subject: [PATCH 11/23] feat: add package installer-py Signed-off-by: sisungo --- packages/installer-py/pkgbuild.py | 22 ++++++++++++++++++++++ x.py | 1 + 2 files changed, 23 insertions(+) create mode 100644 packages/installer-py/pkgbuild.py diff --git a/packages/installer-py/pkgbuild.py b/packages/installer-py/pkgbuild.py new file mode 100644 index 0000000..b35587a --- /dev/null +++ b/packages/installer-py/pkgbuild.py @@ -0,0 +1,22 @@ +from lib.make import * +from lib import python + + +python.version("1.0.1") +description("A library for installing Python wheels.") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/06/fe/b9f481cf0cc867958a21338baa900357b7b7d86cac9b025948049d77923c/installer-1.0.1.tar.gz") + +python.builddep("$shortcut") + + +def build(): + python.build() + python.install() + +on_build(build) + + +package("installer.py") +python.dep("python") +python.use_auto_pack() diff --git a/x.py b/x.py index 3484849..f178d2f 100644 --- a/x.py +++ b/x.py @@ -118,6 +118,7 @@ def cmd_build_package(package: str): "name": pkgname, "version": pkgver, "arch": pkgarch, + "description": pkginfo[lib.make._key_description], "dependencies": pkginfo[lib.make._key_dependencies], "provides": pkginfo[lib.make._key_provides], "recommendations": pkginfo[lib.make._key_recommendations], -- 2.55.0 From 9711728da69f6f6fd7132169ab6d1c087b5aac03 Mon Sep 17 00:00:00 2001 From: sisungo Date: Sun, 16 Aug 2026 09:38:46 +0800 Subject: [PATCH 12/23] feat: add package PyYAML Signed-off-by: sisungo --- packages/PyYAML/pkgbuild.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 packages/PyYAML/pkgbuild.py diff --git a/packages/PyYAML/pkgbuild.py b/packages/PyYAML/pkgbuild.py new file mode 100644 index 0000000..185d1bc --- /dev/null +++ b/packages/PyYAML/pkgbuild.py @@ -0,0 +1,22 @@ +from lib.make import * +from lib import python + + +python.version("6.0.3") +description("YAML parser and emitter for Python") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz") + +python.builddep("$shortcut") + + +def build(): + python.build() + python.install() + +on_build(build) + + +package("PyYAML.py") +python.dep("python") +python.use_auto_pack() -- 2.55.0 From a14d1e6ea09598b815bae7439e75993ed19eab3c Mon Sep 17 00:00:00 2001 From: sisungo Date: Sun, 16 Aug 2026 10:19:55 +0800 Subject: [PATCH 13/23] feat: add package MarkupSafe-py Signed-off-by: sisungo --- packages/MarkupSafe-py/pkgbuild.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 packages/MarkupSafe-py/pkgbuild.py diff --git a/packages/MarkupSafe-py/pkgbuild.py b/packages/MarkupSafe-py/pkgbuild.py new file mode 100644 index 0000000..699a4bd --- /dev/null +++ b/packages/MarkupSafe-py/pkgbuild.py @@ -0,0 +1,22 @@ +from lib.make import * +from lib import python + + +python.version("3.0.3") +description("Safely add untrusted strings to HTML/XML markup.") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz") + +python.builddep("$shortcut") + + +def build(): + python.build() + python.install() + +on_build(build) + + +package("MarkupSafe.py") +python.dep("python") +python.use_auto_pack() -- 2.55.0 From 02dede782332155377e685c8baeb07717a617fad Mon Sep 17 00:00:00 2001 From: sisungo Date: Sun, 16 Aug 2026 10:43:10 +0800 Subject: [PATCH 14/23] feat: add package Mako-py Signed-off-by: sisungo --- lib/python.py | 2 +- packages/Mako-py/pkgbuild.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 packages/Mako-py/pkgbuild.py diff --git a/lib/python.py b/lib/python.py index 2939330..4d897fe 100644 --- a/lib/python.py +++ b/lib/python.py @@ -32,7 +32,7 @@ def _depcommon(s: str): if ")" in s: return s.replace(")", f", +python{PY3_VERSION})") else: - return s.replace(".py", f" (+python{PY3_VERSION})") + return s.replace(".py", f".py (+python{PY3_VERSION})") else: return None diff --git a/packages/Mako-py/pkgbuild.py b/packages/Mako-py/pkgbuild.py new file mode 100644 index 0000000..b3aec6a --- /dev/null +++ b/packages/Mako-py/pkgbuild.py @@ -0,0 +1,29 @@ +import os + +from lib.make import * +from lib import python + + +python.version("1.4.1") +description("A super-fast templating language that borrows the best ideas from the existing templating languages.") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/2a/12/b5fa2353e2754cd67fb9f83793fa48ff42c213a5da7e719869d2301f6ab8/mako-1.4.1.tar.gz") + +python.builddep("$shortcut") +python.builddep("MarkupSafe.py") + + +def build(): + python.build() + python.install() + os.chdir("lib") + while len(os.listdir(".")) == 1: + os.chdir(os.listdir(".")[0]) + +on_build(build) + + +package("Mako.py") +python.dep("python") +python.dep("MarkupSafe.py") +python.use_auto_pack() -- 2.55.0 From 452e767da4a37165f5a3ad4c2156ea9fc8aabc53 Mon Sep 17 00:00:00 2001 From: sisungo Date: Tue, 11 Aug 2026 20:32:18 +0800 Subject: [PATCH 15/23] feat: add package spirv-tools Signed-off-by: sisungo --- packages/spirv-tools/pkgbuild.py | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 packages/spirv-tools/pkgbuild.py diff --git a/packages/spirv-tools/pkgbuild.py b/packages/spirv-tools/pkgbuild.py new file mode 100644 index 0000000..188663d --- /dev/null +++ b/packages/spirv-tools/pkgbuild.py @@ -0,0 +1,43 @@ +import os +import shutil + +from lib.make import * +from lib import cpp, arch + + +sdk_version = "1.4.357.0" + +version(sdk_version) +description("an API and commands for processing SPIR-V modules") +maintainer("sisungo ") +source_url("https://github.com/KhronosGroup/SPIRV-Tools/archive/refs/tags/vulkan-sdk-1.4.357.0.tar.gz") + +builddep("shortcut/cmake") +builddep("shortcut/c++") +builddep(f"spirv-headers (={sdk_version}) @{arch.get_target()}") + + +def build(): + cpp.cmake([ + f"-DSPIRV-Headers_SOURCE_DIR=/lib/{arch.get_target()}", + "-DCMAKE_CXX_FLAGS=-Wno-error=switch", + f"-DCMAKE_INSTALL_PREFIX={get_prefix('spirv-tools-dev')}", + ]) + cpp.ninja() + cpp.ninja_install() + try: + os.rename("lib64", "lib") + os.rename("lib32", "lib") + except: + pass + +on_build(build) + + +package("spirv-tools") +dep("libcxx @same-arch") +cpp.use_auto_pack(["bin"]) + +package("spirv-tools-dev") +dep("spirv-tools (same)") +cpp.use_auto_pack(["lib", "dev"]) -- 2.55.0 From 3a1f472de29c1bbd4a397c7e595d504571ef0c1e Mon Sep 17 00:00:00 2001 From: sisungo Date: Sun, 16 Aug 2026 23:36:00 +0800 Subject: [PATCH 16/23] fix: lib/cpp auto pack ignores hpp files Signed-off-by: sisungo --- lib/cpp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cpp.py b/lib/cpp.py index fd9ad4b..2a8ab73 100644 --- a/lib/cpp.py +++ b/lib/cpp.py @@ -117,6 +117,7 @@ def _is_dev_file(ent) -> bool: or ent.name.endswith(".la") or ent.name.endswith(".pc") or ent.name.endswith(".h") + or ent.name.endswith(".hpp") or ent.name.endswith(".cmake") or ent.name.endswith(".inc") or ("Makefile" in ent.name) -- 2.55.0 From 7bae4acc421469f266525f0b9e0eafb265cc91d6 Mon Sep 17 00:00:00 2001 From: sisungo Date: Mon, 17 Aug 2026 00:20:05 +0800 Subject: [PATCH 17/23] feat: add package pycparser Signed-off-by: sisungo --- packages/pycparser/pkgbuild.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 packages/pycparser/pkgbuild.py diff --git a/packages/pycparser/pkgbuild.py b/packages/pycparser/pkgbuild.py new file mode 100644 index 0000000..d6b166c --- /dev/null +++ b/packages/pycparser/pkgbuild.py @@ -0,0 +1,22 @@ +from lib.make import * +from lib import python + + +python.version("3.0") +description("C parser in Python") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz") + +python.builddep("$shortcut") + + +def build(): + python.build() + python.install() + +on_build(build) + + +package("pycparser.py") +python.dep("python") +python.use_auto_pack() -- 2.55.0 From 0ada9d32fb4f83cd73400148590c7282ad304d56 Mon Sep 17 00:00:00 2001 From: sisungo Date: Mon, 17 Aug 2026 17:43:54 +0800 Subject: [PATCH 18/23] feat: add support of zip source archives Signed-off-by: sisungo --- lib/sources.py | 52 ++++++++++++++++++++++++++++++++++++++++---------- x.py | 1 + 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/lib/sources.py b/lib/sources.py index c643024..3748bdc 100644 --- a/lib/sources.py +++ b/lib/sources.py @@ -4,6 +4,7 @@ import sys import tarfile import urllib.parse import urllib.request +import zipfile def filename(url): @@ -128,6 +129,25 @@ def tar_common_root(tar: tarfile.TarFile) -> str | None: return root +def zip_common_root(zip_file: zipfile.ZipFile) -> str | None: + members = zip_file.infolist() + if not members: + return None + root = None + for member in members: + path = member.filename.replace('\\', '/').lstrip('./').lstrip('/') + if not path: + continue + this_root = path.split('/')[0] + if this_root in ('', '.', '..'): + continue + if root is None: + root = this_root + elif this_root != root: + return None + return root + + def sources_dir_name() -> str: with open("./target/sources.tag") as file: return file.read() @@ -139,16 +159,28 @@ def source_url(url: str): download_path = f"./target/{filename(url)}" download(url, download_path) - with tarfile.open(download_path, "r") as tar: - common_root = tar_common_root(tar) - extract_dir = "./target" - sources_dir = f"./target/{common_root}" - if common_root in ["", ".", "None"]: - extract_dir = "./target/sources" - sources_dir = "./target/sources" - tar.extractall(extract_dir) - with open("./target/sources.tag", "wt+") as file: - file.write(sources_dir) + if download_path.endswith(".zip"): + with zipfile.ZipFile(download_path, "r") as zip: + common_root = zip_common_root(zip) + else: + with tarfile.open(download_path, "r") as tar: + common_root = tar_common_root(tar) + + extract_dir = "./target" + sources_dir = f"./target/{common_root}" + if common_root in ["", ".", None]: + extract_dir = "./target/sources" + sources_dir = "./target/sources" + + if download_path.endswith(".zip"): + with zipfile.ZipFile(download_path, "r") as zip: + zip.extractall(extract_dir) + else: + with tarfile.open(download_path, "r") as tar: + tar.extractall(extract_dir) + + with open("./target/sources.tag", "wt+") as file: + file.write(sources_dir) def _git_repo_name(url: str) -> str: diff --git a/x.py b/x.py index f178d2f..2dd8a99 100644 --- a/x.py +++ b/x.py @@ -119,6 +119,7 @@ def cmd_build_package(package: str): "version": pkgver, "arch": pkgarch, "description": pkginfo[lib.make._key_description], + "maintainers": pkginfo[lib.make._key_maintainers], "dependencies": pkginfo[lib.make._key_dependencies], "provides": pkginfo[lib.make._key_provides], "recommendations": pkginfo[lib.make._key_recommendations], -- 2.55.0 From 75f756bd09f89e67d4a91ef672b557ad35ac7aa0 Mon Sep 17 00:00:00 2001 From: sisungo Date: Tue, 18 Aug 2026 14:00:25 +0800 Subject: [PATCH 19/23] feat: add general documents Signed-off-by: sisungo --- LICENSE | 24 ++++++++++++++++++++++++ README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..efb9808 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/README.md b/README.md new file mode 100644 index 0000000..92ee4c7 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# SemiOS Packages + +This is the SemiOS source package collection. + +## Usage + +To build a package for your native target, run: + +```shell +./x build +``` + +To cross-build a package for another target, run: + +```shell +./x --target build +``` + +After a package is successfully built, you can find the build artifacts +at `./packages//target/*.pkg`. + +To clean building files for a package, run: + +```shell +./x clean # Clean a package +./x clean --all # Clean all packages +``` + +## Targets + +This repository is for SemiOS targets only. Other targets are not guaranteed to work. +Currently, we support: + +- aarch64-semios-linux +- riscv64-semios-linux +- x86_64-semios-linux + +## Atom Builds + +*Atom Build* is a technology to make reproducible building environments. To build a +package in its atom environment, run: + +```shell +./x --atombuild build +``` + +You can use the `--atombuild` flag with other flags described above. -- 2.55.0 From 4f6837b076c3300b7426964fe686741cb235d6b6 Mon Sep 17 00:00:00 2001 From: sisungo Date: Tue, 18 Aug 2026 21:12:39 +0800 Subject: [PATCH 20/23] feat: add package gperf Signed-off-by: sisungo --- packages/gperf/pkgbuild.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 packages/gperf/pkgbuild.py diff --git a/packages/gperf/pkgbuild.py b/packages/gperf/pkgbuild.py new file mode 100644 index 0000000..f8a85ee --- /dev/null +++ b/packages/gperf/pkgbuild.py @@ -0,0 +1,24 @@ +from lib import arch, cpp +from lib.make import * + + +version("3.3") +description("GNU perfect hash function generator") +maintainer("sisungo ") +source_url("https://ftp.gnu.org/pub/gnu/gperf/gperf-3.3.tar.gz") + +builddep("shortcut/c++") +builddep("shortcut/autotools") + + +def build(): + cpp.configure() + cpp.make() + cpp.make_install() + +on_build(build) + + +package("gperf") +dep("libcxx @same-arch") +cpp.use_auto_pack(["bin"]) -- 2.55.0 From 9ffea2323453762391e2de8b265569299c588f2f Mon Sep 17 00:00:00 2001 From: sisungo Date: Wed, 19 Aug 2026 15:06:52 +0800 Subject: [PATCH 21/23] feat: add package setuptools-py Signed-off-by: sisungo --- packages/setuptools-py/pkgbuild.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 packages/setuptools-py/pkgbuild.py diff --git a/packages/setuptools-py/pkgbuild.py b/packages/setuptools-py/pkgbuild.py new file mode 100644 index 0000000..b7b5df1 --- /dev/null +++ b/packages/setuptools-py/pkgbuild.py @@ -0,0 +1,22 @@ +from lib.make import * +from lib import python + + +python.version("84.0.0") +description("Most extensible Python build backend with support for C/C++ extension modules") +maintainer("sisungo ") +source_url("https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz") + +python.builddep("$shortcut") + + +def build(): + python.build() + python.install() + +on_build(build) + + +package("setuptools.py") +python.dep("python") +python.use_auto_pack() -- 2.55.0 From aee73b0820524a13c4f783cbe92e1432aa0bad47 Mon Sep 17 00:00:00 2001 From: sisungo Date: Wed, 19 Aug 2026 19:58:58 +0800 Subject: [PATCH 22/23] feat: add package graphite Signed-off-by: sisungo --- packages/graphite/pkgbuild.py | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 packages/graphite/pkgbuild.py diff --git a/packages/graphite/pkgbuild.py b/packages/graphite/pkgbuild.py new file mode 100644 index 0000000..493102d --- /dev/null +++ b/packages/graphite/pkgbuild.py @@ -0,0 +1,48 @@ +import os + +import lib.cpp as cpp +from lib.make import * + + +version("1.3.15") +description("Graphite is a \"smart font\" system developed specifically to handle the complexities of lesser-known languages of the world.") +maintainer("sisungo ") +source_url("https://github.com/silnrsi/graphite/releases/download/1.3.15/graphite2-1.3.15.tgz") + +builddep("shortcut/c++") +builddep("shortcut/cmake") + + +def build(): + cpp.cmake([ + f"-DCMAKE_INSTALL_PREFIX={get_prefix('libgraphite-dev')}", + ]) + cpp.ninja() + cpp.ninja_install() + +on_build(build) + + +def pack_dev(composer): + composer.add_dir("bin", "bin") + composer.add_dir("include", "include") + composer.add_dir("share", "share") + composer.makedir("lib") + composer.add_dir("lib/pkgconfig", "lib/pkgconfig") + for i in os.listdir("lib"): + if not os.path.isfile(f"lib/{i}"): + continue + if ".so" in i: + os.symlink(f"{get_prefix('libgraphite')}/lib/{i}", f"{composer.workdir}/bundle/lib/{i}") + else: + composer.addfile(f"lib/{i}", f"lib/{i}") + + +package("libgraphite") +dep("semi-libc @same-arch") +cpp.use_auto_pack(["lib"]) + +package("libgraphite-dev") +dep("libgraphite (same)") +dep("semi-libc-dev @same-arch") +on_pack(pack_dev) -- 2.55.0 From 0f0ed19c8a0b6c8645016b992447ac8785e19bc3 Mon Sep 17 00:00:00 2001 From: sisungo Date: Thu, 20 Aug 2026 11:36:43 +0800 Subject: [PATCH 23/23] feat: fix glib include path Signed-off-by: sisungo --- packages/glib/pkgbuild.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/glib/pkgbuild.py b/packages/glib/pkgbuild.py index fea900b..7cda67a 100644 --- a/packages/glib/pkgbuild.py +++ b/packages/glib/pkgbuild.py @@ -31,7 +31,7 @@ def build(): f"-Dgio_module_dir=/lib/{arch.get_target()}/gio/modules", "--prefix=/", f"--bindir={get_prefix('glib-tools')}/bin", - f"--libdir={get_prefix('glib')}/lib", + f"--libdir={get_prefix('glib-dev')}/lib", f"--includedir={get_prefix('glib-dev')}/include", f"--libexecdir={get_prefix('libglib')}/libexec", f"--datadir={get_prefix('glib')}/share", -- 2.55.0