CMakeLists.txt 12.9 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.0)
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
128
129
130
131
132
133
134
135
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
136
	set(XRT_FEATURE_OPENXR_LAYER_EQUIRECT ON)
137
endif()
138
139
140
if(NOT DEFINED XRT_FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY)
	set(XRT_FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY OFF)
endif()
141
142

# Most users won't touch these.
143
mark_as_advanced(XRT_FEATURE_COMPOSITOR_MAIN XRT_FEATURE_OPENXR)
144

145
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
146
147
	set(XRT_HAVE_LIBUDEV ON)
	set(XRT_HAVE_INTERNAL_HID ON)
148
else()
149
	cmake_dependent_option(XRT_HAVE_LIBUDEV "Enable libudev (used for device probing on Linux)" ON "UDEV_FOUND" OFF)
150
endif()
151
152
153
154
155
156
157
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
158

159

160
161
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)
162
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)
163
164
165
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
166

167
option(XRT_BUILD_DRIVER_DUMMY "Enable dummy driver" ON)
168
option(XRT_BUILD_DRIVER_REMOTE "Enable remote debugging driver" ON)
169

170
171
172
173
174
# 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)
175

176
177
# 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)
178

179
180
cmake_dependent_option(XRT_BUILD_DRIVER_ANDROID "Enable Android sensors driver" ON "ANDROID" OFF)

181
182
# 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!
183
list(APPEND AVAILABLE_DRIVERS "ANDROID" ARDUINO DUMMY HDK HYDRA NS OHMD PSMV PSVR RS V4L2 VIVE DAYDREAM REMOTE SURVIVE)
184

185
186
187
188
189
190
191
192
193
194
195

# 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()

196
197
198
###
# Flags
###
199

200
201
202
203
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()

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

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


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

235
236
237
238
	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()

239
240
241
# Default to PIC code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

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

###
# Decend into madness.
###

add_subdirectory(src)
add_subdirectory(doc)
253
254
255
256
257

if(BUILD_TESTING)
    include(CTest)
    add_subdirectory(tests)
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
258
259

message(STATUS "#####----- Config -----#####")
260
261
message(STATUS "#    GIT_DESC:     ${GIT_DESC}")
message(STATUS "#")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
262
263
264
265
message(STATUS "#    WAYLAND:      ${XRT_HAVE_WAYLAND}")
message(STATUS "#    XLIB:         ${XRT_HAVE_XLIB}")
message(STATUS "#    XCB:          ${XRT_HAVE_XCB}")
message(STATUS "#    OPENGL:       ${XRT_HAVE_OPENGL}")
266
message(STATUS "#    OPENGLES:     ${XRT_HAVE_OPENGLES}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
267
268
269
270
271
272
273
274
275
276
277
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 "#")
278
279
280
281
282
283
284
285
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}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
286
message(STATUS "#")
287
message(STATUS "#    DRIVER_ANDROID:  ${XRT_BUILD_DRIVER_ANDROID}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
288
message(STATUS "#    DRIVER_ARDUINO:  ${XRT_BUILD_DRIVER_ARDUINO}")
289
message(STATUS "#    DRIVER_DAYDREAM: ${XRT_BUILD_DRIVER_DAYDREAM}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
290
291
292
293
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}")
294
295
296
297
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}")
298
message(STATUS "#    DRIVER_REMOTE:   ${XRT_BUILD_DRIVER_REMOTE}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
299
message(STATUS "#    DRIVER_SURVIVE:  ${XRT_BUILD_DRIVER_SURVIVE}")
300
message(STATUS "#    DRIVER_VIVE:     ${XRT_BUILD_DRIVER_VIVE}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
301
message(STATUS "#####----- Config -----#####")