import os
import shutil
import subprocess
import sys
from pathlib import Path
def _build_lib(libname: str, force: bool = False) -> Path:
target = f"//kcal:{libname}"
dst_path = Path(f"kcal/{libname}.so")
if dst_path.exists():
if force:
dst_path.unlink()
else:
print(f"{dst_path} exists, ignore build")
return dst_path
ver_info = sys.version_info
version = f"{ver_info.major}.{ver_info.minor}"
build_mode = os.getenv("KCAL_BUILD_MODE", "opt")
args = [
"bazelisk",
"build",
target,
"-c",
build_mode,
f"--@rules_python//python/config_settings:python_version={version}",
]
subprocess.run(args, check=True)
dst_path.parent.mkdir(exist_ok=True)
bzl_path = Path(f"bazel-bin/kcal/{libname}.so")
shutil.copy2(bzl_path, dst_path)
return dst_path
def build_libs():
force = os.getenv("KCAL_BUILD_FORCE", "false") == "true"
_build_lib("libkcal", force)
def pdm_build_initialize(context):
from packaging.tags import sys_tags, platform_tags
context.config_settings["--plat-name"] = next(platform_tags())
context.config_settings["--python-tag"] = next(sys_tags()).interpreter
def pdm_build_update_files(context, files: dict):
force = os.getenv("KCAL_BUILD_FORCE", "false") == "true"
libkcal = _build_lib("libkcal", force)
files[str(libkcal)] = libkcal