Files
yichuan520030910320 46f6cc100b Initial commit
2025-06-30 09:05:05 +00:00

82 lines
2.7 KiB
CMake

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT license.
cmake_minimum_required(VERSION 3.18...3.22)
set(CMAKE_CXX_STANDARD 17)
if (PYTHON_EXECUTABLE)
set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
endif()
find_package(Python3 COMPONENTS Interpreter Development.Module NumPy REQUIRED)
execute_process(COMMAND ${Python3_EXECUTABLE} -c "import pybind11; print(pybind11.get_cmake_dir())"
OUTPUT_VARIABLE _tmp_dir
OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ECHO STDOUT)
list(APPEND CMAKE_PREFIX_PATH "${_tmp_dir}")
# Now we can find pybind11
find_package(pybind11 CONFIG REQUIRED)
execute_process(COMMAND ${Python3_EXECUTABLE} -c "import numpy; print(numpy.get_include())"
OUTPUT_VARIABLE _numpy_include
OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ECHO STDOUT)
# pybind11_add_module(diskannpy MODULE src/diskann_bindings.cpp)
# the following is fairly synonymous with pybind11_add_module, but we need more target_link_libraries
# see https://pybind11.readthedocs.io/en/latest/compiling.html#advanced-interface-library-targets for more details
add_library(_diskannpy MODULE
src/module.cpp
src/builder.cpp
src/dynamic_memory_index.cpp
src/static_memory_index.cpp
src/static_disk_index.cpp
)
target_include_directories(_diskannpy AFTER PRIVATE include)
if (MSVC)
target_compile_options(_diskannpy PRIVATE /U_WINDLL)
endif()
target_link_libraries(
_diskannpy
PRIVATE
pybind11::module
pybind11::lto
pybind11::windows_extras
${PROJECT_NAME}
${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS}
${DISKANN_ASYNC_LIB}
)
pybind11_extension(_diskannpy)
if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
# Strip unnecessary sections of the binary on Linux/macOS
pybind11_strip(_diskannpy)
endif()
set_target_properties(_diskannpy PROPERTIES CXX_VISIBILITY_PRESET "hidden"
CUDA_VISIBILITY_PRESET "hidden")
# generally, the VERSION_INFO flag is set by pyproject.toml, by way of setup.py.
# attempts to locate the version within CMake fail because the version has to be available
# to pyproject.toml for the sdist to work after we build it.
if(NOT VERSION_INFO)
set(VERSION_INFO "0.0.0dev")
endif()
target_compile_definitions(_diskannpy PRIVATE VERSION_INFO="${VERSION_INFO}")
# Add a post-build command to automatically copy the compiled Python module
if(UPDATE_EDITABLE_INSTALL)
add_custom_command(
TARGET _diskannpy
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_BINARY_DIR}/_diskannpy.cpython-*.so
${CMAKE_SOURCE_DIR}/python/src/
COMMENT "Copying Python module to python/src directory"
)
endif()