Include zig build in the build process.

This commit is contained in:
2025-11-07 04:43:54 +00:00
parent e644f1b2ca
commit 5c04940525
6 changed files with 69 additions and 8 deletions
+9 -2
View File
@@ -1,6 +1,13 @@
include pyaegis/aegis_cdef.h
include setup.py
include build_backend.py
include BUILD.md
include README.md
recursive-include libaegis/src/include *.h
include libaegis/zig-out/lib/libaegis.a
recursive-include libaegis *.c *.h *.zig *.zon
include libaegis/CMakeLists.txt
include libaegis/LICENSE
include libaegis/README.md
recursive-include libaegis/cmake *.cmake *.cmake.in
graft libaegis/src
include libaegis/build.zig
include libaegis/build.zig.zon
+55
View File
@@ -0,0 +1,55 @@
"""Custom build backend that builds libaegis with Zig before building the Python package."""
import subprocess
import sys
from pathlib import Path
from setuptools import build_meta as _orig
def _build_libaegis():
"""Build libaegis static library with Zig."""
libaegis_dir = Path(__file__).parent / "libaegis"
if not libaegis_dir.exists():
raise FileNotFoundError(
f"libaegis directory not found at {libaegis_dir}. "
"Cannot build static library."
)
print("Building libaegis static library with Zig...")
try:
subprocess.run(
["zig", "build", "-Drelease"],
cwd=libaegis_dir,
check=True,
capture_output=False,
)
print("Successfully built libaegis static library")
except subprocess.CalledProcessError as e:
print(f"Error building libaegis: {e}", file=sys.stderr)
raise
except FileNotFoundError:
print(
"Error: 'zig' command not found. Please install Zig to build libaegis.",
file=sys.stderr,
)
raise
# Expose all the standard build backend hooks
get_requires_for_build_wheel = _orig.get_requires_for_build_wheel
get_requires_for_build_sdist = _orig.get_requires_for_build_sdist
prepare_metadata_for_build_wheel = _orig.prepare_metadata_for_build_wheel
build_sdist = _orig.build_sdist
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
"""Build wheel with libaegis built first."""
_build_libaegis()
return _orig.build_wheel(wheel_directory, config_settings, metadata_directory)
def build_editable(wheel_directory, config_settings=None, metadata_directory=None):
"""Build editable install with libaegis built first."""
_build_libaegis()
return _orig.build_editable(wheel_directory, config_settings, metadata_directory)
+3 -1
View File
@@ -1,6 +1,7 @@
[build-system]
requires = ["setuptools>=61.0", "cffi>=2.0.0"]
build-backend = "setuptools.build_meta"
build-backend = "build_backend"
backend-path = ["."]
[project]
name = "pyaegis"
@@ -25,6 +26,7 @@ Homepage = "https://github.com/aegis-aead/libaegis"
[dependency-groups]
dev = [
"pytest>=8.4.2",
"setuptools>=80.9.0",
]
[tool.setuptools]
-1
View File
@@ -5,7 +5,6 @@ from pathlib import Path
from cffi import FFI
from setuptools import setup
# Read the CDEF header
cdef_path = Path(__file__).parent / "pyaegis" / "aegis_cdef.h"
cdef_content = cdef_path.read_text(encoding="utf-8")
+1 -1
View File
@@ -25,4 +25,4 @@ def random_split_bytes(data: bytes) -> list[bytes]:
for stop in (*cut_points, len(data)):
parts.append(data[start:stop])
start = stop
return parts
return parts
+1 -3
View File
@@ -39,9 +39,7 @@ def clean_declaration(text: str) -> str:
if "CRYPTO_ALIGN" in text and "typedef struct" in text:
# Replace "CRYPTO_ALIGN(N) uint8_t opaque[SIZE];" with "...;"
text = re.sub(
r"CRYPTO_ALIGN\s*\(\s*\d+\s*\)\s+uint8_t\s+opaque\[\d+\];",
"...;",
text
r"CRYPTO_ALIGN\s*\(\s*\d+\s*\)\s+uint8_t\s+opaque\[\d+\];", "...;", text
)
else:
# For non-struct declarations, just remove CRYPTO_ALIGN