From 3d51b10bcb9b0ba5837b2d49955389ee19b81a15 Mon Sep 17 00:00:00 2001
From: Lubosz Sarnecki <lubosz@gmail.com>
Date: Sat, 25 May 2024 11:56:45 +0200
Subject: [PATCH] ports: Add openxr-loader.

Copy from vcpkg repository.
Add OpenXR to hifi-client-deps.
---
 cmake/ports/hifi-client-deps/CONTROL          |  2 +-
 cmake/ports/openxr-loader/fix-jinja2.patch    | 23 ++++++
 .../fix-openxr-sdk-jsoncpp.patch              | 30 +++++++
 cmake/ports/openxr-loader/portfile.cmake      | 79 +++++++++++++++++++
 .../python3_8_compatibility.patch             | 13 +++
 cmake/ports/openxr-loader/vcpkg.json          | 27 +++++++
 6 files changed, 173 insertions(+), 1 deletion(-)
 create mode 100644 cmake/ports/openxr-loader/fix-jinja2.patch
 create mode 100644 cmake/ports/openxr-loader/fix-openxr-sdk-jsoncpp.patch
 create mode 100644 cmake/ports/openxr-loader/portfile.cmake
 create mode 100644 cmake/ports/openxr-loader/python3_8_compatibility.patch
 create mode 100644 cmake/ports/openxr-loader/vcpkg.json

diff --git a/cmake/ports/hifi-client-deps/CONTROL b/cmake/ports/hifi-client-deps/CONTROL
index afee6a5d48..c951768a4d 100644
--- a/cmake/ports/hifi-client-deps/CONTROL
+++ b/cmake/ports/hifi-client-deps/CONTROL
@@ -1,4 +1,4 @@
 Source: hifi-client-deps
 Version: 0.1
 Description: Collected dependencies for High Fidelity applications
