From fbf9c944e69cc4dd74db4d0c22680c0f044e8bdd Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Thu, 6 Nov 2025 16:43:54 -0600 Subject: [PATCH] Include zig build in the build process. --- MANIFEST.in | 11 ++++++++-- build_backend.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 4 +++- setup.py | 1 - tests/util.py | 2 +- tools/gen_cdef.py | 4 +--- 6 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 build_backend.py diff --git a/MANIFEST.in b/MANIFEST.in index a3b35af..5ecb178 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -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 diff --git a/build_backend.py b/build_backend.py new file mode 100644 index 0000000..f9da17c --- /dev/null +++ b/build_backend.py @@ -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) diff --git a/pyproject.toml b/pyproject.toml index 5329f20..c0013bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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] diff --git a/setup.py b/setup.py index ce0df56..9ca861f 100644 --- a/setup.py +++ b/setup.py @@ -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") diff --git a/tests/util.py b/tests/util.py index f72e626..95d542c 100644 --- a/tests/util.py +++ b/tests/util.py @@ -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 \ No newline at end of file + return parts diff --git a/tools/gen_cdef.py b/tools/gen_cdef.py index 8c25a6d..00cbac0 100644 --- a/tools/gen_cdef.py +++ b/tools/gen_cdef.py @@ -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