minor: fix c example cmake and build c++ dynamic lib (#347)
This commit is contained in:
parent
1e25294c07
commit
bbe4ca7bae
|
|
@ -411,11 +411,22 @@ jobs:
|
|||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
||||
cmake --build "$EXAMPLES_BUILD" --parallel
|
||||
|
||||
# Reuse the shared-library directory from Step 4; push again in
|
||||
# case Step 4 was skipped or the directory was cleaned.
|
||||
DEVICE_LIB_DIR="/data/local/tmp/zvec_tests/lib"
|
||||
adb shell "mkdir -p $DEVICE_LIB_DIR" 2>/dev/null || true
|
||||
SO_COUNT=0
|
||||
while IFS= read -r so_file; do
|
||||
adb push "$so_file" "$DEVICE_LIB_DIR/$(basename "$so_file")" > /dev/null 2>&1
|
||||
SO_COUNT=$((SO_COUNT + 1))
|
||||
done < <(find "$BUILD_DIR/lib" -name "*.so" -type f 2>/dev/null)
|
||||
echo "Pushed $SO_COUNT shared libraries to $DEVICE_LIB_DIR"
|
||||
|
||||
for example in ailego-example core-example db-example; do
|
||||
if [ -f "$EXAMPLES_BUILD/$example" ]; then
|
||||
echo "=== Running $example ==="
|
||||
adb push "$EXAMPLES_BUILD/$example" "/data/local/tmp/$example" > /dev/null 2>&1
|
||||
adb shell "chmod 755 /data/local/tmp/$example && cd /data/local/tmp && ./$example"
|
||||
adb shell "chmod 755 /data/local/tmp/$example && cd /data/local/tmp && LD_LIBRARY_PATH=$DEVICE_LIB_DIR ./$example"
|
||||
adb shell "rm -f /data/local/tmp/$example"
|
||||
fi
|
||||
done
|
||||
|
|
|
|||
|
|
@ -97,6 +97,30 @@ jobs:
|
|||
cd build
|
||||
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build . --config Release --parallel $env:NPROC
|
||||
|
||||
# Copy zvec.dll next to the example executables so Windows can find it.
|
||||
# CMake places DLLs in bin/ (RUNTIME output) and import libs in lib/.
|
||||
$buildDir = "$env:GITHUB_WORKSPACE\build"
|
||||
$found = $false
|
||||
foreach ($sub in @("$buildDir\bin", "$buildDir\bin\Release", "$buildDir\lib", "$buildDir\lib\Release")) {
|
||||
if (Test-Path "$sub\zvec.dll") {
|
||||
Copy-Item "$sub\zvec.dll" -Destination . -Force
|
||||
Write-Host "Copied zvec.dll from $sub"
|
||||
$found = $true
|
||||
break
|
||||
}
|
||||
}
|
||||
if (-not $found) {
|
||||
Write-Host "WARNING: zvec.dll not found, searching recursively..."
|
||||
$dll = Get-ChildItem -Path $buildDir -Filter "zvec.dll" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
|
||||
if ($dll) {
|
||||
Copy-Item $dll.FullName -Destination . -Force
|
||||
Write-Host "Copied zvec.dll from $($dll.DirectoryName)"
|
||||
} else {
|
||||
Write-Error "zvec.dll not found anywhere under $buildDir"
|
||||
}
|
||||
}
|
||||
|
||||
.\db-example.exe
|
||||
.\core-example.exe
|
||||
.\ailego-example.exe
|
||||
|
|
|
|||
|
|
@ -1,12 +1,13 @@
|
|||
cmake_minimum_required(VERSION 3.26)
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
cmake_policy(SET CMP0077 NEW)
|
||||
project(zvec-example-c++)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Enable compile_commands.json
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
# --- Paths to Zvec and dependencies ---
|
||||
# --- Paths to Zvec ---
|
||||
# Allow custom host build directory, default to "build"
|
||||
if(NOT DEFINED HOST_BUILD_DIR)
|
||||
set(HOST_BUILD_DIR "build")
|
||||
|
|
@ -14,215 +15,46 @@ endif()
|
|||
|
||||
set(ZVEC_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../src/include)
|
||||
set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib)
|
||||
set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib)
|
||||
|
||||
# Add include and library search paths
|
||||
include_directories(${ZVEC_INCLUDE_DIR})
|
||||
link_directories(${ZVEC_LIB_DIR} ${ZVEC_DEPENDENCY_LIB_DIR})
|
||||
link_directories(${ZVEC_LIB_DIR})
|
||||
|
||||
# Support multi-config builds (libs in Release/ or Debug/ subdirectories)
|
||||
if (CMAKE_BUILD_TYPE)
|
||||
link_directories(
|
||||
${ZVEC_LIB_DIR}/${CMAKE_BUILD_TYPE}
|
||||
${ZVEC_DEPENDENCY_LIB_DIR}/${CMAKE_BUILD_TYPE}
|
||||
)
|
||||
endif ()
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
|
||||
# --- Determine debug/release library names ---
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(GLOG_LIB glogd)
|
||||
if (WIN32)
|
||||
set(GFLAGS_LIB gflags_nothreads_static_debug)
|
||||
else ()
|
||||
set(GFLAGS_LIB gflags_nothreads_debug)
|
||||
endif ()
|
||||
set(PROTOBUF_LIB protobufd)
|
||||
else()
|
||||
set(GLOG_LIB glog)
|
||||
if (WIN32)
|
||||
set(GFLAGS_LIB gflags_nothreads_static)
|
||||
else ()
|
||||
set(GFLAGS_LIB gflags_nothreads)
|
||||
endif ()
|
||||
set(PROTOBUF_LIB protobuf)
|
||||
# Support multi-config builds (MSVC puts libs in Debug/Release subdirectories)
|
||||
if(CMAKE_BUILD_TYPE)
|
||||
link_directories(${ZVEC_LIB_DIR}/${CMAKE_BUILD_TYPE})
|
||||
endif()
|
||||
if(WIN32)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
endif()
|
||||
|
||||
# --- Dependency groups ---
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
|
||||
set(zvec_core_deps
|
||||
zvec_turbo
|
||||
# --- 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
|
||||
# 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)
|
||||
set(zvec_ailego_deps
|
||||
arrow
|
||||
parquet
|
||||
arrow_bundled_dependencies
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
|
||||
set(zvec_db_deps
|
||||
roaring
|
||||
rocksdb
|
||||
arrow
|
||||
arrow_acero
|
||||
arrow_bundled_dependencies
|
||||
arrow_compute
|
||||
arrow_dataset
|
||||
parquet
|
||||
antlr4-runtime
|
||||
${GLOG_LIB}
|
||||
${GFLAGS_LIB}
|
||||
${PROTOBUF_LIB}
|
||||
lz4
|
||||
)
|
||||
else ()
|
||||
# Windows static libraries use different naming conventions
|
||||
set(PROTOBUF_LIB libprotobuf)
|
||||
set(zvec_ailego_deps
|
||||
arrow_static
|
||||
parquet_static
|
||||
arrow_bundled_dependencies
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
set(zvec_db_deps
|
||||
roaring
|
||||
rocksdb
|
||||
arrow_static
|
||||
arrow_acero_static
|
||||
arrow_bundled_dependencies
|
||||
arrow_compute_static
|
||||
arrow_dataset_static
|
||||
parquet_static
|
||||
antlr4-runtime-static
|
||||
${GLOG_LIB}
|
||||
${GFLAGS_LIB}
|
||||
${PROTOBUF_LIB}
|
||||
lz4
|
||||
rpcrt4
|
||||
shlwapi
|
||||
)
|
||||
endif ()
|
||||
|
||||
# --- Create INTERFACE targets for Zvec components ---
|
||||
|
||||
# zvec_ailego: links libzvec_ailego.a + its deps
|
||||
add_library(zvec-ailego INTERFACE)
|
||||
if (WIN32)
|
||||
target_link_libraries(zvec-ailego INTERFACE
|
||||
zvec_ailego
|
||||
${zvec_ailego_deps}
|
||||
)
|
||||
else ()
|
||||
target_link_libraries(zvec-ailego INTERFACE
|
||||
-lzvec_ailego
|
||||
${zvec_ailego_deps}
|
||||
)
|
||||
endif ()
|
||||
|
||||
# zvec_core: links libzvec_core.a via special flags (handled externally), but declare logical deps
|
||||
add_library(zvec-core INTERFACE)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
target_link_libraries(zvec-core INTERFACE
|
||||
-Wl,--whole-archive
|
||||
zvec_core
|
||||
-Wl,--no-whole-archive
|
||||
-Wl,--start-group
|
||||
zvec-ailego
|
||||
${zvec_core_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
elseif(APPLE)
|
||||
target_link_libraries(zvec-core INTERFACE
|
||||
-Wl,-force_load ${ZVEC_LIB_DIR}/libzvec_core.a
|
||||
zvec-ailego
|
||||
${zvec_core_deps}
|
||||
)
|
||||
elseif(ANDROID)
|
||||
target_link_libraries(zvec-core INTERFACE
|
||||
-Wl,--whole-archive
|
||||
zvec_core
|
||||
-Wl,--no-whole-archive
|
||||
-Wl,--start-group
|
||||
zvec-ailego
|
||||
${zvec_core_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
elseif (WIN32)
|
||||
target_link_libraries(zvec-core INTERFACE
|
||||
zvec_core
|
||||
zvec-ailego
|
||||
${zvec_core_deps}
|
||||
)
|
||||
target_link_options(zvec-core INTERFACE "/WHOLEARCHIVE:zvec_core")
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
|
||||
if(NOT WIN32)
|
||||
target_link_libraries(zvec-lib INTERFACE ${CMAKE_DL_LIBS})
|
||||
endif()
|
||||
|
||||
# zvec_db: links libzvec_db.a + all deps
|
||||
add_library(zvec-db INTERFACE)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
target_link_libraries(zvec-db INTERFACE
|
||||
zvec_db
|
||||
zvec-core
|
||||
zvec-ailego
|
||||
-Wl,--start-group
|
||||
${zvec_db_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
elseif(APPLE)
|
||||
target_link_libraries(zvec-db INTERFACE
|
||||
zvec_db
|
||||
zvec-core
|
||||
zvec-ailego
|
||||
${zvec_db_deps}
|
||||
)
|
||||
elseif(ANDROID)
|
||||
target_link_libraries(zvec-db INTERFACE
|
||||
zvec_db
|
||||
zvec-core
|
||||
zvec-ailego
|
||||
-Wl,--start-group
|
||||
${zvec_db_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
elseif (WIN32)
|
||||
target_link_libraries(zvec-db INTERFACE
|
||||
zvec_db
|
||||
zvec-core
|
||||
zvec-ailego
|
||||
${zvec_db_deps}
|
||||
)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
|
||||
endif()
|
||||
|
||||
|
||||
# --- Main executable ---
|
||||
# --- Executables ---
|
||||
add_executable(db-example db/main.cc)
|
||||
target_link_libraries(db-example PRIVATE
|
||||
zvec-db
|
||||
)
|
||||
target_link_libraries(db-example PRIVATE zvec-lib)
|
||||
if(ANDROID)
|
||||
target_link_libraries(db-example PRIVATE
|
||||
log
|
||||
)
|
||||
target_link_libraries(db-example PRIVATE log)
|
||||
endif()
|
||||
|
||||
add_executable(core-example core/main.cc)
|
||||
target_link_libraries(core-example PRIVATE
|
||||
zvec-core
|
||||
)
|
||||
target_link_libraries(core-example PRIVATE zvec-lib)
|
||||
|
||||
add_executable(ailego-example ailego/main.cc)
|
||||
target_link_libraries(ailego-example PRIVATE
|
||||
zvec-ailego
|
||||
)
|
||||
target_link_libraries(ailego-example PRIVATE zvec-lib)
|
||||
|
||||
# Strip symbols to reduce executable size
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID)
|
||||
|
|
|
|||
|
|
@ -29,115 +29,32 @@ endif()
|
|||
|
||||
set(ZVEC_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../src/include)
|
||||
set(ZVEC_GENERATED_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/src/generated)
|
||||
|
||||
# On Windows, libraries are in Debug/Release subdirectories
|
||||
if(WIN32)
|
||||
set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib/$<CONFIG>)
|
||||
set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib/$<CONFIG>)
|
||||
else()
|
||||
set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib)
|
||||
set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib)
|
||||
endif()
|
||||
set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib)
|
||||
|
||||
# Add include and library search paths
|
||||
include_directories(${ZVEC_INCLUDE_DIR} ${ZVEC_GENERATED_INCLUDE_DIR})
|
||||
link_directories(${ZVEC_LIB_DIR} ${ZVEC_DEPENDENCY_LIB_DIR})
|
||||
link_directories(${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})
|
||||
endif()
|
||||
|
||||
# Find required packages
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
# --- Determine debug/release library names ---
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(GLOG_LIB glogd)
|
||||
set(GFLAGS_LIB gflags_nothreads_debug)
|
||||
set(PROTOBUF_LIB protobufd)
|
||||
else()
|
||||
set(GLOG_LIB glog)
|
||||
set(GFLAGS_LIB gflags_nothreads)
|
||||
set(PROTOBUF_LIB protobuf)
|
||||
endif()
|
||||
|
||||
# --- Dependency groups ---
|
||||
if(NOT WIN32)
|
||||
set(zvec_c_api_deps
|
||||
roaring
|
||||
rocksdb
|
||||
arrow
|
||||
arrow_acero
|
||||
arrow_bundled_dependencies
|
||||
arrow_compute
|
||||
arrow_dataset
|
||||
parquet
|
||||
antlr4-runtime
|
||||
${GLOG_LIB}
|
||||
${GFLAGS_LIB}
|
||||
${PROTOBUF_LIB}
|
||||
lz4
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
else()
|
||||
# Windows static libraries use different naming conventions
|
||||
set(PROTOBUF_LIB libprotobuf)
|
||||
set(zvec_c_api_deps
|
||||
roaring
|
||||
rocksdb
|
||||
arrow_static
|
||||
arrow_acero_static
|
||||
arrow_bundled_dependencies
|
||||
arrow_compute_static
|
||||
arrow_dataset_static
|
||||
parquet_static
|
||||
antlr4-runtime-static
|
||||
${GLOG_LIB}
|
||||
${GFLAGS_LIB}
|
||||
${PROTOBUF_LIB}
|
||||
lz4
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
rpcrt4
|
||||
shlwapi
|
||||
)
|
||||
endif()
|
||||
|
||||
# Create INTERFACE target for zvec_c_api with platform-specific linking
|
||||
# Create INTERFACE target for zvec_c_api (fat shared library)
|
||||
# No whole-archive flags needed — all symbols are already resolved in the .so/.dylib
|
||||
add_library(zvec-c-api INTERFACE)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
target_link_libraries(zvec-c-api INTERFACE
|
||||
-Wl,--whole-archive
|
||||
-lzvec_c_api
|
||||
-Wl,--no-whole-archive
|
||||
-Wl,--start-group
|
||||
${zvec_c_api_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
elseif(APPLE)
|
||||
# On macOS, use -Wl,-force_load with full path to ensure all symbols are loaded
|
||||
target_link_libraries(zvec-c-api INTERFACE
|
||||
-Wl,-force_load
|
||||
${ZVEC_LIB_DIR}/libzvec_c_api.dylib
|
||||
${zvec_c_api_deps}
|
||||
)
|
||||
# Set rpath so the executable can find the dylib at runtime
|
||||
target_link_options(zvec-c-api INTERFACE
|
||||
-Wl,-rpath,${ZVEC_LIB_DIR}
|
||||
)
|
||||
elseif(ANDROID)
|
||||
target_link_libraries(zvec-c-api INTERFACE
|
||||
-Wl,--whole-archive
|
||||
-lzvec_c_api
|
||||
-Wl,--no-whole-archive
|
||||
-Wl,--start-group
|
||||
${zvec_c_api_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
elseif(WIN32)
|
||||
target_link_libraries(zvec-c-api INTERFACE
|
||||
zvec_c_api
|
||||
${zvec_c_api_deps}
|
||||
)
|
||||
target_link_options(zvec-c-api INTERFACE "/WHOLEARCHIVE:zvec_c_api")
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
|
||||
target_link_libraries(zvec-c-api INTERFACE
|
||||
zvec_c_api
|
||||
Threads::Threads
|
||||
)
|
||||
if(NOT WIN32)
|
||||
target_link_libraries(zvec-c-api INTERFACE ${CMAKE_DL_LIBS})
|
||||
endif()
|
||||
if(APPLE)
|
||||
target_link_options(zvec-c-api INTERFACE -Wl,-rpath,${ZVEC_LIB_DIR})
|
||||
endif()
|
||||
|
||||
# Basic example
|
||||
|
|
|
|||
|
|
@ -10,3 +10,150 @@ cc_directory(turbo)
|
|||
cc_directory(core)
|
||||
cc_directory(db)
|
||||
cc_directory(binding)
|
||||
|
||||
# =============================================================================
|
||||
# Build ALL-IN-ONE C++ Shared Library (libzvec.so / libzvec.dylib)
|
||||
# =============================================================================
|
||||
# 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
|
||||
# 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"
|
||||
)
|
||||
|
||||
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)
|
||||
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()
|
||||
|
||||
# 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
|
||||
)
|
||||
|
||||
# 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"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Installation
|
||||
install(TARGETS zvec_shared
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -111,7 +111,6 @@ if(MSVC)
|
|||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_core>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_ailego>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_turbo>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:roaring>
|
||||
)
|
||||
|
||||
target_link_libraries(zvec_c_api
|
||||
|
|
@ -120,34 +119,15 @@ if(MSVC)
|
|||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
roaring
|
||||
${ZVEC_CXX_STD_LIB}
|
||||
Threads::Threads
|
||||
)
|
||||
elseif(APPLE)
|
||||
# Third-party libraries that are dependencies of zvec_db and zvec_ailego
|
||||
# These must be linked before the internal libraries that depend on them
|
||||
target_link_libraries(zvec_c_api
|
||||
PRIVATE
|
||||
Arrow::arrow_static
|
||||
Arrow::parquet_static
|
||||
Arrow::arrow_compute
|
||||
Arrow::arrow_dataset
|
||||
Arrow::arrow_acero
|
||||
rocksdb
|
||||
glog
|
||||
libprotobuf
|
||||
antlr4
|
||||
)
|
||||
|
||||
# Link zvec internal libraries with -force_load to extract all objects
|
||||
# Use target names directly with -Wl,-force_load flag
|
||||
target_link_options(zvec_c_api PRIVATE
|
||||
-Wl,-force_load,$<TARGET_FILE:zvec_db>
|
||||
-Wl,-force_load,$<TARGET_FILE:zvec_core>
|
||||
-Wl,-force_load,$<TARGET_FILE:zvec_ailego>
|
||||
-Wl,-force_load,$<TARGET_FILE:zvec_turbo>
|
||||
-Wl,-force_load,$<TARGET_FILE:roaring>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_db>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_core>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_ailego>
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_turbo>
|
||||
)
|
||||
|
||||
# Link the libraries themselves (without force_load flags)
|
||||
|
|
@ -157,7 +137,6 @@ elseif(APPLE)
|
|||
zvec_core
|
||||
zvec_ailego
|
||||
zvec_turbo
|
||||
roaring
|
||||
Threads::Threads
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
|
|
@ -176,11 +155,6 @@ else()
|
|||
zvec_ailego
|
||||
zvec_turbo # Required by zvec_core (metric module)
|
||||
${ZVEC_NO_WHOLE_ARCHIVE_SUFFIX}
|
||||
# Most third-party libs are linked via zvec_db
|
||||
# Only roaring needs explicit whole-archive (C library)
|
||||
${ZVEC_WHOLE_ARCHIVE_PREFIX}
|
||||
roaring
|
||||
${ZVEC_NO_WHOLE_ARCHIVE_SUFFIX}
|
||||
Threads::Threads
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
|
|
@ -188,7 +162,6 @@ else()
|
|||
# Link C++ standard library appropriately for the platform
|
||||
# On Linux, we need to explicitly link libstdc++
|
||||
# Try static linking first, fall back to dynamic
|
||||
|
||||
set(STATIC_LIBS_FOUND FALSE)
|
||||
|
||||
# Try to find static libraries using compiler's built-in search
|
||||
|
|
|
|||
Loading…
Reference in New Issue