CMakeLists.txt 13.1 KB
Newer Older
1
# Copyright 2018-2020, Collabora, Ltd.
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
2
3
# SPDX-License-Identifier: BSL-1.0

4
cmake_minimum_required(VERSION 3.10.2)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
5
project(XRT VERSION 0.4.1)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
6
7
8

# CMake 3.11 introduced CMP0072 - Prefer GLVND
if(POLICY CMP0072)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
9
	cmake_policy(SET CMP0072 NEW)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
10
11
endif()

12
13
option(XRT_OPENXR_INSTALL_ABSOLUTE_RUNTIME_PATH "Use the absolute path to the runtime in the installed manifest, rather than a bare filename." ON)
option(XRT_OPENXR_INSTALL_ACTIVE_RUNTIME "Make Monado the default OpenXR runtime on install" ON)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
14
15
16
17
18
19
20

###
# Dependencies
###
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(CMakeDependentOption)
include(SPIR-V)
Ryan Pavlik's avatar
Ryan Pavlik committed
21
include(GNUInstallDirs)
22
23
include(GetGitRevisionDescription)
git_describe(GIT_DESC "--always")
24
25
26
27
if(NOT ${CMAKE_VERSION} VERSION_LESS 3.9)
	include(CheckIPOSupported)
	check_ipo_supported(RESULT HAS_IPO)
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
28

29
30
31
# Redundant mention of version is required because module defaults to looking for 2.91-compatible,
# which the config file for a 3.x says it's not compatible with.
find_package(Eigen3 3 REQUIRED)
32
find_package(Vulkan)
33
find_package(EGL)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
34
find_package(HIDAPI)
Ryan Pavlik's avatar
Ryan Pavlik committed
35
find_package(OpenHMD)
36
find_package(OpenCV COMPONENTS core calib3d highgui imgproc imgcodecs features2d video CONFIG)
37
38
find_package(Libusb1)
find_package(JPEG)
39
40
find_package(realsense2 CONFIG)
find_package(SDL2 CONFIG)
41
find_package(ZLIB)
42
find_package(cJSON)
43
find_package(Systemd)
44
find_package(OpenGLES COMPONENTS V3)
45

46
47
# Android SDK doesn't look for 3.8 and 3.9, which is what new distros ship with.
set(Python_ADDITIONAL_VERSIONS 3.8 3.9)
48
49
50
51
52
53
54
55
56
57
58
if(NOT CMAKE_VERSION VERSION_LESS 3.12)
	find_package(Python3 REQUIRED Interpreter)
	set(PYTHON_EXECUTABLE Python3::Interpreter)
else()
	find_package(PythonInterp REQUIRED VERSION 3)
	if(PYTHON_EXECUTABLE MATCHES "WindowsApps")
		# If you hit this error, you will have to install Python 3 or try harder to tell CMake where it is.
		message(FATAL_ERROR "Found WindowsApps alias for Python. Make sure Python3 is installed, then choose 'Manage App Execution Aliases' in Start and disable the aliases for Python.")
	endif()
endif()

59
60
61
62
63
64
65
66
67
68
add_library(xrt-pthreads INTERFACE)
if(WIN32)
	find_package(pthreads_windows REQUIRED)
	target_link_libraries(xrt-pthreads INTERFACE PThreads4W::PThreads4W_CXXEXC)
else()
	set(CMAKE_THREAD_PREFER_PTHREAD ON)
	find_package(Threads)
	target_link_libraries(xrt-pthreads INTERFACE Threads::Threads)
endif()

69
70
71
if(NOT ANDROID)
	# @TODO Turn into a find_package LIBUVC file.
	pkg_check_modules(LIBUVC libuvc)
72

73
74
75
	# @TODO Turn into a find_package FFMPEG file.
	pkg_check_modules(FFMPEG libavcodec)
endif()
76

Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
77
78

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
79
	set(XRT_HAVE_LINUX YES)
80
	# Compositor backend
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
81
	find_package(X11)
82
	find_package(PkgConfig)
83
84

	find_package(udev REQUIRED)
85
	set(XRT_HAVE_V4L2 TRUE)
86
	if(PKGCONFIG_FOUND)
