Skip to content

Commit 89d97b7

Browse files
authored
Merge pull request #149 from rpavlik/link-patches
Link patches
2 parents d4a83bc + 6c9705c commit 89d97b7

File tree

9 files changed

+363
-260
lines changed

9 files changed

+363
-260
lines changed

src/CMakeLists.txt

Lines changed: 112 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,37 @@ set(CMAKE_CXX_STANDARD 14)
2020
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
2121
set(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
2447
option(BUILD_LOADER "Build loader" ON)
2548
option(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+
)
2754
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
2855
option(DYNAMIC_LOADER "Build the loader as a .dll library" OFF)
2956
else()
@@ -40,10 +67,9 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/conformance" AND NOT CMAKE_SYSTEM_NAME ST
4067
endif()
4168
include(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
4975
if(WIN32)
@@ -52,6 +78,19 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
5278
add_definitions(-DXR_OS_LINUX)
5379
endif()
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.
5796
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
@@ -60,48 +99,49 @@ endif()
6099

61100
# Several files use these compile-time platform switches
62101
if(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)
76115
endif()
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)
89120
endif()
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)
93128
endif()
94129

95130
# Find glslc shader compiler.
96131
# On Android, the NDK includes the binary, so no external dependency.
97132
if(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+
)
99139
else()
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})
101142
endif()
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}")
105145
else()
106146
message(STATUS "Could NOT find glslc, using precompiled .spv files")
107147
endif()
@@ -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

135172
endfunction()
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-
144174
if(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
155185
add_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

161190
add_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.
168197
if(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+
)
170201
else()
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+
)
172205
endif()
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.
207244
macro(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
)
217263
endmacro()
218264

@@ -221,13 +267,13 @@ set(GENERATED_OUTPUT)
221267
set(GENERATED_DEPENDS)
222268
run_xr_xml_generate(utility_source_generator.py xr_generated_dispatch_table.h)
223269
run_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})
227271
set_target_properties(xr_global_generated_files PROPERTIES FOLDER ${CODEGEN_FOLDER})
228272

229273
set(COMMON_GENERATED_OUTPUT ${GENERATED_OUTPUT})
230274

275+
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
276+
231277
if(BUILD_LOADER)
232278
add_subdirectory(loader)
233279
endif()
@@ -243,6 +289,3 @@ endif()
243289
if(BUILD_CONFORMANCE_TESTS)
244290
add_subdirectory(conformance)
245291
endif()
246-
247-
248-

src/api_layers/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ add_library(XrApiLayer_api_dump SHARED
6666
)
6767
set_target_properties(XrApiLayer_api_dump PROPERTIES FOLDER ${API_LAYERS_FOLDER})
6868

69+
target_link_libraries(XrApiLayer_api_dump PRIVATE openxr-all-supported)
6970
add_dependencies(XrApiLayer_api_dump
7071
generate_openxr_header
7172
xr_global_generated_files
@@ -128,6 +129,7 @@ add_library(XrApiLayer_core_validation SHARED
128129
)
129130
set_target_properties(XrApiLayer_core_validation PROPERTIES FOLDER ${API_LAYERS_FOLDER})
130131

132+
target_link_libraries(XrApiLayer_core_validation PRIVATE openxr-all-supported)
131133
add_dependencies(XrApiLayer_core_validation
132134
generate_openxr_header
133135
xr_global_generated_files

0 commit comments

Comments
 (0)