OpenXR SDK编译介绍

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

...

猜你喜欢

转载自blog.csdn.net/weixin_41028555/article/details/132298460