From bd16d6d218ae08897d6918ef6815d48701ef2d28 Mon Sep 17 00:00:00 2001 From: sisungo Date: Wed, 8 Jul 2026 00:48:59 +0800 Subject: [PATCH] feat: add support of atom builds Signed-off-by: sisungo --- lib/atombuild.py | 136 +++++++++++++++++++++++++++++ lib/cpp.py | 22 +++-- lib/make.py | 25 +++++- lib/packie.py | 24 ++++- packages/airup/pkgbuild.py | 2 + packages/alsa-lib/pkgbuild.py | 3 + packages/awk/pkgbuild.py | 4 + packages/aws-lc/pkgbuild.py | 11 ++- packages/bc/pkgbuild.py | 3 + packages/bmake/pkgbuild.py | 4 + packages/brotli/pkgbuild.py | 1 - packages/byacc/pkgbuild.py | 3 + packages/bzip2/pkgbuild.py | 8 +- packages/c-ares/pkgbuild.py | 3 + packages/certutil/pkgbuild.py | 2 + packages/coreutils/pkgbuild.py | 2 + packages/diffutils/pkgbuild.py | 2 + packages/expat/pkgbuild.py | 1 - packages/file/pkgbuild.py | 3 + packages/findutils/pkgbuild.py | 2 + packages/flex/pkgbuild.py | 4 + packages/gettext-tiny/pkgbuild.py | 3 + packages/git/pkgbuild.py | 6 +- packages/gnu-make/pkgbuild.py | 3 + packages/gnu-sed/pkgbuild.py | 3 + packages/grep/pkgbuild.py | 6 ++ packages/iana-timezone/pkgbuild.py | 3 + packages/icu4c/pkgbuild.py | 3 + packages/iproute2/pkgbuild.py | 4 + packages/libarchive/pkgbuild.py | 8 ++ packages/libffi/pkgbuild.py | 3 + packages/libgcc-compat/pkgbuild.py | 5 ++ packages/libopus/pkgbuild.py | 3 + packages/linux/pkgbuild.py | 6 ++ packages/mandoc/pkgbuild.py | 6 +- packages/mksh/pkgbuild.py | 11 ++- packages/ncurses/pkgbuild.py | 3 + packages/neatvi/pkgbuild.py | 3 + packages/nextvi/pkgbuild.py | 3 + packages/nghttp2/pkgbuild.py | 1 - packages/ninja/pkgbuild.py | 2 + packages/openssh/pkgbuild.py | 5 ++ packages/patch/pkgbuild.py | 2 + packages/pcre2/pkgbuild.py | 2 +- packages/perl/pkgbuild.py | 3 + packages/pkgconf/pkgbuild.py | 3 + packages/python/pkgbuild.py | 14 ++- packages/rhash/pkgbuild.py | 3 + packages/ripgrep/pkgbuild.py | 2 + packages/sed/pkgbuild.py | 4 + packages/semi-libc/pkgbuild.py | 4 + packages/sqlite/pkgbuild.py | 6 ++ packages/vim/pkgbuild.py | 4 + packages/xz/pkgbuild.py | 6 ++ packages/zlib-ng/pkgbuild.py | 2 + packages/zstd/pkgbuild.py | 3 + x.py | 48 +++++++++- 57 files changed, 433 insertions(+), 28 deletions(-) create mode 100644 lib/atombuild.py diff --git a/lib/atombuild.py b/lib/atombuild.py new file mode 100644 index 0000000..88f8a99 --- /dev/null +++ b/lib/atombuild.py @@ -0,0 +1,136 @@ +import os +import shutil +import subprocess + +from . import packie + +BASE_REQUIREMENTS = [ + # Basic packages for running shell scripts + "mksh", + "coreutils", + "findutils", + "diffutils", + # Packages for running `semios-packages` scripts + "python", + "packie", + "patch", + "zstd", + # Basic libraries + "sqlite", + "libgcc-compat", + "libcxx", + "semi-libc", + "libz-ng", + # Networking + "ca-certificates", + "certutil", + "aws-lc-libssl", + "aws-lc-tools", +] + + +def _prepare_build_env_base_files(root: str): + os.makedirs(root, exist_ok=True) + os.mkdir(f"{root}/var") + os.mkdir(f"{root}/var/tmp") + os.mkdir(f"{root}/var/run") + os.mkdir(f"{root}/tmp") + os.mkdir(f"{root}/run") + os.makedirs(f"{root}/var/db/packie") + shutil.copytree("/var/config/packie/repos.d", f"{root}/var/config/packie/repos.d") + os.mkdir(f"{root}/dev") + os.mkdir(f"{root}/sys") + os.mkdir(f"{root}/proc") + os.makedirs(f"{root}/home/root") + + +def prepare_build_env(root: str, extreq: list[str] = []): + # Skip if the environment is already initialized + if os.path.exists(f"{root}/.INIT"): + return + try: + shutil.rmtree(root) + except: + pass + + # Prepare basic filesystem hierarchy + _prepare_build_env_base_files(root) + + # Install packages + packie.chroot_update(root) + packie.chroot_install(root, BASE_REQUIREMENTS + extreq) + + # Refresh certificates + enter_build_env(root, ["certutil", "refresh"]) + + # Copy DNS config + os.makedirs(f"{root}/etc", exist_ok=True) + shutil.copy2("/etc/resolv.conf", f"{root}/etc/resolv.conf") + + # Create initialized tag + with open(f"{root}/.INIT", "wt+") as file: + file.write("OK") + + +def enter_build_env(root: str, cmd: list[str], chdir: str = "/"): + reserve_env = ["https_proxy", "http_proxy", "all_proxy"] + reserve_env_args = [] + for i in reserve_env: + if os.environ.get(i): + reserve_env_args += ["--setenv", i, os.environ[i]] + subprocess.run( + [ + "bwrap", + "--bind", + root, + "/", + "--unshare-pid", + "--unshare-user", + "--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", + "--chdir", + chdir, + ] + + reserve_env_args + + cmd + ) + + +def copy_pkgbuild_tree(repo_root: str, pkgname: str, build_env_root: str): + build_dir = f"{build_env_root}/Atom" + if os.path.exists(build_dir): + return + os.mkdir(build_dir) + shutil.copytree(f"{repo_root}/hooks", f"{build_dir}/hooks") + shutil.copytree(f"{repo_root}/lib", f"{build_dir}/lib") + shutil.copy2(f"{repo_root}/x", f"{build_dir}/x") + shutil.copy2(f"{repo_root}/x.py", f"{build_dir}/x.py") + os.makedirs(f"{build_dir}/packages/{pkgname}") + for i in os.listdir(f"{repo_root}/packages/{pkgname}"): + srcpath = f"{repo_root}/packages/{pkgname}/{i}" + dstpath = f"{build_dir}/packages/{pkgname}/{i}" + if i in ["target", "__pycache__"]: + continue + if os.path.isdir(srcpath): + shutil.copytree(srcpath, dstpath) + elif os.path.isfile(srcpath): + shutil.copy2(srcpath, dstpath) diff --git a/lib/cpp.py b/lib/cpp.py index f6f4a9a..68af147 100644 --- a/lib/cpp.py +++ b/lib/cpp.py @@ -29,6 +29,15 @@ def cmake(rem: list[str] = []): ) +def _move_install(): + subprocess.run(["sh", "-c", "cp -r ./pkg/*@*/* . 2>/dev/null || true"], check=False) + subprocess.run( + ["sh", "-c", "cp -r ./usr/local/* . 2>/dev/null || true"], check=False + ) + subprocess.run(["sh", "-c", "cp -r ./usr/* . 2>/dev/null || true"], check=False) + subprocess.run(["rm", "-rf", "./pkg", "./usr"], check=False) + + def make(rem: list[str] = []): subprocess.run(["make", f"-j{os.cpu_count()}"] + rem, check=True) @@ -44,26 +53,21 @@ def make_install(rem: list[str] | None = None, chdir: bool = True, move: bool = if rem is None and chdir: os.chdir("../cpp_install") if chdir and move: - subprocess.run( - ["sh", "-c", "cp -r ./pkg/*@*/* . 2>/dev/null || true"], check=False - ) - subprocess.run( - ["sh", "-c", "cp -r ./usr/local/* . 2>/dev/null || true"], check=False - ) - subprocess.run(["sh", "-c", "cp -r ./usr/* . 2>/dev/null || true"], check=False) - subprocess.run(["rm", "-rf", "./pkg", "./usr"], check=False) + _move_install() def ninja(rem: list[str] = []): subprocess.run(["ninja"] + rem, check=True) -def ninja_install(rem: list[str] = [], chdir: bool = True): +def ninja_install(rem: list[str] = [], chdir: bool = True, move: bool = True): if chdir: os.environ["DESTDIR"] = os.getcwd() + "/../cpp_install" subprocess.run(["ninja", "install"] + rem, check=True) if chdir: os.chdir(os.environ["DESTDIR"]) + if chdir and move: + _move_install() def meson_setup(rem: list[str] = []): diff --git a/lib/make.py b/lib/make.py index a045423..433a5ea 100644 --- a/lib/make.py +++ b/lib/make.py @@ -24,9 +24,28 @@ _pkginfo: dict[str, dict[str, typing.Any]] = { _supported_arch: typing.Callable[[str], bool] = lambda x: True _on_build: typing.Callable[[], None] | None = None +_in_atombuild = False +_builddep: list[str] = [] + _blocked_hooks: list[str] = [] +def builddep(s: str): + global _builddep + if s == "shortcut/c": + _builddep += ["semi-libc-dev", "clang", "llvm", "lld"] + elif s == "shortcut/c++": + builddep("shortcut/c") + _builddep += ["libcxx-dev"] + elif s == "shortcut/autotools": + _builddep += ["gnu-make", "gnu-sed", "awk", "grep"] + elif s == "shortcut/rust": + builddep("shortcut/c") + _builddep += ["cargo", "rustc"] + else: + _builddep += [s] + + def package(s: str): global _current_pkgname _current_pkgname = s @@ -103,8 +122,10 @@ def block_hook(hook: str): def source_url(url: str): - sources.source_url(url) + if not _in_atombuild: + sources.source_url(url) def source_git(url: str, branch: str | None = None): - sources.source_git(url, branch) + if not _in_atombuild: + sources.source_git(url, branch) diff --git a/lib/packie.py b/lib/packie.py index 5ed847f..35c012a 100644 --- a/lib/packie.py +++ b/lib/packie.py @@ -1,11 +1,31 @@ -import subprocess import os +import subprocess PACKIE_EXEC = os.getenv("PACKIE", "packie") + def host_arch() -> str: result = subprocess.run( [PACKIE_EXEC, "print", "profile.host_arch"], - check=True, capture_output=True, + check=True, + capture_output=True, ) return result.stdout.decode().strip() + + +def chroot_update(root: str): + subprocess.run([PACKIE_EXEC, "--chroot", root, "update"], check=True) + + +def chroot_install(root: str, requirements: list[str]): + subprocess.run( + [PACKIE_EXEC, "--chroot", root, "install", "--yes"] + requirements, check=True + ) + + +def update(): + subprocess.run([PACKIE_EXEC, "update"], check=True) + + +def install(requirements: list[str]): + subprocess.run([PACKIE_EXEC, "install", "--yes"] + requirements, check=True) diff --git a/packages/airup/pkgbuild.py b/packages/airup/pkgbuild.py index 80561af..7303294 100644 --- a/packages/airup/pkgbuild.py +++ b/packages/airup/pkgbuild.py @@ -7,6 +7,8 @@ from lib.make import * version("0.10.9") source_url("https://github.com/sisungo/airup/archive/refs/tags/v0.10.9.tar.gz") +builddep("shortcut/rust") + def build(): shutil.copy2("../../build_manifest.json", "build_manifest.json") diff --git a/packages/alsa-lib/pkgbuild.py b/packages/alsa-lib/pkgbuild.py index d43be2d..538dc8e 100644 --- a/packages/alsa-lib/pkgbuild.py +++ b/packages/alsa-lib/pkgbuild.py @@ -6,6 +6,9 @@ upstream_version = "1.2.16.1" version(upstream_version) source_url("https://www.alsa-project.org/files/pub/lib/alsa-lib-1.2.16.1.tar.bz2") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/awk/pkgbuild.py b/packages/awk/pkgbuild.py index 3cb1454..66d60f5 100644 --- a/packages/awk/pkgbuild.py +++ b/packages/awk/pkgbuild.py @@ -6,6 +6,10 @@ from lib.make import * version("2026.4.26") source_url("https://github.com/onetrueawk/awk/archive/refs/tags/20260426.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep("bison") + def build(): cpp.make() diff --git a/packages/aws-lc/pkgbuild.py b/packages/aws-lc/pkgbuild.py index 33e5296..b0729d1 100644 --- a/packages/aws-lc/pkgbuild.py +++ b/packages/aws-lc/pkgbuild.py @@ -6,12 +6,19 @@ from lib.make import * version("5.1.0") source_url("https://github.com/aws/aws-lc/archive/refs/tags/v5.1.0.tar.gz") +builddep("shortcut/c") + def build(): - cpp.cmake(["-DBUILD_SHARED_LIBS=1"]) + cpp.cmake( + [ + "-DBUILD_SHARED_LIBS=1", + "-DCMAKE_INSTALL_PREFIX=/", + f"-DCMAKE_INSTALL_INCLUDEDIR={get_prefix('aws-lc-dev')}", + ] + ) cpp.ninja() cpp.ninja_install() - os.chdir("usr") on_build(build) diff --git a/packages/bc/pkgbuild.py b/packages/bc/pkgbuild.py index c3a864c..74b5bd7 100644 --- a/packages/bc/pkgbuild.py +++ b/packages/bc/pkgbuild.py @@ -4,6 +4,9 @@ from lib.make import * version("7.0.3") source_url("https://github.com/gavinhoward/bc/releases/download/7.0.3/bc-7.0.3.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): predefined_build_type = "GDH" diff --git a/packages/bmake/pkgbuild.py b/packages/bmake/pkgbuild.py index f0ea4a4..d34f501 100644 --- a/packages/bmake/pkgbuild.py +++ b/packages/bmake/pkgbuild.py @@ -8,6 +8,10 @@ VERSION = "2026.6.19" version(VERSION) source_url("https://www.crufty.net/ftp/pub/sjg/bmake-20260619.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep("bc") + def build(): cpp.configure( diff --git a/packages/brotli/pkgbuild.py b/packages/brotli/pkgbuild.py index 4a0149f..dbca5a2 100644 --- a/packages/brotli/pkgbuild.py +++ b/packages/brotli/pkgbuild.py @@ -11,7 +11,6 @@ def build(): cpp.cmake() cpp.ninja() cpp.ninja_install() - os.chdir("usr") on_build(build) diff --git a/packages/byacc/pkgbuild.py b/packages/byacc/pkgbuild.py index 3fee848..a7dbcb2 100644 --- a/packages/byacc/pkgbuild.py +++ b/packages/byacc/pkgbuild.py @@ -6,6 +6,9 @@ from lib.make import * version("2.0") source_url("https://www.invisible-island.net/archives/byacc/byacc-2.0.tgz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure([f"--prefix={get_prefix('byacc')}", "--enable-btyacc"]) diff --git a/packages/bzip2/pkgbuild.py b/packages/bzip2/pkgbuild.py index 78d015a..5fd7bd5 100644 --- a/packages/bzip2/pkgbuild.py +++ b/packages/bzip2/pkgbuild.py @@ -6,17 +6,21 @@ from lib.make import * upstream_version = "1.0.8" +builddep("shortcut/c") +builddep("shortcut/autotools") + version(f"{upstream_version}") source_url(f"https://sourceware.org/pub/bzip2/bzip2-{upstream_version}.tar.gz") def build(): - cpp.make(["-f", "Makefile-libbz2_so"]) + makevars = [f"CC={os.environ.get('CC', 'cc')}"] + cpp.make(["-f", "Makefile-libbz2_so"] + makevars) try: shutil.rmtree("../cpp_install") except Exception: pass - cpp.make_install(["PREFIX=../cpp_install"], chdir=False) + cpp.make_install(["PREFIX=../cpp_install" + makevars], chdir=False) shutil.copy2( f"libbz2.so.{upstream_version}", f"../cpp_install/lib/libbz2.so.{upstream_version}", diff --git a/packages/c-ares/pkgbuild.py b/packages/c-ares/pkgbuild.py index f5d33fc..146925a 100644 --- a/packages/c-ares/pkgbuild.py +++ b/packages/c-ares/pkgbuild.py @@ -6,6 +6,9 @@ source_url( "https://github.com/c-ares/c-ares/releases/download/v1.34.6/c-ares-1.34.6.tar.gz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/certutil/pkgbuild.py b/packages/certutil/pkgbuild.py index bff2aaf..1e64a2c 100644 --- a/packages/certutil/pkgbuild.py +++ b/packages/certutil/pkgbuild.py @@ -4,6 +4,8 @@ from lib.make import * version("0.1.0") source_url("https://gitea.semilabs.org/semios/certutil/archive/v0.1.0.tar.gz") +builddep("shortcut/rust") + def build(): rust.build() diff --git a/packages/coreutils/pkgbuild.py b/packages/coreutils/pkgbuild.py index 0f4689c..4b900bf 100644 --- a/packages/coreutils/pkgbuild.py +++ b/packages/coreutils/pkgbuild.py @@ -5,6 +5,8 @@ version("0.9.0") source_url("https://github.com/uutils/coreutils/archive/refs/tags/0.9.0.tar.gz") block_hook("autolink") +builddep("shortcut/rust") + def build(): rust.build(["--features", "unix"]) diff --git a/packages/diffutils/pkgbuild.py b/packages/diffutils/pkgbuild.py index 578b827..12d6d2f 100644 --- a/packages/diffutils/pkgbuild.py +++ b/packages/diffutils/pkgbuild.py @@ -4,6 +4,8 @@ from lib.make import * version("0.5.0") source_url("https://github.com/uutils/diffutils/archive/refs/tags/v0.5.0.tar.gz") +builddep("shortcut/rust") + block_hook("autolink") diff --git a/packages/expat/pkgbuild.py b/packages/expat/pkgbuild.py index 08d5da9..89feaa6 100644 --- a/packages/expat/pkgbuild.py +++ b/packages/expat/pkgbuild.py @@ -13,7 +13,6 @@ def build(): cpp.cmake() cpp.ninja() cpp.ninja_install() - os.chdir("usr") on_build(build) diff --git a/packages/file/pkgbuild.py b/packages/file/pkgbuild.py index a0098c5..e72d3c5 100644 --- a/packages/file/pkgbuild.py +++ b/packages/file/pkgbuild.py @@ -8,6 +8,9 @@ VERSION = "5.48" version(VERSION) source_git("https://github.com/file/file.git", "FILE5_48") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): subprocess.run(["autoreconf", "-fiv"], check=True) diff --git a/packages/findutils/pkgbuild.py b/packages/findutils/pkgbuild.py index 0a9ec04..27f25dc 100644 --- a/packages/findutils/pkgbuild.py +++ b/packages/findutils/pkgbuild.py @@ -4,6 +4,8 @@ from lib.make import * version("0.9.0") source_url("https://github.com/uutils/findutils/archive/refs/tags/0.9.0.tar.gz") +builddep("shortcut/rust") + def build(): rust.build() diff --git a/packages/flex/pkgbuild.py b/packages/flex/pkgbuild.py index 16719dd..9806644 100644 --- a/packages/flex/pkgbuild.py +++ b/packages/flex/pkgbuild.py @@ -4,6 +4,10 @@ from lib.make import * version("2.6.4") source_url("https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep("m4") + def build(): cpp.configure( diff --git a/packages/gettext-tiny/pkgbuild.py b/packages/gettext-tiny/pkgbuild.py index 94b24e9..aa82d4e 100644 --- a/packages/gettext-tiny/pkgbuild.py +++ b/packages/gettext-tiny/pkgbuild.py @@ -8,6 +8,9 @@ source_url( "https://github.com/sabotage-linux/gettext-tiny/releases/download/v0.3.3/gettext-tiny-0.3.3.tar.xz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.make(["LIBINTL=musl"]) diff --git a/packages/git/pkgbuild.py b/packages/git/pkgbuild.py index 93a63b3..3dc11a5 100644 --- a/packages/git/pkgbuild.py +++ b/packages/git/pkgbuild.py @@ -1,11 +1,15 @@ import subprocess -from lib import cpp +from lib import arch, cpp from lib.make import * version("2.55.0") source_url("https://www.kernel.org/pub/software/scm/git/git-2.55.0.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep(f"libz-dev {arch.get_target()}") + def build(): cpp.configure( diff --git a/packages/gnu-make/pkgbuild.py b/packages/gnu-make/pkgbuild.py index 23a1464..749ec3a 100644 --- a/packages/gnu-make/pkgbuild.py +++ b/packages/gnu-make/pkgbuild.py @@ -4,6 +4,9 @@ from lib.make import * version("4.4.1") source_url("https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure([f"--prefix={get_prefix('gnu-make')}"]) diff --git a/packages/gnu-sed/pkgbuild.py b/packages/gnu-sed/pkgbuild.py index 5c7506d..634d4fe 100644 --- a/packages/gnu-sed/pkgbuild.py +++ b/packages/gnu-sed/pkgbuild.py @@ -8,6 +8,9 @@ source_url("https://ftp.gnu.org/gnu/sed/sed-4.10.tar.gz") block_hook("autolink") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/grep/pkgbuild.py b/packages/grep/pkgbuild.py index 7eb0327..7b6565d 100644 --- a/packages/grep/pkgbuild.py +++ b/packages/grep/pkgbuild.py @@ -5,6 +5,12 @@ from lib.make import * version("15.1.2") source_url("https://gitea.semilabs.org/semios/grep/archive/v15.1.2.tar.gz") +builddep("shortcut/c") +builddep(f"libpcre2-dev @{arch.get_target()}") +builddep("pcre2-tools") +builddep(f"libbzip2-dev @{arch.get_target()}") +builddep(f"libz-ng-dev @{arch.get_target()}") + def build(): subprocess.run(["./build.sh"], check=True) diff --git a/packages/iana-timezone/pkgbuild.py b/packages/iana-timezone/pkgbuild.py index 0c344e1..5d0dfad 100644 --- a/packages/iana-timezone/pkgbuild.py +++ b/packages/iana-timezone/pkgbuild.py @@ -6,6 +6,9 @@ from lib.make import * version("2026.4.22") source_url("https://data.iana.org/time-zones/releases/tzdb-2026b.tar.lz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.make() diff --git a/packages/icu4c/pkgbuild.py b/packages/icu4c/pkgbuild.py index d7ec55a..c8c7cdc 100644 --- a/packages/icu4c/pkgbuild.py +++ b/packages/icu4c/pkgbuild.py @@ -8,6 +8,9 @@ source_url( "https://github.com/unicode-org/icu/releases/download/release-78.3/icu4c-78.3-sources.tgz" ) +builddep("shortcut/c++") +builddep("shortcut/autotools") + def build(): os.chdir("source") diff --git a/packages/iproute2/pkgbuild.py b/packages/iproute2/pkgbuild.py index 6741049..e2d3e09 100644 --- a/packages/iproute2/pkgbuild.py +++ b/packages/iproute2/pkgbuild.py @@ -7,6 +7,10 @@ from lib.make import * version("7.1.0") source_git("https://git.kernel.org/pub/scm/network/iproute2/iproute2.git", "v7.1.0") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep("git") + def build(): cpp.configure() diff --git a/packages/libarchive/pkgbuild.py b/packages/libarchive/pkgbuild.py index 198e0a9..1975474 100644 --- a/packages/libarchive/pkgbuild.py +++ b/packages/libarchive/pkgbuild.py @@ -6,6 +6,14 @@ source_url( "https://github.com/libarchive/libarchive/releases/download/v3.8.7/libarchive-3.8.7.tar.gz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep(f"aws-lc-dev @{arch.get_target()}") +builddep(f"libz-ng-dev @{arch.get_target()}") +builddep(f"libzstd-dev @{arch.get_target()}") +builddep(f"libbzip2-dev @{arch.get_target()}") +builddep(f"liblzma-dev @{arch.get_target()}") + def build(): cpp.configure( diff --git a/packages/libffi/pkgbuild.py b/packages/libffi/pkgbuild.py index da118bf..11a3d71 100644 --- a/packages/libffi/pkgbuild.py +++ b/packages/libffi/pkgbuild.py @@ -6,6 +6,9 @@ source_url( "https://github.com/libffi/libffi/releases/download/v3.6.0/libffi-3.6.0.tar.gz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/libgcc-compat/pkgbuild.py b/packages/libgcc-compat/pkgbuild.py index 0f04528..9f07397 100644 --- a/packages/libgcc-compat/pkgbuild.py +++ b/packages/libgcc-compat/pkgbuild.py @@ -1,11 +1,16 @@ import os import subprocess +from lib import arch from lib.make import * version("0.1.0") source_url(f"file://{os.getcwd()}/empty.tar") +builddep("shortcut/c") +builddep(f"libunwind-dev {arch.get_target()}") +builddep(f"linux-dev {arch.get_target()}") + def build(): subprocess.run( diff --git a/packages/libopus/pkgbuild.py b/packages/libopus/pkgbuild.py index da895ab..ea39a12 100644 --- a/packages/libopus/pkgbuild.py +++ b/packages/libopus/pkgbuild.py @@ -4,6 +4,9 @@ from lib.make import * version("1.6.1") source_url("https://downloads.xiph.org/releases/opus/opus-1.6.1.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/linux/pkgbuild.py b/packages/linux/pkgbuild.py index ff15dab..84badfe 100644 --- a/packages/linux/pkgbuild.py +++ b/packages/linux/pkgbuild.py @@ -12,6 +12,12 @@ source_url( f"https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-{upstream_version}.tar.xz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep("libncurses-dev") +builddep("aws-lc-dev") +builddep("aws-lc-tools") + def get_arch(): return arch.get_target().split("-")[0].replace("aarch64", "arm64") diff --git a/packages/mandoc/pkgbuild.py b/packages/mandoc/pkgbuild.py index 587d5d9..95f2ded 100644 --- a/packages/mandoc/pkgbuild.py +++ b/packages/mandoc/pkgbuild.py @@ -1,12 +1,16 @@ import os import subprocess -from lib import cpp +from lib import arch, cpp from lib.make import * version("1.14.6") source_url("https://mandoc.bsd.lv/snapshots/mandoc-1.14.6.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep(f"libz-ng-dev @{arch.get_target()}") + def build(): cpp.configure() diff --git a/packages/mksh/pkgbuild.py b/packages/mksh/pkgbuild.py index b6e6e68..8a54259 100644 --- a/packages/mksh/pkgbuild.py +++ b/packages/mksh/pkgbuild.py @@ -1,13 +1,18 @@ -import os +import subprocess from lib.make import * version("1.59.2") -source_git("https://github.com/mirabilos/mksh-cvs2git.git", "mksh-R59c") +source_url( + "https://github.com/mirabilos/mksh-cvs2git/archive/refs/tags/mksh-R59c.tar.gz" +) + +builddep("shortcut/c") +builddep("sed") def build(): - os.system("sh ./Build.sh") + subprocess.run(["sh", "./Build.sh"], check=True) on_build(build) diff --git a/packages/ncurses/pkgbuild.py b/packages/ncurses/pkgbuild.py index 7ac48ea..7a6fa8b 100644 --- a/packages/ncurses/pkgbuild.py +++ b/packages/ncurses/pkgbuild.py @@ -6,6 +6,9 @@ from lib.make import * version("6.6") source_url("https://invisible-island.net/archives/ncurses/ncurses-6.6.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/neatvi/pkgbuild.py b/packages/neatvi/pkgbuild.py index 8d86872..971461b 100644 --- a/packages/neatvi/pkgbuild.py +++ b/packages/neatvi/pkgbuild.py @@ -6,6 +6,9 @@ from lib.make import * version("19") source_url("https://github.com/aligrudi/neatvi/archive/refs/tags/19.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.make([f"CC={os.environ['CC']}"]) diff --git a/packages/nextvi/pkgbuild.py b/packages/nextvi/pkgbuild.py index b7fab6e..580a1e0 100644 --- a/packages/nextvi/pkgbuild.py +++ b/packages/nextvi/pkgbuild.py @@ -7,6 +7,9 @@ from lib.make import * version("5.3") source_url("https://github.com/kyx0r/nextvi/archive/refs/tags/5.3.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): os.environ["PREFIX"] = "/" diff --git a/packages/nghttp2/pkgbuild.py b/packages/nghttp2/pkgbuild.py index cf3ee3b..f95ce79 100644 --- a/packages/nghttp2/pkgbuild.py +++ b/packages/nghttp2/pkgbuild.py @@ -13,7 +13,6 @@ def build(): cpp.cmake() cpp.ninja() cpp.ninja_install() - os.chdir("usr") on_build(build) diff --git a/packages/ninja/pkgbuild.py b/packages/ninja/pkgbuild.py index 685380d..1771e06 100644 --- a/packages/ninja/pkgbuild.py +++ b/packages/ninja/pkgbuild.py @@ -5,6 +5,8 @@ from lib.make import * version("1.13.2") source_url("https://github.com/ninja-build/ninja/archive/refs/tags/v1.13.2.tar.gz") +builddep("shortcut/c++") + def build(): os.system("./configure.py --bootstrap") diff --git a/packages/openssh/pkgbuild.py b/packages/openssh/pkgbuild.py index d55f8fb..b65e0d2 100644 --- a/packages/openssh/pkgbuild.py +++ b/packages/openssh/pkgbuild.py @@ -4,6 +4,11 @@ from lib.make import * version("10.3.1") source_url("https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.3p1.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep(f"libz-ng-dev @{arch.get_target()}") +builddep(f"aws-lc-dev @{arch.get_target()}") + def build(): cpp.configure( diff --git a/packages/patch/pkgbuild.py b/packages/patch/pkgbuild.py index c4cd529..b00a10e 100644 --- a/packages/patch/pkgbuild.py +++ b/packages/patch/pkgbuild.py @@ -6,6 +6,8 @@ from lib.make import * version("15.1.1") source_url("https://gitea.semilabs.org/semios/patch/archive/v15.1.1.tar.gz") +builddep("shortcut/c") + def build(): subprocess.run(["./build.sh"], check=True) diff --git a/packages/pcre2/pkgbuild.py b/packages/pcre2/pkgbuild.py index c8763b6..348ba7b 100644 --- a/packages/pcre2/pkgbuild.py +++ b/packages/pcre2/pkgbuild.py @@ -30,6 +30,6 @@ package("pcre2-tools") dep("libpcre2 (same)") cpp.use_auto_pack(["bin"]) -dep("libpcre2-dev") +package("libpcre2-dev") dep("semi-libc @same-arch") cpp.use_auto_pack(["dev"]) diff --git a/packages/perl/pkgbuild.py b/packages/perl/pkgbuild.py index 06e5719..4496bad 100644 --- a/packages/perl/pkgbuild.py +++ b/packages/perl/pkgbuild.py @@ -9,6 +9,9 @@ upstream_version = "5.42.2" version(upstream_version) source_url("https://www.cpan.org/src/5.0/perl-5.42.2.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + block_hook("autolink") diff --git a/packages/pkgconf/pkgbuild.py b/packages/pkgconf/pkgbuild.py index 3f75137..07b1cd3 100644 --- a/packages/pkgconf/pkgbuild.py +++ b/packages/pkgconf/pkgbuild.py @@ -5,6 +5,9 @@ from lib.make import * version("2.5.1") source_url("https://distfiles.ariadne.space/pkgconf/pkgconf-2.5.1.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/python/pkgbuild.py b/packages/python/pkgbuild.py index 19b1a1d..1a893f0 100644 --- a/packages/python/pkgbuild.py +++ b/packages/python/pkgbuild.py @@ -1,6 +1,5 @@ import os import shutil -import subprocess from lib import arch, cpp from lib.make import * @@ -15,6 +14,19 @@ source_url( f"https://www.python.org/ftp/python/{VERSION_FULL}/Python-{VERSION_FULL}.tar.xz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep(f"liblzma-dev @{arch.get_target()}") +builddep(f"libzstd-dev @{arch.get_target()}") +builddep(f"libz-ng-dev @{arch.get_target()}") +builddep(f"aws-lc-dev @{arch.get_target()}") +builddep(f"libexpat-dev @{arch.get_target()}") +builddep(f"libsqlite-dev @{arch.get_target()}") +builddep(f"libncurses-dev @{arch.get_target()}") +builddep(f"libbzip2-dev @{arch.get_target()}") +builddep(f"libffi-dev @{arch.get_target()}") +builddep("pkgconf") + def build(): cpp.configure( diff --git a/packages/rhash/pkgbuild.py b/packages/rhash/pkgbuild.py index 14baffd..af2d8c9 100644 --- a/packages/rhash/pkgbuild.py +++ b/packages/rhash/pkgbuild.py @@ -4,6 +4,9 @@ from lib.make import * version("1.4.6") source_url("https://github.com/rhash/RHash/archive/refs/tags/v1.4.6.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.configure( diff --git a/packages/ripgrep/pkgbuild.py b/packages/ripgrep/pkgbuild.py index e2e60a1..c1e4502 100644 --- a/packages/ripgrep/pkgbuild.py +++ b/packages/ripgrep/pkgbuild.py @@ -4,6 +4,8 @@ from lib.make import * version("15.1.0") source_url("https://github.com/BurntSushi/ripgrep/archive/refs/tags/15.1.0.tar.gz") +builddep("shortcut/rust") + def build(): rust.build() diff --git a/packages/sed/pkgbuild.py b/packages/sed/pkgbuild.py index 8d721e1..933b63f 100644 --- a/packages/sed/pkgbuild.py +++ b/packages/sed/pkgbuild.py @@ -5,6 +5,10 @@ from lib.make import * version("15.1.1") source_url("https://gitea.semilabs.org/semios/sed/archive/v15.1.1.tar.gz") +builddep("shortcut/c") +builddep(f"libpcre2-dev @{arch.get_target()}") +builddep("pcre2-tools") + def build(): subprocess.run(["./build.sh"]) diff --git a/packages/semi-libc/pkgbuild.py b/packages/semi-libc/pkgbuild.py index 1a0da63..aebdc6d 100644 --- a/packages/semi-libc/pkgbuild.py +++ b/packages/semi-libc/pkgbuild.py @@ -5,6 +5,10 @@ version("1.2.6+1") source_url("https://gitea.semilabs.org/semios/semi-libc/archive/v1.2.6-1.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") + + def build(): cpp.configure(["--prefix=/"]) cpp.make() diff --git a/packages/sqlite/pkgbuild.py b/packages/sqlite/pkgbuild.py index 8d8d8f3..621be52 100644 --- a/packages/sqlite/pkgbuild.py +++ b/packages/sqlite/pkgbuild.py @@ -1,9 +1,15 @@ +import os + import lib.cpp as cpp from lib.make import * version("3.53.2") source_url("https://sqlite.org/2026/sqlite-autoconf-3530200.tar.gz") +builddep("shortcut/autotools") +builddep("shortcut/c") +builddep("linenoise-dev") + def build(): cpp.configure( diff --git a/packages/vim/pkgbuild.py b/packages/vim/pkgbuild.py index df86422..b8abdd7 100644 --- a/packages/vim/pkgbuild.py +++ b/packages/vim/pkgbuild.py @@ -6,6 +6,10 @@ upstream_version = "9.2.782" version(upstream_version) source_url("https://github.com/vim/vim/archive/refs/tags/v9.2.0782.tar.gz") +builddep("shortcut/c") +builddep("shortcut/autotools") +builddep(f"libncurses-dev @{arch.get_target()}") + def build(): cpp.configure( diff --git a/packages/xz/pkgbuild.py b/packages/xz/pkgbuild.py index c368342..a98fae2 100644 --- a/packages/xz/pkgbuild.py +++ b/packages/xz/pkgbuild.py @@ -1,3 +1,5 @@ +import os + from lib import cpp from lib.make import * @@ -6,8 +8,12 @@ source_url( "https://github.com/tukaani-project/xz/releases/download/v5.8.3/xz-5.8.3.tar.gz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): + os.environ["FGREP"] = "grep -F" cpp.configure( [ "--prefix=/", diff --git a/packages/zlib-ng/pkgbuild.py b/packages/zlib-ng/pkgbuild.py index 1acdf4c..29de6fe 100644 --- a/packages/zlib-ng/pkgbuild.py +++ b/packages/zlib-ng/pkgbuild.py @@ -6,6 +6,8 @@ from lib.make import * version("2.3.3") source_url("https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.3.3.tar.gz") +builddep("shortcut/c++") + def build(): cpp.cmake(["-DZLIB_COMPAT=ON", "-DINSTALL_UTILS=ON"]) diff --git a/packages/zstd/pkgbuild.py b/packages/zstd/pkgbuild.py index 7ae1452..aa43df5 100644 --- a/packages/zstd/pkgbuild.py +++ b/packages/zstd/pkgbuild.py @@ -8,6 +8,9 @@ source_url( "https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz" ) +builddep("shortcut/c") +builddep("shortcut/autotools") + def build(): cpp.make(["HAVE_ZLIB=0", "HAVE_LZMA=0", "HAVE_LZ4=0"]) diff --git a/x.py b/x.py index 4460a4f..f1ebe41 100644 --- a/x.py +++ b/x.py @@ -7,7 +7,9 @@ import typing import hooks import lib.arch +import lib.atombuild import lib.make +import lib.packie import lib.pkgcomposer import lib.sources @@ -20,6 +22,7 @@ argparser = argparse.ArgumentParser( argparser.add_argument( "--target", type=str, help="Target architecture to build the package for" ) +argparser.add_argument("--atombuild", action="store_true", help="Enable Atom Build") subparsers = argparser.add_subparsers(dest="subcommand") parser_build = subparsers.add_parser("build") parser_build.add_argument("BUILD_PKGNAME") @@ -64,6 +67,9 @@ def run_build_package(package: str): print(f"Architecture {lib.arch.get_target()} is not supported for this package") exit(1) + if os.environ.get("SEMIOS_PKGBUILD_IN_ATOMIC", "0") == "1": + lib.packie.install(lib.make._builddep) + # Run `pre_build` hooks run_hooks(hooks.pre_build) @@ -151,8 +157,48 @@ def run_list(item): print(i) +def run_build_atom(pkgname: str): + # Declare necessary paths + repo_root = os.getcwd() + package_dir = f"{repo_root}/packages/{pkgname}" + target_dir = f"{package_dir}/target" + build_env_root = f"{target_dir}/atombuild_root" + + # Read `pkgbuild.py` of that package + lib.make._in_atombuild = True + try: + os.chdir(package_dir) + os.makedirs(target_dir, exist_ok=True) + except Exception: + print(f"No such package {pkgname}") + exit(1) + importlib.import_module(f"packages.{pkgname}.pkgbuild") + os.chdir(repo_root) + + # Initialize build environment + lib.atombuild.prepare_build_env(build_env_root, lib.make._builddep) + lib.atombuild.copy_pkgbuild_tree(repo_root, pkgname, build_env_root) + lib.atombuild.enter_build_env( + build_env_root, + ["./x", "--target", lib.arch.get_target(), "build", pkgname], + chdir="/Atom", + ) + + # Copy artifacts + atom_target_dir = f"{build_env_root}/Atom/packages/{pkgname}/target" + try: + for i in os.listdir(atom_target_dir): + if i.endswith(".pkg"): + shutil.copy2(f"{atom_target_dir}/{i}", f"{target_dir}/{i}") + except Exception: + pass + + if args.subcommand == "build": - run_build_package(args.BUILD_PKGNAME) + if args.atombuild: + run_build_atom(args.BUILD_PKGNAME) + else: + run_build_package(args.BUILD_PKGNAME) elif args.subcommand == "clean": run_clean_package(args.CLEAN_PKGNAME) elif args.subcommand == "list":