From b94159b4923401c53a71d7f0cfcaff9b64451254 Mon Sep 17 00:00:00 2001 From: sisungo Date: Wed, 10 Jun 2026 00:29:19 +0800 Subject: [PATCH] feat: add rust packing methods Signed-off-by: sisungo --- lib/cpp.py | 2 +- lib/rust.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 lib/rust.py diff --git a/lib/cpp.py b/lib/cpp.py index 72a535b..73f9c0f 100644 --- a/lib/cpp.py +++ b/lib/cpp.py @@ -21,7 +21,7 @@ def make_install(rem: list[str] | None = None, chdir: bool = True): def _do_auto_pack(pc: pkgcomposer.PkgComposer, srcdir: str, dstdir: str, filter): - pc.makedir(srcdir) + pc.makedir(dstdir) with os.scandir(srcdir) as entries: for ent in entries: if filter(ent): diff --git a/lib/rust.py b/lib/rust.py new file mode 100644 index 0000000..2cbca59 --- /dev/null +++ b/lib/rust.py @@ -0,0 +1,60 @@ +import os +import subprocess + +from . import arch, make, pkgcomposer + + +def _rust_triple(semios: str) -> str: + return semios.replace("-semios-linux", "-unknown-linux-musl") + + +def build(rem: list[str] = []): + cmdline = [ + "cargo", + "build", + "--release", + "--target", + _rust_triple(arch.get_target()), + ] + rem + os.environ["RUSTFLAGS"] = ( + os.environ.get("RUSTFLAGS", "") + " -C target-feature=-crt-static" + ) + subprocess.run(cmdline) + + +def _do_auto_pack(pc: pkgcomposer.PkgComposer, srcdir: str, dstdir: str, filter): + pc.makedir(dstdir) + with os.scandir(srcdir) as entries: + for ent in entries: + if filter(ent): + if ent.is_dir(follow_symlinks=False): + pc.makedir(f"{dstdir}/{ent.name}") + elif ent.is_file(follow_symlinks=False): + pc.addfile(ent.path, f"{dstdir}/{ent.name}") + elif ent.is_symlink() and not os.path.isabs(os.readlink(ent.path)): + pc.addfile(ent.path, f"{dstdir}/{ent.name}") + + +def _autopack_filter_lib(ent) -> bool: + if ent.is_dir(follow_symlinks=False): + return False + if ent.name.endswith(".so"): + return True + else: + return False + + +def _autopack_filter_bin(ent) -> bool: + return os.access(ent.path, os.X_OK) and ent.is_file(follow_symlinks=False) + + +def _auto_pack(profiles: list[str], pc: pkgcomposer.PkgComposer): + target_dir = f"target/{_rust_triple(arch.get_target())}/release" + if "lib" in profiles: + _do_auto_pack(pc, target_dir, "lib", _autopack_filter_lib) + if "bin" in profiles: + _do_auto_pack(pc, target_dir, "bin", _autopack_filter_bin) + + +def use_auto_pack(profiles: list[str]): + make.on_pack(lambda pc: _auto_pack(profiles, pc))