The open source OpenXR runtime
1# Copyright 2019-2025, Collabora, Ltd.
2#
3# SPDX-License-Identifier: BSL-1.0
4
5set(ENABLED_HEADSET_DRIVERS)
6set(ENABLED_DRIVERS)
7
8add_library(drv_includes INTERFACE)
9target_include_directories(drv_includes INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
10
11if(XRT_BUILD_DRIVER_ARDUINO)
12 add_library(
13 drv_arduino STATIC arduino/arduino_device.c arduino/arduino_interface.h
14 arduino/arduino_prober.c
15 )
16 target_link_libraries(drv_arduino PRIVATE xrt-interfaces aux_util aux_os aux_os_ble)
17 list(APPEND ENABLED_DRIVERS arduino)
18endif()
19
20add_library(drv_cemu STATIC ht_ctrl_emu/ht_ctrl_emu.cpp ht_ctrl_emu/ht_ctrl_emu_interface.h)
21target_link_libraries(drv_cemu PRIVATE xrt-interfaces aux_generated_bindings_helpers aux_util)
22list(APPEND ENABLED_HEADSET_DRIVERS drv_cemu)
23
24if(XRT_BUILD_DRIVER_BLUBUR_S1)
25 add_library(
26 drv_blubur_s1 STATIC blubur_s1/blubur_s1_hmd.c blubur_s1/blubur_s1_interface.h
27 blubur_s1/blubur_s1_prober.c
28 )
29 target_link_libraries(drv_blubur_s1 PRIVATE xrt-interfaces aux_util aux_os)
30 list(APPEND ENABLED_DRIVERS blubur_s1)
31endif()
32
33if(XRT_BUILD_DRIVER_DAYDREAM)
34 add_library(
35 drv_daydream STATIC daydream/daydream_device.c daydream/daydream_device.h
36 daydream/daydream_interface.h daydream/daydream_prober.c
37 )
38 target_link_libraries(drv_daydream PRIVATE xrt-interfaces aux_util aux_os aux_os_ble)
39 list(APPEND ENABLED_DRIVERS daydream)
40endif()
41
42if(XRT_BUILD_DRIVER_DEPTHAI)
43 add_library(drv_depthai STATIC depthai/depthai_driver.cpp depthai/depthai_interface.h)
44 target_link_libraries(
45 drv_depthai
46 PRIVATE
47 xrt-interfaces
48 aux_os
49 aux_util
50 aux_tracking
51 ${OpenCV_LIBRARIES}
52 depthai::core
53 XLink
54 )
55 target_include_directories(drv_depthai PRIVATE ${OpenCV_INCLUDE_DIRS})
56 list(APPEND ENABLED_DRIVERS depthai)
57endif()
58
59if(XRT_BUILD_DRIVER_SIMULATED)
60 add_library(
61 drv_simulated STATIC simulated/simulated_controller.c simulated/simulated_hmd.c
62 simulated/simulated_interface.h simulated/simulated_prober.c
63 )
64 target_link_libraries(drv_simulated PRIVATE xrt-interfaces aux_util)
65 list(APPEND ENABLED_HEADSET_DRIVERS simulated)
66endif()
67
68if(XRT_BUILD_DRIVER_TWRAP)
69 add_library(drv_twrap STATIC twrap/twrap_slam.c twrap/twrap_interface.h)
70 target_link_libraries(drv_twrap PRIVATE xrt-interfaces aux_util)
71endif()
72
73if(XRT_BUILD_DRIVER_QWERTY)
74 add_library(
75 drv_qwerty STATIC
76 qwerty/qwerty_device.c
77 qwerty/qwerty_device.h
78 qwerty/qwerty_interface.h
79 qwerty/qwerty_prober.c
80 qwerty/qwerty_sdl.c
81 )
82 target_link_libraries(drv_qwerty PRIVATE xrt-interfaces aux_util SDL2::SDL2)
83 list(APPEND ENABLED_DRIVERS qwerty)
84
85 add_library(drv_qwerty_includes INTERFACE)
86 target_include_directories(drv_qwerty_includes INTERFACE qwerty)
87endif()
88
89if(XRT_BUILD_DRIVER_HDK)
90 set(HDK_SOURCE_FILES)
91
92 add_library(
93 drv_hdk STATIC hdk/hdk_device.cpp hdk/hdk_device.h hdk/hdk_interface.h
94 hdk/hdk_prober.c
95 )
96 target_link_libraries(drv_hdk PRIVATE xrt-interfaces aux_math)
97 list(APPEND ENABLED_HEADSET_DRIVERS hdk)
98endif()
99
100if(XRT_BUILD_DRIVER_HYDRA)
101 set(HYDRA_SOURCE_FILES)
102
103 add_library(drv_hydra STATIC hydra/hydra_driver.c hydra/hydra_interface.h)
104 target_link_libraries(drv_hydra PRIVATE xrt-interfaces aux_os aux_util)
105 list(APPEND ENABLED_DRIVERS hydra)
106endif()
107
108if(XRT_BUILD_DRIVER_NS)
109 add_library(
110 drv_ns STATIC
111 north_star/distortion_3d/utility_northstar.h
112 north_star/distortion_3d/deformation_northstar.h
113 north_star/distortion_3d/deformation_northstar.cpp
114 north_star/ns_hmd.h
115 north_star/ns_hmd.c
116 north_star/ns_interface.h
117 )
118 target_link_libraries(drv_ns PRIVATE xrt-interfaces aux_math xrt-external-cjson)
119 list(APPEND ENABLED_HEADSET_DRIVERS ns)
120endif()
121
122if(XRT_BUILD_DRIVER_XREAL_AIR)
123 add_library(
124 drv_xreal_air STATIC xreal_air/xreal_air_hmd.h xreal_air/xreal_air_hmd.c
125 xreal_air/xreal_air_interface.h xreal_air/xreal_air_packet.c
126 )
127 target_link_libraries(
128 drv_xreal_air PRIVATE xrt-interfaces HIDAPI::hidapi aux_util xrt-external-cjson
129 )
130 target_include_directories(drv_xreal_air PRIVATE ${HIDAPI_INCLUDE_DIRS})
131 list(APPEND ENABLED_HEADSET_DRIVERS xreal_air)
132endif()
133
134if(XRT_BUILD_DRIVER_ULV2)
135 add_library(drv_ulv2 STATIC ultraleap_v2/ulv2_driver.cpp ultraleap_v2/ulv2_interface.h)
136 target_link_libraries(drv_ulv2 PRIVATE xrt-interfaces aux_util aux_math LeapV2::LeapV2)
137endif()
138
139if(XRT_BUILD_DRIVER_ULV5)
140 add_library(drv_ulv5 STATIC ultraleap_v5/ulv5_driver.cpp ultraleap_v5/ulv5_interface.h)
141 target_link_libraries(drv_ulv5 PRIVATE xrt-interfaces aux_util aux_math LeapSDK::LeapC)
142endif()
143
144if(XRT_BUILD_DRIVER_OHMD)
145 add_library(
146 drv_ohmd STATIC ohmd/oh_device.c ohmd/oh_device.h ohmd/oh_interface.h
147 ohmd/oh_prober.c
148 )
149 target_link_libraries(drv_ohmd PRIVATE xrt-interfaces OpenHMD::OpenHMD aux_util aux_math)
150 list(APPEND ENABLED_HEADSET_DRIVERS openhmd)
151endif()
152
153if(XRT_BUILD_DRIVER_OPENGLOVES)
154 add_library(
155 drv_opengloves STATIC
156 opengloves/opengloves_interface.h
157 opengloves/opengloves_device.c
158 opengloves/opengloves_prober.c
159 opengloves/opengloves_device.h
160 opengloves/communication/serial/opengloves_serial.h
161 opengloves/communication/serial/opengloves_serial.c
162 opengloves/encoding/alpha_encoding.h
163 opengloves/encoding/alpha_encoding.cpp
164 opengloves/encoding/encoding.h
165 opengloves/communication/bluetooth/opengloves_bt_serial.h
166 opengloves/communication/bluetooth/opengloves_bt_serial.c
167 opengloves/communication/opengloves_communication.h
168 opengloves/communication/serial/opengloves_prober_serial.h
169 opengloves/communication/serial/opengloves_prober_serial.c
170 opengloves/communication/bluetooth/opengloves_prober_bt.h
171 opengloves/communication/bluetooth/opengloves_prober_bt.c
172 )
173 target_link_libraries(drv_opengloves PRIVATE xrt-interfaces aux_util aux_os bluetooth)
174 list(APPEND ENABLED_DRIVERS opengloves)
175
176endif()
177
178if(XRT_BUILD_DRIVER_PSMV)
179 add_library(drv_psmv STATIC psmv/psmv_driver.c psmv/psmv_interface.h)
180 target_link_libraries(
181 drv_psmv
182 PRIVATE xrt-interfaces aux_util
183 PUBLIC aux_os aux_tracking
184 )
185 list(APPEND ENABLED_DRIVERS psmv)
186endif()
187
188if(XRT_BUILD_DRIVER_PSSENSE)
189 add_library(drv_pssense STATIC pssense/pssense_driver.c pssense/pssense_interface.h)
190 target_link_libraries(drv_pssense PRIVATE aux_os aux_util)
191 list(APPEND ENABLED_DRIVERS pssense)
192endif()
193
194if(XRT_BUILD_DRIVER_PSVR)
195 add_library(
196 drv_psvr STATIC
197 psvr/psvr_device.c
198 psvr/psvr_device.h
199 psvr/psvr_interface.h
200 psvr/psvr_packet.c
201 psvr/psvr_prober.c
202 )
203 target_link_libraries(drv_psvr PRIVATE xrt-interfaces HIDAPI::hidapi aux_util)
204 target_include_directories(drv_psvr PRIVATE ${HIDAPI_INCLUDE_DIRS})
205 list(APPEND ENABLED_HEADSET_DRIVERS psvr)
206endif()
207
208if(XRT_BUILD_DRIVER_REALSENSE)
209 add_library(
210 drv_realsense STATIC
211 realsense/rs_ddev.c
212 realsense/rs_hdev.c
213 realsense/rs_prober.c
214 realsense/rs_driver.h
215 realsense/rs_interface.h
216 )
217 target_link_libraries(drv_realsense PRIVATE xrt-interfaces realsense2::realsense2 aux_util)
218 list(APPEND ENABLED_HEADSET_DRIVERS rs)
219endif()
220
221if(XRT_BUILD_DRIVER_REMOTE)
222 add_library(
223 drv_remote STATIC
224 remote/r_device.c
225 remote/r_hmd.c
226 remote/r_hub.c
227 remote/r_interface.h
228 remote/r_internal.h
229 )
230 target_link_libraries(drv_remote PRIVATE xrt-interfaces aux_util aux_vive)
231 if(WIN32)
232 target_link_libraries(drv_remote PRIVATE ws2_32)
233 endif()
234 list(APPEND ENABLED_HEADSET_DRIVERS remote)
235endif()
236
237if(XRT_BUILD_DRIVER_ROKID)
238 add_library(drv_rokid STATIC rokid/rokid_hmd.c rokid/rokid_interface.h)
239 target_link_libraries(
240 drv_rokid
241 PRIVATE
242 xrt-interfaces
243 aux_util
244 aux_os
245 aux_math
246 ${LIBUSB1_LIBRARIES}
247 )
248 target_include_directories(drv_rokid PUBLIC ${LIBUSB1_INCLUDE_DIRS})
249 list(APPEND ENABLED_HEADSET_DRIVERS rokid)
250endif()
251
252if(XRT_BUILD_DRIVER_RIFT)
253 add_library(drv_rift STATIC rift/rift_hmd.c rift/rift_distortion.c rift/rift_prober.c)
254 target_include_directories(drv_rift SYSTEM PRIVATE)
255 target_link_libraries(
256 drv_rift
257 PRIVATE
258 xrt-interfaces
259 aux_util
260 aux_util_sink
261 aux_math
262 xrt-external-cjson
263 xrt-external-tinyceres
264 )
265 list(APPEND ENABLED_HEADSET_DRIVERS rift)
266endif()
267
268if(XRT_BUILD_DRIVER_RIFT_S)
269 add_library(
270 drv_rift_s STATIC
271 rift_s/rift_s_interface.h
272 rift_s/rift_s_camera.c
273 rift_s/rift_s_camera.h
274 rift_s/rift_s_controller.c
275 rift_s/rift_s_controller.h
276 rift_s/rift_s_firmware.c
277 rift_s/rift_s_firmware.h
278 rift_s/rift_s_hmd.c
279 rift_s/rift_s_hmd.h
280 rift_s/rift_s_protocol.c
281 rift_s/rift_s_protocol.h
282 rift_s/rift_s_radio.c
283 rift_s/rift_s_radio.h
284 rift_s/rift_s_tracker.c
285 rift_s/rift_s_tracker.h
286 rift_s/rift_s_util.cpp
287 rift_s/rift_s_util.h
288 rift_s/rift_s.c
289 rift_s/rift_s.h
290 )
291 target_link_libraries(
292 drv_rift_s
293 PRIVATE
294 xrt-interfaces
295 aux_util
296 aux_util_sink
297 aux_math
298 xrt-external-cjson
299 xrt-external-tinyceres
300 )
301 if(XRT_BUILD_DRIVER_HANDTRACKING)
302 target_link_libraries(drv_rift_s PRIVATE drv_ht)
303 endif()
304 list(APPEND ENABLED_HEADSET_DRIVERS rift-s)
305endif()
306
307set(VIVE_CONFIG_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/vive")
308if(XRT_BUILD_DRIVER_VIVE)
309 add_library(
310 drv_vive STATIC
311 vive/vive_device.h
312 vive/vive_device.c
313 vive/vive_prober.h
314 vive/vive_prober.c
315 vive/vive_protocol.c
316 vive/vive_protocol.h
317 vive/vive_controller.h
318 vive/vive_controller.c
319 vive/vive_lighthouse.h
320 vive/vive_lighthouse.c
321 vive/vive_source.h
322 vive/vive_source.c
323 )
324 target_link_libraries(
325 drv_vive
326 PRIVATE
327 xrt-interfaces
328 aux_os
329 aux_util
330 aux_math
331 xrt-external-cjson
332 aux_vive
333 )
334 target_link_libraries(drv_vive PRIVATE ${ZLIB_LIBRARIES})
335 target_include_directories(drv_vive PRIVATE ${ZLIB_INCLUDE_DIRS})
336 list(APPEND ENABLED_HEADSET_DRIVERS vive)
337endif()
338
339if(XRT_HAVE_V4L2)
340 add_library(drv_v4l2 STATIC v4l2/v4l2_driver.h v4l2/v4l2_driver.c)
341 target_link_libraries(drv_v4l2 PRIVATE xrt-interfaces aux_os aux_util)
342 list(APPEND ENABLED_DRIVERS v4l2)
343endif()
344
345if(XRT_BUILD_DRIVER_VF)
346 add_library(drv_vf STATIC vf/vf_driver.c)
347 target_link_libraries(drv_vf PRIVATE xrt-interfaces aux_os aux_util ${GST_LIBRARIES})
348 target_include_directories(drv_vf PRIVATE ${GST_INCLUDE_DIRS})
349 list(APPEND ENABLED_DRIVERS vf)
350endif()
351
352if(XRT_BUILD_DRIVER_HANDTRACKING)
353 add_library(drv_ht STATIC ht/ht_driver.c ht/ht_interface.h)
354 target_link_libraries(
355 drv_ht
356 PRIVATE
357 xrt-interfaces
358 aux_os
359 aux_util
360 aux_math
361 t_ht_mercury
362 hand_async
363 )
364
365 target_include_directories(drv_ht PRIVATE ${OpenCV_INCLUDE_DIRS})
366 list(APPEND ENABLED_DRIVERS ht)
367endif()
368
369if(XRT_BUILD_DRIVER_SURVIVE)
370 add_library(drv_survive STATIC survive/survive_driver.c survive/survive_interface.h)
371 target_link_libraries(
372 drv_survive
373 PRIVATE
374 xrt-interfaces
375 aux_os
376 aux_util
377 aux_math
378 aux_vive
379 PkgConfig::SURVIVE
380 )
381 list(APPEND ENABLED_HEADSET_DRIVERS survive)
382endif()
383
384if(XRT_BUILD_DRIVER_ANDROID)
385 add_library(
386 drv_android STATIC android/android_prober.c android/android_prober.h
387 android/android_sensors.c android/android_sensors.h
388 )
389 target_link_libraries(
390 drv_android
391 PRIVATE
392 xrt-interfaces
393 aux_util
394 aux_os
395 aux_android
396 ${ANDROID_LIBRARY}
397 )
398 target_link_libraries(drv_android PRIVATE xrt-external-cardboard)
399 list(APPEND ENABLED_DRIVERS android)
400endif()
401
402if(XRT_BUILD_DRIVER_ILLIXR)
403 add_library(
404 drv_illixr STATIC
405 illixr/illixr_device.cpp
406 illixr/illixr_interface.h
407 illixr/illixr_prober.c
408 illixr/illixr_component.cpp
409 illixr/illixr_component.h
410 )
411 target_link_libraries(drv_illixr PUBLIC ${CMAKE_DL_LIBS} xrt-interfaces aux_util aux_os)
412 target_include_directories(drv_illixr PUBLIC ${ILLIXR_PATH})
413 list(APPEND ENABLED_HEADSET_DRIVERS illixr)
414endif()
415
416add_library(drv_multi STATIC multi_wrapper/multi.c multi_wrapper/multi.h)
417target_link_libraries(drv_multi PUBLIC xrt-interfaces aux_util)
418list(APPEND ENABLED_HEADSET_DRIVERS drv_multi)
419
420if(XRT_BUILD_DRIVER_WMR)
421 add_library(
422 drv_wmr STATIC
423 wmr/wmr_camera.h
424 wmr/wmr_common.h
425 wmr/wmr_config.c
426 wmr/wmr_config.h
427 wmr/wmr_controller_base.c
428 wmr/wmr_controller_base.h
429 wmr/wmr_controller_og.c
430 wmr/wmr_controller_hp.c
431 wmr/wmr_controller.c
432 wmr/wmr_controller.h
433 wmr/wmr_bt_controller.c
434 wmr/wmr_bt_controller.h
435 wmr/wmr_hmd.c
436 wmr/wmr_hmd.h
437 wmr/wmr_hmd_controller.c
438 wmr/wmr_hmd_controller.h
439 wmr/wmr_interface.h
440 wmr/wmr_prober.c
441 wmr/wmr_protocol.c
442 wmr/wmr_protocol.h
443 wmr/wmr_controller_protocol.c
444 wmr/wmr_controller_protocol.h
445 wmr/wmr_source.c
446 wmr/wmr_source.h
447 )
448 target_link_libraries(
449 drv_wmr
450 PRIVATE
451 xrt-interfaces
452 aux_util
453 aux_util_sink # TODO remove this when converted to builders.
454 aux_math
455 aux_tracking
456 xrt-external-cjson
457 )
458 list(APPEND ENABLED_HEADSET_DRIVERS wmr)
459
460 # Can only build camera support with libusb
461 if(XRT_HAVE_LIBUSB)
462 target_sources(drv_wmr PRIVATE wmr/wmr_camera.c)
463 target_include_directories(drv_wmr PUBLIC ${LIBUSB1_INCLUDE_DIRS})
464 target_link_libraries(drv_wmr PRIVATE ${LIBUSB1_LIBRARIES})
465 endif()
466
467 if(XRT_BUILD_DRIVER_HANDTRACKING)
468 target_link_libraries(drv_wmr PRIVATE drv_ht)
469 target_link_libraries(drv_wmr PRIVATE drv_cemu)
470 endif()
471endif()
472
473if(XRT_BUILD_DRIVER_EUROC)
474 add_library(
475 drv_euroc STATIC
476 euroc/euroc_player.cpp
477 euroc/euroc_driver.h
478 euroc/euroc_device.c
479 euroc/euroc_interface.h
480 euroc/euroc_runner.c
481 )
482 target_link_libraries(
483 drv_euroc PRIVATE xrt-interfaces aux_util aux_tracking ${OpenCV_LIBRARIES}
484 )
485 target_include_directories(drv_euroc PRIVATE ${OpenCV_INCLUDE_DIRS})
486 list(APPEND ENABLED_DRIVERS euroc)
487endif()
488
489if(XRT_BUILD_DRIVER_SIMULAVR)
490 add_library(drv_svr STATIC simula/svr_hmd.c simula/svr_interface.h)
491 target_link_libraries(drv_svr PRIVATE xrt-interfaces aux_math xrt-external-cjson)
492 list(APPEND ENABLED_HEADSET_DRIVERS svr)
493endif()
494
495if(XRT_BUILD_DRIVER_STEAMVR_LIGHTHOUSE)
496 add_library(drv_vp2 STATIC vp2/vp2_hid.c vp2/vp2_hid.h)
497 target_link_libraries(drv_vp2 PRIVATE aux_os aux_util aux_math aux_vive)
498endif()
499
500if(XRT_BUILD_DRIVER_STEAMVR_LIGHTHOUSE)
501 add_library(
502 drv_steamvr_lh STATIC
503 steamvr_lh/steamvr_lh.cpp
504 steamvr_lh/device.cpp
505 steamvr_lh/interfaces/driver_manager.cpp
506 steamvr_lh/interfaces/iobuffer.cpp
507 steamvr_lh/interfaces/resources.cpp
508 steamvr_lh/interfaces/settings.cpp
509 steamvr_lh/interfaces/blockqueue.cpp
510 steamvr_lh/interfaces/paths.cpp
511 )
512 target_link_libraries(
513 drv_steamvr_lh
514 PRIVATE
515 aux_util
516 aux_math
517 aux_vive
518 drv_vp2
519 drv_includes
520 xrt-interfaces
521 xrt-external-openvr
522 xrt-external-cjson
523 xrt-external-vdf
524 ${CMAKE_DL_LIBS}
525 )
526 list(APPEND ENABLED_HEADSET_DRIVERS steamvr_lh)
527endif()
528
529if(XRT_BUILD_DRIVER_SOLARXR)
530 add_library(
531 drv_solarxr STATIC
532 solarxr/protocol.c
533 solarxr/protocol.h
534 solarxr/solarxr_device.c
535 solarxr/solarxr_interface.h
536 solarxr/solarxr_ipc_message.h
537 solarxr/solarxr_ipc_socket.c
538 solarxr/solarxr_ipc_socket.h
539 )
540 target_link_libraries(drv_solarxr PRIVATE xrt-interfaces aux_util ipc_shared)
541 list(APPEND ENABLED_DRIVERS solarxr)
542endif()
543
544if(XRT_BUILD_SAMPLES)
545 # We build the sample driver to make sure it stays valid,
546 # but it never gets linked into a final target.
547 add_library(
548 drv_sample STATIC sample/sample_hmd.c sample/sample_interface.h
549 sample/sample_prober.c
550 )
551 target_link_libraries(drv_sample PRIVATE xrt-interfaces aux_util)
552endif()
553
554if(ENABLED_HEADSET_DRIVERS)
555 set(ENABLED_DRIVERS ${ENABLED_HEADSET_DRIVERS} ${ENABLED_DRIVERS})
556 list(SORT ENABLED_DRIVERS)
557 string(REPLACE ";" " " ENABLED_DRIVERS "${ENABLED_DRIVERS}")
558 message(STATUS "Enabled drivers: ${ENABLED_DRIVERS}")
559else()
560 message(FATAL_ERROR "You must enable at least one headset driver to build Monado.")
561endif()