OpenXR 编译指南可参考:https://blog.csdn.net/geyichongchujianghu/article/details/124672713
OpenXR SDK地址为:GitHub - KhronosGroup/OpenXR-SDK-Source: Sources for OpenXR loader, basic API layers, and example code.
Monado runtime地址为:Monado / Monado · GitLab
system broker地址为:Ryan Pavlik / openxr-android-broker · GitLab
1. hello_xr/CMakeLists.txt
file(GLOB LOCAL_HEADERS "*.h")-- GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件,变量存放在LOCAL_HEADERS变量中 file(GLOB LOCAL_SOURCE "*.cpp") file(GLOB VULKAN_SHADERS "vulkan_shaders/*.glsl") # For including compiled shaders include_directories(${CMAKE_CURRENT_BINARY_DIR})--将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。CMAKE_CURRENT_BINARY_DIR就是当前的build目录。hello_xr/build if(ANDROID) add_library(hello_xr MODULE ${LOCAL_SOURCE} ${LOCAL_HEADERS} ${VULKAN_SHADERS} $<TARGET_OBJECTS:android_native_app_glue>)--添加名为hello_xr的库,库的源文件可指定,也可用target_sources()后续指定。库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一。 target_link_libraries(hello_xr ${ANDROID_LIBRARY} ${ANDROID_LOG_LIBRARY})--链接给定目标和/或其依赖项时要使用的库或标志 else() add_executable(hello_xr ${LOCAL_SOURCE} ${LOCAL_HEADERS} ${VULKAN_SHADERS})--使用指定的源文件来生成目标可执行文件 endif() set_target_properties(hello_xr PROPERTIES FOLDER ${SAMPLES_FOLDER})--这个命令是设置目标的属性,设置属性FOLDER为${SAMPLES_FOLDER} source_group("Headers" FILES ${LOCAL_HEADERS})--任何明确指定的源文件都将放在组 <Headers> 中。相对路径是相对于当前源目录进行解释的。 source_group("Shaders" FILES ${VULKAN_SHADERS}) compile_glsl(run_hello_xr_glsl_compiles ${VULKAN_SHADERS}) add_dependencies(hello_xr generate_openxr_header run_hello_xr_glsl_compiles )--添加依赖 target_include_directories(hello_xr PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/src/common # for helper headers ${PROJECT_SOURCE_DIR}/external/include )--指定目标(exe或者so文件)需要包含的头文件路径。 if(GLSLANG_VALIDATOR AND NOT GLSLC_COMMAND) target_compile_definitions(hello_xr PRIVATE USE_GLSLANGVALIDATOR)--向target添加编译定义USE_GLSLANGVALIDATOR endif() if(Vulkan_FOUND) target_include_directories(hello_xr PRIVATE ${Vulkan_INCLUDE_DIRS} ) endif() target_link_libraries(hello_xr OpenXR::openxr_loader) if(TARGET openxr-gfxwrapper) target_link_libraries(hello_xr openxr-gfxwrapper) endif() ...
2. hello_xr/build.gradle
externalNativeBuild { --用于控制Native的编译 cmake { arguments '-DANDROID_STL=c++_shared', '-DBUILD_API_LAYERS=OFF', '-DBUILD_TESTS=ON', '-DBUILD_LOADER=ON', '-DBUILD_CONFORMANCE_TESTS=OFF', '-DBUILD_ALL_EXTENSIONS=ON' targets "openxr_loader", "hello_xr" } }如果要编译API_LAYER的话,则需要修改为如下:
arguments...
'-DBUILD_API_LAYERS=ON',
targets "openxr_loader", "hello_xr", "XrApiLayer_api_dump"
externalNativeBuild { --用于控制Native的编译 cmake { path "${project.repoRoot}/CMakeLists.txt"--指定CMakeLists文件 version "3.22.1"--cmake版本 } }
3. loader/CMakeLists.txt
由于太多,只挑重点的
# make cache variables for install destinations include(GNUInstallDirs)--include文件夹 # List of all files externally generated outside of the loader that the loader # needs to build with. set(LOADER_EXTERNAL_GEN_FILES ${COMMON_GENERATED_OUTPUT})--定义变量LOADER_EXTERNAL_GEN_FILES ,并赋值为${COMMON_GENERATED_OUTPUT} set(LOADER_EXTERNAL_GEN_DEPENDS ${COMMON_GENERATED_DEPENDS}) run_xr_xml_generate(loader_source_generator.py xr_generated_loader.hpp)-- run_xr_xml_generate(loader_source_generator.py xr_generated_loader.cpp) add_library(openxr_loader ${LIBRARY_TYPE} android_utilities.cpp android_utilities.h api_layer_interface.cpp api_layer_interface.hpp loader_core.cpp loader_instance.cpp loader_instance.hpp loader_logger.cpp loader_logger.hpp loader_logger_recorders.cpp loader_logger_recorders.hpp manifest_file.cpp manifest_file.hpp runtime_interface.cpp runtime_interface.hpp ${GENERATED_OUTPUT} ${PROJECT_SOURCE_DIR}/src/common/hex_and_handles.h ${PROJECT_SOURCE_DIR}/src/common/object_info.cpp ${PROJECT_SOURCE_DIR}/src/common/object_info.h ${PROJECT_SOURCE_DIR}/src/common/platform_utils.hpp ${LOADER_EXTERNAL_GEN_FILES} ${openxr_loader_RESOURCE_FILE} )--生成libopenxr_loader.so,并添加相关编译文件 set_target_properties(openxr_loader PROPERTIES FOLDER ${LOADER_FOLDER}) add_dependencies(openxr_loader generate_openxr_header xr_global_generated_files)--添加依赖 target_include_directories( openxr_loader # for OpenXR headers PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> PRIVATE ${PROJECT_SOURCE_DIR}/src/common # for generated dispatch table, common_config.h ${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR}/.. # for target-specific generated files ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> )--指定目标(exe或者so文件)需要包含的头文件路径,需要INTERFACE、PUBLIC和PRIVATE关键字来指定以下参数的范围 target_link_libraries( openxr_loader PRIVATE ${CMAKE_DL_LIBS} PUBLIC Threads::Threads )---需要链接的库 target_compile_definitions(openxr_loader PRIVATE ${OPENXR_ALL_SUPPORTED_DEFINES})--添加定义 if(ANDROID) target_link_libraries( openxr_loader PRIVATE ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY}) endif()target_compile_definitions(openxr_loader PRIVATE API_NAME="OpenXR")--修改定义 openxr_add_filesystem_utils(openxr_loader) set_target_properties(openxr_loader PROPERTIES DEBUG_POSTFIX "${OPENXR_DEBUG_POSTFIX}")--设置属性 ... elseif(ANDROID) set(JNIPP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../external/jnipp) set(JNIWRAPPER_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../external/android-jni-wrappers) file(GLOB ANDROID_WRAP_SOURCES ${JNIWRAPPER_ROOT}/wrap/*.cpp) set_target_properties(openxr_loader PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED TRUE) target_sources(openxr_loader PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/android_utilities.cpp ${CMAKE_CURRENT_SOURCE_DIR}/android_utilities.h ${ANDROID_WRAP_SOURCES} ${JNIPP_ROOT}/jnipp.cpp )--将源添加到target target_include_directories(openxr_loader PRIVATE ${JNIPP_ROOT} ${JNIWRAPPER_ROOT} ) endif()add_library(headers INTERFACE)--直接导入已经生成的库,cmake不会给这类library添加编译规则 target_include_directories(headers INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)install( TARGETS openxr_loader headers EXPORT openxr_loader_export RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT Loader LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT Loader ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT Loader )--将tunrimewe文件,库文件,头文件等安装到指定目录 export( EXPORT openxr_loader_export FILE ${CMAKE_CURRENT_BINARY_DIR}/OpenXRTargets.cmake NAMESPACE OpenXR:: )# Create aliases so that it can be used the same whether vendored as source or found with CMake. add_library(OpenXR::openxr_loader ALIAS openxr_loader)--设置库openxr_loader的别名OpenXR::openxr_loader add_library(OpenXR::headers ALIAS headers)--设置库headers的别名OpenXR::headers...