90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
"""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, 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)
|
|
|
|
# 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()
|