-Build-Depends: hifi-deps, aristo (windows), glslang, liblo (windows), nlohmann-json, openvr ((linux&!arm)|windows), quazip (!android), sdl2 (!android), spirv-cross (!android), spirv-tools (!android), sranipal (windows), vulkanmemoryallocator, discord-rpc (!android)
+Build-Depends: hifi-deps, aristo (windows), glslang, liblo (windows), nlohmann-json, openvr ((linux&!arm)|windows), openxr-loader, quazip (!android), sdl2 (!android), spirv-cross (!android), spirv-tools (!android), sranipal (windows), vulkanmemoryallocator, discord-rpc (!android)
diff --git a/cmake/ports/openxr-loader/fix-jinja2.patch b/cmake/ports/openxr-loader/fix-jinja2.patch
new file mode 100644
index 0000000000..5d77cb4e46
--- /dev/null
+++ b/cmake/ports/openxr-loader/fix-jinja2.patch
@@ -0,0 +1,23 @@
+From d80c7dc3f4810fc49e4444590d39ef71e8a9b01c Mon Sep 17 00:00:00 2001
+From: Adam Johnson <AdamJohnso@gmail.com>
+Date: Sat, 19 Feb 2022 19:42:31 -0500
+Subject: [PATCH] Fix bad import in jinja2
+
+---
+ external/python/jinja2/utils.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/external/python/jinja2/utils.py b/external/python/jinja2/utils.py
+index db9c5d06..f198e3ef 100644
+--- a/external/python/jinja2/utils.py
++++ b/external/python/jinja2/utils.py
+@@ -639,4 +639,8 @@ def __repr__(self):
+ 
+ 
+ # Imported here because that's where it was in the past
+-from markupsafe import Markup, escape, soft_unicode
++from markupsafe import Markup, escape
++try:
++    from markupsafe import soft_unicode
++except ImportError:
++    from markupsafe import soft_str as soft_unicode
diff --git a/cmake/ports/openxr-loader/fix-openxr-sdk-jsoncpp.patch b/cmake/ports/openxr-loader/fix-openxr-sdk-jsoncpp.patch
new file mode 100644
index 0000000000..758d55e0f8
--- /dev/null
+++ b/cmake/ports/openxr-loader/fix-openxr-sdk-jsoncpp.patch
@@ -0,0 +1,30 @@
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index c75b145..386494c 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -89,7 +89,7 @@ if(NOT VULKAN_INCOMPATIBLE)
+ endif()
+ 
+ find_package(Threads REQUIRED)
+-find_package(JsonCpp)
++find_package(jsoncpp CONFIG REQUIRED)
+ 
+ ### All options defined here
+ option(BUILD_LOADER "Build loader" ON)
+diff --git a/src/loader/CMakeLists.txt b/src/loader/CMakeLists.txt
+index 6a88cf4..0821a3d 100644
+--- a/src/loader/CMakeLists.txt
++++ b/src/loader/CMakeLists.txt
+@@ -68,7 +68,11 @@ add_library(openxr_loader ${LIBRARY_TYPE}
+     ${openxr_loader_RESOURCE_FILE}
+ )
+ if(BUILD_WITH_SYSTEM_JSONCPP)
+-    target_link_libraries(openxr_loader PRIVATE JsonCpp::JsonCpp)
++    if(BUILD_SHARED_LIBS)
++        target_link_libraries(openxr_loader PRIVATE jsoncpp_lib)
++    else()
++        target_link_libraries(openxr_loader PRIVATE jsoncpp_static)
++    endif()
+ else()
+     target_sources(openxr_loader
+         PRIVATE
diff --git a/cmake/ports/openxr-loader/portfile.cmake b/cmake/ports/openxr-loader/portfile.cmake
new file mode 100644
index 0000000000..4d1127e56e
--- /dev/null
+++ b/cmake/ports/openxr-loader/portfile.cmake
@@ -0,0 +1,79 @@
+
+vcpkg_from_github(
+    OUT_SOURCE_PATH SOURCE_PATH
+    REPO KhronosGroup/OpenXR-SDK
+    REF "release-${VERSION}"
+    SHA512 6efc7596e707f95366dbcdbac9bd7d0c20735a2175b4edf56a9e8a112cf0ab8b664069fe942313164a37119032ddbf5671bc88ab5f276005dd36e4a4dabba1c7
+    HEAD_REF master
+    PATCHES
+        fix-openxr-sdk-jsoncpp.patch
+)
+
+vcpkg_from_github(
+    OUT_SOURCE_PATH SDK_SOURCE_PATH
+    REPO KhronosGroup/OpenXR-SDK-Source
+    REF "release-${VERSION}"
+    SHA512 04bdb0f16078209b5edd175a3396f70e1ceb8cfa382c65b8fda388e565480e3844daf68e0d987e72ed8c21d3148af0b41a2170911ec1660565887e0e5ae6d2bf
+    HEAD_REF master
+    PATCHES
+        fix-openxr-sdk-jsoncpp.patch
+        fix-jinja2.patch
+)
+
+vcpkg_from_github(
+    OUT_SOURCE_PATH HPP_SOURCE_PATH
+    REPO KhronosGroup/OpenXR-hpp
+    REF 63db9919822f8af6f7bf7416ba6a015d4617202e
+    SHA512 9e768f485d1631f8e74f35f028a64e2d64e33d362c53ae1c54427a10786e3befdd24089927319aa1a4b4c3e010247bd6cb3394bcee460c467c637ab6bc7bec90
+    HEAD_REF master
+    PATCHES
+        python3_8_compatibility.patch
+)
+
+# Weird behavior inside the OpenXR loader.  On Windows they force shared libraries to use static crt, and
+# vice-versa. Might be better in future iterations to patch the CMakeLists.txt for OpenXR
+if (VCPKG_TARGET_IS_UWP OR VCPKG_TARGET_IS_WINDOWS)
+    if(VCPKG_LIBRARY_LINKAGE STREQUAL static)
+        set(DYNAMIC_LOADER OFF)
+        set(VCPKG_CRT_LINKAGE dynamic)
+    else()
+        set(DYNAMIC_LOADER ON)
+        set(VCPKG_CRT_LINKAGE static)
+    endif()
+endif()
+
+vcpkg_find_acquire_program(PYTHON3)
+
+vcpkg_cmake_configure(
+    SOURCE_PATH "${SOURCE_PATH}"
+    OPTIONS
+        -DBUILD_API_LAYERS=OFF
+        -DBUILD_TESTS=OFF
+        -DBUILD_CONFORMANCE_TESTS=OFF
+        -DDYNAMIC_LOADER=${DYNAMIC_LOADER}
+        -DPYTHON_EXECUTABLE="${PYTHON3}"
+        -DBUILD_WITH_SYSTEM_JSONCPP=ON
+)
+
+vcpkg_cmake_install()
+
+# Generate the OpenXR C++ bindings
+set(ENV{OPENXR_REPO} "${SDK_SOURCE_PATH}")
+vcpkg_execute_required_process(
+    COMMAND ${PYTHON3} "${HPP_SOURCE_PATH}/scripts/hpp_genxr.py" -quiet  -registry "${SDK_SOURCE_PATH}/specification/registry/xr.xml" -o "${CURRENT_PACKAGES_DIR}/include/openxr"
+    WORKING_DIRECTORY "${HPP_SOURCE_PATH}"
+    LOGNAME "openxr-hpp"
+)
+
+if(VCPKG_TARGET_IS_WINDOWS)
+    vcpkg_cmake_config_fixup(PACKAGE_NAME OpenXR CONFIG_PATH cmake)
+else()
+    vcpkg_cmake_config_fixup(PACKAGE_NAME OpenXR CONFIG_PATH lib/cmake/openxr)
+endif()
+
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share")
+
+vcpkg_fixup_pkgconfig()
+vcpkg_copy_pdbs()
+file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
diff --git a/cmake/ports/openxr-loader/python3_8_compatibility.patch b/cmake/ports/openxr-loader/python3_8_compatibility.patch
new file mode 100644
index 0000000000..657bb2b7ab
--- /dev/null
+++ b/cmake/ports/openxr-loader/python3_8_compatibility.patch
@@ -0,0 +1,13 @@
+diff --git a/scripts/hpp_genxr.py b/scripts/hpp_genxr.py
+index ce419b0..23e1d3d 100644
+--- a/scripts/hpp_genxr.py
++++ b/scripts/hpp_genxr.py
+@@ -36,7 +36,7 @@ from xrconventions import OpenXRConventions
+ from data import EXCLUDED_EXTENSIONS
+
+
+-def makeREstring(strings: Iterable[str], default: typing.Optional[str] = None) -> str:
++def makeREstring(strings, default: typing.Optional[str] = None) -> str:
+     """Turn a list of strings into a regexp string matching exactly those strings."""
+     if strings or default is None:
+         return f"^({'|'.join(re.escape(s) for s in strings)})$"
diff --git a/cmake/ports/openxr-loader/vcpkg.json b/cmake/ports/openxr-loader/vcpkg.json
new file mode 100644
index 0000000000..a45e3c9199
--- /dev/null
+++ b/cmake/ports/openxr-loader/vcpkg.json
@@ -0,0 +1,27 @@
+{
+  "name": "openxr-loader",
+  "version": "1.0.31",
+  "description": "A royalty-free, open standard that provides high-performance access to Augmented Reality (AR) and Virtual Reality (VR)—collectively known as XR—platforms and devices",
+  "homepage": "https://github.com/KhronosGroup/OpenXR-SDK",
+  "license": "Apache-2.0",
+  "supports": "!uwp & !osx",
+  "dependencies": [
+    "jsoncpp",
+    {
+      "name": "vcpkg-cmake",
+      "host": true
+    },
+    {
+      "name": "vcpkg-cmake-config",
+      "host": true
+    }
+  ],
+  "features": {
+    "vulkan": {
+      "description": "Vulkan functionality for OpenXR",
+      "dependencies": [
+        "vulkan"
+      ]
+    }
+  }
+}