@@ -20,10 +20,37 @@ set(CMAKE_CXX_STANDARD 14)
2020set (CMAKE_POSITION_INDEPENDENT_CODE ON )
2121set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR} /cmake" )
2222
23- # All options defined here
23+ ### Dependencies
24+ set (OpenGL_GL_PREFERENCE GLVND)
25+ find_package (OpenGL)
26+ if (OPENGL_FOUND)
27+ add_definitions (-DXR_USE_GRAPHICS_API_OPENGL)
28+ elseif (BUILD_ALL_EXTENSIONS)
29+ message (FATAL_ERROR "OpenGL not found" )
30+ endif ()
31+
32+ if (NOT CMAKE_VERSION VERSION_LESS 3.7.0)
33+ # Find the Vulkan headers
34+ find_package (VulkanHeaders)
35+ find_package (Vulkan)
36+ endif ()
37+ if (VulkanHeaders_FOUND)
38+ add_definitions (-DXR_USE_GRAPHICS_API_VULKAN)
39+ elseif (BUILD_ALL_EXTENSIONS)
40+ message (FATAL_ERROR "Vulkan headers not found" )
41+ endif ()
42+
43+ find_package (Threads REQUIRED)
44+ find_package (JsonCpp)
45+
46+ ### All options defined here
2447option (BUILD_LOADER "Build loader" ON )
2548option (BUILD_ALL_EXTENSIONS "Build loader and layers with all extensions" OFF )
26- option (BUILD_LOADER_WITH_EXCEPTION_HANDLING "Enable exception handling in the loader. Leave this on unless your standard library is built to not throw." ON )
49+ option (
50+ BUILD_LOADER_WITH_EXCEPTION_HANDLING
51+ "Enable exception handling in the loader. Leave this on unless your standard library is built to not throw."
52+ ON
53+ )
2754if (CMAKE_SYSTEM_NAME STREQUAL "Windows" )
2855 option (DYNAMIC_LOADER "Build the loader as a .dll library" OFF )
2956else ()
@@ -40,10 +67,9 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/conformance" AND NOT CMAKE_SYSTEM_NAME ST
4067endif ()
4168include (CMakeDependentOption)
4269
43- find_package (JsonCpp)
44- cmake_dependent_option(BUILD_WITH_SYSTEM_JSONCPP "Use system jsoncpp instead of vendored source" ON
45- "JSONCPP_FOUND" OFF )
46-
70+ cmake_dependent_option(
71+ BUILD_WITH_SYSTEM_JSONCPP "Use system jsoncpp instead of vendored source" ON "JSONCPP_FOUND" OFF
72+ )
4773
4874# Several files use these compile-time OS switches
4975if (WIN32 )
@@ -52,6 +78,19 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
5278 add_definitions (-DXR_OS_LINUX)
5379endif ()
5480
81+ # This is a little helper library for setting up OpenGL
82+ if (OPENGL_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR} /common/gfxwrapper_opengl.c" )
83+ add_library (openxr-gfxwrapper STATIC common/gfxwrapper_opengl.c common/gfxwrapper_opengl.h)
84+ target_include_directories (openxr-gfxwrapper PUBLIC ${PROJECT_SOURCE_DIR} /external/include )
85+ if (TARGET OpenGL::OpenGL)
86+ target_link_libraries (openxr-gfxwrapper PUBLIC OpenGL::OpenGL)
87+ elseif (TARGET OpenGL::GL)
88+ target_link_libraries (openxr-gfxwrapper PUBLIC OpenGL::GL)
89+ else ()
90+ target_link_libraries (openxr-gfxwrapper PUBLIC ${OPENGL_LIBRARIES} )
91+ endif ()
92+ endif ()
93+
5594# Determine the presentation backend for Linux systems.
5695# Use an include because the code is pretty big.
5796if (CMAKE_SYSTEM_NAME STREQUAL "Linux" )
@@ -60,48 +99,49 @@ endif()
6099
61100# Several files use these compile-time platform switches
62101if (WIN32 )
63- add_definitions ( -DXR_USE_PLATFORM_WIN32 )
64- elseif ( PRESENTATION_BACKEND MATCHES "xlib" )
65- add_definitions ( -DXR_USE_PLATFORM_XLIB )
66- elseif ( PRESENTATION_BACKEND MATCHES "xcb" )
67- add_definitions ( -DXR_USE_PLATFORM_XCB )
102+ add_definitions (-DXR_USE_PLATFORM_WIN32)
103+ elseif (PRESENTATION_BACKEND MATCHES "xlib" )
104+ add_definitions (-DXR_USE_PLATFORM_XLIB)
105+ elseif (PRESENTATION_BACKEND MATCHES "xcb" )
106+ add_definitions (-DXR_USE_PLATFORM_XCB)
68107
69108 # TODO remove once conformance supports XCB
70109 set (BUILD_CONFORMANCE_TESTS OFF )
71- elseif ( PRESENTATION_BACKEND MATCHES "wayland" )
72- add_definitions ( -DXR_USE_PLATFORM_WAYLAND )
110+ elseif (PRESENTATION_BACKEND MATCHES "wayland" )
111+ add_definitions (-DXR_USE_PLATFORM_WAYLAND)
73112
74113 # TODO remove once conformance supports Wayland
75114 set (BUILD_CONFORMANCE_TESTS OFF )
76115endif ()
77116
78- # Enable graphics API available to the build.
79- if (NOT CMAKE_VERSION VERSION_LESS 3.7.0)
80- # Find the Vulkan headers
81- find_package (VulkanHeaders)
82- if (VulkanHeaders_FOUND)
83- add_definitions (-DXR_USE_GRAPHICS_API_VULKAN)
84- endif ()
85- # Find the Vulkan loader.
86- find_package (Vulkan)
87- # To use simply include ${Vulkan_LIBRARY} in your target_link_library or
88- # wherever you normally link your library files to your target.
117+ add_library (openxr-all -supported INTERFACE )
118+ if (BUILD_WITH_XLIB_HEADERS)
119+ target_compile_definitions (openxr-all -supported INTERFACE XR_USE_PLATFORM_XLIB)
89120endif ()
90121
91- if (BUILD_ALL_EXTENSIONS AND NOT VulkanHeaders_FOUND)
92- message (FATAL_ERROR "Vulkan headers not found" )
122+ if (BUILD_WITH_XCB_HEADERS)
123+ target_compile_definitions (openxr-all -supported INTERFACE XR_USE_PLATFORM_XCB)
124+ endif ()
125+
126+ if (BUILD_WITH_WAYLAND_HEADERS)
127+ target_compile_definitions (openxr-all -supported INTERFACE XR_USE_PLATFORM_WAYLAND)
93128endif ()
94129
95130# Find glslc shader compiler.
96131# On Android, the NDK includes the binary, so no external dependency.
97132if (ANDROID)
98- file (GLOB glslc-folders ${ANDROID_NDK} /shader-tools/*)
133+ file (GLOB glslc_folders ${ANDROID_NDK} /shader-tools/*)
134+ find_program (
135+ GLSL_COMPILER glslc
136+ PATHS ${glslc_folders}
137+ NO_DEFAULT_PATH
138+ )
99139else ()
100- file (GLOB glslc-folders $ENV{VULKAN_SDK} /*)
140+ file (GLOB glslc_folders $ENV{VULKAN_SDK} /*)
141+ find_program (GLSL_COMPILER glslc PATHS ${glslc_folders} )
101142endif ()
102- find_program (CMAKE_GLSL_COMPILER glslc PATHS ${glslc-folders} NO_DEFAULT_PATH)
103- if (CMAKE_GLSL_COMPILER)
104- message (STATUS "Found glslc: ${CMAKE_GLSL_COMPILER} " )
143+ if (GLSL_COMPILER)
144+ message (STATUS "Found glslc: ${GLSL_COMPILER} " )
105145else ()
106146 message (STATUS "Could NOT find glslc, using precompiled .spv files" )
107147endif ()
@@ -111,11 +151,11 @@ function(compile_glsl run_target_name)
111151 foreach (in_file IN LISTS ARGN)
112152 get_filename_component (glsl_stage ${in_file} NAME_WE )
113153 set (out_file ${CMAKE_CURRENT_BINARY_DIR} /${glsl_stage} .spv)
114- if (CMAKE_GLSL_COMPILER )
154+ if (GLSL_COMPILER )
115155 # Run glslc if we can find it
116156 add_custom_command (
117157 OUTPUT ${out_file}
118- COMMAND ${CMAKE_GLSL_COMPILER } -mfmt=c -fshader-stage=${glsl_stage} ${in_file} -o ${out_file}
158+ COMMAND ${GLSL_COMPILER } -mfmt=c -fshader-stage=${glsl_stage} ${in_file} -o ${out_file}
119159 DEPENDS ${in_file}
120160 )
121161 else ()
@@ -126,21 +166,11 @@ function(compile_glsl run_target_name)
126166 endif ()
127167 list (APPEND glsl_output_files ${out_file} )
128168 endforeach ()
129- add_custom_target (
130- ${run_target_name} ALL
131- DEPENDS ${glsl_output_files}
132- )
133- set_target_properties (${run_target_name} PROPERTIES FOLDER ${HELPER_FOLDER} )
169+ add_custom_target (${run_target_name} ALL DEPENDS ${glsl_output_files} )
170+ set_target_properties (${run_target_name} PROPERTIES FOLDER ${HELPER_FOLDER} )
134171
135172endfunction ()
136173
137- find_package (OpenGL)
138- if (OPENGL_FOUND)
139- add_definitions (-DXR_USE_GRAPHICS_API_OPENGL)
140- elseif (BUILD_ALL_EXTENSIONS)
141- message (FATAL_ERROR "OpenGL not found" )
142- endif ()
143-
144174if (WIN32 )
145175 add_definitions (-DXR_USE_GRAPHICS_API_D3D11)
146176 add_definitions (-DXR_USE_GRAPHICS_API_D3D12)
@@ -155,8 +185,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/common_config.h.in ${CMAKE_CURRENT_BI
155185add_definitions (-DOPENXR_HAVE_COMMON_CONFIG)
156186
157187# Be able to find pre-generated files, if used.
158- include_directories (${CMAKE_CURRENT_SOURCE_DIR} /../include
159- ${CMAKE_CURRENT_SOURCE_DIR} )
188+ include_directories (${CMAKE_CURRENT_SOURCE_DIR} /../include ${CMAKE_CURRENT_SOURCE_DIR} )
160189
161190add_definitions (-DXR_USE_TIMESPEC)
162191
@@ -166,9 +195,13 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/version.cmake)
166195# Path separators ( : or ; ) are not handled well in CMake.
167196# This seems like a reasonable approach.
168197if (WIN32 )
169- set (CODEGEN_PYTHON_PATH "${PROJECT_SOURCE_DIR} /specification/scripts;${PROJECT_SOURCE_DIR} /src/scripts;$ENV{PYTHONPATH} " )
198+ set (CODEGEN_PYTHON_PATH
199+ "${PROJECT_SOURCE_DIR} /specification/scripts;${PROJECT_SOURCE_DIR} /src/scripts;$ENV{PYTHONPATH} "
200+ )
170201else ()
171- set (CODEGEN_PYTHON_PATH "${PROJECT_SOURCE_DIR} /specification/scripts:${PROJECT_SOURCE_DIR} /src/scripts:$ENV{PYTHONPATH} " )
202+ set (CODEGEN_PYTHON_PATH
203+ "${PROJECT_SOURCE_DIR} /specification/scripts:${PROJECT_SOURCE_DIR} /src/scripts:$ENV{PYTHONPATH} "
204+ )
172205endif ()
173206
174207# General code generation macro used by several targets.
@@ -179,22 +212,26 @@ macro(run_xr_xml_generate dependency output)
179212 list (APPEND GENERATED_OUTPUT "${CMAKE_CURRENT_SOURCE_DIR} /${output} " )
180213 else ()
181214 if (NOT PYTHON_EXECUTABLE)
182- message (FATAL_ERROR "Python 3 not found, but pre-generated ${CMAKE_CURRENT_SOURCE_DIR} /${output} not found" )
215+ message (
216+ FATAL_ERROR
217+ "Python 3 not found, but pre-generated ${CMAKE_CURRENT_SOURCE_DIR} /${output} not found"
218+ )
183219 endif ()
184- add_custom_command (OUTPUT ${output}
185- COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH} "
220+ add_custom_command (
221+ OUTPUT ${output}
222+ COMMAND
223+ ${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH} "
186224 ${PYTHON_EXECUTABLE}
187- ${PROJECT_SOURCE_DIR} /src/scripts/src_genxr.py
188- -registry ${PROJECT_SOURCE_DIR} /specification/registry/xr.xml
189- ${output}
225+ ${PROJECT_SOURCE_DIR} /src/scripts/src_genxr.py
226+ -registry ${PROJECT_SOURCE_DIR} /specification/registry/xr.xml
227+ ${output}
190228 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
191- DEPENDS
192- "${PROJECT_SOURCE_DIR} /specification/registry/xr.xml"
229+ DEPENDS "${PROJECT_SOURCE_DIR} /specification/registry/xr.xml"
193230 "${PROJECT_SOURCE_DIR} /specification/scripts/generator.py"
194231 "${PROJECT_SOURCE_DIR} /specification/scripts/reg.py"
195232 "${PROJECT_SOURCE_DIR} /src/scripts/${dependency} "
196233 "${PROJECT_SOURCE_DIR} /src/scripts/src_genxr.py"
197- ${ARGN}
234+ ${ARGN}
198235 COMMENT "Generating ${output} using ${PYTHON_EXECUTABLE} on ${dependency} "
199236 )
200237 set_source_files_properties (${output} PROPERTIES GENERATED TRUE )
@@ -205,14 +242,23 @@ endmacro()
205242
206243# Layer JSON generation macro used by several targets.
207244macro (gen_xr_layer_json filename layername libfile version desc genbad)
208- add_custom_command (OUTPUT ${filename}
209- COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH} "
245+ add_custom_command (
246+ OUTPUT ${filename}
247+ COMMAND
248+ ${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH} "
210249 ${PYTHON_EXECUTABLE}
211- ${PROJECT_SOURCE_DIR} /src/scripts/generate_api_layer_manifest.py
212- -f ${filename} -n ${layername} -l ${libfile} -a ${MAJOR} .${MINOR} -v ${version} ${genbad} -d ${desc}
250+ ${PROJECT_SOURCE_DIR} /src/scripts/generate_api_layer_manifest.py
251+ -f ${filename}
252+ -n ${layername}
253+ -l ${libfile}
254+ -a ${MAJOR} .${MINOR}
255+ -v ${version}
256+ ${genbad}
257+ -d ${desc}
213258 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
214259 DEPENDS ${PROJECT_SOURCE_DIR} /src/scripts/generate_api_layer_manifest.py
215- COMMENT "Generating API Layer JSON ${filename} using -f ${filename} -n ${layername} -l ${libfile} -a ${MAJOR} .${MINOR} -v ${version} ${genbad} -d ${desc} "
260+ COMMENT
261+ "Generating API Layer JSON ${filename} using -f ${filename} -n ${layername} -l ${libfile} -a ${MAJOR} .${MINOR} -v ${version} ${genbad} -d ${desc} "
216262 )
217263endmacro ()
218264
@@ -221,13 +267,13 @@ set(GENERATED_OUTPUT)
221267set (GENERATED_DEPENDS)
222268run_xr_xml_generate(utility_source_generator.py xr_generated_dispatch_table.h)
223269run_xr_xml_generate(utility_source_generator.py xr_generated_dispatch_table.c)
224- add_custom_target (xr_global_generated_files DEPENDS
225- ${GENERATED_DEPENDS}
226- )
270+ add_custom_target (xr_global_generated_files DEPENDS ${GENERATED_DEPENDS} )
227271set_target_properties (xr_global_generated_files PROPERTIES FOLDER ${CODEGEN_FOLDER} )
228272
229273set (COMMON_GENERATED_OUTPUT ${GENERATED_OUTPUT} )
230274
275+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
276+
231277if (BUILD_LOADER)
232278 add_subdirectory (loader)
233279endif ()
@@ -243,6 +289,3 @@ endif()
243289if (BUILD_CONFORMANCE_TESTS)
244290 add_subdirectory (conformance)
245291endif ()
246-
247-
248-
0 commit comments