87
		pkg_check_modules(XCB xcb xcb-randr x11-xcb)
88

89
90
91
92
		pkg_search_module(WAYLAND wayland-client)
		pkg_search_module(WAYLAND_SCANNER wayland-scanner)
		pkg_search_module(WAYLAND_PROTOCOLS wayland-protocols)
	endif()
93
	find_package(OpenGL COMPONENTS GLX)
Pete Black's avatar
Pete Black committed
94
95
	pkg_search_module(DBUS dbus-1)

96
	pkg_check_modules(SURVIVE IMPORTED_TARGET survive)
97
98
else()
	find_package(OpenGL)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
99
100
endif()

101
102
103
find_library(RT_LIBRARY rt)
if(ANDROID)
	find_library(ANDROID_LIBRARY android)
104
	find_library(ANDROID_LOG_LIBRARY log)
105
106
endif()

107
108
109
# This one is named differently because that's what CTest uses
option(BUILD_TESTING "Enable building of the test suite?" ON)

110
cmake_dependent_option(CMAKE_INTERPROCEDURAL_OPTIMIZATION "Enable inter-procedural (link-time) optimization" OFF "HAS_IPO" OFF)
111
112
113
cmake_dependent_option(XRT_HAVE_WAYLAND "Enable Wayland support" ON "WAYLAND_FOUND AND WAYLAND_SCANNER_FOUND AND WAYLAND_PROTOCOLS_FOUND" OFF)
cmake_dependent_option(XRT_HAVE_XLIB "Enable xlib support" ON "X11_FOUND" OFF)
cmake_dependent_option(XRT_HAVE_XCB "Enable xcb support" ON "XCB_FOUND" OFF)
114

115
cmake_dependent_option(XRT_HAVE_VULKAN "Enable Vulkan Graphics API support (also needed for compositor)" ON "VULKAN_FOUND" OFF)
116
117
cmake_dependent_option(XRT_HAVE_OPENGL "Enable OpenGL Graphics API support" ON "OPENGL_FOUND" OFF)
cmake_dependent_option(XRT_HAVE_OPENGLES "Enable OpenGL-ES Graphics API support" ON "OpenGLES_FOUND" OFF)
118
cmake_dependent_option(XRT_HAVE_EGL "Enable OpenGL on EGL Graphics API support" ON "EGL_FOUND; XRT_HAVE_OPENGL OR XRT_HAVE_OPENGLES" OFF)
119
cmake_dependent_option(XRT_HAVE_DBUS "Enable dbus support (for BLE support)" ON "DBUS_FOUND" OFF)
120
cmake_dependent_option(XRT_FEATURE_COMPOSITOR_MAIN "Build main compositor host functionality" ON "XRT_HAVE_VULKAN; XRT_HAVE_WAYLAND OR XRT_HAVE_XCB OR ANDROID" OFF)
121
cmake_dependent_option(XRT_FEATURE_OPENXR "Build OpenXR runtime target" ON "XRT_FEATURE_COMPOSITOR_MAIN" OFF)
122
option(XRT_FEATURE_SERVICE "Enable separate service module for OpenXR runtime" ON)
123
cmake_dependent_option(XRT_HAVE_SYSTEMD "Enable systemd support (for socket activation of service)" ON "Systemd_FOUND AND XRT_FEATURE_SERVICE" OFF)
124
125
cmake_dependent_option(XRT_INSTALL_SYSTEMD_UNIT_FILES "Install user unit files for systemd socket activation on installation" ON "XRT_HAVE_SYSTEMD" OFF)
cmake_dependent_option(XRT_INSTALL_ABSOLUTE_SYSTEMD_UNIT_FILES "Use an absolute path to monado-system in installed user unit files for systemd socket activation" ON "XRT_INSTALL_SYSTEMD_UNIT_FILES" OFF)
126
127
option(XRT_FEATURE_STEAMVR_PLUGIN "Build SteamVR plugin" ON)

128
129
130
131
132
133
134
135
136
137
if(NOT DEFINED XRT_FEATURE_OPENXR_LAYER_DEPTH)
	set(XRT_FEATURE_OPENXR_LAYER_DEPTH ON)
