CMakeLists.txt 12.3 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
###
# Flags
###
184

185
186
187
188
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()

189
if(XRT_HAVE_SDL2)
190
191
192
193
	# Arch work around
	if(NOT DEFINED SDL2_LIBRARIES)
		set(SDL2_LIBRARIES SDL2::SDL2)
	endif()
194
195
endif()

196
# Vulkan flags for the shared Vulkan code.
197
if(XRT_HAVE_XCB)
198
	set(VK_USE_PLATFORM_XCB_KHR TRUE)
199
endif()
200
if(XRT_HAVE_XCB AND XRT_HAVE_XLIB)
201
	set(VK_USE_PLATFORM_XLIB_XRANDR_EXT TRUE)
202
endif()
203
if(XRT_HAVE_WAYLAND)
204
	set(VK_USE_PLATFORM_WAYLAND_KHR TRUE)
205
endif()
206
207
208
if(ANDROID)
	set(VK_USE_PLATFORM_ANDROID_KHR TRUE)
endif()
209
210
211
if(WIN32)
	set(VK_USE_PLATFORM_WIN32_KHR TRUE)
endif()
212
213


214
if(NOT MSVC)
215
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wno-unused-parameter")
216
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror-implicit-function-declaration -Werror=incompatible-pointer-types")
Ryan Pavlik's avatar
Ryan Pavlik committed
217
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=int-conversion")
218
219
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Wno-unused-parameter")

220
221
222
223
	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()

224
225
226
# Default to PIC code
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

227
228
229
230
# Describe IPO setting
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
	message(STATUS "Inter-procedural optimization enabled")
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
231
232
233
234
235
236
237

###
# Decend into madness.
###

add_subdirectory(src)
add_subdirectory(doc)
238
239
240
241
242

if(BUILD_TESTING)
    include(CTest)
    add_subdirectory(tests)
endif()
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
243
244

message(STATUS "#####----- Config -----#####")
245
246
message(STATUS "#    GIT_DESC:     ${GIT_DESC}")
message(STATUS "#")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
247
248
249
250
message(STATUS "#    WAYLAND:      ${XRT_HAVE_WAYLAND}")
message(STATUS "#    XLIB:         ${XRT_HAVE_XLIB}")
message(STATUS "#    XCB:          ${XRT_HAVE_XCB}")
message(STATUS "#    OPENGL:       ${XRT_HAVE_OPENGL}")
251
message(STATUS "#    OPENGLES:     ${XRT_HAVE_OPENGLES}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
252
253
254
255
256
257
258
259
260
261
262
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 "#")
263
264
265
266
267
268
269
270
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
271
272
message(STATUS "#")
message(STATUS "#    DRIVER_ARDUINO:  ${XRT_BUILD_DRIVER_ARDUINO}")
273
message(STATUS "#    DRIVER_DAYDREAM: ${XRT_BUILD_DRIVER_DAYDREAM}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
274
275
276
277
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}")
278
279
280
281
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}")
282
message(STATUS "#    DRIVER_REMOTE:   ${XRT_BUILD_DRIVER_REMOTE}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
283
message(STATUS "#    DRIVER_SURVIVE:  ${XRT_BUILD_DRIVER_SURVIVE}")
284
message(STATUS "#    DRIVER_VIVE:     ${XRT_BUILD_DRIVER_VIVE}")
Jakob Bornecrantz's avatar
Jakob Bornecrantz committed
285
message(STATUS "#####----- Config -----#####")