SDL: cmake: build tests for UWP

From a5d9db0cd07430ba45eed689475d41ee7c48b62c Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Wed, 19 Apr 2023 16:28:39 +0200
Subject: [PATCH] cmake: build tests for UWP

---
 .github/workflows/msvc.yml       |   3 +-
 CMakeLists.txt                   |   4 +-
 cmake/test/CMakeLists.txt        |   5 +++
 test/CMakeLists.txt              |  62 +++++++++++++++++++++++++++++--
 test/testdraw.c                  |   3 +-
 test/uwp/Package.appxmanifest.in |  52 ++++++++++++++++++++++++++
 test/uwp/logo-50x50.png          | Bin 0 -> 2421 bytes
 test/uwp/splash-620x300.png      | Bin 0 -> 30918 bytes
 test/uwp/square-150x150.png      | Bin 0 -> 10605 bytes
 test/uwp/square-44x44.png        | Bin 0 -> 2082 bytes
 10 files changed, 121 insertions(+), 8 deletions(-)
 create mode 100644 test/uwp/Package.appxmanifest.in
 create mode 100644 test/uwp/logo-50x50.png
 create mode 100644 test/uwp/splash-620x300.png
 create mode 100644 test/uwp/square-150x150.png
 create mode 100644 test/uwp/square-44x44.png

diff --git a/.github/workflows/msvc.yml b/.github/workflows/msvc.yml
index 0b8cdcd7e043..a434a7284742 100644
--- a/.github/workflows/msvc.yml
+++ b/.github/workflows/msvc.yml
@@ -23,7 +23,7 @@ jobs:
         - { name: Windows (clang-cl x86), flags: -T ClangCL -A Win32, artifact: 'SDL-clang-cl-x86' }
         - { name: Windows (ARM),          flags: -A ARM, artifact: 'SDL-VC-arm32' }
         - { name: Windows (ARM64),        flags: -A ARM64, artifact: 'SDL-VC-arm64' }
