flexloopy.base 源代码
"""Utilities to locate and load the flexloopy shared library."""
import os
import sys
import sysconfig
from pathlib import Path
from typing import Iterable, List, Optional
import tvm_ffi
def _library_name() -> str:
if sys.platform.startswith("win"):
return "flexloopy.dll"
if sys.platform.startswith("darwin"):
return "flexloopy.dylib"
return "flexloopy.so"
def _normalized_platform_tag() -> str:
return sysconfig.get_platform().replace("-", "_").replace(".", "_")
def _candidate_directories(file_dir: Path) -> Iterable[Path]:
build_root = file_dir.parent.parent / "build"
yield file_dir
yield build_root
yield build_root / f"py3-none-{_normalized_platform_tag()}"
def _candidate_paths(lib_name: str, roots: Iterable[Path]) -> Iterable[Path]:
config_subdirs = ("RelWithDebInfo", "Release", "Debug")
seen: set[Path] = set()
for base in roots:
candidates = [base / lib_name]
candidates.extend(base / sub / lib_name for sub in config_subdirs)
for candidate in candidates:
if candidate in seen:
continue
seen.add(candidate)
yield candidate
_CACHED_PATH: Optional[Path] = None
[文档]
_LIB: Optional[tvm_ffi.Module] = None
def _env_lib_path(lib_name: str) -> Optional[Path]:
p = os.environ.get("TVM_BOOK_LIB_PATH")
if p:
path = Path(p)
if path.is_file():
return path
d = os.environ.get("TVM_BOOK_LIB_DIR")
if d:
dir_path = Path(d)
cand = dir_path / lib_name
if cand.exists():
return cand
return None
def _resolve_lib_path() -> Path:
file_dir = Path(__file__).resolve().parent
lib_name = _library_name()
override = _env_lib_path(lib_name)
if override is not None:
return override
for candidate in _candidate_paths(lib_name, _candidate_directories(file_dir)):
if candidate.exists():
return candidate
locations = []
for p in _candidate_paths(lib_name, _candidate_directories(file_dir)):
locations.append(str(p.parent))
hint = "; set TVM_BOOK_LIB_PATH or TVM_BOOK_LIB_DIR to override"
raise FileNotFoundError(f"Could not find {lib_name} in: {', '.join(dict.fromkeys(locations))}{hint}")
[文档]
def get_lib() -> tvm_ffi.Module:
global _LIB, _CACHED_PATH
if _LIB is not None:
return _LIB
if _CACHED_PATH is None:
_CACHED_PATH = _resolve_lib_path()
_LIB = tvm_ffi.load_module(str(_CACHED_PATH))
return _LIB
__all__ = ["get_lib", "_LIB"]