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 artifacts_dir(): return f"target/{_rust_triple(arch.get_target())}/release" 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): if "lib" in profiles: _do_auto_pack(pc, artifacts_dir(), "lib", _autopack_filter_lib) if "bin" in profiles: _do_auto_pack(pc, artifacts_dir(), "bin", _autopack_filter_bin) def use_auto_pack(profiles: list[str]): make.on_pack(lambda pc: _auto_pack(profiles, pc))