endif()
if(NOT DEFINED XRT_FEATURE_OPENXR_LAYER_CUBE)
	set(XRT_FEATURE_OPENXR_LAYER_CUBE OFF)
endif()
if(NOT DEFINED XRT_FEATURE_OPENXR_LAYER_CYLINDER)
	set(XRT_FEATURE_OPENXR_LAYER_CYLINDER ON)
endif()
if(NOT DEFINED XRT_FEATURE_OPENXR_LAYER_EQUIRECT)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
138
	set(XRT_FEATURE_OPENXR_LAYER_EQUIRECT ON)
139
endif()
140
141
142
if(NOT DEFINED XRT_FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY)
	set(XRT_FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY OFF)
endif()
143
144

# Most users won't touch these.
145
mark_as_advanced(XRT_FEATURE_COMPOSITOR_MAIN XRT_FEATURE_OPENXR)
146

147
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
148
149
	set(XRT_HAVE_LIBUDEV ON)
	set(XRT_HAVE_INTERNAL_HID ON)
150
else()
151
	cmake_dependent_option(XRT_HAVE_LIBUDEV "Enable libudev (used for device probing on Linux)" ON "UDEV_FOUND" OFF)
152
endif()
153
154
155
156
157
158
159
cmake_dependent_option(XRT_HAVE_LIBUSB "Enable libusb (used for most drivers)" ON "LIBUSB1_FOUND" OFF)
cmake_dependent_option(XRT_HAVE_JPEG "Enable jpeg code (used for some video drivers)" ON "JPEG_FOUND" OFF)
cmake_dependent_option(XRT_HAVE_OPENCV "Enable OpenCV backend" ON "OpenCV_FOUND" OFF)
cmake_dependent_option(XRT_HAVE_LIBUVC "Enable libuvc video driver" ON "LIBUVC_FOUND AND XRT_HAVE_LIBUSB" OFF)
cmake_dependent_option(XRT_HAVE_FFMPEG "Enable ffmpeg testing video driver" ON "FFMPEG_FOUND" OFF)
cmake_dependent_option(XRT_HAVE_SDL2 "Enable use of SDL2" ON "SDL2_FOUND AND XRT_HAVE_OPENGL" OFF)
cmake_dependent_option(XRT_HAVE_SYSTEM_CJSON "Enable cJSON from system, instead of bundled source" ON "CJSON_FOUND" OFF)
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
160

161

162
163
cmake_dependent_option(XRT_BUILD_DRIVER_PSVR "Enable PSVR HMD driver" ON "HIDAPI_FOUND" OFF)
cmake_dependent_option(XRT_BUILD_DRIVER_RS "Enable RealSense device driver" ON "realsense2_FOUND" OFF)
164
cmake_dependent_option(XRT_BUILD_DRIVER_VIVE "Enable driver for HTC Vive, Vive Pro, Valve Index, and their controllers" ON "ZLIB_FOUND AND XRT_HAVE_LINUX" OFF)
165
166
167
cmake_dependent_option(XRT_BUILD_DRIVER_OHMD "Enable OpenHMD driver" ON "OPENHMD_FOUND" OFF)
cmake_dependent_option(XRT_BUILD_DRIVER_DAYDREAM "Enable the Google Daydream View controller driver (BLE, via D-Bus)" ON "XRT_HAVE_DBUS" OFF)
cmake_dependent_option(XRT_BUILD_DRIVER_ARDUINO "Enable Arduino input device with BLE via via D-Bus" ON "XRT_HAVE_DBUS" OFF)
Pete Black's avatar
Pete Black committed
168

169
option(XRT_BUILD_DRIVER_DUMMY "Enable dummy driver" ON)
170
cmake_dependent_option(XRT_BUILD_DRIVER_REMOTE "Enable remote debugging driver" ON "XRT_HAVE_LINUX OR ANDROID" OFF)
171

