from __future__ import annotations
import os
import shutil
from pathlib import Path
from setuptools import Distribution, setup
from setuptools.command.build_py import build_py
CDYLIB_NAMES = ("pith_zip.dll", "libpith_zip.so", "libpith_zip.dylib")
class BinaryDistribution(Distribution):
def has_ext_modules(self) -> bool: return True
class build_py_with_cdylib(build_py):
def run(self) -> None:
super().run()
repo_root = Path(__file__).resolve().parent.parent.parent
env_dir = os.environ.get("PITH_CDYLIB_DIR")
candidates = [Path(env_dir)] if env_dir else []
if not env_dir or not Path(env_dir).is_absolute():
candidates.append(repo_root / (env_dir or "target/release"))
candidates.append(repo_root / "target" / "release")
pkg_dir = Path(self.build_lib) / "pith_zip"
copied = 0
for candidate in candidates:
for name in CDYLIB_NAMES:
src = candidate / name
if src.is_file():
self.mkpath(str(pkg_dir))
shutil.copy2(src, pkg_dir / name)
copied += 1
if copied:
break
if copied == 0:
raise SystemExit(
f"no cdylib (any of {', '.join(CDYLIB_NAMES)}) found in "
f"{', '.join(str(c) for c in candidates)}; run `cargo build --release` first"
)
setup(
cmdclass={"build_py": build_py_with_cdylib},
distclass=BinaryDistribution,
)