Skip to content

Commit 42b046c

Browse files
Allow non-system GCC toolchain, bridge robot: --no-mic (#73)
1 parent ea9c328 commit 42b046c

10 files changed

Lines changed: 185 additions & 113 deletions

File tree

CMakeLists.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,20 @@ else()
179179
set(RUST_TARGET_DIR "${RUST_ROOT}/target")
180180
endif()
181181

182+
# Detect the GCC toolchain's library directory so cargo can find the matching libstdc++.
183+
# This is needed when using a non-system GCC (e.g. GCC 14) on an older distro whose
184+
# system libstdc++ lacks symbols like __cxa_call_terminate.
185+
set(GCC_LIB_DIR "")
186+
if(NOT WIN32)
187+
get_filename_component(_gcc_bin_dir "${CMAKE_C_COMPILER}" DIRECTORY)
188+
get_filename_component(_gcc_root "${_gcc_bin_dir}" DIRECTORY)
189+
if(IS_DIRECTORY "${_gcc_root}/lib64")
190+
set(GCC_LIB_DIR "${_gcc_root}/lib64")
191+
elseif(IS_DIRECTORY "${_gcc_root}/lib")
192+
set(GCC_LIB_DIR "${_gcc_root}/lib")
193+
endif()
194+
endif()
195+
182196
set(RUN_CARGO_SCRIPT ${LIVEKIT_BINARY_DIR}/run_cargo.cmake)
183197
file(WRITE ${RUN_CARGO_SCRIPT}
184198
"if(NOT DEFINED CFG)
@@ -204,6 +218,11 @@ endif()
204218
message(STATUS \"[run_cargo.cmake] CFG=\${CFG} CARGO=\${CARGO} PROTOC=\${PROTOC_PATH}\")
205219
set(ENV{PROTOC} \"\${PROTOC_PATH}\")
206220
221+
if(DEFINED GCC_LIB_DIR AND NOT GCC_LIB_DIR STREQUAL \"\")
222+
set(ENV{RUSTFLAGS} \"-L \${GCC_LIB_DIR} \$ENV{RUSTFLAGS}\")
223+
set(ENV{LD_LIBRARY_PATH} \"\${GCC_LIB_DIR}:\$ENV{LD_LIBRARY_PATH}\")
224+
endif()
225+
207226
execute_process(
208227
COMMAND \"\${CARGO}\" \${ARGS}
209228
WORKING_DIRECTORY \"\${RUST_ROOT}\"
@@ -286,6 +305,7 @@ add_custom_command(
286305
-DCARGO=${CARGO_EXECUTABLE}
287306
-DPROTOC_PATH=${Protobuf_PROTOC_EXECUTABLE}
288307
-DRUST_TARGET=${RUST_TARGET_TRIPLE}
308+
-DGCC_LIB_DIR=${GCC_LIB_DIR}
289309
-P "${RUN_CARGO_SCRIPT}"
290310
WORKING_DIRECTORY "${RUST_ROOT}"
291311
DEPENDS ${RUST_SOURCES}

examples/CMakeLists.txt

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -117,46 +117,46 @@ target_link_libraries(SimpleRpc
117117
spdlog::spdlog
118118
)
119119

120-
# --- SimpleRobot example (robot + human executables with shared json_utils) ---
120+
# --- SimpleJoystick example (sender + receiver executables with shared json_utils) ---
121121

122-
add_library(simple_robot_json_utils STATIC
123-
simple_robot/json_utils.cpp
124-
simple_robot/json_utils.h
125-
simple_robot/utils.cpp
126-
simple_robot/utils.h
122+
add_library(simple_joystick_json_utils STATIC
123+
simple_joystick/json_utils.cpp
124+
simple_joystick/json_utils.h
125+
simple_joystick/utils.cpp
126+
simple_joystick/utils.h
127127
)
128128

129-
target_include_directories(simple_robot_json_utils PUBLIC
130-
${CMAKE_CURRENT_SOURCE_DIR}/simple_robot
129+
target_include_directories(simple_joystick_json_utils PUBLIC
130+
${CMAKE_CURRENT_SOURCE_DIR}/simple_joystick
131131
)
132132

133-
target_link_libraries(simple_robot_json_utils
133+
target_link_libraries(simple_joystick_json_utils
134134
PUBLIC
135135
nlohmann_json::nlohmann_json
136136
)
137137

138-
add_executable(SimpleRobot
139-
simple_robot/robot.cpp
138+
add_executable(SimpleJoystickReceiver
139+
simple_joystick/receiver.cpp
140140
)
141141

142-
target_include_directories(SimpleRobot PRIVATE ${EXAMPLES_PRIVATE_INCLUDE_DIRS})
142+
target_include_directories(SimpleJoystickReceiver PRIVATE ${EXAMPLES_PRIVATE_INCLUDE_DIRS})
143143

144-
target_link_libraries(SimpleRobot
144+
target_link_libraries(SimpleJoystickReceiver
145145
PRIVATE
146-
simple_robot_json_utils
146+
simple_joystick_json_utils
147147
livekit
148148
spdlog::spdlog
149149
)
150150

151-
add_executable(SimpleHuman
152-
simple_robot/human.cpp
151+
add_executable(SimpleJoystickSender
152+
simple_joystick/sender.cpp
153153
)
154154

155-
target_include_directories(SimpleHuman PRIVATE ${EXAMPLES_PRIVATE_INCLUDE_DIRS})
155+
target_include_directories(SimpleJoystickSender PRIVATE ${EXAMPLES_PRIVATE_INCLUDE_DIRS})
156156

157-
target_link_libraries(SimpleHuman
157+
target_link_libraries(SimpleJoystickSender
158158
PRIVATE
159-
simple_robot_json_utils
159+
simple_joystick_json_utils
160160
livekit
161161
spdlog::spdlog
162162
)
@@ -269,7 +269,7 @@ if(WIN32)
269269
)
270270

271271
# Copy DLLs to each example's output directory
272-
foreach(EXAMPLE SimpleRoom SimpleRpc SimpleRobot SimpleHuman SimpleDataStream LoggingLevelsBasicUsage LoggingLevelsCustomSinks BridgeRobot BridgeHuman)
272+
foreach(EXAMPLE SimpleRoom SimpleRpc SimpleJoystickSender SimpleJoystickReceiver SimpleDataStream LoggingLevelsBasicUsage LoggingLevelsCustomSinks BridgeRobot BridgeHuman)
273273
foreach(DLL ${REQUIRED_DLLS})
274274
add_custom_command(TARGET ${EXAMPLE} POST_BUILD
275275
COMMAND ${CMAKE_COMMAND} -E copy_if_different
@@ -304,7 +304,7 @@ if(UNIX)
304304
endif()
305305

306306
# Copy shared library to each example's output directory
307-
foreach(EXAMPLE SimpleRoom SimpleRpc SimpleRobot SimpleHuman SimpleDataStream LoggingLevelsBasicUsage LoggingLevelsCustomSinks BridgeRobot BridgeHuman)
307+
foreach(EXAMPLE SimpleRoom SimpleRpc SimpleJoystickSender SimpleJoystickReceiver SimpleDataStream LoggingLevelsBasicUsage LoggingLevelsCustomSinks BridgeRobot BridgeHuman)
308308
add_custom_command(TARGET ${EXAMPLE} POST_BUILD
309309
COMMAND ${CMAKE_COMMAND} -E copy_if_different
310310
"${LIVEKIT_LIB_DIR}/${FFI_SHARED_LIB}"

examples/bridge_human_robot/human.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@
4343
* Run alongside the "robot" example (which publishes with identity "robot").
4444
*/
4545

46-
#include "lk_log.h"
4746
#include "livekit/audio_frame.h"
4847
#include "livekit/track.h"
4948
#include "livekit/video_frame.h"
5049
#include "livekit_bridge/livekit_bridge.h"
50+
#include "lk_log.h"
5151
#include "sdl_media.h"
5252

5353
#include <SDL3/SDL.h>
@@ -115,9 +115,25 @@ int main(int argc, char *argv[]) {
115115
}
116116

117117
std::string url, token;
118+
auto is_ws_url = [](const std::string &s) {
119+
return (s.size() >= 5 && s.compare(0, 5, "ws://") == 0) ||
120+
(s.size() >= 6 && s.compare(0, 6, "wss://") == 0);
121+
};
118122
if (positional.size() >= 2) {
119-
url = positional[0];
120-
token = positional[1];
123+
for (const auto &arg : positional) {
124+
if (is_ws_url(arg)) {
125+
url = arg;
126+
break;
127+
}
128+
}
129+
for (const auto &arg : positional) {
130+
if (arg != url) {
131+
token = arg;
132+
break;
133+
}
134+
}
135+
if (url.empty())
136+
url = positional[0], token = positional[1]; // fallback by position
121137
} else {
122138
const char *e = std::getenv("LIVEKIT_URL");
123139
if (e)

0 commit comments

Comments
 (0)