feat: support zvec core-only build (#481)
This commit is contained in:
parent
da39a33feb
commit
4679a8f39d
|
|
@ -9,18 +9,30 @@ if(NOT ZVEC_SOURCE_DIR)
|
|||
message(FATAL_ERROR "ZVEC_SOURCE_DIR is required")
|
||||
endif()
|
||||
|
||||
option(ENABLE_ZVEC_CORE "Validate zvec-core-only subproject integration" OFF)
|
||||
|
||||
if(ENABLE_ZVEC_CORE)
|
||||
set(BUILD_ZVEC_CORE_ONLY ON CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
|
||||
add_subdirectory("${ZVEC_SOURCE_DIR}" zvec)
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
|
||||
add_executable(zvec_embed_db_example
|
||||
"${ZVEC_SOURCE_DIR}/examples/c++/db/main.cc")
|
||||
target_link_libraries(zvec_embed_db_example PRIVATE zvec_shared)
|
||||
if(ENABLE_ZVEC_CORE)
|
||||
add_executable(zvec_embed_core_only_example
|
||||
"${ZVEC_SOURCE_DIR}/examples/c++/core/main.cc")
|
||||
target_link_libraries(zvec_embed_core_only_example PRIVATE zvec_core_shared)
|
||||
else()
|
||||
add_executable(zvec_embed_db_example
|
||||
"${ZVEC_SOURCE_DIR}/examples/c++/db/main.cc")
|
||||
target_link_libraries(zvec_embed_db_example PRIVATE zvec_shared)
|
||||
|
||||
add_executable(zvec_embed_core_example
|
||||
"${ZVEC_SOURCE_DIR}/examples/c++/core/main.cc")
|
||||
target_link_libraries(zvec_embed_core_example PRIVATE zvec_shared)
|
||||
add_executable(zvec_embed_core_example
|
||||
"${ZVEC_SOURCE_DIR}/examples/c++/core/main.cc")
|
||||
target_link_libraries(zvec_embed_core_example PRIVATE zvec_shared)
|
||||
|
||||
add_executable(zvec_embed_ailego_example
|
||||
"${ZVEC_SOURCE_DIR}/examples/c++/ailego/main.cc")
|
||||
target_link_libraries(zvec_embed_ailego_example PRIVATE zvec_shared)
|
||||
add_executable(zvec_embed_ailego_example
|
||||
"${ZVEC_SOURCE_DIR}/examples/c++/ailego/main.cc")
|
||||
target_link_libraries(zvec_embed_ailego_example PRIVATE zvec_shared)
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -143,6 +143,27 @@ jobs:
|
|||
}
|
||||
}
|
||||
|
||||
# core-example links libzvec_core directly, so copy zvec_core.dll too.
|
||||
$found = $false
|
||||
foreach ($sub in @("$buildDir\bin", "$buildDir\bin\Release", "$buildDir\lib", "$buildDir\lib\Release")) {
|
||||
if (Test-Path "$sub\zvec_core.dll") {
|
||||
Copy-Item "$sub\zvec_core.dll" -Destination . -Force
|
||||
Write-Host "Copied zvec_core.dll from $sub"
|
||||
$found = $true
|
||||
break
|
||||
}
|
||||
}
|
||||
if (-not $found) {
|
||||
Write-Host "WARNING: zvec_core.dll not found, searching recursively..."
|
||||
$dll = Get-ChildItem -Path $buildDir -Filter "zvec_core.dll" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
|
||||
if ($dll) {
|
||||
Copy-Item $dll.FullName -Destination . -Force
|
||||
Write-Host "Copied zvec_core.dll from $($dll.DirectoryName)"
|
||||
} else {
|
||||
Write-Error "zvec_core.dll not found anywhere under $buildDir"
|
||||
}
|
||||
}
|
||||
|
||||
.\db-example.exe
|
||||
.\core-example.exe
|
||||
.\ailego-example.exe
|
||||
|
|
@ -151,4 +172,4 @@ jobs:
|
|||
- name: Show sccache statistics
|
||||
if: always()
|
||||
run: sccache --show-stats
|
||||
shell: powershell
|
||||
shell: powershell
|
||||
|
|
|
|||
|
|
@ -11,9 +11,19 @@ permissions:
|
|||
|
||||
jobs:
|
||||
subproject-integration:
|
||||
name: Subproject Build & Example (linux-x64)
|
||||
name: Subproject Build & Example (${{ matrix.mode }})
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- mode: linux-x64
|
||||
cache_key: full
|
||||
enable_zvec_core: false
|
||||
- mode: linux-x64-enable-zvec-core
|
||||
cache_key: core-only
|
||||
enable_zvec_core: true
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
|
|
@ -24,7 +34,7 @@ jobs:
|
|||
- name: Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: cmake-subproject-linux-x64
|
||||
key: cmake-subproject-linux-x64-${{ matrix.cache_key }}
|
||||
max-size: 150M
|
||||
|
||||
- name: Set up Python
|
||||
|
|
@ -58,27 +68,39 @@ jobs:
|
|||
|
||||
- name: Configure subproject integration
|
||||
run: |
|
||||
SMOKE_SOURCE="$RUNNER_TEMP/zvec-subproject-nightly"
|
||||
SMOKE_BUILD="$RUNNER_TEMP/zvec-subproject-nightly-build"
|
||||
SMOKE_SOURCE="$RUNNER_TEMP/zvec-subproject-nightly-${{ matrix.cache_key }}"
|
||||
SMOKE_BUILD="$RUNNER_TEMP/zvec-subproject-nightly-build-${{ matrix.cache_key }}"
|
||||
|
||||
mkdir -p "$SMOKE_SOURCE" "$SMOKE_BUILD"
|
||||
cp "$GITHUB_WORKSPACE/.github/cmake/subproject-integration/CMakeLists.txt" \
|
||||
"$SMOKE_SOURCE/CMakeLists.txt"
|
||||
|
||||
cmake -S "$SMOKE_SOURCE" -B "$SMOKE_BUILD" -G Ninja \
|
||||
-DZVEC_SOURCE_DIR="$GITHUB_WORKSPACE" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DBUILD_TOOLS=OFF \
|
||||
-DBUILD_C_BINDINGS=OFF \
|
||||
-DBUILD_PYTHON_BINDINGS=OFF \
|
||||
-DENABLE_WERROR=ON \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
CMAKE_ARGS=(
|
||||
-DZVEC_SOURCE_DIR="$GITHUB_WORKSPACE"
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
-DENABLE_WERROR=ON
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
||||
)
|
||||
|
||||
if [[ "${{ matrix.enable_zvec_core }}" == "true" ]]; then
|
||||
CMAKE_ARGS+=(-DENABLE_ZVEC_CORE=ON)
|
||||
else
|
||||
CMAKE_ARGS+=(
|
||||
-DBUILD_TOOLS=OFF
|
||||
-DBUILD_C_BINDINGS=OFF
|
||||
-DBUILD_PYTHON_BINDINGS=OFF
|
||||
)
|
||||
fi
|
||||
|
||||
cmake -S "$SMOKE_SOURCE" -B "$SMOKE_BUILD" -G Ninja \
|
||||
"${CMAKE_ARGS[@]}"
|
||||
|
||||
echo "SMOKE_BUILD=$SMOKE_BUILD" >> "$GITHUB_ENV"
|
||||
shell: bash
|
||||
|
||||
- name: Build subproject targets
|
||||
if: ${{ ! matrix.enable_zvec_core }}
|
||||
run: |
|
||||
cmake --build "$SMOKE_BUILD" --target \
|
||||
core_knn_diskann \
|
||||
|
|
@ -89,9 +111,32 @@ jobs:
|
|||
shell: bash
|
||||
|
||||
- name: Run subproject examples
|
||||
if: ${{ ! matrix.enable_zvec_core }}
|
||||
run: |
|
||||
cd "$SMOKE_BUILD"
|
||||
./bin/zvec_embed_db_example
|
||||
./bin/zvec_embed_core_example
|
||||
./bin/zvec_embed_ailego_example
|
||||
shell: bash
|
||||
|
||||
- name: Build enable_zvec_core targets
|
||||
if: ${{ matrix.enable_zvec_core }}
|
||||
run: |
|
||||
cmake --build "$SMOKE_BUILD" --target \
|
||||
zvec_core_shared \
|
||||
zvec_embed_core_only_example \
|
||||
--parallel "$NPROC"
|
||||
shell: bash
|
||||
|
||||
- name: Run enable_zvec_core example
|
||||
if: ${{ matrix.enable_zvec_core }}
|
||||
run: |
|
||||
cd "$SMOKE_BUILD"
|
||||
./bin/zvec_embed_core_only_example
|
||||
ldd ./bin/zvec_embed_core_only_example | tee zvec-core-only-ldd.txt
|
||||
grep -q 'libzvec_core\.so' zvec-core-only-ldd.txt
|
||||
if grep -q 'libzvec\.so' zvec-core-only-ldd.txt; then
|
||||
echo "core-only example unexpectedly depends on libzvec.so"
|
||||
exit 1
|
||||
fi
|
||||
shell: bash
|
||||
|
|
|
|||
|
|
@ -74,13 +74,28 @@ endif()
|
|||
include_directories(${PROJECT_ROOT_DIR}/src/include)
|
||||
include_directories(${PROJECT_ROOT_DIR}/src)
|
||||
|
||||
option(BUILD_ZVEC_CORE_ONLY "Build only zvec-core and its all-in-one shared library" OFF)
|
||||
message(STATUS "BUILD_ZVEC_CORE_ONLY:${BUILD_ZVEC_CORE_ONLY}")
|
||||
|
||||
option(BUILD_ZVEC_SHARED "Build all-in-one C++ shared library libzvec" ON)
|
||||
option(BUILD_ZVEC_CORE_SHARED "Build all-in-one zvec-core shared library libzvec_core" ON)
|
||||
|
||||
option(BUILD_PYTHON_BINDINGS "Build Python bindings using pybind11" OFF)
|
||||
message(STATUS "BUILD_PYTHON_BINDINGS:${BUILD_PYTHON_BINDINGS}")
|
||||
|
||||
option(BUILD_C_BINDINGS "Build C bindings" ON)
|
||||
message(STATUS "BUILD_C_BINDINGS:${BUILD_C_BINDINGS}")
|
||||
|
||||
option(BUILD_TOOLS "Build tools" ON)
|
||||
|
||||
if(BUILD_ZVEC_CORE_ONLY)
|
||||
set(BUILD_ZVEC_SHARED OFF CACHE BOOL "Build all-in-one C++ shared library libzvec" FORCE)
|
||||
set(BUILD_ZVEC_CORE_SHARED ON CACHE BOOL "Build all-in-one zvec-core shared library libzvec_core" FORCE)
|
||||
set(BUILD_PYTHON_BINDINGS OFF CACHE BOOL "Build Python bindings using pybind11" FORCE)
|
||||
set(BUILD_C_BINDINGS OFF CACHE BOOL "Build C bindings" FORCE)
|
||||
set(BUILD_TOOLS OFF CACHE BOOL "Build tools" FORCE)
|
||||
endif()
|
||||
|
||||
message(STATUS "BUILD_ZVEC_SHARED:${BUILD_ZVEC_SHARED}")
|
||||
message(STATUS "BUILD_ZVEC_CORE_SHARED:${BUILD_ZVEC_CORE_SHARED}")
|
||||
message(STATUS "BUILD_PYTHON_BINDINGS:${BUILD_PYTHON_BINDINGS}")
|
||||
message(STATUS "BUILD_C_BINDINGS:${BUILD_C_BINDINGS}")
|
||||
message(STATUS "BUILD_TOOLS:${BUILD_TOOLS}")
|
||||
|
||||
option(RABITQ_ENABLE_AVX512 "Compile RaBitQ with AVX-512 support" OFF)
|
||||
|
|
@ -135,9 +150,18 @@ message(STATUS "USE_OSS_MIRROR:${USE_OSS_MIRROR}")
|
|||
|
||||
cc_directory(thirdparty)
|
||||
cc_directories(src)
|
||||
cc_directories(tests)
|
||||
|
||||
add_custom_target(clang_tidy_deps DEPENDS zvec_proto ARROW.BUILD glog gflags Lz4.BUILD)
|
||||
if(BUILD_ZVEC_CORE_ONLY)
|
||||
# Keep the include context from tests/CMakeLists.txt for core tests that include tests/test_util.h.
|
||||
include_directories(${PROJECT_ROOT_DIR})
|
||||
cc_directory(tests/core)
|
||||
else()
|
||||
cc_directories(tests)
|
||||
endif()
|
||||
|
||||
if(NOT BUILD_ZVEC_CORE_ONLY)
|
||||
add_custom_target(clang_tidy_deps DEPENDS zvec_proto ARROW.BUILD glog gflags Lz4.BUILD)
|
||||
endif()
|
||||
|
||||
if(BUILD_TOOLS)
|
||||
cc_directories(tools)
|
||||
|
|
|
|||
|
|
@ -13,66 +13,148 @@ if(NOT DEFINED HOST_BUILD_DIR)
|
|||
set(HOST_BUILD_DIR "build")
|
||||
endif()
|
||||
|
||||
set(ZVEC_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../src/include)
|
||||
set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib)
|
||||
get_filename_component(ZVEC_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
|
||||
set(ZVEC_INCLUDE_DIR ${ZVEC_ROOT_DIR}/src/include)
|
||||
set(ZVEC_LIB_DIR ${ZVEC_ROOT_DIR}/${HOST_BUILD_DIR}/lib)
|
||||
set(ZVEC_LINK_VIA_CMAKE_TARGET OFF)
|
||||
if(TARGET zvec_shared OR TARGET zvec_core_shared)
|
||||
set(ZVEC_LINK_VIA_CMAKE_TARGET ON)
|
||||
endif()
|
||||
|
||||
# Add include and library search paths
|
||||
include_directories(${ZVEC_INCLUDE_DIR})
|
||||
link_directories(${ZVEC_LIB_DIR})
|
||||
set(ZVEC_LIB_SEARCH_DIRS ${ZVEC_LIB_DIR})
|
||||
|
||||
# Support multi-config builds (MSVC puts libs in Debug/Release subdirectories)
|
||||
if(CMAKE_BUILD_TYPE)
|
||||
link_directories(${ZVEC_LIB_DIR}/${CMAKE_BUILD_TYPE})
|
||||
set(ZVEC_CONFIG_LIB_DIR ${ZVEC_LIB_DIR}/${CMAKE_BUILD_TYPE})
|
||||
if(EXISTS "${ZVEC_CONFIG_LIB_DIR}")
|
||||
list(APPEND ZVEC_LIB_SEARCH_DIRS ${ZVEC_CONFIG_LIB_DIR})
|
||||
endif()
|
||||
endif()
|
||||
if(NOT ZVEC_LINK_VIA_CMAKE_TARGET)
|
||||
link_directories(${ZVEC_LIB_SEARCH_DIRS})
|
||||
set(CMAKE_BUILD_RPATH ${ZVEC_LIB_SEARCH_DIRS})
|
||||
endif()
|
||||
if(WIN32)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
endif()
|
||||
|
||||
find_package(Threads REQUIRED)
|
||||
function(zvec_find_shared_library OUT_VAR LIB_NAME)
|
||||
unset(${OUT_VAR} CACHE)
|
||||
if(WIN32)
|
||||
find_library(${OUT_VAR}
|
||||
NAMES ${LIB_NAME}_shared ${LIB_NAME}
|
||||
PATHS ${ZVEC_LIB_SEARCH_DIRS}
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
else()
|
||||
set(ZVEC_ORIGINAL_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
if(APPLE)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib")
|
||||
else()
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so")
|
||||
endif()
|
||||
find_library(${OUT_VAR}
|
||||
NAMES ${LIB_NAME}
|
||||
PATHS ${ZVEC_LIB_SEARCH_DIRS}
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES "${ZVEC_ORIGINAL_LIBRARY_SUFFIXES}")
|
||||
endif()
|
||||
set(${OUT_VAR} "${${OUT_VAR}}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
set(ZVEC_CORE_EXAMPLE_DEFAULT ON)
|
||||
if(NOT TARGET zvec_core_shared)
|
||||
zvec_find_shared_library(ZVEC_CORE_SHARED_LIBRARY zvec_core)
|
||||
if(NOT ZVEC_CORE_SHARED_LIBRARY)
|
||||
set(ZVEC_CORE_EXAMPLE_DEFAULT OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(ZVEC_FULL_EXAMPLES_DEFAULT ON)
|
||||
if(NOT TARGET zvec_shared)
|
||||
zvec_find_shared_library(ZVEC_SHARED_LIBRARY zvec)
|
||||
if(NOT ZVEC_SHARED_LIBRARY)
|
||||
set(ZVEC_FULL_EXAMPLES_DEFAULT OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(BUILD_ZVEC_CORE_EXAMPLE "Build zvec-core example linked only with libzvec_core" ${ZVEC_CORE_EXAMPLE_DEFAULT})
|
||||
option(BUILD_ZVEC_FULL_EXAMPLES "Build examples linked with libzvec" ${ZVEC_FULL_EXAMPLES_DEFAULT})
|
||||
|
||||
# --- Create INTERFACE target for libzvec (all-in-one C++ shared library) ---
|
||||
# libzvec.so/.dylib/.dll already bundles all zvec internal components
|
||||
# (zvec_db, zvec_core, zvec_ailego, zvec_turbo), so no individual dependency
|
||||
# (zvec, zvec_core, zvec_ailego, zvec_turbo), so no individual dependency
|
||||
# libraries need to be specified by the consumer.
|
||||
add_library(zvec-lib INTERFACE)
|
||||
target_link_libraries(zvec-lib INTERFACE
|
||||
zvec
|
||||
Threads::Threads
|
||||
)
|
||||
if(NOT WIN32)
|
||||
target_link_libraries(zvec-lib INTERFACE ${CMAKE_DL_LIBS})
|
||||
if(BUILD_ZVEC_FULL_EXAMPLES)
|
||||
add_library(zvec-lib INTERFACE)
|
||||
if(TARGET zvec_shared)
|
||||
target_link_libraries(zvec-lib INTERFACE zvec_shared)
|
||||
else()
|
||||
if(ZVEC_SHARED_LIBRARY)
|
||||
target_link_libraries(zvec-lib INTERFACE "${ZVEC_SHARED_LIBRARY}")
|
||||
else()
|
||||
message(FATAL_ERROR
|
||||
"libzvec shared library was not found in ${ZVEC_LIB_SEARCH_DIRS}. "
|
||||
"Build zvec with -DBUILD_ZVEC_SHARED=ON or disable BUILD_ZVEC_FULL_EXAMPLES.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# --- Create INTERFACE target for libzvec_core (core-only all-in-one library) ---
|
||||
# The core example intentionally depends only on libzvec_core.
|
||||
if(BUILD_ZVEC_CORE_EXAMPLE)
|
||||
add_library(zvec-core-lib INTERFACE)
|
||||
if(TARGET zvec_core_shared)
|
||||
target_link_libraries(zvec-core-lib INTERFACE zvec_core_shared)
|
||||
else()
|
||||
zvec_find_shared_library(ZVEC_CORE_SHARED_LIBRARY zvec_core)
|
||||
if(ZVEC_CORE_SHARED_LIBRARY)
|
||||
target_link_libraries(zvec-core-lib INTERFACE "${ZVEC_CORE_SHARED_LIBRARY}")
|
||||
else()
|
||||
message(FATAL_ERROR
|
||||
"libzvec_core shared library was not found in ${ZVEC_LIB_SEARCH_DIRS}. "
|
||||
"Build zvec with -DBUILD_ZVEC_CORE_SHARED=ON or "
|
||||
"-DBUILD_ZVEC_CORE_ONLY=ON, or disable BUILD_ZVEC_CORE_EXAMPLE.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# --- Executables ---
|
||||
add_executable(db-example db/main.cc)
|
||||
target_link_libraries(db-example PRIVATE zvec-lib)
|
||||
if(ANDROID)
|
||||
target_link_libraries(db-example PRIVATE log)
|
||||
set(ZVEC_EXAMPLE_TARGETS)
|
||||
|
||||
if(BUILD_ZVEC_FULL_EXAMPLES)
|
||||
add_executable(db-example db/main.cc)
|
||||
target_link_libraries(db-example PRIVATE zvec-lib)
|
||||
if(ANDROID)
|
||||
target_link_libraries(db-example PRIVATE log)
|
||||
endif()
|
||||
list(APPEND ZVEC_EXAMPLE_TARGETS db-example)
|
||||
|
||||
add_executable(ailego-example ailego/main.cc)
|
||||
target_link_libraries(ailego-example PRIVATE zvec-lib)
|
||||
list(APPEND ZVEC_EXAMPLE_TARGETS ailego-example)
|
||||
endif()
|
||||
|
||||
add_executable(core-example core/main.cc)
|
||||
target_link_libraries(core-example PRIVATE zvec-lib)
|
||||
|
||||
add_executable(ailego-example ailego/main.cc)
|
||||
target_link_libraries(ailego-example PRIVATE zvec-lib)
|
||||
if(BUILD_ZVEC_CORE_EXAMPLE)
|
||||
add_executable(core-example core/main.cc)
|
||||
target_link_libraries(core-example PRIVATE zvec-core-lib)
|
||||
list(APPEND ZVEC_EXAMPLE_TARGETS core-example)
|
||||
endif()
|
||||
|
||||
# Strip symbols to reduce executable size
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID)
|
||||
add_custom_command(TARGET db-example POST_BUILD
|
||||
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:db-example>"
|
||||
COMMENT "Stripping symbols from db-example")
|
||||
add_custom_command(TARGET core-example POST_BUILD
|
||||
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:core-example>"
|
||||
COMMENT "Stripping symbols from core-example")
|
||||
add_custom_command(TARGET ailego-example POST_BUILD
|
||||
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:ailego-example>"
|
||||
COMMENT "Stripping symbols from ailego-example")
|
||||
foreach(ZVEC_EXAMPLE_TARGET ${ZVEC_EXAMPLE_TARGETS})
|
||||
add_custom_command(TARGET ${ZVEC_EXAMPLE_TARGET} POST_BUILD
|
||||
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:${ZVEC_EXAMPLE_TARGET}>"
|
||||
COMMENT "Stripping symbols from ${ZVEC_EXAMPLE_TARGET}")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# Optimize for size
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID)
|
||||
set_property(TARGET db-example core-example ailego-example
|
||||
PROPERTY COMPILE_FLAGS "-Os")
|
||||
set_property(TARGET db-example core-example ailego-example
|
||||
PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID AND ZVEC_EXAMPLE_TARGETS)
|
||||
set_property(TARGET ${ZVEC_EXAMPLE_TARGETS} PROPERTY COMPILE_FLAGS "-Os")
|
||||
set_property(TARGET ${ZVEC_EXAMPLE_TARGETS} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -8,152 +8,162 @@ git_version(ZVEC_VERSION ${CMAKE_CURRENT_SOURCE_DIR})
|
|||
cc_directory(ailego)
|
||||
cc_directory(turbo)
|
||||
cc_directory(core)
|
||||
cc_directory(db)
|
||||
cc_directory(binding)
|
||||
|
||||
if(NOT BUILD_ZVEC_CORE_ONLY)
|
||||
cc_directory(db)
|
||||
cc_directory(binding)
|
||||
endif()
|
||||
|
||||
# =============================================================================
|
||||
# Build ALL-IN-ONE C++ Shared Library (libzvec.so / libzvec.dylib)
|
||||
# Build ALL-IN-ONE C++ Shared Libraries
|
||||
# =============================================================================
|
||||
# Merges all zvec internal static libraries (zvec_db, zvec_core, zvec_ailego,
|
||||
# zvec_turbo) into a single shared library, exposing the full C++ interface.
|
||||
# Unlike zvec_c_api which only exposes C symbols, this library preserves all
|
||||
# Merges zvec internal static libraries into shared libraries while preserving
|
||||
# C++ symbols for direct C++ linking.
|
||||
|
||||
include(GNUInstallDirs)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
# Generate a minimal stub source (add_library SHARED requires at least one source)
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/zvec_allin_stub.cc
|
||||
"// Auto-generated stub for zvec all-in-one C++ shared library\n"
|
||||
)
|
||||
function(zvec_add_all_in_one_shared TARGET_NAME OUTPUT_NAME)
|
||||
cmake_parse_arguments(ZVEC_ALLIN "" "" "LIBS" ${ARGN})
|
||||
if(NOT ZVEC_ALLIN_LIBS)
|
||||
message(FATAL_ERROR "zvec_add_all_in_one_shared requires LIBS")
|
||||
endif()
|
||||
|
||||
add_library(zvec_shared SHARED
|
||||
${CMAKE_CURRENT_BINARY_DIR}/zvec_allin_stub.cc
|
||||
)
|
||||
|
||||
set_target_properties(zvec_shared PROPERTIES
|
||||
OUTPUT_NAME "zvec"
|
||||
POSITION_INDEPENDENT_CODE ON
|
||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
||||
)
|
||||
|
||||
# Determine whole-archive flag for current platform
|
||||
if(MSVC)
|
||||
set(ZVEC_ALLIN_WA_PREFIX "/WHOLEARCHIVE:")
|
||||
set(ZVEC_ALLIN_WA_SUFFIX "")
|
||||
elseif(APPLE)
|
||||
set(ZVEC_ALLIN_WA_PREFIX "-Wl,-force_load,")
|
||||
set(ZVEC_ALLIN_WA_SUFFIX "")
|
||||
else()
|
||||
set(ZVEC_ALLIN_WA_PREFIX "-Wl,--whole-archive")
|
||||
set(ZVEC_ALLIN_WA_SUFFIX "-Wl,--no-whole-archive")
|
||||
endif()
|
||||
|
||||
# Platform-specific whole-archive linking (mirrors binding/c/CMakeLists.txt)
|
||||
if(MSVC)
|
||||
# On MSVC, WINDOWS_EXPORT_ALL_SYMBOLS generates a .def file only from the
|
||||
# target's own object files. /WHOLEARCHIVE: pulls objects into the DLL but
|
||||
# they are NOT scanned for the .def, leaving the import library empty.
|
||||
# Fix: include static-library objects directly via TARGET_OBJECTS (CMake 3.21+)
|
||||
# so the def-file generator sees every symbol.
|
||||
target_sources(zvec_shared PRIVATE
|
||||
$<TARGET_OBJECTS:zvec_db>
|
||||
$<TARGET_OBJECTS:zvec_core>
|
||||
$<TARGET_OBJECTS:zvec_ailego>
|
||||
$<TARGET_OBJECTS:zvec_turbo>
|
||||
)
|
||||
target_link_libraries(zvec_shared
|
||||
PRIVATE
|
||||
zvec_db
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
Threads::Threads
|
||||
)
|
||||
elseif(APPLE)
|
||||
target_link_options(zvec_shared PRIVATE
|
||||
${ZVEC_ALLIN_WA_PREFIX}$<TARGET_FILE:zvec_db>
|
||||
${ZVEC_ALLIN_WA_PREFIX}$<TARGET_FILE:zvec_core>
|
||||
${ZVEC_ALLIN_WA_PREFIX}$<TARGET_FILE:zvec_ailego>
|
||||
${ZVEC_ALLIN_WA_PREFIX}$<TARGET_FILE:zvec_turbo>
|
||||
)
|
||||
target_link_libraries(zvec_shared
|
||||
PRIVATE
|
||||
zvec_db
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
Threads::Threads
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
else()
|
||||
# Linux and other Unix-like systems
|
||||
target_link_libraries(zvec_shared
|
||||
PRIVATE
|
||||
${ZVEC_ALLIN_WA_PREFIX}
|
||||
zvec_db
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
${ZVEC_ALLIN_WA_SUFFIX}
|
||||
Threads::Threads
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
|
||||
# Try static linking of libstdc++ and libgcc for better portability
|
||||
set(ALLIN_STATIC_LIBS_FOUND FALSE)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++.a
|
||||
OUTPUT_VARIABLE ALLIN_LIBSTDCPP_PATH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc.a
|
||||
OUTPUT_VARIABLE ALLIN_LIBGCC_PATH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(EXISTS "${ALLIN_LIBSTDCPP_PATH}" AND EXISTS "${ALLIN_LIBGCC_PATH}")
|
||||
if(IS_ABSOLUTE "${ALLIN_LIBSTDCPP_PATH}" AND IS_ABSOLUTE "${ALLIN_LIBGCC_PATH}")
|
||||
set(ALLIN_STATIC_LIBS_FOUND TRUE)
|
||||
foreach(ZVEC_ALLIN_LIB ${ZVEC_ALLIN_LIBS})
|
||||
if(NOT TARGET ${ZVEC_ALLIN_LIB})
|
||||
message(FATAL_ERROR "Target ${ZVEC_ALLIN_LIB} is required by ${TARGET_NAME}")
|
||||
endif()
|
||||
endif()
|
||||
if(ALLIN_STATIC_LIBS_FOUND)
|
||||
target_link_options(zvec_shared PRIVATE -static-libstdc++ -static-libgcc)
|
||||
message(STATUS "zvec_shared: Using static libstdc++ and libgcc")
|
||||
else()
|
||||
message(STATUS "zvec_shared: Using dynamic linking for libstdc++ and libgcc")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Include directories
|
||||
target_include_directories(zvec_shared
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src/generated>
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/include>
|
||||
$<INSTALL_INTERFACE:include>
|
||||
PRIVATE
|
||||
${PROJECT_SOURCE_DIR}/src
|
||||
)
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_stub.cc
|
||||
"// Auto-generated stub for ${TARGET_NAME}\n"
|
||||
)
|
||||
|
||||
# Strip symbols in release builds to reduce library size
|
||||
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
if(UNIX AND NOT APPLE)
|
||||
# add_custom_command(TARGET zvec_shared POST_BUILD
|
||||
# COMMAND ${CMAKE_STRIP} $<TARGET_FILE:zvec_shared>
|
||||
# COMMENT "Stripping symbols from libzvec.so"
|
||||
# )
|
||||
elseif(APPLE)
|
||||
add_custom_command(TARGET zvec_shared POST_BUILD
|
||||
COMMAND /usr/bin/strip -x $<TARGET_FILE:zvec_shared>
|
||||
COMMENT "Stripping symbols from libzvec.dylib"
|
||||
add_library(${TARGET_NAME} SHARED
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_stub.cc
|
||||
)
|
||||
|
||||
set_target_properties(${TARGET_NAME} PROPERTIES
|
||||
OUTPUT_NAME "${OUTPUT_NAME}"
|
||||
POSITION_INDEPENDENT_CODE ON
|
||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
||||
)
|
||||
if(WIN32)
|
||||
set_target_properties(${TARGET_NAME} PROPERTIES
|
||||
ARCHIVE_OUTPUT_NAME "${TARGET_NAME}"
|
||||
)
|
||||
endif()
|
||||
target_compile_features(${TARGET_NAME} PUBLIC cxx_std_17)
|
||||
|
||||
if(MSVC)
|
||||
foreach(ZVEC_ALLIN_LIB ${ZVEC_ALLIN_LIBS})
|
||||
target_sources(${TARGET_NAME} PRIVATE
|
||||
$<TARGET_OBJECTS:${ZVEC_ALLIN_LIB}>
|
||||
)
|
||||
endforeach()
|
||||
|
||||
target_link_libraries(${TARGET_NAME}
|
||||
PRIVATE
|
||||
${ZVEC_ALLIN_LIBS}
|
||||
Threads::Threads
|
||||
)
|
||||
elseif(APPLE)
|
||||
foreach(ZVEC_ALLIN_LIB ${ZVEC_ALLIN_LIBS})
|
||||
list(APPEND ZVEC_ALLIN_WA_OPTIONS
|
||||
-Wl,-force_load,$<TARGET_FILE:${ZVEC_ALLIN_LIB}>
|
||||
)
|
||||
endforeach()
|
||||
|
||||
target_link_options(${TARGET_NAME} PRIVATE ${ZVEC_ALLIN_WA_OPTIONS})
|
||||
target_link_libraries(${TARGET_NAME}
|
||||
PRIVATE
|
||||
${ZVEC_ALLIN_LIBS}
|
||||
Threads::Threads
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
else()
|
||||
target_link_libraries(${TARGET_NAME}
|
||||
PRIVATE
|
||||
-Wl,--whole-archive
|
||||
${ZVEC_ALLIN_LIBS}
|
||||
-Wl,--no-whole-archive
|
||||
Threads::Threads
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
|
||||
# Try static linking of libstdc++ and libgcc for better portability.
|
||||
set(ALLIN_STATIC_LIBS_FOUND FALSE)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++.a
|
||||
OUTPUT_VARIABLE ALLIN_LIBSTDCPP_PATH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc.a
|
||||
OUTPUT_VARIABLE ALLIN_LIBGCC_PATH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(EXISTS "${ALLIN_LIBSTDCPP_PATH}" AND EXISTS "${ALLIN_LIBGCC_PATH}")
|
||||
if(IS_ABSOLUTE "${ALLIN_LIBSTDCPP_PATH}" AND IS_ABSOLUTE "${ALLIN_LIBGCC_PATH}")
|
||||
set(ALLIN_STATIC_LIBS_FOUND TRUE)
|
||||
endif()
|
||||
endif()
|
||||
if(ALLIN_STATIC_LIBS_FOUND)
|
||||
target_link_options(${TARGET_NAME} PRIVATE -static-libstdc++ -static-libgcc)
|
||||
message(STATUS "${TARGET_NAME}: Using static libstdc++ and libgcc")
|
||||
else()
|
||||
message(STATUS "${TARGET_NAME}: Using dynamic linking for libstdc++ and libgcc")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
target_include_directories(${TARGET_NAME}
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src/generated>
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/include>
|
||||
$<INSTALL_INTERFACE:include>
|
||||
PRIVATE
|
||||
${PROJECT_SOURCE_DIR}/src
|
||||
)
|
||||
|
||||
# Strip symbols in release builds to reduce library size.
|
||||
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
if(UNIX AND NOT APPLE)
|
||||
# add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
||||
# COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${TARGET_NAME}>
|
||||
# COMMENT "Stripping symbols from $<TARGET_FILE_NAME:${TARGET_NAME}>"
|
||||
# )
|
||||
elseif(APPLE)
|
||||
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
||||
COMMAND /usr/bin/strip -x $<TARGET_FILE:${TARGET_NAME}>
|
||||
COMMENT "Stripping symbols from $<TARGET_FILE_NAME:${TARGET_NAME}>"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
install(TARGETS ${TARGET_NAME}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
if(BUILD_ZVEC_CORE_SHARED AND NOT IOS)
|
||||
zvec_add_all_in_one_shared(zvec_core_shared zvec_core
|
||||
LIBS
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
)
|
||||
elseif(BUILD_ZVEC_CORE_SHARED AND IOS)
|
||||
message(STATUS "Skipping zvec_core_shared on iOS")
|
||||
endif()
|
||||
|
||||
# Installation
|
||||
install(TARGETS zvec_shared
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
|
||||
if(BUILD_ZVEC_SHARED)
|
||||
zvec_add_all_in_one_shared(zvec_shared zvec
|
||||
LIBS
|
||||
zvec
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
)
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -13,11 +13,21 @@ git_version(GIT_SRCS_VER ${CMAKE_CURRENT_SOURCE_DIR})
|
|||
file(GLOB_RECURSE ALL_SRCS *.cc *.c *.h)
|
||||
|
||||
set(EXTRA_LIBS ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS})
|
||||
set(EXTRA_DEFS)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
list(APPEND EXTRA_LIBS ${LIB_RT})
|
||||
endif()
|
||||
|
||||
if(BUILD_ZVEC_CORE_ONLY)
|
||||
list(FILTER ALL_SRCS EXCLUDE REGEX ".*/buffer/parquet_hash_table\\.cc$")
|
||||
list(APPEND EXTRA_DEFS ZVEC_CORE_ONLY=1)
|
||||
else()
|
||||
list(APPEND EXTRA_LIBS
|
||||
Arrow::arrow_static
|
||||
Arrow::parquet_static)
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID AND AUTO_DETECT_ARCH)
|
||||
if(HOST_ARCH MATCHES "^(x86|x64)$")
|
||||
setup_compiler_march_for_x86(MATH_MARCH_FLAG_SSE MATH_MARCH_FLAG_AVX2 MATH_MARCH_FLAG_AVX512 MATH_MARCH_FLAG_AVX512FP16)
|
||||
|
|
@ -121,7 +131,6 @@ cc_library(
|
|||
NAME zvec_ailego STATIC STRICT PACKED
|
||||
SRCS ${ALL_SRCS}
|
||||
LIBS ${EXTRA_LIBS}
|
||||
Arrow::arrow_static
|
||||
Arrow::parquet_static
|
||||
DEFS ${EXTRA_DEFS}
|
||||
VERSION "${GIT_SRCS_VER}"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -12,10 +12,13 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include <zvec/ailego/buffer/parquet_hash_table.h>
|
||||
#include <zvec/ailego/buffer/vector_page_table.h>
|
||||
#include <zvec/core/framework/index_logger.h>
|
||||
|
||||
#ifndef ZVEC_CORE_ONLY
|
||||
#include <zvec/ailego/buffer/parquet_hash_table.h>
|
||||
#endif
|
||||
|
||||
namespace zvec {
|
||||
namespace ailego {
|
||||
|
||||
|
|
@ -57,11 +60,15 @@ bool BlockEvictionQueue::evict_block(BlockType &item) {
|
|||
return false;
|
||||
}
|
||||
if (item.page_table == nullptr) {
|
||||
#ifndef ZVEC_CORE_ONLY
|
||||
if (!ParquetBufferPool::get_instance().is_dead_node(item)) {
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
#else
|
||||
continue;
|
||||
#endif
|
||||
}
|
||||
} while (!is_valid_and_alive(item));
|
||||
return ok;
|
||||
|
|
@ -76,8 +83,10 @@ void BlockEvictionQueue::recycle() {
|
|||
valid_page_tables_.end()) {
|
||||
item.page_table->evict_block(item.vector_block.first);
|
||||
}
|
||||
#ifndef ZVEC_CORE_ONLY
|
||||
} else {
|
||||
ParquetBufferPool::get_instance().evict(item.parquet_buffer_block.first);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -150,4 +159,4 @@ bool MemoryLimitPool::is_full() {
|
|||
}
|
||||
|
||||
} // namespace ailego
|
||||
} // namespace zvec
|
||||
} // namespace zvec
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ endif()
|
|||
# Users only need to link libzvec_c_api.so without installing any dependencies
|
||||
if(MSVC)
|
||||
target_link_options(zvec_c_api PRIVATE
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_db>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_core>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_ailego>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_turbo>
|
||||
|
|
@ -120,7 +120,7 @@ if(MSVC)
|
|||
|
||||
target_link_libraries(zvec_c_api
|
||||
PRIVATE
|
||||
zvec_db
|
||||
zvec
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
|
|
@ -129,7 +129,7 @@ if(MSVC)
|
|||
)
|
||||
elseif(APPLE)
|
||||
target_link_options(zvec_c_api PRIVATE
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_db>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_core>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_ailego>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_turbo>
|
||||
|
|
@ -138,7 +138,7 @@ elseif(APPLE)
|
|||
# Link the libraries themselves (without force_load flags)
|
||||
target_link_libraries(zvec_c_api
|
||||
PRIVATE
|
||||
zvec_db
|
||||
zvec
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
|
|
@ -155,7 +155,7 @@ else()
|
|||
PRIVATE
|
||||
# Force load all zvec internal libraries (extract all objects)
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}
|
||||
zvec_db
|
||||
zvec
|
||||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo # Required by zvec_core (metric module)
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|||
$<TARGET_FILE:core_quantizer_static>
|
||||
$<TARGET_FILE:core_plugin>
|
||||
-Wl,--no-whole-archive
|
||||
zvec_db
|
||||
zvec
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
target_link_options(_zvec PRIVATE
|
||||
|
|
@ -99,7 +99,7 @@ elseif (APPLE)
|
|||
-Wl,-force_load,$<TARGET_FILE:core_utility_static>
|
||||
-Wl,-force_load,$<TARGET_FILE:core_quantizer_static>
|
||||
-Wl,-force_load,$<TARGET_FILE:core_plugin>
|
||||
zvec_db
|
||||
zvec
|
||||
)
|
||||
target_link_libraries(_zvec PRIVATE
|
||||
-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/exports.mac
|
||||
|
|
@ -121,7 +121,7 @@ elseif (MSVC)
|
|||
)
|
||||
target_link_libraries(_zvec PRIVATE
|
||||
${_zvec_whole_archive_libs}
|
||||
zvec_db
|
||||
zvec
|
||||
)
|
||||
foreach(_lib ${_zvec_whole_archive_libs})
|
||||
target_link_options(_zvec PRIVATE
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ endif()
|
|||
# The DiskAnn algorithm is provided by the separate core_knn_diskann library
|
||||
# (real on Linux x86_64, stub on other platforms). Including them here causes
|
||||
# duplicate symbols and missing -laio when test binaries link both zvec_core
|
||||
# (via zvec_db) and core_knn_diskann.
|
||||
# (via zvec) and core_knn_diskann.
|
||||
list(FILTER ALL_CORE_SRCS EXCLUDE REGEX ".*/algorithm/diskann/.*")
|
||||
if(NOT DISKANN_SUPPORTED)
|
||||
list(FILTER ALL_CORE_SRCS EXCLUDE REGEX ".*/interface/indexes/diskann_index\\.cc")
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
#include <ailego/internal/cpu_features.h>
|
||||
#include <ailego/pattern/defer.h>
|
||||
#include <ailego/utility/memory_helper.h>
|
||||
#include <arrow/compute/ordering.h>
|
||||
#include "algorithm/hnsw_rabitq/rabitq_reformer.h"
|
||||
#include "zvec/ailego/container/params.h"
|
||||
#include "zvec/ailego/logger/logger.h"
|
||||
|
|
@ -993,4 +992,4 @@ int HnswRabitqStreamer::search_bf_by_p_keys_impl(
|
|||
|
||||
|
||||
} // namespace core
|
||||
} // namespace zvec
|
||||
} // namespace zvec
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ cc_directory(sqlengine)
|
|||
file(GLOB_RECURSE ALL_DB_SRCS *.cc *.c *.h)
|
||||
|
||||
# Ensure bitpacked_simd_sse41.cc is compiled with SSE4.1 flag and
|
||||
# bitpacked_simd_avx2.cc with AVX2 flag in the packed zvec_db target as well
|
||||
# bitpacked_simd_avx2.cc with AVX2 flag in the packed zvec target as well
|
||||
# (they are also compiled separately in zvec_index).
|
||||
if(NOT ANDROID AND AUTO_DETECT_ARCH)
|
||||
if(HOST_ARCH MATCHES "^(x86|x64)$")
|
||||
|
|
@ -31,7 +31,7 @@ if(NOT ANDROID AND AUTO_DETECT_ARCH)
|
|||
endif()
|
||||
|
||||
cc_library(
|
||||
NAME zvec_db STATIC STRICT SRCS_NO_GLOB PACKED
|
||||
NAME zvec STATIC STRICT SRCS_NO_GLOB PACKED
|
||||
SRCS ${ALL_DB_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/proto/zvec.pb.cc
|
||||
INCS . ${CMAKE_CURRENT_BINARY_DIR}
|
||||
PUBINCS ${PROJECT_ROOT_DIR}/src/include
|
||||
|
|
@ -51,4 +51,4 @@ cc_library(
|
|||
Arrow::arrow_acero
|
||||
DEPS zvec_proto
|
||||
VERSION "${PROXIMA_ZVEC_VERSION}"
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -9,8 +9,6 @@ foreach(CC_SRCS ${ALL_TEST_SRCS})
|
|||
cc_gtest(
|
||||
NAME ${CC_TARGET} STRICT
|
||||
LIBS zvec_ailego core_framework core_utility
|
||||
Arrow::arrow_depends
|
||||
Arrow::parquet_static
|
||||
SRCS ${CC_SRCS}
|
||||
INCS . ${PROJECT_ROOT_DIR}/src/core/
|
||||
)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ foreach(CC_SRCS ${ALL_TEST_SRCS})
|
|||
get_filename_component(CC_TARGET ${CC_SRCS} NAME_WE)
|
||||
cc_gmock(
|
||||
NAME ${CC_TARGET} STRICT
|
||||
LIBS zvec_db
|
||||
LIBS zvec
|
||||
zvec_proto
|
||||
core_knn_flat
|
||||
core_knn_flat_sparse
|
||||
|
|
@ -45,5 +45,5 @@ foreach(CC_SRCS ${ALL_TEST_SRCS})
|
|||
INCS . .. ../../src
|
||||
LDFLAGS ${APPLE_FRAMEWORK_LIBS}
|
||||
)
|
||||
cc_test_suite(zvec_db ${CC_TARGET})
|
||||
cc_test_suite(zvec ${CC_TARGET})
|
||||
endforeach()
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ endif()
|
|||
|
||||
# Common libraries
|
||||
set(CRASH_RECOVERY_COMMON_LIBS
|
||||
zvec_db
|
||||
zvec
|
||||
zvec_proto
|
||||
core_knn_flat
|
||||
core_knn_flat_sparse
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ foreach(CC_SRCS ${ALL_TEST_SRCS})
|
|||
get_filename_component(CC_TARGET ${CC_SRCS} NAME_WE)
|
||||
cc_gmock(
|
||||
NAME ${CC_TARGET} STRICT
|
||||
LIBS zvec_db
|
||||
LIBS zvec
|
||||
zvec_ailego
|
||||
zvec_proto
|
||||
core_metric_static
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ foreach(CC_SRCS ${ALL_TEST_SRCS})
|
|||
LIBS zvec_common
|
||||
zvec_proto
|
||||
zvec_sqlengine
|
||||
zvec_db
|
||||
zvec
|
||||
zvec_ailego
|
||||
core_metric
|
||||
core_utility
|
||||
|
|
|
|||
|
|
@ -13,20 +13,24 @@ set(EXTERNAL_LIB_DIR ${CMAKE_BINARY_DIR}/external/usr/local/lib)
|
|||
file(MAKE_DIRECTORY ${EXTERNAL_INC_DIR})
|
||||
file(MAKE_DIRECTORY ${EXTERNAL_LIB_DIR})
|
||||
|
||||
add_subdirectory(sparsehash sparsehash EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(magic_enum magic_enum EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(RaBitQ-Library RaBitQ-Library EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(googletest googletest EXCLUDE_FROM_ALL)
|
||||
|
||||
if(BUILD_ZVEC_CORE_ONLY)
|
||||
return()
|
||||
endif()
|
||||
|
||||
add_subdirectory(arrow arrow EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(gflags gflags EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(glog glog EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(sparsehash sparsehash EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(yaml-cpp yaml-cpp EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(protobuf protobuf EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(antlr antlr EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(lz4 lz4 EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(rocksdb rocksdb EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(CRoaring CRoaring EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(arrow arrow EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(magic_enum magic_enum EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(RaBitQ-Library RaBitQ-Library EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(FastPFOR FastPFOR EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(limonp limonp EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(cppjieba cppjieba EXCLUDE_FROM_ALL)
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,11 @@ include(ProcessorCount)
|
|||
|
||||
ProcessorCount(NPROC)
|
||||
|
||||
set(ARROW_CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
|
||||
if(NOT ARROW_CMAKE_BUILD_TYPE)
|
||||
set(ARROW_CMAKE_BUILD_TYPE Release)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
set(LIB_PARQUET ${EXTERNAL_LIB_DIR}/parquet_static.lib)
|
||||
set(LIB_ARROW ${EXTERNAL_LIB_DIR}/arrow_static.lib)
|
||||
|
|
@ -64,7 +69,7 @@ if(ANDROID)
|
|||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apache-arrow-21.0.0
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_IN_SOURCE false
|
||||
CONFIGURE_COMMAND env ${CONFIGURE_ENV_LIST} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} ${_ARROW_COMPILER_LAUNCHER_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DANDROID_ABI=${ANDROID_ABI} -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} -DARROW_WITH_MUSL=OFF "<SOURCE_DIR>/cpp"
|
||||
CONFIGURE_COMMAND env ${CONFIGURE_ENV_LIST} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} ${_ARROW_COMPILER_LAUNCHER_ARGS} -DCMAKE_BUILD_TYPE=${ARROW_CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DANDROID_ABI=${ANDROID_ABI} -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} -DARROW_WITH_MUSL=OFF "<SOURCE_DIR>/cpp"
|
||||
BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC}
|
||||
INSTALL_COMMAND "${CMAKE_COMMAND}" --install "<BINARY_DIR>" --prefix=${EXTERNAL_BINARY_DIR}/usr/local
|
||||
BYPRODUCTS ${LIB_PARQUET} ${LIB_ARROW} ${LIB_COMPUTE} ${LIB_ACERO} ${LIB_ARROW_DEPENDS} ${LIB_ARROW_DATASET}
|
||||
|
|
@ -91,7 +96,7 @@ elseif(IOS)
|
|||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apache-arrow-21.0.0
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_IN_SOURCE false
|
||||
CONFIGURE_COMMAND env ${_arrow_ios_env} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} ${_ARROW_COMPILER_LAUNCHER_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DARROW_CPU_FLAG=${IOS_ARROW_CPU_FLAG} "<SOURCE_DIR>/cpp"
|
||||
CONFIGURE_COMMAND env ${_arrow_ios_env} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} ${_ARROW_COMPILER_LAUNCHER_ARGS} -DCMAKE_BUILD_TYPE=${ARROW_CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DARROW_CPU_FLAG=${IOS_ARROW_CPU_FLAG} "<SOURCE_DIR>/cpp"
|
||||
BUILD_COMMAND env "IPHONEOS_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}" "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC}
|
||||
INSTALL_COMMAND "${CMAKE_COMMAND}" --install "<BINARY_DIR>" --prefix=${EXTERNAL_BINARY_DIR}/usr/local
|
||||
BYPRODUCTS ${LIB_PARQUET} ${LIB_ARROW} ${LIB_COMPUTE} ${LIB_ACERO} ${LIB_ARROW_DEPENDS} ${LIB_ARROW_DATASET}
|
||||
|
|
@ -134,7 +139,7 @@ else ()
|
|||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apache-arrow-21.0.0
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_IN_SOURCE false
|
||||
CONFIGURE_COMMAND env ${CONFIGURE_ENV_LIST} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} ${_ARROW_COMPILER_LAUNCHER_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib "<SOURCE_DIR>/cpp"
|
||||
CONFIGURE_COMMAND env ${CONFIGURE_ENV_LIST} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} ${_ARROW_COMPILER_LAUNCHER_ARGS} -DCMAKE_BUILD_TYPE=${ARROW_CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib "<SOURCE_DIR>/cpp"
|
||||
BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC}
|
||||
INSTALL_COMMAND "${CMAKE_COMMAND}" --install "<BINARY_DIR>" --prefix=${EXTERNAL_BINARY_DIR}/usr/local
|
||||
BYPRODUCTS ${LIB_PARQUET} ${LIB_ARROW} ${LIB_COMPUTE} ${LIB_ACERO} ${LIB_ARROW_DEPENDS} ${LIB_ARROW_DATASET}
|
||||
|
|
|
|||
Loading…
Reference in New Issue