add_third_party( lua GIT_REPOSITORY https://github.com/dragonflydb/lua GIT_TAG Dragonfly-5.4.6a CONFIGURE_COMMAND echo BUILD_IN_SOURCE 1 BUILD_COMMAND ${DFLY_TOOLS_MAKE} all INSTALL_COMMAND cp /liblua.a ${THIRD_PARTY_LIB_DIR}/lua/lib/ COMMAND cp /lualib.h /lua.h /lauxlib.h /luaconf.h ${THIRD_PARTY_LIB_DIR}/lua/include ) # Header-only, so we only fetch the headers. add_third_party( dragonbox URL https://github.com/jk-jeon/dragonbox/archive/beeeef91cf6fef89a4d4ba5e95d47ca64ccb3a44.tar.gz CONFIGURE_COMMAND echo skip BUILD_COMMAND echo skip INSTALL_COMMAND cp -r /include/dragonbox ${THIRD_PARTY_LIB_DIR}/dragonbox/include/ LIB "none" ) add_third_party( reflex URL https://github.com/Genivia/RE-flex/archive/refs/tags/v6.5.0.tar.gz PATCH_COMMAND autoreconf -fi CONFIGURE_COMMAND /configure --disable-avx2 --prefix=${THIRD_PARTY_LIB_DIR}/reflex CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ) set(REFLEX "${THIRD_PARTY_LIB_DIR}/reflex/bin/reflex") ExternalProject_Add_Step(reflex_project reflex_executable DEPENDEES install COMMAND ${CMAKE_COMMAND} -E true BYPRODUCTS ${REFLEX} ) ExternalProject_Add_StepTargets(reflex_project reflex_executable) add_third_party( jsoncons GIT_REPOSITORY https://github.com/dragonflydb/jsoncons GIT_TAG Dragonfly1.5.0 GIT_SHALLOW 1 CMAKE_PASS_FLAGS "-DJSONCONS_BUILD_TESTS=OFF -DJSONCONS_HAS_POLYMORPHIC_ALLOCATOR=ON" LIB "none" ) add_third_party( lz4 URL https://github.com/lz4/lz4/archive/refs/tags/v1.10.0.tar.gz BUILD_IN_SOURCE 1 CONFIGURE_COMMAND echo skip BUILD_COMMAND ${DFLY_TOOLS_MAKE} lib-release INSTALL_COMMAND ${DFLY_TOOLS_MAKE} install BUILD_SHARED=no PREFIX=${THIRD_PARTY_LIB_DIR}/lz4 ) # MiMalloc is built with a raw ExternalProject_Add rather than add_third_party: # its build needs custom patches, bespoke -DMI_* CMAKE_ARGS, non-standard output dirs, extra header copying, and a # hand-declared imported target - none of which fit add_third_party's conventional layout. It still downloads a URL # tarball, so it reuses the shared retry policy (see third_party.cmake) via DOWNLOAD_COMMAND (see below). set(MIMALLOC_ROOT_DIR ${THIRD_PARTY_LIB_DIR}/mimalloc2) set(MIMALLOC_INCLUDE_DIR ${MIMALLOC_ROOT_DIR}/include) set(MIMALLOC_PATCH_DIR ${CMAKE_CURRENT_LIST_DIR}/../patches/mimalloc-v2.5.2) set(MIMALLOC_C_FLAGS "-O3 -g -DMI_STAT=0 -DNDEBUG") set(MIMALLOC_URL https://github.com/microsoft/mimalloc/archive/refs/tags/v2.5.2.tar.gz) set(MIMALLOC_SHA256 5cf9d2a10fae5551b764e888a623da411c6c6beb0221b847f83492ab1932bdab) file(MAKE_DIRECTORY ${MIMALLOC_INCLUDE_DIR}) ExternalProject_Add(mimalloc2_project # Download via the shared retry policy (see note above). HELIO_CMAKE_DIR is # exported by helio/cmake/third_party.cmake. DOWNLOAD_COMMAND ${CMAKE_COMMAND} -DURL=${MIMALLOC_URL} -DDEST=${THIRD_PARTY_DIR}/mimalloc2-src-archive -DEXTRACT_DIR=${THIRD_PARTY_DIR}/mimalloc2 -DEXPECTED_HASH=${MIMALLOC_SHA256} -P ${HELIO_CMAKE_DIR}/download_retry.cmake # DOWNLOAD_DIR (the download step's working dir) must differ from the source # dir: download_retry.cmake removes EXTRACT_DIR (=the source dir) before # moving the extracted tree into place, so it must not be the step's own CWD. DOWNLOAD_DIR ${THIRD_PARTY_DIR} SOURCE_DIR ${THIRD_PARTY_DIR}/mimalloc2 # INSTALL_DIR ${MIMALLOC_ROOT_DIR} UPDATE_COMMAND "" PATCH_COMMAND patch -p1 -d ${THIRD_PARTY_DIR}/mimalloc2/ -i ${MIMALLOC_PATCH_DIR}/0_base.patch COMMAND patch -p1 -d ${THIRD_PARTY_DIR}/mimalloc2/ -i ${MIMALLOC_PATCH_DIR}/1_add_stat_type.patch COMMAND patch -p1 -d ${THIRD_PARTY_DIR}/mimalloc2/ -i ${MIMALLOC_PATCH_DIR}/2_return_stat.patch BUILD_COMMAND make mimalloc-static INSTALL_COMMAND make install # Copy internal types like mi_page_usage_stats_s and mi_heap_s COMMAND cp -r /include/mimalloc ${MIMALLOC_INCLUDE_DIR}/ LOG_INSTALL ON LOG_DOWNLOAD ON LOG_CONFIGURE ON LOG_BUILD ON LOG_PATCH ON LOG_UPDATE ON CMAKE_GENERATOR "Unix Makefiles" # Add -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS=-O0 to debug, and set BUILD_BYPRODUCTS to # libmimalloc-debug.a BUILD_BYPRODUCTS ${MIMALLOC_ROOT_DIR}/lib/libmimalloc.a CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${MIMALLOC_ROOT_DIR}/lib -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${MIMALLOC_ROOT_DIR}/lib -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} -DMI_INSTALL_TOPLEVEL=ON -DMI_OVERRIDE=OFF -DMI_NO_PADDING=ON -DMI_BUILD_TESTS=OFF -DMI_BUILD_SHARED=OFF -DMI_BUILD_OBJECT=OFF -DCMAKE_C_FLAGS=${MIMALLOC_C_FLAGS} -DCMAKE_INSTALL_PREFIX:PATH=${MIMALLOC_ROOT_DIR} ) add_library(TRDP::mimalloc2 STATIC IMPORTED) add_dependencies(TRDP::mimalloc2 mimalloc2_project) set_target_properties(TRDP::mimalloc2 PROPERTIES IMPORTED_LOCATION ${MIMALLOC_ROOT_DIR}/lib/libmimalloc.a INTERFACE_INCLUDE_DIRECTORIES ${MIMALLOC_ROOT_DIR}/include) add_third_party( croncpp URL https://github.com/mariusbancila/croncpp/archive/refs/tags/v2026.08.12.tar.gz LIB "none" ) if (WITH_SEARCH) add_third_party( uni-algo URL https://github.com/uni-algo/uni-algo/archive/refs/tags/v1.2.0.tar.gz CMAKE_PASS_FLAGS "-DCMAKE_CXX_STANDARD:STRING=20" ) add_third_party( hnswlib GIT_REPOSITORY https://github.com/dragonflydb/hnswlib.git # HEAD of dragonfly branch GIT_TAG d07dd1da2bf48b85d2f03b8396193ad7120f75c2 BUILD_COMMAND echo SKIP INSTALL_COMMAND cp -R /hnswlib ${THIRD_PARTY_LIB_DIR}/hnswlib/include/ LIB "none" ) # No autoconf/cmake/install in upstream Makefile; manual install copy. add_third_party( stemmer URL https://github.com/snowballstem/snowball/archive/refs/tags/v3.1.1.tar.gz BUILD_IN_SOURCE 1 CONFIGURE_COMMAND echo skip BUILD_COMMAND ${DFLY_TOOLS_MAKE} -j4 CFLAGS=-O3\ -fPIC libstemmer.a INSTALL_COMMAND bash -c "\ mkdir -p ${THIRD_PARTY_LIB_DIR}/stemmer/include ${THIRD_PARTY_LIB_DIR}/stemmer/lib && \ cp /include/libstemmer.h ${THIRD_PARTY_LIB_DIR}/stemmer/include/ && \ cp /libstemmer.a ${THIRD_PARTY_LIB_DIR}/stemmer/lib/" LIB libstemmer.a ) endif() add_third_party( fast_float URL https://github.com/fastfloat/fast_float/archive/refs/tags/v8.3.0.tar.gz LIB "none" ) add_third_party( flatbuffers URL https://github.com/google/flatbuffers/archive/refs/tags/v23.5.26.tar.gz CMAKE_PASS_FLAGS "-DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_LIBCXX_WITH_CLANG=OFF -DFLATBUFFERS_BUILD_FLATC=OFF" ) add_third_party( hdr_histogram GIT_REPOSITORY https://github.com/HdrHistogram/HdrHistogram_c/ GIT_TAG 0.12.0 CMAKE_PASS_FLAGS "-DHDR_LOG_REQUIRED=OFF -DHDR_HISTOGRAM_BUILD_PROGRAMS=OFF -DHDR_HISTOGRAM_INSTALL_SHARED=OFF" LIB libhdr_histogram_static.a ) if(WITH_SIMSIMD) # Compute integer macros for native half-precision support. set(SIMSIMD_NATIVE_F16_VAL 0) set(SIMSIMD_NATIVE_BF16_VAL 0) if(SIMSIMD_NATIVE_F16) set(SIMSIMD_NATIVE_F16_VAL 1) set(SIMSIMD_NATIVE_BF16_VAL 1) endif() # Build statically via add_third_party using the C shim with dynamic dispatch. add_third_party( simsimd URL https://github.com/ashvardanian/SimSIMD/archive/refs/tags/v6.5.16.tar.gz BUILD_IN_SOURCE 1 CONFIGURE_COMMAND echo skip BUILD_COMMAND bash -c "\ mkdir -p ${THIRD_PARTY_LIB_DIR}/simsimd/lib && \ ${CMAKE_C_COMPILER} -O3 -fPIC -DNDEBUG \ -DSIMSIMD_DYNAMIC_DISPATCH=1 \ -DSIMSIMD_NATIVE_F16=${SIMSIMD_NATIVE_F16_VAL} \ -DSIMSIMD_NATIVE_BF16=${SIMSIMD_NATIVE_BF16_VAL} \ -I/include -c /c/lib.c -o /lib.o && \ ar rcs /libsimsimd.a /lib.o" INSTALL_COMMAND bash -c "\ mkdir -p ${THIRD_PARTY_LIB_DIR}/simsimd/include ${THIRD_PARTY_LIB_DIR}/simsimd/lib && \ cp -R /include/* ${THIRD_PARTY_LIB_DIR}/simsimd/include/ && \ cp /libsimsimd.a ${THIRD_PARTY_LIB_DIR}/simsimd/lib/" LIB libsimsimd.a ) endif() add_library(TRDP::jsoncons INTERFACE IMPORTED) add_dependencies(TRDP::jsoncons jsoncons_project) set_target_properties(TRDP::jsoncons PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${JSONCONS_INCLUDE_DIR}") add_library(TRDP::dragonbox INTERFACE IMPORTED) add_dependencies(TRDP::dragonbox dragonbox_project) set_target_properties(TRDP::dragonbox PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${DRAGONBOX_INCLUDE_DIR}") add_library(TRDP::croncpp INTERFACE IMPORTED) add_dependencies(TRDP::croncpp croncpp_project) set_target_properties(TRDP::croncpp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CRONCPP_INCLUDE_DIR}") if (WITH_SEARCH) add_library(TRDP::hnswlib INTERFACE IMPORTED) add_dependencies(TRDP::hnswlib hnswlib_project) set_target_properties(TRDP::hnswlib PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${HNSWLIB_INCLUDE_DIR}") endif() add_library(TRDP::fast_float INTERFACE IMPORTED) add_dependencies(TRDP::fast_float fast_float_project) set_target_properties(TRDP::fast_float PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FAST_FLOAT_INCLUDE_DIR}")