@@ -38,6 +38,128 @@ set(LOADABLE_EXTENSION_NAME ${TARGET_NAME}_loadable_extension)
3838
3939project (${TARGET_NAME} )
4040
41+ # Native Iroh is compiled into the DuckDB extension as a Rust static library.
42+ # Emscripten keeps using the application-owned browser adapter. Release builds
43+ # build from pinned source; local developers may point at a sibling checkout or
44+ # disable the native transport for C++-only iteration.
45+ if (EMSCRIPTEN)
46+ set (VGI_ENABLE_IROH OFF CACHE BOOL "Embed native Iroh transport" FORCE )
47+ else ()
48+ option (VGI_ENABLE_IROH "Embed native Iroh transport" ON )
49+ endif ()
50+
51+ if (VGI_ENABLE_IROH)
52+ set (VGI_IROH_SOURCE_DIR "" CACHE PATH
53+ "Optional path to a local vgi-rpc-rust source tree" )
54+ if (NOT VGI_IROH_SOURCE_DIR )
55+ include (FetchContent )
56+ FetchContent_Declare (vgi_iroh_source
57+ GIT_REPOSITORY https://github.com/Query-farm/vgi-rpc-rust.git
58+ GIT_TAG c105d7b047e912355a79420ced81cf296ec52c73
59+ GIT_SHALLOW FALSE )
60+ FetchContent_GetProperties (vgi_iroh_source)
61+ if (NOT vgi_iroh_source_POPULATED)
62+ FetchContent_Populate (vgi_iroh_source)
63+ endif ()
64+ set (VGI_IROH_SOURCE_DIR "${vgi_iroh_source_SOURCE_DIR } " )
65+ endif ()
66+ if (NOT EXISTS "${VGI_IROH_SOURCE_DIR } /vgi-iroh-cabi/Cargo.toml" )
67+ message (FATAL_ERROR
68+ "VGI_ENABLE_IROH requires vgi-iroh-cabi source. Set VGI_IROH_SOURCE_DIR "
69+ "to a pinned vgi-rpc-rust checkout or configure -DVGI_ENABLE_IROH=OFF." )
70+ endif ()
71+
72+ set (VGI_IROH_CARGO_ENV)
73+ if (APPLE )
74+ # rustc otherwise defaults native objects to the host OS version, which can
75+ # make a distributable extension unloadable on older supported macOS hosts.
76+ # Apple Silicon starts at macOS 11; use an explicitly configured higher
77+ # deployment target when the enclosing DuckDB build supplies one.
78+ set (VGI_IROH_MACOS_DEPLOYMENT_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET} " )
79+ if (NOT VGI_IROH_MACOS_DEPLOYMENT_TARGET)
80+ set (VGI_IROH_MACOS_DEPLOYMENT_TARGET "11.0" )
81+ endif ()
82+ list (APPEND VGI_IROH_CARGO_ENV
83+ "MACOSX_DEPLOYMENT_TARGET=${VGI_IROH_MACOS_DEPLOYMENT_TARGET} " )
84+ endif ()
85+ find_program (VGI_CARGO_EXECUTABLE cargo REQUIRED )
86+
87+ if (CMAKE_CROSSCOMPILING )
88+ message (FATAL_ERROR
89+ "Native VGI Iroh currently requires a native Rust build host; CMake cross-compilation "
90+ "is not yet supported. Configure with -DVGI_ENABLE_IROH=OFF for unsupported builders." )
91+ elseif (APPLE )
92+ if (CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" )
93+ set (VGI_IROH_RUST_TARGET x86_64-apple -darwin)
94+ elseif (CMAKE_OSX_ARCHITECTURES MATCHES "arm64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64" )
95+ set (VGI_IROH_RUST_TARGET aarch64-apple -darwin)
96+ else ()
97+ message (FATAL_ERROR "Native VGI Iroh supports only x86_64 and arm64 macOS" )
98+ endif ()
99+ elseif (WIN32 )
100+ if (CMAKE_SYSTEM_PROCESSOR MATCHES "ARM|arm|aarch64" )
101+ message (FATAL_ERROR "Native VGI Iroh does not yet support Windows ARM" )
102+ endif ()
103+ if (MINGW)
104+ set (VGI_IROH_RUST_TARGET x86_64-pc-windows-gnu)
105+ else ()
106+ set (VGI_IROH_RUST_TARGET x86_64-pc-windows-msvc )
107+ # The enclosing DuckDB/Haybarn build uses /MT. Keep Rust on the same
108+ # static CRT so one extension never crosses allocator/CRT boundaries.
109+ # Preserve any target-specific caller flags rather than replacing them.
110+ set (VGI_IROH_MSVC_RUSTFLAGS "$ENV{CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS} " )
111+ string (STRIP "${VGI_IROH_MSVC_RUSTFLAGS} -Ctarget-feature=+crt-static"
112+ VGI_IROH_MSVC_RUSTFLAGS)
113+ list (APPEND VGI_IROH_CARGO_ENV
114+ "CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS=${VGI_IROH_MSVC_RUSTFLAGS} " )
115+ endif ()
116+ elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" )
117+ if (CMAKE_CXX_COMPILER_TARGET MATCHES "musl" )
118+ message (FATAL_ERROR "Native VGI Iroh does not yet support musl targets" )
119+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64" )
120+ set (VGI_IROH_RUST_TARGET aarch64-unknown-linux -gnu)
121+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|amd64" )
122+ set (VGI_IROH_RUST_TARGET x86_64-unknown-linux -gnu)
123+ else ()
124+ message (FATAL_ERROR "Native VGI Iroh supports only x86_64 and arm64 glibc Linux" )
125+ endif ()
126+ else ()
127+ message (FATAL_ERROR "Native VGI Iroh is currently supported on macOS, Windows x86_64, and glibc Linux" )
128+ endif ()
129+
130+ set (VGI_IROH_CARGO_TARGET_DIR "${CMAKE_CURRENT_BINARY_DIR } /vgi-iroh-cargo" )
131+ if (WIN32 AND NOT MINGW)
132+ set (VGI_IROH_STATIC_LIB
133+ "${VGI_IROH_CARGO_TARGET_DIR} /${VGI_IROH_RUST_TARGET} /release/vgi_iroh_cabi.lib" )
134+ else ()
135+ set (VGI_IROH_STATIC_LIB
136+ "${VGI_IROH_CARGO_TARGET_DIR} /${VGI_IROH_RUST_TARGET} /release/libvgi_iroh_cabi.a" )
137+ endif ()
138+ file (GLOB_RECURSE VGI_IROH_RUST_INPUTS CONFIGURE_DEPENDS
139+ "${VGI_IROH_SOURCE_DIR } /vgi-iroh-cabi/*"
140+ "${VGI_IROH_SOURCE_DIR } /vgi-iroh-transport/*" )
141+ list (APPEND VGI_IROH_RUST_INPUTS
142+ "${VGI_IROH_SOURCE_DIR } /Cargo.toml"
143+ "${VGI_IROH_SOURCE_DIR } /Cargo.lock" )
144+ add_custom_command (
145+ OUTPUT "${VGI_IROH_STATIC_LIB} "
146+ COMMAND "${CMAKE_COMMAND } " -E env ${VGI_IROH_CARGO_ENV}
147+ "${VGI_CARGO_EXECUTABLE} " build --locked --release
148+ --manifest-path "${VGI_IROH_SOURCE_DIR } /Cargo.toml"
149+ --package vgi-iroh-cabi --target "${VGI_IROH_RUST_TARGET} "
150+ --target-dir "${VGI_IROH_CARGO_TARGET_DIR} "
151+ DEPENDS ${VGI_IROH_RUST_INPUTS}
152+ WORKING_DIRECTORY "${VGI_IROH_SOURCE_DIR } "
153+ COMMENT "Building embedded VGI Iroh transport (${VGI_IROH_RUST_TARGET} )"
154+ VERBATIM )
155+ add_custom_target (vgi_iroh_rust DEPENDS "${VGI_IROH_STATIC_LIB} " )
156+ add_library (vgi_iroh_cabi STATIC IMPORTED GLOBAL )
157+ set_target_properties (vgi_iroh_cabi PROPERTIES IMPORTED_LOCATION "${VGI_IROH_STATIC_LIB} " )
158+ add_dependencies (vgi_iroh_cabi vgi_iroh_rust )
159+ include_directories ("${VGI_IROH_SOURCE_DIR } /vgi-iroh-cabi/include" )
160+ add_compile_definitions (VGI_ENABLE_IROH=1 )
161+ endif ()
162+
41163# Windows: keep <windows.h> from pulling in the legacy <winsock.h>, which
42164# collides ("redefinition; different linkage") with the <winsock2.h> that
43165# cpp-httplib (HTTP transport) uses. NOMINMAX stops windows.h's min/max macros
@@ -94,6 +216,8 @@ src/vgi_container_runtime.cpp
94216src/vgi_http_compression.cpp
95217src/vgi_http_client.cpp
96218src/vgi_http_function_connection.cpp
219+ src/vgi_iroh_config.cpp
220+ src/vgi_iroh_native.cpp
97221src/vgi_cookie_jar.cpp
98222src/vgi_oauth.cpp
99223src/vgi_oauth_env.cpp
@@ -173,6 +297,22 @@ build_loadable_extension(${TARGET_NAME} " " ${EXTENSION_SOURCES})
173297target_link_libraries (${EXTENSION_NAME} ${VGI_SSL_LIBS} ${VGI_ARROW_LIB} )
174298target_link_libraries (${LOADABLE_EXTENSION_NAME} ${VGI_SSL_LIBS} ${VGI_ARROW_LIB} )
175299
300+ if (VGI_ENABLE_IROH)
301+ add_dependencies (${EXTENSION_NAME} vgi_iroh_rust )
302+ add_dependencies (${LOADABLE_EXTENSION_NAME} vgi_iroh_rust )
303+ target_link_libraries (${EXTENSION_NAME} vgi_iroh_cabi )
304+ target_link_libraries (${LOADABLE_EXTENSION_NAME} vgi_iroh_cabi )
305+ if (APPLE )
306+ target_link_libraries (${EXTENSION_NAME} "-framework Security" "-framework CoreFoundation"
307+ "-framework SystemConfiguration" )
308+ target_link_libraries (${LOADABLE_EXTENSION_NAME} "-framework Security" "-framework CoreFoundation"
309+ "-framework SystemConfiguration" )
310+ elseif (WIN32 )
311+ target_link_libraries (${EXTENSION_NAME} Crypt32 )
312+ target_link_libraries (${LOADABLE_EXTENSION_NAME} Crypt32 )
313+ endif ()
314+ endif ()
315+
176316# SQLite-backed per-value memo disk tier (same-host multi-process + cross-restart).
177317# sqlite3 comes from vcpkg (see vcpkg.json), like every other native dependency, so it
178318# builds identically on macOS/Linux/Windows. Native only: WASM has no filesystem tier
0 commit comments