The open source OpenXR runtime
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()