The open source OpenXR runtime
at main 180 lines 4.9 kB view raw
1# Copyright 2020-2021, Collabora, Ltd. 2# Copyright 2025, NVIDIA CORPORATION. 3# SPDX-License-Identifier: BSL-1.0 4 5### 6# Merge split protocol JSON files into single proto.json 7file(GLOB PROTO_JSON_FILES "${CMAKE_CURRENT_SOURCE_DIR}/shared/proto/*.json") 8 9merge_json_files( 10 OUTPUT 11 "${CMAKE_CURRENT_BINARY_DIR}/proto.json" 12 SOURCES 13 ${PROTO_JSON_FILES} 14 IGNORE_SCHEMA 15 ) 16 17### 18# Generator 19 20foreach( 21 fn 22 ipc_protocol_generated.h 23 ipc_client_generated.h 24 ipc_client_generated.c 25 ipc_server_generated.h 26 ipc_server_generated.c 27 ) 28 add_custom_command( 29 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${fn}" 30 COMMAND 31 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/shared/proto.py 32 ${CMAKE_CURRENT_BINARY_DIR}/proto.json "${CMAKE_CURRENT_BINARY_DIR}/${fn}" 33 VERBATIM 34 DEPENDS 35 ${CMAKE_CURRENT_SOURCE_DIR}/shared/proto.py 36 ${CMAKE_CURRENT_SOURCE_DIR}/shared/ipcproto/common.py 37 ${CMAKE_CURRENT_BINARY_DIR}/proto.json 38 ${CMAKE_CURRENT_SOURCE_DIR}/shared/ipc_protocol_generated.h.template 39 COMMENT "Generating ${fn} from protocol JSON description" 40 ) 41endforeach() 42 43# Generate IPC structures list in the build root 44add_custom_command( 45 OUTPUT "${CMAKE_BINARY_DIR}/ipc-structs.txt" 46 COMMAND 47 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/shared/proto.py 48 ${CMAKE_CURRENT_BINARY_DIR}/proto.json "${CMAKE_BINARY_DIR}/ipc-structs.txt" 49 VERBATIM 50 DEPENDS 51 ${CMAKE_CURRENT_SOURCE_DIR}/shared/proto.py 52 ${CMAKE_CURRENT_SOURCE_DIR}/shared/ipcproto/common.py 53 ${CMAKE_CURRENT_BINARY_DIR}/proto.json 54 COMMENT "Generating ipc-structs.txt from protocol JSON description" 55 ) 56 57add_custom_target(ipc_structs_list ALL DEPENDS "${CMAKE_BINARY_DIR}/ipc-structs.txt") 58 59set(IPC_COMMON_SOURCES 60 ${CMAKE_CURRENT_BINARY_DIR}/ipc_protocol_generated.h 61 shared/ipc_message_channel.h 62 shared/ipc_shmem.c 63 shared/ipc_shmem.h 64 shared/ipc_utils.c 65 shared/ipc_utils.h 66 ) 67 68add_library(ipc_shared STATIC ${IPC_COMMON_SOURCES}) 69target_include_directories( 70 ipc_shared PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} 71 ) 72 73if(WIN32) 74 target_sources(ipc_shared PRIVATE shared/ipc_message_channel_windows.cpp) 75else() 76 target_sources(ipc_shared PRIVATE shared/ipc_message_channel_unix.c) 77endif() 78 79target_link_libraries(ipc_shared PRIVATE aux_util) 80 81if(RT_LIBRARY) 82 target_link_libraries(ipc_shared PUBLIC ${RT_LIBRARY}) 83endif() 84 85### 86# Client 87 88add_library( 89 ipc_client STATIC 90 ${CMAKE_CURRENT_BINARY_DIR}/ipc_client_generated.c 91 ${CMAKE_CURRENT_BINARY_DIR}/ipc_client_generated.h 92 client/ipc_client.h 93 client/ipc_client_compositor.c 94 client/ipc_client_connection.c 95 client/ipc_client_device.c 96 client/ipc_client_future.c 97 client/ipc_client_hmd.c 98 client/ipc_client_instance.c 99 client/ipc_client_session.c 100 client/ipc_client_space_overseer.c 101 client/ipc_client_system.c 102 client/ipc_client_system_devices.c 103 client/ipc_client_xdev.c 104 client/ipc_client_xdev.h 105 ) 106target_include_directories( 107 ipc_client PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} 108 ) 109if(WIN32) 110 if(XRT_SERVICE_EXECUTABLE) 111 target_compile_definitions( 112 ipc_client PUBLIC XRT_SERVICE_EXECUTABLE="${XRT_SERVICE_EXECUTABLE}.exe" 113 ) 114 endif() 115 116 target_link_libraries(ipc_client PRIVATE winmm) 117endif() 118target_link_libraries(ipc_client PRIVATE aux_util ipc_shared) 119 120if(ANDROID) 121 # Need android_instance_base on the client side too. 122 target_link_libraries(ipc_client PRIVATE aux_android) 123endif() 124 125### 126# Server 127 128add_library( 129 ipc_server STATIC 130 ${CMAKE_CURRENT_BINARY_DIR}/ipc_server_generated.c 131 ${CMAKE_CURRENT_BINARY_DIR}/ipc_server_generated.h 132 server/ipc_server.h 133 server/ipc_server_handler.c 134 server/ipc_server_per_client_thread.c 135 server/ipc_server_process.c 136 ) 137target_include_directories( 138 ipc_server 139 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} 140 PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 141 ) 142target_link_libraries(ipc_server PRIVATE aux_util aux_util_process aux_util_debug_gui ipc_shared) 143 144if(XRT_HAVE_SYSTEMD) 145 target_include_directories(ipc_server PRIVATE ${SYSTEMD_INCLUDE_DIRS}) 146 target_link_libraries(ipc_server PRIVATE ${SYSTEMD_LIBRARIES}) 147endif() 148 149if(ANDROID) 150 add_library( 151 ipc_android STATIC 152 android/ipc_client_android.cpp 153 android/ipc_client_android.h 154 android/org.freedesktop.monado.ipc.cpp 155 android/org.freedesktop.monado.ipc.hpp 156 android/org.freedesktop.monado.ipc.impl.hpp 157 ) 158 target_link_libraries( 159 ipc_android PUBLIC xrt-external-jni-wrap xrt-external-jnipp aux_android 160 ) 161 target_sources( 162 ipc_server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/server/ipc_server_mainloop_android.c 163 ) 164 target_link_libraries( 165 ipc_shared 166 PUBLIC ${ANDROID_LIBRARY} 167 PRIVATE aux_android ipc_android 168 ) 169elseif(XRT_HAVE_LINUX) 170 target_sources( 171 ipc_server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/server/ipc_server_mainloop_linux.c 172 ) 173elseif(WIN32) 174 target_sources( 175 ipc_server 176 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/server/ipc_server_mainloop_windows.cpp 177 ) 178 179 target_link_libraries(ipc_server PRIVATE winmm) 180endif()