Files
lmcache--lmcache/setup_extensions/common_cpp.py
T
2026-07-13 12:24:33 +08:00

99 lines
2.7 KiB
Python

# SPDX-License-Identifier: Apache-2.0
"""Common C++ extension builders shared by all backends.
These extensions (storage manager, Redis, filesystem)
are always compiled regardless of which backend is selected.
"""
# Standard
from dataclasses import dataclass
from typing import TYPE_CHECKING
if TYPE_CHECKING:
# Third Party
from setuptools.extension import Extension
# First Party
from setup_extensions.build_profiles import BuildProfile
@dataclass(frozen=True)
class CommonExtSpec:
"""Declarative spec for a common C++ extension."""
name: str
sources: list[str]
include_dirs: list[str]
COMMON_EXTENSIONS: list[CommonExtSpec] = [
CommonExtSpec(
name="native_storage_ops",
sources=[
"csrc/storage_manager/bitmap.cpp",
"csrc/storage_manager/fold.cpp",
"csrc/storage_manager/periodic_event_notifier.cpp",
"csrc/storage_manager/pybind.cpp",
"csrc/storage_manager/ttl_lock.cpp",
"csrc/storage_manager/utils.cpp",
],
include_dirs=["csrc/storage_manager"],
),
CommonExtSpec(
name="lmcache_redis",
sources=[
"csrc/storage_backends/redis/pybind.cpp",
"csrc/storage_backends/redis/connector.cpp",
],
include_dirs=[
"csrc/storage_backends",
"csrc/storage_backends/redis",
],
),
CommonExtSpec(
name="lmcache_fs",
sources=[
"csrc/storage_backends/fs/pybind.cpp",
"csrc/storage_backends/fs/connector.cpp",
],
include_dirs=[
"csrc/storage_backends",
"csrc/storage_backends/fs",
],
),
]
def build_common_cpp(
profile: "BuildProfile | None" = None,
) -> tuple[list["Extension"], dict]:
"""Build pure C++ extensions that do not depend on any backend.
Args:
profile: Resolved backend profile (or ``None``). Each spec in
:data:`COMMON_EXTENSIONS` queries ``profile.extra_cxx_flags_for``
to obtain its per-extension extra flags.
Returns:
``(ext_modules, cmdclass)`` tuple.
"""
# Third Party
from torch.utils import cpp_extension
ext_modules = [
cpp_extension.CppExtension(
"lmcache." + spec.name,
sources=spec.sources,
include_dirs=spec.include_dirs,
extra_compile_args={
"cxx": (
(profile.extra_cxx_flags_for(spec) if profile else [])
+ ["-O3", "-std=c++17"]
),
},
)
for spec in COMMON_EXTENSIONS
]
cmdclass = {"build_ext": cpp_extension.BuildExtension}
return ext_modules, cmdclass