@@ -163,6 +163,22 @@ find_program(CARGO_EXECUTABLE NAMES cargo REQUIRED)
163163
164164set (RUST_ROOT ${LIVEKIT_ROOT_DIR} /client-sdk-rust)
165165
166+ # Determine Rust target triple for cross-compilation on macOS
167+ set (RUST_TARGET_TRIPLE "" )
168+ if (APPLE AND CMAKE_OSX_ARCHITECTURES)
169+ if (CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64" )
170+ set (RUST_TARGET_TRIPLE "x86_64-apple-darwin" )
171+ elseif (CMAKE_OSX_ARCHITECTURES STREQUAL "arm64" )
172+ set (RUST_TARGET_TRIPLE "aarch64-apple-darwin" )
173+ endif ()
174+ endif ()
175+
176+ if (RUST_TARGET_TRIPLE)
177+ set (RUST_TARGET_DIR "${RUST_ROOT} /target/${RUST_TARGET_TRIPLE} " )
178+ else ()
179+ set (RUST_TARGET_DIR "${RUST_ROOT} /target" )
180+ endif ()
181+
166182set (RUN_CARGO_SCRIPT ${LIVEKIT_BINARY_DIR} /run_cargo.cmake)
167183file (WRITE ${RUN_CARGO_SCRIPT}
168184"if(NOT DEFINED CFG)
@@ -180,6 +196,11 @@ if(NOT CFG STREQUAL \"Debug\")
180196 list(APPEND ARGS --release)
181197endif()
182198
199+ if(DEFINED RUST_TARGET AND NOT RUST_TARGET STREQUAL \"\" )
200+ list(APPEND ARGS --target \"\$ {RUST_TARGET}\" )
201+ message(STATUS \" [run_cargo.cmake] Cross-compiling for target: \$ {RUST_TARGET}\" )
202+ endif()
203+
183204message(STATUS \" [run_cargo.cmake] CFG=\$ {CFG} CARGO=\$ {CARGO} PROTOC=\$ {PROTOC_PATH}\" )
184205set(ENV{PROTOC} \"\$ {PROTOC_PATH}\" )
185206
@@ -223,8 +244,8 @@ if(WIN32)
223244elseif (APPLE )
224245 # macOS: use dynamic library (.dylib) to isolate Debug/Release ABI differences
225246 add_library (livekit_ffi SHARED IMPORTED GLOBAL )
226- set (RUST_LIB_DEBUG "${RUST_ROOT} /target /debug/liblivekit_ffi.dylib" )
227- set (RUST_LIB_RELEASE "${RUST_ROOT} /target /release/liblivekit_ffi.dylib" )
247+ set (RUST_LIB_DEBUG "${RUST_TARGET_DIR} /debug/liblivekit_ffi.dylib" )
248+ set (RUST_LIB_RELEASE "${RUST_TARGET_DIR} /release/liblivekit_ffi.dylib" )
228249
229250 set_target_properties (livekit_ffi PROPERTIES
230251 IMPORTED_CONFIGURATIONS "Debug;Release;RelWithDebInfo;MinSizeRel"
@@ -238,8 +259,8 @@ elseif(APPLE)
238259else ()
239260 # Linux: use dynamic library (.so) to isolate Debug/Release ABI differences
240261 add_library (livekit_ffi SHARED IMPORTED GLOBAL )
241- set (RUST_LIB_DEBUG "${RUST_ROOT} /target /debug/liblivekit_ffi.so" )
242- set (RUST_LIB_RELEASE "${RUST_ROOT} /target /release/liblivekit_ffi.so" )
262+ set (RUST_LIB_DEBUG "${RUST_TARGET_DIR} /debug/liblivekit_ffi.so" )
263+ set (RUST_LIB_RELEASE "${RUST_TARGET_DIR} /release/liblivekit_ffi.so" )
243264
244265 set_target_properties (livekit_ffi PROPERTIES
245266 IMPORTED_CONFIGURATIONS "Debug;Release;RelWithDebInfo;MinSizeRel"
@@ -264,6 +285,7 @@ add_custom_command(
264285 -DRUST_ROOT=${RUST_ROOT}
265286 -DCARGO=${CARGO_EXECUTABLE}
266287 -DPROTOC_PATH=${Protobuf_PROTOC_EXECUTABLE}
288+ -DRUST_TARGET=${RUST_TARGET_TRIPLE}
267289 -P "${RUN_CARGO_SCRIPT} "
268290 WORKING_DIRECTORY "${RUST_ROOT} "
269291 DEPENDS ${RUST_SOURCES}
@@ -381,8 +403,8 @@ if(LIVEKIT_IS_TOPLEVEL)
381403 )
382404 elseif (APPLE )
383405 # macOS: copy .dylib
384- set (FFI_LIB_DEBUG "${RUST_ROOT} /target /debug/liblivekit_ffi.dylib" )
385- set (FFI_LIB_RELEASE "${RUST_ROOT} /target /release/liblivekit_ffi.dylib" )
406+ set (FFI_LIB_DEBUG "${RUST_TARGET_DIR} /debug/liblivekit_ffi.dylib" )
407+ set (FFI_LIB_RELEASE "${RUST_TARGET_DIR} /release/liblivekit_ffi.dylib" )
386408 add_custom_command (
387409 TARGET livekit POST_BUILD
388410 COMMAND ${CMAKE_COMMAND} -E copy
@@ -404,18 +426,18 @@ if(LIVEKIT_IS_TOPLEVEL)
404426 add_custom_command (
405427 TARGET livekit POST_BUILD
406428 COMMAND /usr/bin/install_name_tool
407- -change "${RUST_ROOT} /target /release/deps/liblivekit_ffi.dylib"
429+ -change "${RUST_TARGET_DIR} /release/deps/liblivekit_ffi.dylib"
408430 "@rpath/liblivekit_ffi.dylib"
409- -change "${RUST_ROOT} /target /debug/deps/liblivekit_ffi.dylib"
431+ -change "${RUST_TARGET_DIR} /debug/deps/liblivekit_ffi.dylib"
410432 "@rpath/liblivekit_ffi.dylib"
411433 "$<TARGET_FILE :livekit >"
412434 COMMENT "Fix dependency path in liblivekit.dylib -> liblivekit_ffi.dylib"
413435 VERBATIM
414436 )
415437 else ()
416438 # Linux: copy .so
417- set (FFI_LIB_DEBUG "${RUST_ROOT} /target /debug/liblivekit_ffi.so" )
418- set (FFI_LIB_RELEASE "${RUST_ROOT} /target /release/liblivekit_ffi.so" )
439+ set (FFI_LIB_DEBUG "${RUST_TARGET_DIR} /debug/liblivekit_ffi.so" )
440+ set (FFI_LIB_RELEASE "${RUST_TARGET_DIR} /release/liblivekit_ffi.so" )
419441 add_custom_command (
420442 TARGET livekit POST_BUILD
421443 COMMAND ${CMAKE_COMMAND} -E copy
0 commit comments