-        - { name: UWP (x64),              flags: -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0" -DSDL_TESTS=OFF, nowerror: true,
+        - { name: UWP (x64),              flags: -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0", nowerror: true,
             project: VisualC-WinRT/SDL-UWP.sln, projectflags: '/p:Platform=x64 /p:WindowsTargetPlatformVersion=10.0.17763.0', artifact: 'SDL-VC-UWP' }
 
     steps:
@@ -70,7 +70,6 @@ jobs:
       run: |
         cmake --build build/ --config Release --target PACKAGE
     - name: Verify CMake configuration files
-      if: ${{ !contains(matrix.platform.name, 'UWP') }}  # FIXME: cmake/test/CMakeLists.txt should support UWP
       run: |
         cmake -S cmake/test -B cmake_config_build `
           -DCMAKE_PREFIX_PATH=${{ env.SDL3_DIR }} `
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e4971e577c0a..d045715012c3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -304,7 +304,7 @@ set_option(SDL_DUMMYAUDIO          "Support the dummy audio driver" ON)
 set_option(SDL_DUMMYVIDEO          "Use dummy video driver" ON)
 dep_option(SDL_IBUS                "Enable IBus support" ON ${UNIX_SYS} OFF)
 dep_option(SDL_OPENGL              "Include OpenGL support" ON "NOT VISIONOS" OFF)
-dep_option(SDL_OPENGLES            "Include OpenGL ES support" ON "NOT VISIONOS" OFF) 
+dep_option(SDL_OPENGLES            "Include OpenGL ES support" ON "NOT VISIONOS" OFF)
 set_option(SDL_PTHREADS            "Use POSIX threads for multi-threading" ${SDL_PTHREADS_DEFAULT})
 dep_option(SDL_PTHREADS_SEM        "Use pthread semaphores" ON "SDL_PTHREADS" OFF)
 dep_option(SDL_OSS                 "Support the OSS audio API" ON "UNIX_SYS OR RISCOS" OFF)
@@ -365,7 +365,7 @@ option(SDL_TEST_LIBRARY   "Build the SDL3_test library" ON)
 
 dep_option(SDL_STATIC_PIC      "Static version of the library should be built with Position Independent Code" "${CMAKE_POSITION_INDEPENDENT_CODE}" "SDL_STATIC" OFF)
 dep_option(SDL_TESTS           "Build the test directory" OFF SDL_TEST_LIBRARY OFF)
-dep_option(SDL_INSTALL_TESTS   "Install test-cases" OFF "NOT SDL_DISABLE_INSTALL;NOT SDL_FRAMEWORK" OFF)
+dep_option(SDL_INSTALL_TESTS   "Install test-cases" OFF "NOT SDL_DISABLE_INSTALL;NOT SDL_FRAMEWORK;NOT WINDOWS_STORE" OFF)
 dep_option(SDL_TESTS_LINK_SHARED "link tests to shared SDL library" "${SDL_SHARED}" "SDL_SHARED;SDL_STATIC" "${SDL_SHARED}")
 set(SDL_TESTS_TIMEOUT_MULTIPLIER "1" CACHE STRING "Timeout multiplier to account for really slow machines")
 
diff --git a/cmake/test/CMakeLists.txt b/cmake/test/CMakeLists.txt
index da7c1505457d..83ee81dc5166 100644
--- a/cmake/test/CMakeLists.txt
+++ b/cmake/test/CMakeLists.txt
@@ -2,6 +2,11 @@
 
 cmake_minimum_required(VERSION 3.12)
 project(sdl_test LANGUAGES C)
+if(WINDOWS_STORE)
+    enable_language(CXX)
+    add_compile_options(/ZW)
+    set_source_files_properties(ain_cli.c main_gui.c PROPERTIES LANGUAGE CXX)
+endif()
 
 include(GenerateExportHeader)
 
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 60ce593a6cd6..b762ffe92d2e 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -15,6 +15,12 @@ if(NOT (MSVC AND SDL_CPU_ARM64))
     find_package(OpenGL)
 endif()
 
+if(WINDOWS_STORE)
+    cmake_minimum_required(VERSION 3.19)
+    # CMP0112: Target file component generator expressions do not add target dependencies.
+    cmake_policy(SET CMP0112 NEW)
+endif()
+
 set(SDL_TEST_EXECUTABLES)
 
 add_library(sdltests_utils OBJECT
@@ -33,6 +39,14 @@ define_property(TARGET PROPERTY SDL_NONINTERACTIVE BRIEF_DOCS "If true, target i
 define_property(TARGET PROPERTY SDL_NONINTERACTIVE_ARGUMENTS BRIEF_DOCS "Argument(s) to run executable in non-interactive mode." FULL_DOCS "Argument(s) to run executable in non-interactive mode.")
 define_property(TARGET PROPERTY SDL_NONINTERACTIVE_TIMEOUT BRIEF_DOCS "Timeout for noninteractive executable." FULL_DOCS "Timeout for noninteractive executable.")
 
+if(WINDOWS_STORE)
+    add_library(sdl_test_main_uwp OBJECT main.cpp)
+    target_link_libraries(sdl_test_main_uwp PRIVATE SDL3::Headers)
+    target_compile_options(sdl_test_main_uwp PRIVATE "/ZW")
+
+    set_source_files_properties(${RESOURCE_FILES} PROPERTIES VS_DEPLOYENT_LOCATION "Assets")
+endif()
+
 macro(add_sdl_test_executable TARGET)
     cmake_parse_arguments(AST "BUILD_DEPENDENT;NONINTERACTIVE;NEEDS_RESOURCES;TESTUTILS;NO_C90" "" "NONINTERACTIVE_TIMEOUT;NONINTERACTIVE_ARGS;SOURCES" ${ARGN})
     if(AST_UNPARSED_ARGUMENTS)
@@ -44,13 +58,34 @@ macro(add_sdl_test_executable TARGET)
     if(AST_TESTUTILS)
         list(APPEND AST_SOURCES $<TARGET_OBJECTS:sdltests_utils>)
     endif()
+    set(EXTRA_SOURCES "")
+    if(WINDOWS_STORE)
+        set(uwp_bindir "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.dir")
+        if(NOT IS_DIRECTORY "${uwp_bindir}")
+            execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${uwp_bindir}")
+        endif()
+        string(REGEX REPLACE "[_]" "" SAFE_TARGET "${TARGET}")
+        file(GENERATE OUTPUT "${uwp_bindir}/${TARGET}.appxmanifest"
+            INPUT "${CMAKE_CURRENT_SOURCE_DIR}/uwp/Package.appxmanifest.in"
+            TARGET "${TARGET}"
+        )
+        set_property(SOURCE "${uwp_bindir}/${TARGET}.appxmanifest" PROPERTY VS_DEPLOYMENT_CONTENT 1)
+        list(APPEND EXTRA_SOURCES
+            "$<TARGET_OBJECTS:sdl_test_main_uwp>"
+            "${uwp_bindir}/${TARGET}.appxmanifest"
+            "uwp/logo-50x50.png"
+            "uwp/square-44x44.png"
+            "uwp/square-150x150.png"
+            "uwp/splash-620x300.png"
+        )
+    endif()
     if(AST_NEEDS_RESOURCES)
-        list(APPEND AST_SOURCES ${RESOURCE_FILES})
+        list(APPEND EXTRA_SOURCES ${RESOURCE_FILES})
     endif()
     if(ANDROID)
-        add_library(${TARGET} SHARED ${AST_SOURCES})
+        add_library(${TARGET} SHARED ${AST_SOURCES} ${EXTRA_SOURCES})
     else()
-        add_executable(${TARGET} ${AST_SOURCES})
+        add_executable(${TARGET} ${AST_SOURCES} ${EXTRA_SOURCES})
     endif()
     SDL_AddCommonCompilerFlags(${TARGET})
     target_link_libraries(${TARGET} PRIVATE SDL3::SDL3_test SDL3::${sdl_name_component})
@@ -74,6 +109,16 @@ macro(add_sdl_test_executable TARGET)
             add_custom_command(TARGET ${TARGET} POST_BUILD
                 COMMAND ${CMAKE_COMMAND} ARGS -E make_directory $<TARGET_FILE_DIR:${TARGET}>/sdl-${TARGET}
                 COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILES} $<TARGET_FILE_DIR:${TARGET}>/sdl-${TARGET})
+        elseif(WINDOWS_STORE)
+            # MSVC does build the dependent targets (or POST_BUILD commands) when building an application
+            # after starting to debug. By copying the resources in a custom target, the files can be copied afterwards.
+            # FIXME: find out proper way to add assets to UWP package
+            cmake_minimum_required(VERSION 3.19)
+            add_custom_target(zzz-resources-copy-${TARGET}
+                COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${TARGET}>/AppX"
+                COMMAND ${CMAKE_COMMAND} -E copy_if_different ${RESOURCE_FILES} "$<TARGET_FILE_DIR:${TARGET}>/AppX"
+            )
+            add_dependencies(${TARGET} zzz-resources-copy-${TARGET})
         else()
             add_custom_command(TARGET ${TARGET} POST_BUILD
                 COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILES} $<TARGET_FILE_DIR:${TARGET}>)
@@ -103,6 +148,17 @@ macro(add_sdl_test_executable TARGET)
     elseif(PSP)
         target_link_libraries(${TARGET} PRIVATE GL)
     endif()
+    if(WINDOWS_STORE)
+        target_compile_definitions(${TARGET} PRIVATE "SDL_MAIN_NOIMPL")
+        set_property(TARGET ${TARGET} PROPERTY WIN32_EXECUTABLE TRUE)
+        set_property(TARGET ${TARGET} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${uwp_bindir}")
+        target_link_options(${TARGET} PRIVATE
+            -nodefaultlib:vccorlib$<$<CONFIG:Debug>:d>
+            -nodefaultlib:msvcrt$<$<CONFIG:Debug>:d>
+            vccorlib$<$<CONFIG:Debug>:d>.lib
+            msvcrt$<$<CONFIG:Debug>:d>.lib
+        )
+    endif()
 
     if(EMSCRIPTEN)
         set_property(TARGET ${TARGET} PROPERTY SUFFIX ".html")
diff --git a/test/testdraw.c b/test/testdraw.c
index c5c1711d7c9b..d0c102c22a32 100644
--- a/test/testdraw.c
+++ b/test/testdraw.c
@@ -19,8 +19,9 @@
 #include <emscripten/emscripten.h>
 #endif
 
-#include <SDL3/SDL_test_common.h>
+#include <SDL3/SDL.h>
 #include <SDL3/SDL_main.h>
+#include <SDL3/SDL_test_common.h>
 
 #define NUM_OBJECTS 100
 
diff --git a/test/uwp/Package.appxmanifest.in b/test/uwp/Package.appxmanifest.in
new file mode 100644
index 000000000000..8a5d4371475e
--- /dev/null
+++ b/test/uwp/Package.appxmanifest.in
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Package
+  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
+  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
+  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
+  IgnorableNamespaces="mp uap">
+
+  <Identity Name="5a2cfb51-9dcf-4830-81e5-49472403b04d"
+            Publisher="O=libsdl.org"
+            Version="1.0.0.0" />
+
+  <mp:PhoneIdentity
+    PhoneProductId="5a2cfb51-9dcf-4830-81e5-49472403b04d"
+    PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
+
+  <Properties>
+    <DisplayName>$<TARGET_PROPERTY:NAME></DisplayName>
+    <PublisherDisplayName>libsdl.org</PublisherDisplayName>
+    <Logo>logo-50x50.png</Logo>
+  </Properties>
+
+  <Dependencies>
+    <TargetDeviceFamily
+      Name="Windows.Universal"
+      MinVersion="10.0.0.0"
+      MaxVersionTested="10.0.0.0" />
+  </Dependencies>
+
+  <Resources>
+    <Resource Language="x-generate" />
+  </Resources>
+
+  <Applications>
+    <Application Id="App"
+      Executable="$<TARGET_PROPERTY:NAME>.exe"
+      EntryPoint="$<TARGET_PROPERTY:NAME>.App">
+      <uap:VisualElements
+        DisplayName="$<TARGET_PROPERTY:NAME>"
+        Description="$<TARGET_PROPERTY:NAME>"
+        BackgroundColor="#FFFFFF"
+        Square150x150Logo="square-150x150.png"
+        Square44x44Logo="square-44x44.png">
+        <uap:SplashScreen Image="splash-620x300.png" />
+      </uap:VisualElements>
+    </Application>
+  </Applications>
+
+  <Capabilities>
+    <Capability Name="internetClient" />
+    <DeviceCapability Name="microphone" />
+  </Capabilities>
+</Package>
diff --git a/test/uwp/logo-50x50.png b/test/uwp/logo-50x50.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7903b79f11b0d662db06725c36893dca3646544
GIT binary patch
literal 2421
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

literal 0
HcmV?d00001

diff --git a/test/uwp/splash-620x300.png b/test/uwp/splash-620x300.png
new file mode 100644
index 0000000000000000000000000000000000000000..0dde7737d6eb2aaa68d0eb795583d9875cb30445
GIT binary patch
literal 30918
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

(Patch may be truncated, please check the link at the top of this post.)