From 871395d5b51cbf869aacf0e272c03a4e6bd9d31a Mon Sep 17 00:00:00 2001
From: Ryan Pavlik <ryan.pavlik@collabora.com>
Date: Tue, 14 Jan 2020 12:21:23 -0600
Subject: [PATCH] build: Adjust meson build equivalently

---
 meson.build                            | 46 +++++++++++++++++++++-----
 meson_options.txt                      | 25 ++++++++++++++
 src/xrt/compositor/meson.build         | 39 ++++++++++++++++------
 src/xrt/state_trackers/oxr/meson.build |  6 ++--
 src/xrt/targets/openxr/meson.build     | 38 ++++++++++++++-------
 5 files changed, 119 insertions(+), 35 deletions(-)

diff --git a/meson.build b/meson.build
index a2610f391..c23bca33a 100644
--- a/meson.build
+++ b/meson.build
@@ -57,16 +57,16 @@ glslangValidator = find_program('glslangValidator')
 pthreads = cc.find_library('pthread', required: true)
 
 avcodec = dependency('libavcodec', required: false)
-egl     = dependency('egl')
+egl     = dependency('egl', required: get_option('egl'))
 egl     = egl.partial_dependency(includes: true)
 eigen3  = dependency('eigen3')
 libjpeg = dependency('libjpeg', required: false)
 libusb  = dependency('libusb-1.0', required: false)
-opengl  = dependency('gl')
+opengl  = dependency('gl', required: get_option('opengl'))
 sdl2    = dependency('sdl2', required: get_option('gui'))
 udev    = dependency('libudev', required: false)
 libuvc  = dependency('libuvc', required: false)
-vulkan  = dependency('vulkan')
+vulkan  = dependency('vulkan', required: true)
 zlib    = dependency('zlib', required: false)
 
 opencv = dependency('opencv4', required: false)
@@ -79,13 +79,13 @@ if get_option('tracking').enabled() or get_option('tracking').auto()
 endif
 
 # TODO: make these behave well when not present
-x11       = dependency('x11', required: false)
-xcb       = dependency('xcb', required: false)
-xcb_randr = dependency('xcb-randr', required: false)
+x11       = dependency('x11', required: get_option('xlib'))
+xcb       = dependency('xcb', required: get_option('xcb'))
+xcb_randr = dependency('xcb-randr', required: get_option('xcb'))
 
-wayland         = dependency('wayland-client', required: false)
-wayland_protos  = dependency('wayland-protocols', required: false)
-wayland_scanner = dependency('wayland-scanner', required: false)
+wayland         = dependency('wayland-client', required: get_option('wayland'))
+wayland_protos  = dependency('wayland-protocols', required: get_option('wayland'))
+wayland_scanner = dependency('wayland-scanner', required: get_option('wayland'))
 
 if wayland_scanner.found()
 	wayland_scanner = find_program(
@@ -94,6 +94,34 @@ if wayland_scanner.found()
 	)
 endif
 
+build_opengl = false
+if get_option('opengl').enabled() or get_option('opengl').auto()
+        build_opengl = opengl.found()
+endif
+
+
+build_egl = false
+if get_option('egl').enabled() or get_option('egl').auto()
+        build_egl = opengl.found() and egl.found()
+endif
+
+build_xlib = false
+if get_option('xlib').enabled() or get_option('xlib').auto()
+        build_xlib = x11.found()
+endif
+
+build_xcb = false
+if get_option('xcb').enabled() or get_option('xcb').auto()
+        build_xcb = xcb.found()
+endif
+
+build_xcb_xrandr_direct = build_xcb and build_xlib and xcb_randr.found()
+
+build_wayland = false
+if get_option('wayland').enabled() or get_option('wayland').auto()
+        build_wayland = wayland.found() and wayland_protos.found() and wayland_scanner.found()
+endif
+
 # For now required on Linux
 if target_machine.system() == 'linux'
 	v4l2_required = true
diff --git a/meson_options.txt b/meson_options.txt
index a41d8a36e..5780a175d 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -41,3 +41,28 @@ option('install-active-runtime',
 	type: 'boolean',
 	value: true,
 	description: 'Make Monado the default OpenXR runtime on install')
