From 4679a8f39d069ac489a6b1404ca8e07315637b36 Mon Sep 17 00:00:00 2001 From: feihongxu0824 Date: Tue, 9 Jun 2026 23:45:42 +0800 Subject: [PATCH] feat: support zvec core-only build (#481) --- .../subproject-integration/CMakeLists.txt | 30 +- .github/workflows/05-windows-build.yml | 23 +- .../08-cmake-subproject-integration.yml | 69 ++++- CMakeLists.txt | 36 ++- examples/c++/CMakeLists.txt | 154 +++++++--- src/CMakeLists.txt | 276 +++++++++--------- src/ailego/CMakeLists.txt | 13 +- src/ailego/buffer/block_eviction_queue.cc | 13 +- src/binding/c/CMakeLists.txt | 10 +- src/binding/python/CMakeLists.txt | 6 +- src/core/CMakeLists.txt | 2 +- .../hnsw_rabitq/hnsw_rabitq_streamer.cc | 3 +- src/db/CMakeLists.txt | 6 +- tests/core/utility/CMakeLists.txt | 2 - tests/db/CMakeLists.txt | 4 +- tests/db/crash_recovery/CMakeLists.txt | 2 +- tests/db/index/CMakeLists.txt | 2 +- tests/db/sqlengine/CMakeLists.txt | 2 +- thirdparty/CMakeLists.txt | 14 +- thirdparty/arrow/CMakeLists.txt | 11 +- 20 files changed, 448 insertions(+), 230 deletions(-) diff --git a/.github/cmake/subproject-integration/CMakeLists.txt b/.github/cmake/subproject-integration/CMakeLists.txt index 7bde0d7..dbae74c 100644 --- a/.github/cmake/subproject-integration/CMakeLists.txt +++ b/.github/cmake/subproject-integration/CMakeLists.txt @@ -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() diff --git a/.github/workflows/05-windows-build.yml b/.github/workflows/05-windows-build.yml index ef274ba..7ed5503 100644 --- a/.github/workflows/05-windows-build.yml +++ b/.github/workflows/05-windows-build.yml @@ -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 \ No newline at end of file + shell: powershell diff --git a/.github/workflows/08-cmake-subproject-integration.yml b/.github/workflows/08-cmake-subproject-integration.yml index 21e98ce..5709f4d 100644 --- a/.github/workflows/08-cmake-subproject-integration.yml +++ b/.github/workflows/08-cmake-subproject-integration.yml @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e9fe89..392dbda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index c29fdef..dc59961 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -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$<$: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} "$" - COMMENT "Stripping symbols from db-example") - add_custom_command(TARGET core-example POST_BUILD - COMMAND ${CMAKE_STRIP} "$" - COMMENT "Stripping symbols from core-example") - add_custom_command(TARGET ailego-example POST_BUILD - COMMAND ${CMAKE_STRIP} "$" - 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} "$" + 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() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 807c862..9cf11f3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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_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}$ - ${ZVEC_ALLIN_WA_PREFIX}$ - ${ZVEC_ALLIN_WA_PREFIX}$ - ${ZVEC_ALLIN_WA_PREFIX}$ - ) - 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 - $ - $ - $ - 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} $ - # COMMENT "Stripping symbols from libzvec.so" - # ) - elseif(APPLE) - add_custom_command(TARGET zvec_shared POST_BUILD - COMMAND /usr/bin/strip -x $ - 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 + $ + ) + 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,$ + ) + 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 + $ + $ + $ + 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} $ + # COMMENT "Stripping symbols from $" + # ) + elseif(APPLE) + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + COMMAND /usr/bin/strip -x $ + COMMENT "Stripping symbols from $" + ) + 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() diff --git a/src/ailego/CMakeLists.txt b/src/ailego/CMakeLists.txt index fdaa1b1..628027c 100644 --- a/src/ailego/CMakeLists.txt +++ b/src/ailego/CMakeLists.txt @@ -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}" ) diff --git a/src/ailego/buffer/block_eviction_queue.cc b/src/ailego/buffer/block_eviction_queue.cc index 6f24b35..d51ae35 100644 --- a/src/ailego/buffer/block_eviction_queue.cc +++ b/src/ailego/buffer/block_eviction_queue.cc @@ -12,10 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include #include #include +#ifndef ZVEC_CORE_ONLY +#include +#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 \ No newline at end of file +} // namespace zvec diff --git a/src/binding/c/CMakeLists.txt b/src/binding/c/CMakeLists.txt index ef99a6d..13dfdc0 100644 --- a/src/binding/c/CMakeLists.txt +++ b/src/binding/c/CMakeLists.txt @@ -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}$ + ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ @@ -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}$ + ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ @@ -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) diff --git a/src/binding/python/CMakeLists.txt b/src/binding/python/CMakeLists.txt index 81a6919..0db6d75 100644 --- a/src/binding/python/CMakeLists.txt +++ b/src/binding/python/CMakeLists.txt @@ -63,7 +63,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux") $ $ -Wl,--no-whole-archive - zvec_db + zvec ${CMAKE_DL_LIBS} ) target_link_options(_zvec PRIVATE @@ -99,7 +99,7 @@ elseif (APPLE) -Wl,-force_load,$ -Wl,-force_load,$ -Wl,-force_load,$ - 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 diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 13a974b..6405c32 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -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") diff --git a/src/core/algorithm/hnsw_rabitq/hnsw_rabitq_streamer.cc b/src/core/algorithm/hnsw_rabitq/hnsw_rabitq_streamer.cc index dea90c3..6ebf57f 100644 --- a/src/core/algorithm/hnsw_rabitq/hnsw_rabitq_streamer.cc +++ b/src/core/algorithm/hnsw_rabitq/hnsw_rabitq_streamer.cc @@ -17,7 +17,6 @@ #include #include #include -#include #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 \ No newline at end of file +} // namespace zvec diff --git a/src/db/CMakeLists.txt b/src/db/CMakeLists.txt index 4a756a8..7808b29 100644 --- a/src/db/CMakeLists.txt +++ b/src/db/CMakeLists.txt @@ -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}" -) \ No newline at end of file +) diff --git a/tests/core/utility/CMakeLists.txt b/tests/core/utility/CMakeLists.txt index 9c7b10a..a73b7bc 100644 --- a/tests/core/utility/CMakeLists.txt +++ b/tests/core/utility/CMakeLists.txt @@ -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/ ) diff --git a/tests/db/CMakeLists.txt b/tests/db/CMakeLists.txt index 8659108..bfad2bc 100644 --- a/tests/db/CMakeLists.txt +++ b/tests/db/CMakeLists.txt @@ -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() diff --git a/tests/db/crash_recovery/CMakeLists.txt b/tests/db/crash_recovery/CMakeLists.txt index 76df6fc..98a8a3b 100644 --- a/tests/db/crash_recovery/CMakeLists.txt +++ b/tests/db/crash_recovery/CMakeLists.txt @@ -26,7 +26,7 @@ endif() # Common libraries set(CRASH_RECOVERY_COMMON_LIBS - zvec_db + zvec zvec_proto core_knn_flat core_knn_flat_sparse diff --git a/tests/db/index/CMakeLists.txt b/tests/db/index/CMakeLists.txt index 441f490..d269994 100644 --- a/tests/db/index/CMakeLists.txt +++ b/tests/db/index/CMakeLists.txt @@ -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 diff --git a/tests/db/sqlengine/CMakeLists.txt b/tests/db/sqlengine/CMakeLists.txt index 8b046ee..edfc865 100644 --- a/tests/db/sqlengine/CMakeLists.txt +++ b/tests/db/sqlengine/CMakeLists.txt @@ -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 diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index 01561e5..8c73e62 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -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) - diff --git a/thirdparty/arrow/CMakeLists.txt b/thirdparty/arrow/CMakeLists.txt index 973d4b3..a20fa88 100644 --- a/thirdparty/arrow/CMakeLists.txt +++ b/thirdparty/arrow/CMakeLists.txt @@ -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 "/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 "/cpp" BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC} INSTALL_COMMAND "${CMAKE_COMMAND}" --install "" --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} "/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} "/cpp" BUILD_COMMAND env "IPHONEOS_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}" "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC} INSTALL_COMMAND "${CMAKE_COMMAND}" --install "" --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 "/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 "/cpp" BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC} INSTALL_COMMAND "${CMAKE_COMMAND}" --install "" --prefix=${EXTERNAL_BINARY_DIR}/usr/local BYPRODUCTS ${LIB_PARQUET} ${LIB_ARROW} ${LIB_COMPUTE} ${LIB_ACERO} ${LIB_ARROW_DEPENDS} ${LIB_ARROW_DATASET}