CMakeLists.txt 12.7 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.3.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
48
49
50
51
52
53
54
55
56
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()

57
58
59
60
61
62
63
64
65
66
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()

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

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

Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
75
76

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

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

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

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

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

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

108
cmake_dependent_option(CMAKE_INTERPROCEDURAL_OPTIMIZATION "Enable inter-procedural (link-time) optimization" OFF "HAS_IPO" OFF)
109
110
111
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)
112

113
cmake_dependent_option(XRT_HAVE_VULKAN "Enable Vulkan Graphics API support (also needed for compositor)" ON "VULKAN_FOUND" OFF)
114
115
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)
116
cmake_dependent_option(XRT_HAVE_EGL "Enable OpenGL on EGL Graphics API support" ON "EGL_FOUND; XRT_HAVE_OPENGL OR XRT_HAVE_OPENGLES" OFF)
117
cmake_dependent_option(XRT_HAVE_DBUS "Enable dbus support (for BLE support)" ON "DBUS_FOUND" OFF)
118
cmake_dependent_option(XRT_FEATURE_COMPOSITOR_MAIN "Build main compositor host functionality" ON "XRT_HAVE_VULKAN; XRT_HAVE_WAYLAND OR XRT_HAVE_XCB" OFF)
119
120
121
cmake_dependent_option(XRT_FEATURE_OPENXR "Build OpenXR runtime target" ON "XRT_FEATURE_COMPOSITOR_MAIN" OFF)
cmake_dependent_option(XRT_FEATURE_SERVICE "Enable separate service module for OpenXR runtime" ON "XRT_FEATURE_COMPOSITOR_MAIN AND XRT_FEATURE_OPENXR" OFF)
cmake_dependent_option(XRT_HAVE_SYSTEMD "Enable systemd support (for socket activation of service)" ON "Systemd_FOUND AND XRT_FEATURE_SERVICE" OFF)
122
123
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)
124
125
126
127
128
129
130
131
132
133
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
134
	set(XRT_FEATURE_OPENXR_LAYER_EQUIRECT ON)
135
endif()
136
137
138
if(NOT DEFINED XRT_FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY)
	set(XRT_FEATURE_OPENXR_LAYER_EQUIRECT_LEGACY OFF)
endif()
139
140

# Most users won't touch these.
141
mark_as_advanced(XRT_FEATURE_COMPOSITOR_MAIN XRT_FEATURE_OPENXR)
142

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

157

158
159
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)
160
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)
161
162
163
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
164

165
option(XRT_BUILD_DRIVER_DUMMY "Enable dummy driver" ON)
166
option(XRT_BUILD_DRIVER_REMOTE "Enable remote debugging driver" ON)
167

168
169
170
171
172
# 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)
173

174
175
# 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)
176

177
178
# 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!
179
list(APPEND AVAILABLE_DRIVERS ARDUINO DUMMY HDK HYDRA NS OHMD PSMV PSVR RS V4L2 VIVE DAYDREAM REMOTE SURVIVE)
180

181
182
183
184
185
186
187
188
189
190
191

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

192
193
194
###
# Flags
###
195

196
197
198
199
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()

200
if(XRT_HAVE_SDL2)
201
202
203
204
	# Arch work around
	if(NOT DEFINED SDL2_LIBRARIES)
		set(SDL2_LIBRARIES SDL2::SDL2)
	endif()
205
206
endif()

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


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

231
232
233
234
	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()

235
236
237
# Default to PIC code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

238
239
240
241
# Describe IPO setting
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
	message(STATUS "Inter-procedural optimization enabled")
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
242
243
244
245
246
247
248

###
# Decend into madness.
###

add_subdirectory(src)
add_subdirectory(doc)
249
250
251
252
253

if(BUILD_TESTING)
    include(CTest)
    add_subdirectory(tests)
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
254
255

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