+
+option('opengl',
+	type: 'feature',
+	value: 'auto',
+	description: 'Enable OpenGL/GLES application support.')
+
+option('egl',
+	type: 'feature',
+	value: 'auto',
+	description: 'Enable EGL application support.')
+
+option('xlib',
+	type: 'feature',
+	value: 'auto',
+	description: 'Enable xlib application support. Also required for direct mode on X.')
+
+option('xcb',
+	type: 'feature',
+	value: 'auto',
+	description: 'Enable xcb support for direct mode on X.')
+
+option('wayland',
+	type: 'feature',
+	value: 'auto',
+	description: 'Enable support for Wayland rendering.')
diff --git a/src/xrt/compositor/meson.build b/src/xrt/compositor/meson.build
index e1fd5d9f7..b1926efca 100644
--- a/src/xrt/compositor/meson.build
+++ b/src/xrt/compositor/meson.build
@@ -7,11 +7,8 @@ subdir('shaders')
 compositor_deps = [aux, shaders, vulkan]
 
 compositor_srcs = [
-	'client/comp_gl_client.c',
-	'client/comp_gl_client.h',
 	'client/comp_vk_client.c',
 	'client/comp_vk_client.h',
-	'client/comp_gl_xlib_client.c',
 	'common/comp_vk.c',
 	'common/comp_vk.h',
 	'common/comp_vk_swapchain.h',
@@ -22,10 +19,6 @@ compositor_srcs = [
 	'main/comp_distortion.c',
 	'main/comp_distortion.h',
 	'main/comp_documentation.h',
-	'main/comp_glue_egl.c',
-	'main/comp_glue_gl.c',
-	'main/comp_glue_gles.c',
-	'main/comp_glue_gl_xlib.c',
 	'main/comp_glue_vk.c',
 	'main/comp_renderer.c',
 	'main/comp_renderer.h',
@@ -37,20 +30,44 @@ compositor_srcs = [
 
 compile_args = []
 
-if xcb.found()
+if build_xcb
 	compile_args += ['-DVK_USE_PLATFORM_XCB_KHR']
 	compositor_srcs += ['main/comp_window_xcb.cpp']
 	compositor_deps += [xcb]
 endif
 
-if xcb_randr.found()
-	# TODO: monado doesn't compile when xcb is present but not xrandr
+if build_xcb_xrandr_direct
 	compile_args += ['-DVK_USE_PLATFORM_XLIB_XRANDR_EXT']
 	compositor_srcs += ['main/comp_window_direct_mode.cpp']
 	compositor_deps += [xcb_randr]
 endif
 
-if wayland.found() and wayland_protos.found() and wayland_scanner.found()
+if build_opengl
+	compositor_srcs += [
+		'client/comp_gl_client.c',
+		'client/comp_gl_client.h',
+		'main/comp_glue_gl.c',
+		'main/comp_glue_gles.c',
+	]
+	compositor_deps += [opengl]
+endif
+
+if build_opengl and build_xlib
+	compositor_srcs += [
+		'client/comp_gl_xlib_client.c',
+		'main/comp_glue_gl_xlib.c',
+	]
+	compositor_deps += [x11]
+endif
+
+if build_egl
+	compositor_srcs += [
+		'main/comp_glue_egl.c',
+	]
+	compositor_deps += [egl]
+endif
+
+if build_wayland
 	wl_protos_src = []
 	wl_protos_headers = []
 	wl_protocol_dir = wayland_protos.get_pkgconfig_variable('pkgdatadir')
diff --git a/src/xrt/state_trackers/oxr/meson.build b/src/xrt/state_trackers/oxr/meson.build
index cfaeadd65..751753b3a 100644
--- a/src/xrt/state_trackers/oxr/meson.build
+++ b/src/xrt/state_trackers/oxr/meson.build
@@ -2,15 +2,15 @@
 # SPDX-License-Identifier: BSL-1.0
 
 compile_args = []
-if x11.found()
+if build_opengl
 	compile_args += ['-DXR_USE_GRAPHICS_API_OPENGL', '-DXR_USE_GRAPHICS_API_OPENGL_ES']
 endif
 
-if egl.found()
+if build_egl
 	compile_args += ['-DXR_USE_PLATFORM_EGL']
 endif
 
-if opengl.found()
+if build_xlib
 	compile_args += ['-DXR_USE_PLATFORM_XLIB']
 endif
 
diff --git a/src/xrt/targets/openxr/meson.build b/src/xrt/targets/openxr/meson.build
index cb47d33b4..c46710cfc 100644
--- a/src/xrt/targets/openxr/meson.build
+++ b/src/xrt/targets/openxr/meson.build
@@ -37,6 +37,31 @@ else
 	hack_src += 'oxr_sdl2_hack.c'
 endif
 
+openxr_deps = [
+		libusb,
+		libuvc,
+		pthreads,
+		targets_enabled,
+		udev,
+		vulkan,
+	]
+
+if build_opengl
+	openxr_deps += [opengl]
+endif
+
+if build_opengl and build_xlib
+	openxr_deps += [x11]
+endif
+
+if build_xcb
+	openxr_deps += [xcb]
+endif
+
+if build_xcb_xrandr_direct
+	openxr_deps += [xcb_randr]
+endif
+
 openxr = library(
 	runtime_target,
 	files(
@@ -61,18 +86,7 @@ openxr = library(
 		drv_include,
 		xrt_include,
 	] + hack_incs,
-	dependencies: [
-		libusb,
-		libuvc,
-		opengl,
-		pthreads,
-		targets_enabled,
-		udev,
-		vulkan,
-		x11,
-		xcb,
-		xcb_randr,
-	] + driver_deps + hack_deps,
+	dependencies: openxr_deps + driver_deps + hack_deps,
 	install: true,
 )
 
-- 
GitLab