172
173
174
175
176
# These all use the Monado internal hid wrapper.
cmake_dependent_option(XRT_BUILD_DRIVER_HDK "Enable HDK driver" ON "XRT_HAVE_INTERNAL_HID" OFF)
cmake_dependent_option(XRT_BUILD_DRIVER_PSMV "Enable Playstation Move driver" ON "XRT_HAVE_INTERNAL_HID" OFF)
cmake_dependent_option(XRT_BUILD_DRIVER_HYDRA "Enable Hydra driver" ON "XRT_HAVE_INTERNAL_HID" OFF)
cmake_dependent_option(XRT_BUILD_DRIVER_NS "Enable North Star driver" ON "XRT_HAVE_INTERNAL_HID" OFF)
177

178
179
# This one defaults to off, even if we find the deps.
cmake_dependent_option(XRT_BUILD_DRIVER_SURVIVE "Enable libsurvive driver" OFF "SURVIVE_FOUND" OFF)
180

181
182
cmake_dependent_option(XRT_BUILD_DRIVER_ANDROID "Enable Android sensors driver" ON "ANDROID" OFF)

183
184
# You can set this from a superproject to add a driver
# All drivers must be listed in here to be included in the generated header!
185
list(APPEND AVAILABLE_DRIVERS "ANDROID" ARDUINO DUMMY HDK HYDRA NS OHMD PSMV PSVR RS V4L2 VIVE DAYDREAM REMOTE SURVIVE)
186

187
188
189
190
191
192
193
194
195
196
197

# Package name needs to be known by the native code itself.
# Can be overridden from outside/command line
if(ANDROID AND NOT XRT_ANDROID_PACKAGE)
	if(XRT_FEATURE_SERVICE)
		set(XRT_ANDROID_PACKAGE "org.freedesktop.monado.openxr_runtime.out_of_process")
	else()
		set(XRT_ANDROID_PACKAGE "org.freedesktop.monado.openxr_runtime.in_process")
	endif()
endif()

198
199
200
###
# Flags
###
201

202
203
204
205
if(XRT_HAVE_OPENGLES AND NOT XRT_HAVE_EGL)
	message(FATAL_ERROR "XRT_HAVE_OPENGLES requires XRT_HAVE_EGL but XRT_HAVE_EGL is disabled")
endif()

206
if(XRT_HAVE_SDL2)
207
208
209
210
	# Arch work around
	if(NOT DEFINED SDL2_LIBRARIES)
		set(SDL2_LIBRARIES SDL2::SDL2)
	endif()
211
212
endif()

213
# Vulkan flags for the shared Vulkan code.
214
if(XRT_HAVE_XCB)
215
	set(VK_USE_PLATFORM_XCB_KHR TRUE)
216
endif()
217
if(XRT_HAVE_XCB AND XRT_HAVE_XLIB)
218
	set(VK_USE_PLATFORM_XLIB_XRANDR_EXT TRUE)
219
endif()
220
if(XRT_HAVE_WAYLAND)
221
	set(VK_USE_PLATFORM_WAYLAND_KHR TRUE)
222
endif()
223
224
225
if(ANDROID)
	set(VK_USE_PLATFORM_ANDROID_KHR TRUE)
endif()
226
227
228
if(WIN32)
	set(VK_USE_PLATFORM_WIN32_KHR TRUE)
endif()
229
230


231
if(NOT MSVC)
232
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wno-unused-parameter")
233
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror-implicit-function-declaration -Werror=incompatible-pointer-types")
Ryan Pavlik's avatar
Ryan Pavlik committed
234
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=int-conversion")
235
236
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Wno-unused-parameter")

237
238
239
240
	set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
	set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined")
endif()

241
242
243
# Default to PIC code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

244
245
246
247
# Describe IPO setting
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
	message(STATUS "Inter-procedural optimization enabled")
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
248
249
250
251
252
253
254

###
# Decend into madness.
###

add_subdirectory(src)
add_subdirectory(doc)
255
256
257
258
259

if(BUILD_TESTING)
    include(CTest)
    add_subdirectory(tests)
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
260
261

