Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
230 changes: 185 additions & 45 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,41 +1,101 @@
cmake_minimum_required(VERSION 3.15)
cmake_minimum_required(VERSION 3.26)
cmake_policy(SET CMP0077 NEW)
project(zvec_node_binding)


set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)


if(APPLE)
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Minimum macOS version")
endif()

if(MSVC)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" CACHE STRING "" FORCE)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Parallelism for the external zvec build
set(ZVEC_BUILD_JOBS "" CACHE STRING "Parallel build jobs for external zvec project")
include(ProcessorCount)
if(NOT ZVEC_BUILD_JOBS)
ProcessorCount(ZVEC_BUILD_JOBS)
if(NOT ZVEC_BUILD_JOBS OR ZVEC_BUILD_JOBS EQUAL 0)
set(ZVEC_BUILD_JOBS 6)
endif()
endif()


# Path variables
set(ZVEC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/zvec)
set(ZVEC_BINARY_DIR ${CMAKE_BINARY_DIR}/zvec-build)
set(ZVEC_LIB_DIR ${ZVEC_BINARY_DIR}/lib)
set(ZVEC_DEPENDENCY_LIB_DIR ${ZVEC_BINARY_DIR}/external/usr/local/lib)

get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(is_multi_config)
set(ZVEC_LIB_DIR ${ZVEC_BINARY_DIR}/lib/Release)
set(ZVEC_DEPENDENCY_LIB_DIR_MULTI_CONFIG ${ZVEC_DEPENDENCY_LIB_DIR}/Release)
else()
set(ZVEC_LIB_DIR ${ZVEC_BINARY_DIR}/lib)
endif()


# External build byproducts
if(WIN32)
set(ZVEC_BYPRODUCTS
${ZVEC_LIB_DIR}/zvec_ailego.lib
${ZVEC_LIB_DIR}/zvec_core.lib
${ZVEC_LIB_DIR}/zvec_turbo.lib
${ZVEC_LIB_DIR}/zvec_db.lib
)
else()
set(ZVEC_BYPRODUCTS
${ZVEC_LIB_DIR}/libzvec_ailego.a
${ZVEC_LIB_DIR}/libzvec_core.a
${ZVEC_LIB_DIR}/libzvec_turbo.a
${ZVEC_LIB_DIR}/libzvec_db.a
)
endif()


# External build of zvec
include(ExternalProject)
set(ZVEC_BUILD_TARGETS
--target zvec_ailego
--target zvec_core
--target zvec_turbo
--target zvec_db
)
set(ZVEC_CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release)
if(MSVC)
list(APPEND ZVEC_CMAKE_ARGS
"-DBUILD_SHARED_LIBS=OFF"
"-DCMAKE_C_FLAGS=/MP"
"-DCMAKE_CXX_FLAGS=/MP"
"-DBUILD_TOOLS=OFF"
"-DCMAKE_POLICY_DEFAULT_CMP0091=NEW"
"-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded"
)
endif()
ExternalProject_Add(zvec
SOURCE_DIR ${ZVEC_SOURCE_DIR}
BINARY_DIR ${ZVEC_BINARY_DIR}
INSTALL_COMMAND "" # Skip installation
CMAKE_ARGS
-DCMAKE_BUILD_TYPE=Release
BUILD_ALWAYS OFF
CMAKE_ARGS ${ZVEC_CMAKE_ARGS}
BUILD_ALWAYS ON
TEST_COMMAND ""
BUILD_BYPRODUCTS
${ZVEC_LIB_DIR}/libzvec_ailego.a
${ZVEC_LIB_DIR}/libzvec_core.a
${ZVEC_LIB_DIR}/libzvec_db.a
${ZVEC_BYPRODUCTS}
BUILD_COMMAND
${CMAKE_COMMAND} --build <BINARY_DIR> --config Release --parallel ${ZVEC_BUILD_JOBS} ${ZVEC_BUILD_TARGETS}
)


# Add include and library search paths
include_directories(${ZVEC_SOURCE_DIR}/src/include/)
link_directories(${ZVEC_LIB_DIR} ${ZVEC_DEPENDENCY_LIB_DIR})
link_directories(${ZVEC_LIB_DIR} ${ZVEC_DEPENDENCY_LIB_DIR} ${ZVEC_DEPENDENCY_LIB_DIR_MULTI_CONFIG})


# --- Determine debug/release library names ---
Expand All @@ -45,49 +105,88 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(PROTOBUF_LIB protobufd)
else()
set(GLOG_LIB glog)
set(GFLAGS_LIB gflags_nothreads)
if(WIN32)
set(GFLAGS_LIB gflags_nothreads_static)
else()
set(GFLAGS_LIB gflags_nothreads)
endif()
set(PROTOBUF_LIB protobuf)
endif()

# --- Dependency groups ---
find_package(Threads REQUIRED)

set(zvec_ailego_deps
arrow
parquet
arrow_bundled_dependencies
${CMAKE_THREAD_LIBS_INIT}
${CMAKE_DL_LIBS}
)

set(zvec_core_deps
# empty
zvec_turbo
)

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
)
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 ()
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)
target_link_libraries(zvec-ailego INTERFACE
-lzvec_ailego
${zvec_ailego_deps}
)
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)
Expand All @@ -107,11 +206,28 @@ elseif(APPLE)
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}")
endif()

# zvec_db: links libzvec_db.a + all deps
# 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
Expand All @@ -129,6 +245,24 @@ elseif(APPLE)
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()


Expand All @@ -153,8 +287,13 @@ target_include_directories(${PROJECT_NAME}

target_link_libraries(${PROJECT_NAME}
PRIVATE
${CMAKE_JS_LIB}
zvec-db
${CMAKE_JS_LIB}
zvec-db
)

target_compile_definitions(${PROJECT_NAME}
PRIVATE
NAPI_CPP_EXCEPTIONS
)

set_target_properties(${PROJECT_NAME} PROPERTIES
Expand All @@ -163,13 +302,14 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
OUTPUT_NAME "zvec_node_binding"
)

# Strip symbols to reduce executable size
if(CMAKE_BUILD_TYPE STREQUAL "Release")
if(APPLE)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_STRIP} -x "$<TARGET_FILE:${PROJECT_NAME}>"
COMMENT "Stripping symbols (macOS)"
)
else()
elseif(UNIX)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:${PROJECT_NAME}>"
COMMENT "Stripping symbols (Linux)"
Expand Down
6 changes: 5 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 5 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
"install": "node scripts/install.js",
"bump": "node scripts/bump-version.js",
"build": "node scripts/build.js",
"build:debug": "BUILD_TYPE=Debug node scripts/build.js",
"build:release": "BUILD_TYPE=Release node scripts/build.js",
"build:debug": "node scripts/build.js --debug",
"build:release": "node scripts/build.js --release",
"dev": "node scripts/dev.js",
"pack-local": "node scripts/pack-local.js",
"publish:bindings": "node scripts/publish-bindings.js",
Expand All @@ -46,7 +46,8 @@
"optionalDependencies": {
"@zvec/bindings-darwin-arm64": "0.2.3",
"@zvec/bindings-linux-arm64": "0.2.3",
"@zvec/bindings-linux-x64": "0.2.3"
"@zvec/bindings-linux-x64": "0.2.3",
"@zvec/bindings-win32-x64": "0.2.3"
},
"devDependencies": {
"@types/jest": "^30.0.0",
Expand All @@ -62,4 +63,4 @@
"dependencies": {
"bindings": "^1.5.0"
}
}
}
Loading
Loading