""" Build script for Cython extensions. Usage: python scripts/build_cython.py build_ext --inplace Or via make: make build-cython """ import os import sys from pathlib import Path def build_extensions(): try: from Cython.Build import cythonize except ImportError: print("Cython not installed. Skipping Cython build.") print("Install with: pip install cython") return False try: from setuptools import Extension from setuptools.dist import Distribution from setuptools.command.build_ext import build_ext except ImportError: print("setuptools not installed. Skipping Cython build.") print("Install with: pip install setuptools") return False extensions = [ Extension( "pyserve._path_matcher", sources=["pyserve/_path_matcher.pyx"], extra_compile_args=["-O3", "-ffast-math"], define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")], ), ] ext_modules = cythonize( extensions, compiler_directives={ "language_level": "3", "boundscheck": False, "wraparound": False, "cdivision": True, "embedsignature": True, }, annotate=True, ) dist = Distribution({"ext_modules": ext_modules}) dist.package_dir = {"": "."} cmd = build_ext(dist) cmd.ensure_finalized() cmd.inplace = True cmd.run() print("\nCython extensions built successfully!") print(" - pyserve/_path_matcher" + (".pyd" if sys.platform == "win32" else ".so")) return True if __name__ == "__main__": project_root = Path(__file__).parent.parent os.chdir(project_root) success = build_extensions() sys.exit(0 if success else 1)