message(STATUS "#####----- Config -----#####")
262
263
message(STATUS "#    GIT_DESC:     ${GIT_DESC}")
message(STATUS "#")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
264
265
266
267
message(STATUS "#    WAYLAND:      ${XRT_HAVE_WAYLAND}")
message(STATUS "#    XLIB:         ${XRT_HAVE_XLIB}")
message(STATUS "#    XCB:          ${XRT_HAVE_XCB}")
message(STATUS "#    OPENGL:       ${XRT_HAVE_OPENGL}")
268
message(STATUS "#    OPENGLES:     ${XRT_HAVE_OPENGLES}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
269
270
271
272
273
274
275
276
277
278
279
message(STATUS "#    VULKAN:       ${XRT_HAVE_VULKAN}")
message(STATUS "#    EGL:          ${XRT_HAVE_EGL}")
message(STATUS "#    DBUS:         ${XRT_HAVE_DBUS}")
message(STATUS "#    LIBUSB:       ${XRT_HAVE_LIBUSB}")
message(STATUS "#    JPEG:         ${XRT_HAVE_JPEG}")
message(STATUS "#    OPENCV:       ${XRT_HAVE_OPENCV}")
message(STATUS "#    LIBUVC:       ${XRT_HAVE_LIBUVC}")
message(STATUS "#    FFMPEG:       ${XRT_HAVE_FFMPEG}")
message(STATUS "#    SDL2:         ${XRT_HAVE_SDL2}")
message(STATUS "#    SYSTEM_CJSON: ${XRT_HAVE_SYSTEM_CJSON}")
message(STATUS "#")
280
281
282
283
284
285
286
287
message(STATUS "#    FEATURE_COMPOSITOR_MAIN:              ${XRT_FEATURE_COMPOSITOR_MAIN}")
message(STATUS "#    FEATURE_SERVICE:                      ${XRT_FEATURE_SERVICE}")
message(STATUS "#    FEATURE_OPENXR:                       ${XRT_FEATURE_OPENXR}")
message(STATUS "#    FEATURE_OPENXR_LAYER_DEPTH:           ${XRT_FEATURE_OPENXR_LAYER_DEPTH}")
message(STATUS "#    FEATURE_OPENXR_LAYER_CUBE:            ${XRT_FEATURE_OPENXR_LAYER_CUBE}")
message(STATUS "#    FEATURE_OPENXR_LAYER_CYLINDER:        ${XRT_FEATURE_OPENXR_LAYER_CYLINDER}")
message(STATUS "#    FEATURE_OPENXR_LAYER_EQUIRECT:        ${XRT_FEATURE_OPENXR_LAYER_EQUIRECT}")
message(STATUS "#    FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY: ${XRT_FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY}")
288
message(STATUS "#    FEATURE_STEAMVR_PLUGIN:               ${XRT_FEATURE_STEAMVR_PLUGIN}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
289
message(STATUS "#")
290
message(STATUS "#    DRIVER_ANDROID:  ${XRT_BUILD_DRIVER_ANDROID}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
291
message(STATUS "#    DRIVER_ARDUINO:  ${XRT_BUILD_DRIVER_ARDUINO}")
292
message(STATUS "#    DRIVER_DAYDREAM: ${XRT_BUILD_DRIVER_DAYDREAM}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
293
294
295
296
message(STATUS "#    DRIVER_DUMMY:    ${XRT_BUILD_DRIVER_DUMMY}")
message(STATUS "#    DRIVER_HDK:      ${XRT_BUILD_DRIVER_HDK}")
message(STATUS "#    DRIVER_HYDRA:    ${XRT_BUILD_DRIVER_HYDRA}")
message(STATUS "#    DRIVER_NS:       ${XRT_BUILD_DRIVER_NS}")
297
298
299
300
message(STATUS "#    DRIVER_OHMD:     ${XRT_BUILD_DRIVER_OHMD}")
message(STATUS "#    DRIVER_PSMV:     ${XRT_BUILD_DRIVER_PSMV}")
message(STATUS "#    DRIVER_PSVR:     ${XRT_BUILD_DRIVER_PSVR}")
message(STATUS "#    DRIVER_RS:       ${XRT_BUILD_DRIVER_RS}")
301
message(STATUS "#    DRIVER_REMOTE:   ${XRT_BUILD_DRIVER_REMOTE}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
302
message(STATUS "#    DRIVER_SURVIVE:  ${XRT_BUILD_DRIVER_SURVIVE}")
303
message(STATUS "#    DRIVER_VIVE:     ${XRT_BUILD_DRIVER_VIVE}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
304
message(STATUS "#####----- Config -----#####")