瀏覽代碼

openxr: add package (#7743)

* openxr: add package

* Update xmake.lua

* Update xmake.lua

* fix shared build

* fix android

* NDK try to build static lib by linking against `android`

* Try to build shared library for `Windows`

* Try fix shared mingw

* try fix shared mingw

* try fix freebsd

* Try fix FreeBSD

* Add frameworks for MacOS X & iOS

* Support ppc ABI

* Update xmake.lua

* Update xmake.lua

---------

Co-authored-by: Saikari <[email protected]>
star9029 1 月之前
父節點
當前提交
3c521fb469

+ 26 - 0
packages/o/openxr/patches/1.1.49/fix-freebsd.diff

@@ -0,0 +1,26 @@
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 559b4dc..1d7e7bf 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -184,7 +184,7 @@ cmake_dependent_option(
+ if(WIN32)
+     add_definitions(-DXR_OS_WINDOWS)
+     add_definitions(-DNOMINMAX)
+-elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
++elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+     add_definitions(-DXR_OS_LINUX)
+ elseif(ANDROID)
+     add_definitions(-DXR_OS_ANDROID)
+diff --git a/src/loader/CMakeLists.txt b/src/loader/CMakeLists.txt
+index 073e07b..d21471a 100644
+--- a/src/loader/CMakeLists.txt
++++ b/src/loader/CMakeLists.txt
+@@ -154,7 +154,7 @@ if(ANDROID)
+     # Force 16KB page sizes for Android 15+ compatibility.
+     target_link_options(openxr_loader PRIVATE "-Wl,-z,max-page-size=16384")
+ 
+-elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
++elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+     set(FALLBACK_CONFIG_DIRS
+         "/etc/xdg"
+         CACHE

+ 44 - 0
packages/o/openxr/patches/1.1.49/fix-mingw.diff

@@ -0,0 +1,44 @@
+diff --git a/src/loader/CMakeLists.txt b/src/loader/CMakeLists.txt
+index 073e07b..23213b0 100644
+--- a/src/loader/CMakeLists.txt
++++ b/src/loader/CMakeLists.txt
+@@ -206,14 +206,14 @@ elseif(WIN32)
+         openxr_loader PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/loader.rc"
+     )
+ 
+-    if(MSVC)
+-        if(DYNAMIC_LOADER)
+-            target_sources(
+-                openxr_loader
+-                PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/openxr-loader.def"
+-            )
+-        endif()
++    if(DYNAMIC_LOADER)
++        target_sources(
++            openxr_loader
++            PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/openxr-loader.def"
++        )
++    endif()
+ 
++    if(MSVC)
+         if(DYNAMIC_LOADER AND NOT (CMAKE_SYSTEM_NAME STREQUAL "WindowsStore"))
+             # If building DLLs, force static CRT linkage
+             set_target_properties(
+@@ -360,7 +360,7 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
+             openxr_loader
+             PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/openxr-loader.expsym"
+         )
+-    else()
++    elseif(NOT MINGW)
+         set_target_properties(
+             openxr_loader
+             PROPERTIES
+@@ -402,7 +402,7 @@ export(
+ # Create alias so that it can be used the same whether vendored as source or found with CMake.
+ add_library(OpenXR::openxr_loader ALIAS openxr_loader)
+ 
+-if(WIN32 AND NOT INSTALL_TO_ARCHITECTURE_PREFIXES)
++if(MSVC AND NOT INSTALL_TO_ARCHITECTURE_PREFIXES)
+     set(TARGET_DESTINATION cmake)
+ else()
+     set(TARGET_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/openxr/)

+ 13 - 0
packages/o/openxr/patches/1.1.49/ppc-support.diff

@@ -0,0 +1,13 @@
+diff --git a/src/common/platform_utils.hpp b/src/common/platform_utils.hpp
+index 9715fc0..13d1dcc 100644
+--- a/src/common/platform_utils.hpp
++++ b/src/common/platform_utils.hpp
+@@ -55,6 +55,8 @@
+ #define XR_ARCH_ABI "mips"
+ #elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ #define XR_ARCH_ABI "ppc64"
++#elif defined(__powerpc__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++#define XR_ARCH_ABI "ppc"
+ #elif defined(__powerpc__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ #define XR_ARCH_ABI "ppc64el"
+ #elif defined(__s390x__) || defined(__zarch__)

+ 108 - 0
packages/o/openxr/xmake.lua

@@ -0,0 +1,108 @@
+package("openxr")
+    set_homepage("https://khronos.org/openxr")
+    set_description("Generated headers and sources for OpenXR loader.")
+    set_license("Apache-2.0")
+
+    add_urls("https://github.com/KhronosGroup/OpenXR-SDK.git", {alias = "git"})
+    add_urls("https://github.com/KhronosGroup/OpenXR-SDK/archive/refs/tags/release-$(version).tar.gz")
+
+    add_versions("1.1.49", "74e9260a1876b0540171571a09bad853302ec68a911200321be8b0591ca94111")
+
+    add_versions("git:1.1.49", "release-1.1.49")
+
+    add_patches("1.1.49", "patches/1.1.49/fix-mingw.diff", "8cc18048e3be5f64e6f2038303bcfff7137290cf60785ff795d3d57ef1a717b3")
+    add_patches("1.1.49", "patches/1.1.49/fix-freebsd.diff", "f4b63875a75609d2c4ce112f67e74713edb25eb238e9a544441f534a87b523b9")
+    add_patches("1.1.49", "patches/1.1.49/ppc-support.diff", "1bb423ec10110f9003803c63d50154f60ba063917c34f066f12e957eef4424c0")
+
+    add_configs("api_layers", {description = "Build the API layers.", default = false, type = "boolean"})
+
+    if is_plat("mingw") and is_subhost("msys") then
+        add_extsources("pacman::openxr-sdk")
+    elseif is_plat("linux") then
+        add_extsources("pacman::openxr", "apt::libopenxr-dev")
+    end
+
+    add_deps("cmake", "python 3.x", {kind = "binary"})
+    add_deps("jsoncpp")
+    if is_plat("linux", "cross", "bsd") then
+        add_deps("libx11")
+    elseif is_plat("android") then
+        add_deps("egl-headers")
+    end
+
+    if is_plat("windows", "mingw") then
+        add_syslinks("advapi32")
+    elseif is_plat("linux", "bsd") then
+        add_syslinks("pthread")
+    elseif is_plat("android") then
+        add_syslinks("log", "android")
+    elseif is_plat("macosx") then
+        add_frameworks("AppKit", "Foundation", "CoreGraphics")
+    elseif is_plat("iphoneos") then
+        add_frameworks("Foundation", "CoreGraphics", "OpenGLES")
+    end
+
+    on_install("!wasm", function (package)
+        io.replace("src/CMakeLists.txt", "set(CMAKE_POSITION_INDEPENDENT_CODE ON)", "", {plain = true})
+        if package:is_plat("mingw") then
+            io.replace("src/loader/openxr-loader.def", "LIBRARY", "LIBRARY libopenxr_loader.dll", {plain = true})
+        elseif package:is_plat("windows") then
+            local runtime
+            if package:has_runtime("MT") then
+                runtime = "MultiThreaded"
+            elseif package:has_runtime("MTd") then
+                runtime = "MultiThreadedDebug"
+            elseif package:has_runtime("MD") then
+                runtime = "MultiThreadedDLL"
+            elseif package:has_runtime("MDd") then
+                runtime = "MultiThreadedDebugDLL"
+            end
+            io.replace("src/loader/CMakeLists.txt", "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL", runtime, {plain = true})
+            io.replace("src/loader/CMakeLists.txt", "MultiThreaded$<$<CONFIG:Debug>:Debug>", runtime, {plain = true})
+        end
+
+        local configs = {
+            "-DBUILD_CONFORMANCE_TESTS=OFF",
+            "-DBUILD_TESTS=OFF",
+            "-DOPENXR_DEBUG_POSTFIX=''",
+            "-DBUILD_WITH_SYSTEM_JSONCPP=ON",
+        }
+        table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"))
+        table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
+        table.insert(configs, "-DDYNAMIC_LOADER=" .. (package:config("shared") and "ON" or "OFF"))
+        table.insert(configs, "-DBUILD_API_LAYERS=" .. (package:config("api_layers") and "ON" or "OFF"))
+
+        if package:is_plat("android") then
+            table.insert(configs, "-DINSTALL_TO_ARCHITECTURE_PREFIXES=ON")
+            os.vcp("include", package:installdir())
+        end
+        import("package.tools.cmake").install(package, configs, {packagedeps = "libx11"})
+    end)
+
+    on_test(function (package)
+        assert(package:check_cxxsnippets({test = [[
+            #include <openxr/openxr.h>
+            #include <iostream>
+            #include <cstring>
+
+            void test() {
+                XrInstanceCreateInfo createInfo = {};
+                createInfo.type = XR_TYPE_INSTANCE_CREATE_INFO;
+                strcpy(createInfo.applicationInfo.applicationName, "OpenXRTest");
+                createInfo.applicationInfo.applicationVersion = 1;
+                strcpy(createInfo.applicationInfo.engineName, "NoEngine");
+                createInfo.applicationInfo.engineVersion = 1;
+                createInfo.applicationInfo.apiVersion = XR_CURRENT_API_VERSION;
+
+                XrInstance instance = XR_NULL_HANDLE;
+                XrResult result = xrCreateInstance(&createInfo, &instance);
+
+                if (result == XR_SUCCESS) {
+                    std::cout << "OpenXR instance created successfully." << std::endl;
+                    xrDestroyInstance(instance);
+                } else {
+                    std::cerr << "Failed to create OpenXR instance. Error: " << result << std::endl;
+                }
+            }
+        ]]}, {configs = {languages = "c++11"}}))
+    end)