Files

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
)