"""Build a Nuitka-compiled orisys wheel and publish it to SDK/{version}/. Pipeline: 1. Compile src/orisys → .pyd 2. Stage wheel tree (compiled module + bundled files from pyproject.toml) 3. Run bdist_wheel and move output to SDK/{version}/ 4. Smoke-test imports in a temporary venv Run from repo root: python build/build_nuitka.py """ from __future__ import annotations import os import shutil import subprocess from nuitka_compile import compile_orisys, copy_compiled_orisys, install_nuitka from paths import NUITKA_COMPILE_DIR, NUITKA_WHEEL_DIR, REPO_ROOT, repo_path from pyproject_utils import bundle_items, extras_require, get_version, install_requires from verify import verify_built_wheel from wheel_build import publish_wheel_to_sdk, run_bdist_wheel, write_wheel_setup from wheel_layout import copy_bundle_items, copy_orisys_blend, package_data_from_bundle def _reset_dir(path) -> None: """Remove and recreate a build output directory.""" if path.exists(): shutil.rmtree(path) path.mkdir(parents=True) def build() -> None: # --- 1. Compile --- install_nuitka() version = get_version(REPO_ROOT) _reset_dir(NUITKA_COMPILE_DIR) _reset_dir(NUITKA_WHEEL_DIR) print("\n=== Compiling with Nuitka ===") env = os.environ.copy() src_dir = repo_path("src") env["PYTHONPATH"] = src_dir.as_posix() + os.pathsep + env.get("PYTHONPATH", "") ext_file = compile_orisys(NUITKA_COMPILE_DIR, env) # --- 2. Stage wheel contents --- print("\n=== Preparing Wheel Structure ===") pkg_dir = NUITKA_WHEEL_DIR / "wheel_root" / "orisys" pkg_dir.mkdir(parents=True) ext_suffix = copy_compiled_orisys(pkg_dir, ext_file) wheel_root = NUITKA_WHEEL_DIR / "wheel_root" blend_count = copy_orisys_blend(REPO_ROOT, wheel_root) print(f"Staged orisys_blend Python modules: {blend_count}") # Bundle rules live in pyproject.toml → [[tool.orisys.bundle.items]] bundle = bundle_items(REPO_ROOT) copied_counts = copy_bundle_items(REPO_ROOT, pkg_dir, bundle) print(f"Copied {copied_counts['configs']} JSON config files") print(f"Copied {copied_counts['examples']} example files to orisys/examples/") print(f"Copied {copied_counts['docs']} doc files to orisys/docs/") print(f"Copied {copied_counts['assets']} finger asset files to orisys/assets/") write_wheel_setup( NUITKA_WHEEL_DIR, version=version, package_data=package_data_from_bundle(ext_suffix, bundle), install_requires=install_requires(REPO_ROOT), extras_require=extras_require(REPO_ROOT), ) # --- 3. Build wheel and publish to SDK/ --- wheel_path = run_bdist_wheel(NUITKA_WHEEL_DIR) if wheel_path is None: print("\n[ERROR] Wheel not found.") return final_wheel = publish_wheel_to_sdk(wheel_path, version) print(f"\n[SUCCESS] Wheel created and moved to: {final_wheel}") # # --- 4. Verify (isolated venv; does not touch the active environment) --- # print("\n=== Verifying finger mesh/viewer imports ===") # try: # verify_built_wheel(final_wheel) # except subprocess.CalledProcessError as exc: # print(f"\n[WARNING] Wheel verify failed: {exc}") # print("The wheel was built successfully; verification runs in an isolated temp venv.") if __name__ == "__main__": build()