69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
"""Custom build backend that builds libaegis with Zig before building the Python package."""
|
|
|
|
import os
|
|
import platform
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from setuptools import build_meta
|
|
|
|
__all__ = [
|
|
"build_sdist",
|
|
"build_wheel",
|
|
"build_editable",
|
|
"get_requires_for_build_sdist",
|
|
"get_requires_for_build_wheel",
|
|
"prepare_metadata_for_build_wheel",
|
|
]
|
|
|
|
_MACOS_TARGET = "11.0"
|
|
_prepared = False
|
|
|
|
|
|
def _prepare():
|
|
"""Prepare the build environment and build libaegis."""
|
|
global _prepared
|
|
if _prepared:
|
|
return
|
|
_prepared = True
|
|
|
|
# Set macOS deployment target
|
|
if sys.platform == "darwin" and "MACOSX_DEPLOYMENT_TARGET" not in os.environ:
|
|
os.environ["MACOSX_DEPLOYMENT_TARGET"] = _MACOS_TARGET
|
|
|
|
# Check Zig is available
|
|
if shutil.which("zig") is None:
|
|
raise RuntimeError(
|
|
"Zig compiler not found. Install from https://ziglang.org/download/"
|
|
)
|
|
|
|
# Build libaegis
|
|
libaegis_dir = Path(__file__).parent.parent / "libaegis"
|
|
cmd = ["zig", "build", "-Drelease"]
|
|
if sys.platform == "darwin":
|
|
arch = {"arm64": "aarch64", "x86_64": "x86_64"}.get(platform.machine())
|
|
if arch:
|
|
cmd.append(f"-Dtarget={arch}-macos.{_MACOS_TARGET}")
|
|
subprocess.run(cmd, cwd=libaegis_dir, check=True)
|
|
|
|
|
|
build_sdist = build_meta.build_sdist
|
|
get_requires_for_build_sdist = build_meta.get_requires_for_build_sdist
|
|
get_requires_for_build_wheel = build_meta.get_requires_for_build_wheel
|
|
prepare_metadata_for_build_wheel = build_meta.prepare_metadata_for_build_wheel
|
|
|
|
|
|
# Wheel build hooks - need libaegis built first
|
|
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
|
|
_prepare()
|
|
return build_meta.build_wheel(wheel_directory, config_settings, metadata_directory)
|
|
|
|
|
|
def build_editable(wheel_directory, config_settings=None, metadata_directory=None):
|
|
_prepare()
|
|
return build_meta.build_editable(
|
|
wheel_directory, config_settings, metadata_directory
|
|
)
|