mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/usestrix/strix.git
synced 2026-09-20 08:03:42 +08:00
hatchling 1.32.1 made BuildHookInterface a two-parameter generic, so subscripting it with one argument raises TypeError when the hook module is imported and every from-source build fails. Subclass the unsubscripted interface, which works on both the old and new generic signatures.
59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
"""Hatchling build hook that compiles and bundles the Go TUI sidecar."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import sysconfig
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
|
|
|
|
|
class CustomBuildHook(BuildHookInterface): # type: ignore[type-arg]
|
|
"""Compile the Bubble Tea sidecar and ship it inside the wheel.
|
|
|
|
The sidecar is the only interactive interface, so every wheel is a
|
|
platform wheel and a missing Go toolchain is a build failure.
|
|
"""
|
|
|
|
def initialize(self, version: str, build_data: dict[str, Any]) -> None:
|
|
# Editable installs run from the checkout, where the TUI is started
|
|
# with ``go run``; there is nothing to bundle.
|
|
if version == "editable":
|
|
return
|
|
|
|
root = Path(self.root)
|
|
executable = "strix-tui.exe" if os.name == "nt" else "strix-tui"
|
|
output = root / "build" / "sidecar" / executable
|
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
go = shutil.which("go")
|
|
if go is None:
|
|
raise RuntimeError("Go 1.24 or newer is required to build the Bubble Tea TUI")
|
|
env = os.environ.copy()
|
|
env["CGO_ENABLED"] = "0"
|
|
subprocess.run( # noqa: S603 - fixed build command using the resolved Go binary
|
|
[
|
|
go,
|
|
"build",
|
|
"-trimpath",
|
|
"-ldflags=-s -w",
|
|
"-o",
|
|
str(output),
|
|
"./cmd/strix-tui",
|
|
],
|
|
cwd=root / "strix" / "interface" / "tui",
|
|
env=env,
|
|
check=True,
|
|
)
|
|
|
|
build_data["force_include"][str(output)] = f"strix/bin/{executable}"
|
|
build_data["pure_python"] = False
|
|
platform_tag = os.environ.get("STRIX_WHEEL_PLATFORM_TAG")
|
|
if not platform_tag:
|
|
platform_tag = sysconfig.get_platform().replace("-", "_").replace(".", "_")
|
|
build_data["tag"] = f"py3-none-{platform_tag}"
|