64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
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))
|