diff --git a/.github/workflows/msvc.yml b/.github/workflows/msvc.yml index 0b8cdcd7e..a434a7284 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 e4971e577..d04571501 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 da7c15054..83ee81dc5 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 60ce593a6..b762ffe92 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 $) 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 + "$" + "${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 $/sdl-${TARGET} COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILES} $/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 "$/AppX" + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${RESOURCE_FILES} "$/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} $) @@ -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$<$:d> + -nodefaultlib:msvcrt$<$:d> + vccorlib$<$:d>.lib + msvcrt$<$:d>.lib + ) + endif() if(EMSCRIPTEN) set_property(TARGET ${TARGET} PROPERTY SUFFIX ".html") diff --git a/test/testdraw.c b/test/testdraw.c index c5c1711d7..d0c102c22 100644 --- a/test/testdraw.c +++ b/test/testdraw.c @@ -19,8 +19,9 @@ #include #endif -#include +#include #include +#include #define NUM_OBJECTS 100 diff --git a/test/uwp/Package.appxmanifest.in b/test/uwp/Package.appxmanifest.in new file mode 100644 index 000000000..8a5d43714 --- /dev/null +++ b/test/uwp/Package.appxmanifest.in @@ -0,0 +1,52 @@ + + + + + + + + + $ + libsdl.org + logo-50x50.png + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/uwp/logo-50x50.png b/test/uwp/logo-50x50.png new file mode 100644 index 000000000..e7903b79f Binary files /dev/null and b/test/uwp/logo-50x50.png differ diff --git a/test/uwp/splash-620x300.png b/test/uwp/splash-620x300.png new file mode 100644 index 000000000..0dde7737d Binary files /dev/null and b/test/uwp/splash-620x300.png differ diff --git a/test/uwp/square-150x150.png b/test/uwp/square-150x150.png new file mode 100644 index 000000000..0931f4c85 Binary files /dev/null and b/test/uwp/square-150x150.png differ diff --git a/test/uwp/square-44x44.png b/test/uwp/square-44x44.png new file mode 100644 index 000000000..f0bdcd224 Binary files /dev/null and b/test/uwp/square-44x44.png differ