Atlas - CMakeLists.txt

Home / ext / SDL / test Lines: 1 | Size: 45500 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)]
[FILE BEGIN]
1# 2# CMake script for building the SDL tests 3# 4 5cmake_minimum_required(VERSION 3.16) 6 7if(NOT DEFINED CMAKE_C_STANDARD) 8 set(CMAKE_C_STANDARD 99) 9endif() 10 11set(SDL3_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") 12 13list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../cmake") 14 15include(CheckIncludeFile) 16include(CheckStructHasMember) 17include(CMakePushCheckState) 18include(sdlcompilers) 19 20find_package(Python3 COMPONENTS Interpreter) 21if(NOT PYTHON3_EXECUTABLE) 22 set(PYTHON3_EXECUTABLE "python3") 23endif() 24 25if(SDL_TESTS_LINK_SHARED) 26 set(sdl_name_component SDL3-shared) 27else() 28 set(sdl_name_component SDL3-static) 29endif() 30set(HAVE_TESTS_LINK_SHARED "${SDL_TESTS_LINK_SHARED}" PARENT_SCOPE) 31 32# CMake incorrectly detects opengl32.lib being present on MSVC ARM64 33if(NOT (MSVC AND SDL_CPU_ARM64)) 34 # Prefer GLVND, if present 35 set(OpenGL_GL_PREFERENCE GLVND) 36 find_package(OpenGL) 37endif() 38 39add_library(sdltests_utils OBJECT 40 testutils.c 41) 42target_link_libraries(sdltests_utils PRIVATE SDL3::Headers) 43 44file(GLOB RESOURCE_FILES *.png *.wav *.csv *.hex moose.dat utf8.txt) 45 46option(SDLTEST_TRACKMEM "Run tests with --trackmem" OFF) 47 48if(WIN32) 49 option(SDLTEST_PROCDUMP "Run tests using sdlprocdump for minidump generation" OFF) 50 add_executable(sdlprocdump win32/sdlprocdump.c) 51 SDL_AddCommonCompilerFlags(sdlprocdump) 52 if(SDLTEST_PROCDUMP) 53 set(CMAKE_TEST_LAUNCHER "$<TARGET_FILE:sdlprocdump>;--") 54 else() 55 set_property(TARGET sdlprocdump PROPERTY EXCLUDE_FROM_ALL "1") 56 endif() 57else() 58 option(SDLTEST_GDB "Run tests using headless gdb" OFF) 59 find_program(GDB_BIN NAMES "gdb") 60 if(SDLTEST_GDB AND GDB_BIN) 61 set(CMAKE_TEST_LAUNCHER "${GDB_BIN};-batch;-nx;-x;${CMAKE_CURRENT_SOURCE_DIR}/unix/gdbcmds.txt;--args") 62 endif() 63endif() 64 65if(EMSCRIPTEN) 66 set(SDLTEST_BROWSER "firefox" CACHE STRING "Browser in which to run SDL unit tests (chrome or firefox)") 67 set(SDLTEST_PORT "8080" CACHE STRING "Port on which to serve the tests") 68 set(SDLTEST_CHROME_BINARY "" CACHE STRING "Chrome/Chromium browser binary (optional)") 69 if(TARGET Python3::Interpreter) 70 add_custom_target(serve-sdl-tests 71 COMMAND Python3::Interpreter "${CMAKE_CURRENT_SOURCE_DIR}/emscripten/server.py" 72 "${SDLTEST_PORT}" 73 -d "${CMAKE_CURRENT_BINARY_DIR}" 74 --map "${SDL3_SOURCE_DIR}:/SDL") 75 endif() 76endif() 77 78if(CMAKE_RUNTIME_OUTPUT_DIRECTORY) 79 set(test_bin_dir "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") 80 if(NOT IS_ABSOLUTE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") 81 set(test_bin_dir "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") 82 endif() 83else() 84 set(test_bin_dir "${CMAKE_CURRENT_BINARY_DIR}") 85endif() 86if(NOT CMAKE_VERSION VERSION_LESS 3.20) 87 get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) 88 set(test_bin_dir "${test_bin_dir}$<$<BOOL:${is_multi_config}>:/$<CONFIG>>") 89endif() 90 91if(DOS) 92 set(NAME83_LONG "unifont-15.1.05.hex;unifont-15.1.05-license.txt;physaudiodev.png;logaudiodev.png;audiofile.png;soundboard.png;soundboard_levels.png;trashcan.png;msdf_font.png;msdf_font.csv;gamepad_front.png;gamepad_back.png;gamepad_face_abxy.png;gamepad_face_axby.png;gamepad_face_bayx.png;gamepad_face_sony.png;gamepad_battery.png;gamepad_battery_unknown.png;gamepad_battery_wired.png;gamepad_touchpad.png;gamepad_button.png;gamepad_button_small.png;gamepad_button_background.png;gamepad_axis.png;gamepad_axis_arrow.png;gamepad_wired.png;gamepad_wireless.png;sdl-test_round.png") 93 set(DOS83_SHORT "UNIFONT.HEX;UNIFONTL.TXT;PHYSADEV.PNG;LOGADEV.PNG;AUDIOFIL.PNG;SNDBRD.PNG;SNDLVL.PNG;TRASHCAN.PNG;MSDFFONT.PNG;MSDFFONT.CSV;GP_FRONT.PNG;GP_BACK.PNG;GP_FABXY.PNG;GP_FAXBY.PNG;GP_FBAYX.PNG;GP_FSONY.PNG;GP_BATT.PNG;GP_BATTX.PNG;GP_BATTW.PNG;GP_TOUCH.PNG;GP_BTN.PNG;GP_BTNSM.PNG;GP_BTNBG.PNG;GP_AXIS.PNG;GP_AXARW.PNG;GP_WIRED.PNG;GP_WLESS.PNG;SDLROUND.PNG") 94endif() 95 96set(RESOURCE_FILE_NAMES) 97set(RESOURCE_FILES_BINDIR) 98foreach(resource_file IN LISTS RESOURCE_FILES) 99 get_filename_component(res_file_name ${resource_file} NAME) 100 set(output_name "${res_file_name}") 101 if(DOS) 102 list(FIND DOS83_LONG "${res_file_name}" _dos83_idx) 103 if(NOT _dos83_idx EQUAL -1) 104 list(GET DOS83_SHORT ${_dos83_idx} output_name) 105 endif() 106 endif() 107 list(APPEND RESOURCE_FILE_NAMES "${output_name}") 108 set(resource_file_bindir "${test_bin_dir}/${output_name}") 109 set(depends_resource_file "${resource_file}") 110 if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) 111 set(depends_resource_file "${CMAKE_CURRENT_LIST_FILE}") 112 endif() 113 add_custom_command(OUTPUT "${resource_file_bindir}" 114 COMMAND "${CMAKE_COMMAND}" -E copy "${resource_file}" "${resource_file_bindir}" 115 DEPENDS "${depends_resource_file}" 116 ) 117 list(APPEND RESOURCE_FILES_BINDIR "${resource_file_bindir}") 118endforeach() 119add_custom_target(copy-sdl-test-resources 120 DEPENDS "${RESOURCE_FILES_BINDIR}" 121) 122 123define_property(TARGET PROPERTY SDL_NONINTERACTIVE BRIEF_DOCS "If true, target is a non-interactive test executable." FULL_DOCS "If true, target is a noninteractive test executable.") 124define_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.") 125define_property(TARGET PROPERTY SDL_NONINTERACTIVE_TIMEOUT BRIEF_DOCS "Timeout for noninteractive executable." FULL_DOCS "Timeout for noninteractive executable.") 126 127if(HAVE_X11) 128 find_package(X11 QUIET) 129 if(NOT TARGET X11::X11) 130 set(HAVE_X11 OFF) 131 endif() 132endif() 133 134if(HAVE_WAYLAND) 135 find_package(PkgConfig QUIET) 136 pkg_check_modules(PkgWaylandClient QUIET IMPORTED_TARGET wayland-client) 137 if(NOT TARGET PkgConfig::PkgWaylandClient) 138 set(HAVE_WAYLAND OFF) 139 endif() 140endif() 141 142function(add_sdl_test_executable TARGET) 143 cmake_parse_arguments(AST "BUILD_DEPENDENT;NONINTERACTIVE;NEEDS_RESOURCES;TESTUTILS;THREADS;MAIN_CALLBACKS;NOTRACKMEM" "NAME83" "DEPENDS;DISABLE_THREADS_ARGS;NONINTERACTIVE_TIMEOUT;NONINTERACTIVE_ARGS;INSTALLED_ARGS;SOURCES" ${ARGN}) 144 if(AST_UNPARSED_ARGUMENTS) 145 message(FATAL_ERROR "Unknown argument(s): ${AST_UNPARSED_ARGUMENTS}") 146 endif() 147 if(NOT AST_SOURCES) 148 message(FATAL_ERROR "add_sdl_test_executable needs at least one source") 149 endif() 150 if(AST_TESTUTILS) 151 list(APPEND AST_SOURCES $<TARGET_OBJECTS:sdltests_utils>) 152 endif() 153 set(EXTRA_SOURCES "") 154 if(AST_NEEDS_RESOURCES) 155 list(APPEND EXTRA_SOURCES ${RESOURCE_FILES}) 156 endif() 157 if(ANDROID) 158 add_library(${TARGET} SHARED ${AST_SOURCES} ${EXTRA_SOURCES}) 159 else() 160 add_executable(${TARGET} ${AST_SOURCES} ${EXTRA_SOURCES}) 161 endif() 162 target_compile_definitions(${TARGET} PRIVATE HAVE_BUILD_CONFIG) 163 SDL_AddCommonCompilerFlags(${TARGET}) 164 target_include_directories(${TARGET} PRIVATE "${SDL3_SOURCE_DIR}/src/video/khronos") 165 target_link_libraries(${TARGET} PRIVATE SDL3::SDL3_test SDL3::${sdl_name_component}) 166 if(AST_DEPENDS) 167 add_dependencies(${TARGET} ${AST_DEPENDS}) 168 endif() 169 170 set_propertY(TARGET ${TARGET} PROPERTY SDL_INSTALL "1") 171 set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY SDL_TEST_EXECUTABLES "${TARGET}") 172 set_property(TARGET ${TARGET} PROPERTY SDL_NOTRACKMEM ${AST_NOTRACKMEM}) 173 if(AST_NONINTERACTIVE) 174 set_property(TARGET ${TARGET} PROPERTY SDL_NONINTERACTIVE 1) 175 endif() 176 set_property(TARGET ${TARGET} PROPERTY SDL_DISABLE_THREADS_ARGS "${AST_DISABLE_THREADS_ARGS}") 177 set_property(TARGET ${TARGET} PROPERTY SDL_THREADS "${AST_THREADS}") 178 if(AST_NONINTERACTIVE_ARGS) 179 set_property(TARGET ${TARGET} PROPERTY SDL_NONINTERACTIVE_ARGUMENTS "${AST_NONINTERACTIVE_ARGS}") 180 endif() 181 if(AST_INSTALLED_ARGS) 182 set_property(TARGET ${TARGET} PROPERTY SDL_INSTALLED_ARGUMENTS "${AST_INSTALLED_ARGS}") 183 elseif(AST_NONINTERACTIVE_ARGS) 184 set_property(TARGET ${TARGET} PROPERTY SDL_INSTALLED_ARGUMENTS "${AST_NONINTERACTIVE_ARGS}") 185 endif() 186 if(AST_NONINTERACTIVE_TIMEOUT) 187 set_property(TARGET ${TARGET} PROPERTY SDL_NONINTERACTIVE_TIMEOUT "${AST_NONINTERACTIVE_TIMEOUT}") 188 endif() 189 if(AST_NEEDS_RESOURCES) 190 if(PSP OR PS2 OR N3DS) 191 add_custom_command(TARGET ${TARGET} POST_BUILD 192 COMMAND ${CMAKE_COMMAND} ARGS -E make_directory $<TARGET_FILE_DIR:${TARGET}>/sdl-${TARGET} 193 COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILES} $<TARGET_FILE_DIR:${TARGET}>/sdl-${TARGET}) 194 else() 195 add_dependencies(${TARGET} copy-sdl-test-resources) 196 endif() 197 if(APPLE) 198 # Make sure resource files get installed into macOS/iOS .app bundles. 199 set_target_properties(${TARGET} PROPERTIES RESOURCE "${RESOURCE_FILES}") 200 endif() 201 if(EMSCRIPTEN) 202 foreach(res IN LISTS RESOURCE_FILES) 203 get_filename_component(res_name "${res}" NAME) 204 target_link_options(${TARGET} PRIVATE "SHELL:--embed-file ${res}@${res_name}") 205 set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS "${res}") 206 endforeach() 207 endif() 208 set_property(TARGET ${TARGET} APPEND PROPERTY ADDITIONAL_CLEAN_FILES "$<TARGET_FILE_DIR:${TARGET}>/$<JOIN:${RESOURCE_FILE_NAMES},$<SEMICOLON>$<TARGET_FILE_DIR:${TARGET}>/>") 209 endif() 210 if(AST_BUILD_DEPENDENT) 211 target_include_directories(${TARGET} BEFORE PRIVATE $<TARGET_PROPERTY:SDL3::${sdl_name_component},INCLUDE_DIRECTORIES>) 212 target_include_directories(${TARGET} BEFORE PRIVATE ${SDL3_SOURCE_DIR}/src) 213 if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") 214 target_include_directories(${TARGET} AFTER PRIVATE "${SDL3_SOURCE_DIR}/include/build_config") 215 endif() 216 endif() 217 218 if(WINDOWS) 219 # CET support was added in VS 16.7 220 if(MSVC_VERSION GREATER 1926 AND CMAKE_GENERATOR_PLATFORM MATCHES "Win32|x64") 221 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -CETCOMPAT") 222 endif() 223 elseif(PSP) 224 target_link_libraries(${TARGET} PRIVATE GL) 225 elseif(EMSCRIPTEN) 226 set_property(TARGET ${TARGET} PROPERTY SUFFIX ".html") 227 target_link_options(${TARGET} PRIVATE "SHELL:--pre-js ${CMAKE_CURRENT_SOURCE_DIR}/emscripten/pre.js") 228 target_link_options(${TARGET} PRIVATE "-sEXIT_RUNTIME=1") 229 set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/emscripten/pre.js") 230 set_property(TARGET ${TARGET} APPEND PROPERTY EXTRA_INSTALL 231 "$<TARGET_FILE_DIR:${TARGET}>/$<TARGET_FILE_BASE_NAME:${TARGET}>.js" 232 "$<TARGET_FILE_DIR:${TARGET}>/$<TARGET_FILE_BASE_NAME:${TARGET}>.wasm" 233 "$<TARGET_FILE_DIR:${TARGET}>/$<TARGET_FILE_BASE_NAME:${TARGET}>.wasm.map") 234 elseif(NGAGE) 235 string(MD5 TARGET_MD5 "${TARGET}") 236 string(SUBSTRING "${TARGET_MD5}" 0 8 TARGET_MD5_8) 237 target_link_options(${TARGET} PRIVATE "SHELL:-s UID3=0x${TARGET_MD5_8}") 238 if(NOT AST_MAIN_CALLBACKS) 239 set_property(TARGET ${TARGET} PROPERTY "EXCLUDE_FROM_ALL" "1") 240 set_propertY(TARGET ${TARGET} PROPERTY SDL_INSTALL "0") 241 endif() 242 elseif(DOS) 243 if(AST_NAME83) 244 set_property(TARGET ${TARGET} PROPERTY OUTPUT_NAME "${AST_NAME83}") 245 endif() 246 endif() 247 248 if(OPENGL_FOUND) 249 target_compile_definitions(${TARGET} PRIVATE HAVE_OPENGL) 250 endif() 251 252 # FIXME: only add "${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>" + include paths of external dependencies 253 target_include_directories(${TARGET} PRIVATE "$<TARGET_PROPERTY:SDL3::${sdl_name_component},INCLUDE_DIRECTORIES>") 254endfunction() 255 256check_include_file(signal.h LIBC_HAS_SIGNAL_H) 257if(LIBC_HAS_SIGNAL_H) 258 add_definitions(-DHAVE_SIGNAL_H) 259endif() 260 261check_include_file(libudev.h HAVE_LIBUDEV_H) 262if(HAVE_LIBUDEV_H) 263 add_definitions(-DHAVE_LIBUDEV_H) 264endif() 265 266function(files2headers OUTPUT) 267 set(xxd "${SDL3_SOURCE_DIR}/cmake/xxd.py") 268 set(inputs ${ARGN}) 269 set(outputs ) 270 foreach(input IN LISTS inputs) 271 get_filename_component(file_we "${input}" NAME_WE) 272 set(intermediate "${CMAKE_CURRENT_BINARY_DIR}/${file_we}.h") 273 set(output "${CMAKE_CURRENT_SOURCE_DIR}/${file_we}.h") 274 list(APPEND outputs "${output}") 275 if(TARGET Python3::Interpreter AND NOT CMAKE_CROSSCOMPILING) 276 list(APPEND outputs "${intermediate}") 277 # Don't add the 'output' header to the output, to avoid marking them as GENERATED 278 # (generated files are removed when running the CLEAN target) 279 add_custom_command(OUTPUT "${intermediate}" 280 COMMAND Python3::Interpreter "${xxd}" -i "${CMAKE_CURRENT_SOURCE_DIR}/${input}" "-o" "${intermediate}" 281 COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${intermediate}" "${output}" 282 DEPENDS "${xxd}" "${png}" 283 ) 284 endif() 285 endforeach() 286 set(${OUTPUT} "${outputs}" PARENT_SCOPE) 287 add_custom_target(generate-${OUTPUT} DEPENDS ${outputs}) 288endfunction() 289 290files2headers(gamepad_image_headers 291 gamepad_axis_arrow.png 292 gamepad_axis.png 293 gamepad_back.png 294 gamepad_battery.png 295 gamepad_battery_wired.png 296 gamepad_button_background.png 297 gamepad_button.png 298 gamepad_button_small.png 299 gamepad_face_abxy.png 300 gamepad_face_axby.png 301 gamepad_face_bayx.png 302 gamepad_face_sony.png 303 gamepad_front.png 304 gamepad_touchpad.png 305 gamepad_wired.png 306 gamepad_wireless.png 307) 308files2headers(icon_png_header icon.png) 309files2headers(glass_png_header glass.png) 310 311set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE) 312include("${CMAKE_CURRENT_LIST_DIR}/../cmake/FindFFmpeg.cmake") 313if(FFmpeg_FOUND) 314 cmake_push_check_state() 315 list(APPEND CMAKE_REQUIRED_INCLUDES "${FFmpeg_AVUTIL_INCLUDE_DIRS}") 316 list(APPEND CMAKE_REQUIRED_INCLUDES "${SDL3_SOURCE_DIR}/src/video/khronos") 317 check_struct_has_member("AVFrame" "ch_layout" "libavutil/frame.h" LIBAVUTIL_AVFRAME_HAS_CH_LAYOUT) 318 check_struct_has_member("AVVulkanFramesContext" "format" "libavutil/hwcontext_vulkan.h" LIBAVUTIL_AVFULKANFRAMESCONTEXT_HAS_FORMAT) 319 cmake_pop_check_state() 320endif() 321if(FFmpeg_FOUND AND LIBAVUTIL_AVFRAME_HAS_CH_LAYOUT) 322 add_sdl_test_executable(testffmpeg SOURCES testffmpeg.c testffmpeg_vulkan.c ${icon_png_header} DEPENDS generate-icon_png_header) 323 if(LIBAVUTIL_AVFULKANFRAMESCONTEXT_HAS_FORMAT) 324 target_compile_definitions(testffmpeg PRIVATE FFMPEG_VULKAN_SUPPORT) 325 endif() 326 if(APPLE) 327 target_link_options(testffmpeg PRIVATE "-Wl,-framework,CoreVideo") 328 endif() 329 if(TARGET OpenGL::EGL) 330 message(DEBUG "Enabling EGL support in testffmpeg") 331 target_link_libraries(testffmpeg PRIVATE OpenGL::EGL) 332 target_compile_definitions(testffmpeg PRIVATE HAVE_EGL) 333 endif() 334 target_include_directories(testffmpeg SYSTEM BEFORE PRIVATE ${SDL3_SOURCE_DIR}/src/video/khronos) 335 target_link_libraries(testffmpeg PRIVATE ${FFMPEG_LIBRARIES}) 336else() 337 message(STATUS "Can't find ffmpeg 5.1.3 or newer, skipping testffmpeg") 338endif() 339 340add_sdl_test_executable(checkkeys SOURCES checkkeys.c NAME83 chkkeys) 341add_sdl_test_executable(loopwave NEEDS_RESOURCES TESTUTILS MAIN_CALLBACKS SOURCES loopwave.c) 342add_sdl_test_executable(testsurround SOURCES testsurround.c NAME83 surround) 343add_sdl_test_executable(testresample NEEDS_RESOURCES SOURCES testresample.c NAME83 resample) 344add_sdl_test_executable(testaudioinfo SOURCES testaudioinfo.c NAME83 audioinf) 345add_sdl_test_executable(testaudiostreamdynamicresample NEEDS_RESOURCES TESTUTILS SOURCES testaudiostreamdynamicresample.c NAME83 audynres) 346 347file(GLOB TESTAUTOMATION_SOURCE_FILES testautomation*.c) 348add_sdl_test_executable(testautomation NONINTERACTIVE NONINTERACTIVE_TIMEOUT 120 NEEDS_RESOURCES BUILD_DEPENDENT SOURCES ${TESTAUTOMATION_SOURCE_FILES} NAME83 automat) 349if(EMSCRIPTEN) 350 target_link_options(testautomation PRIVATE -sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=1gb) 351endif() 352add_sdl_test_executable(testmultiaudio NEEDS_RESOURCES TESTUTILS SOURCES testmultiaudio.c NAME83 multaudi) 353add_sdl_test_executable(testaudiohotplug NEEDS_RESOURCES TESTUTILS SOURCES testaudiohotplug.c NAME83 audhotpl) 354add_sdl_test_executable(testaudiorecording MAIN_CALLBACKS SOURCES testaudiorecording.c NAME83 aurecord) 355add_sdl_test_executable(testatomic NONINTERACTIVE DISABLE_THREADS_ARGS "--no-threads" SOURCES testatomic.c NAME83 atomic) 356add_sdl_test_executable(testintersections SOURCES testintersections.c NAME83 intersec) 357add_sdl_test_executable(testrelative SOURCES testrelative.c NAME83 relative) 358add_sdl_test_executable(testhittesting SOURCES testhittesting.c NAME83 hittest) 359add_sdl_test_executable(testdraw SOURCES testdraw.c NAME83 draw) 360add_sdl_test_executable(testdrawchessboard SOURCES testdrawchessboard.c NAME83 drawches) 361add_sdl_test_executable(testdropfile MAIN_CALLBACKS SOURCES testdropfile.c NAME83 dropfile) 362add_sdl_test_executable(testerror NONINTERACTIVE DISABLE_THREADS_ARGS "--no-threads" SOURCES testerror.c NAME83 error) 363add_sdl_test_executable(testsymbols NONINTERACTIVE NOTRACKMEM NONINTERACTIVE_ARGS 0 10 20 40 80 160 320 640 SOURCES testsymbols.c NAME83 symbols) 364 365set(build_options_dependent_tests ) 366 367add_sdl_test_executable(testevdev BUILD_DEPENDENT NONINTERACTIVE SOURCES testevdev.c NAME83 evdev) 368 369if(MACOS) 370 add_sdl_test_executable(testnative BUILD_DEPENDENT NEEDS_RESOURCES TESTUTILS 371 SOURCES 372 testnative.c 373 testnativecocoa.m 374 testnativex11.c 375 ) 376elseif(WINDOWS) 377 add_sdl_test_executable(testnative BUILD_DEPENDENT NEEDS_RESOURCES TESTUTILS SOURCES testnative.c testnativew32.c) 378elseif(HAVE_X11 OR HAVE_WAYLAND) 379 add_sdl_test_executable(testnative BUILD_DEPENDENT NEEDS_RESOURCES TESTUTILS SOURCES testnative.c) 380 if(HAVE_X11) 381 target_sources(testnative PRIVATE testnativex11.c) 382 target_link_libraries(testnative PRIVATE X11::X11) 383 endif() 384 if(HAVE_WAYLAND) 385 set_property(SOURCE ${SDL3_BINARY_DIR}/wayland-generated-protocols/xdg-shell-protocol.c PROPERTY GENERATED 1) 386 target_sources(testnative PRIVATE testnativewayland.c "${SDL3_BINARY_DIR}/wayland-generated-protocols/xdg-shell-protocol.c") 387 388 # Needed to silence the documentation warning in the generated header file 389 target_compile_options(testnative PRIVATE -Wno-documentation-unknown-command) 390 target_link_libraries(testnative PRIVATE PkgConfig::PkgWaylandClient) 391 endif () 392endif() 393 394add_sdl_test_executable(testasyncio MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testasyncio.c NAME83 asyncio) 395add_sdl_test_executable(testaudio MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testaudio.c NAME83 audio) 396add_sdl_test_executable(testcolorspace SOURCES testcolorspace.c NAME83 colorspc) 397add_sdl_test_executable(testfile NONINTERACTIVE SOURCES testfile.c) 398add_sdl_test_executable(testcontroller TESTUTILS SOURCES testcontroller.c gamepadutils.c ${gamepad_image_headers} DEPENDS generate-gamepad_image_headers NAME83 control) 399add_sdl_test_executable(testdlopennote TESTUTILS SOURCES testdlopennote.c NAME83 dlnote) 400add_sdl_test_executable(testgeometry TESTUTILS SOURCES testgeometry.c NAME83 geometry) 401add_sdl_test_executable(testgl SOURCES testgl.c NAME83 gl) 402add_sdl_test_executable(testgles SOURCES testgles.c NAME83 tstgles NAME83 gles) 403add_sdl_test_executable(testgpu_simple_clear SOURCES testgpu_simple_clear.c NAME83 gpuclear) 404add_sdl_test_executable(testgpu_spinning_cube SOURCES testgpu_spinning_cube.c ${icon_png_header} DEPENDS generate-icon_png_header NAME83 gpucube) 405add_sdl_test_executable(testgpurender_effects MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testgpurender_effects.c NAME83 gpufx) 406add_sdl_test_executable(testgpurender_msdf MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testgpurender_msdf.c NAME83 gpumsdf) 407add_sdl_test_executable(testgpu_spinning_cube_xr SOURCES testgpu_spinning_cube_xr.c NAME83 gpucubxr) 408 409if(ANDROID) 410 target_link_libraries(testgles PRIVATE GLESv1_CM) 411elseif(IOS OR TVOS) 412 find_library(GLES_LIB OpenGLES REQUIRED) 413 target_link_libraries(testgles PRIVATE "${GLES_LIB}") 414endif() 415add_sdl_test_executable(testgles2 SOURCES testgles2.c NAME83 gles2) 416add_sdl_test_executable(testhaptic SOURCES testhaptic.c NAME83 haptic) 417add_sdl_test_executable(testhotplug SOURCES testhotplug.c NAME83 hotplug) 418add_sdl_test_executable(testpen SOURCES testpen.c NAME83 pen) 419add_sdl_test_executable(testrumble SOURCES testrumble.c NAME83 rumble) 420add_sdl_test_executable(testthread NONINTERACTIVE THREADS NONINTERACTIVE_TIMEOUT 40 SOURCES testthread.c NAME83 thread) 421add_sdl_test_executable(testiconv NEEDS_RESOURCES TESTUTILS SOURCES testiconv.c NAME83 iconv) 422add_sdl_test_executable(testime NEEDS_RESOURCES TESTUTILS SOURCES testime.c NAME83 ime) 423add_sdl_test_executable(testkeys SOURCES testkeys.c NAME83 keys) 424add_sdl_test_executable(testloadso SOURCES testloadso.c NAME83 loadso) 425add_sdl_test_executable(testlocale NONINTERACTIVE SOURCES testlocale.c NAME83 locale) 426add_sdl_test_executable(testlock SOURCES testlock.c NAME83 lock) 427add_sdl_test_executable(testrwlock SOURCES testrwlock.c NONINTERACTIVE NONINTERACTIVE_TIMEOUT 20 NAME83 rwlock) 428add_sdl_test_executable(testmouse SOURCES testmouse.c NAME83 mouse) 429 430add_sdl_test_executable(testoverlay NEEDS_RESOURCES TESTUTILS SOURCES testoverlay.c NAME83 overlay) 431add_sdl_test_executable(testplatform NONINTERACTIVE SOURCES testplatform.c NAME83 platform) 432add_sdl_test_executable(testpower NONINTERACTIVE SOURCES testpower.c NAME83 power) 433add_sdl_test_executable(testfilesystem NONINTERACTIVE SOURCES testfilesystem.c NAME83 filesyst) 434if(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 4) 435 add_sdl_test_executable(pretest SOURCES pretest.c NONINTERACTIVE NONINTERACTIVE_TIMEOUT 60) 436endif() 437add_sdl_test_executable(testrendertarget NEEDS_RESOURCES TESTUTILS SOURCES testrendertarget.c NAME83 rendrtgt) 438add_sdl_test_executable(testrotate SOURCES testrotate.c NAME83 rotate) 439add_sdl_test_executable(testscale NEEDS_RESOURCES TESTUTILS SOURCES testscale.c NAME83 scale) 440add_sdl_test_executable(testsem NONINTERACTIVE DISABLE_THREADS_ARGS "--no-threads" NONINTERACTIVE_ARGS 10 NONINTERACTIVE_TIMEOUT 30 SOURCES testsem.c NAME83 sem) 441add_sdl_test_executable(testsensor SOURCES testsensor.c NAME83 sensor) 442add_sdl_test_executable(testshader NEEDS_RESOURCES TESTUTILS SOURCES testshader.c NAME83 shader) 443if(EMSCRIPTEN) 444 target_link_options(testshader PRIVATE "-sLEGACY_GL_EMULATION") 445endif() 446add_sdl_test_executable(testshape NEEDS_RESOURCES SOURCES testshape.c ${glass_png_header} DEPENDS generate-glass_png_header NAME83 shape) 447add_sdl_test_executable(testsoftwaretransparent SOURCES testsoftwaretransparent.c NAME83 swtransp) 448add_sdl_test_executable(testsprite MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testsprite.c NAME83 sprite) 449add_sdl_test_executable(testspriteminimal SOURCES testspriteminimal.c ${icon_png_header} DEPENDS generate-icon_png_header NAME83 spritmin) 450add_sdl_test_executable(testspritesurface SOURCES testspritesurface.c ${icon_png_header} DEPENDS generate-icon_png_header NAME83 spritsrf) 451add_sdl_test_executable(testpalette SOURCES testpalette.c NAME83 palette) 452add_sdl_test_executable(testtimer NONINTERACTIVE NONINTERACTIVE_ARGS --no-interactive NONINTERACTIVE_TIMEOUT 60 SOURCES testtimer.c NAME83 timer) 453add_sdl_test_executable(testurl SOURCES testurl.c NAME83 url) 454add_sdl_test_executable(testver NONINTERACTIVE NOTRACKMEM SOURCES testver.c NAME83 versdl) 455set_property(TARGET testver PROPERTY C_STANDARD 90) 456add_sdl_test_executable(testcamera MAIN_CALLBACKS SOURCES testcamera.c NAME83 camera) 457add_sdl_test_executable(testclipboard MAIN_CALLBACKS SOURCES testclipboard.c ${icon_png_header} DEPENDS generate-icon_png_header NAME83 clipbrd) 458add_sdl_test_executable(testviewport NEEDS_RESOURCES TESTUTILS SOURCES testviewport.c NAME83 viewport) 459add_sdl_test_executable(testwm SOURCES testwm.c NAME83 wm) 460add_sdl_test_executable(testyuv NONINTERACTIVE NONINTERACTIVE_ARGS "--automated" NEEDS_RESOURCES TESTUTILS SOURCES testyuv.c testyuv_cvt.c NAME83 yuv) 461add_sdl_test_executable(torturethread NONINTERACTIVE THREADS NONINTERACTIVE_TIMEOUT 30 SOURCES torturethread.c NAME83 tortthrd) 462add_sdl_test_executable(testrendercopyex NEEDS_RESOURCES TESTUTILS SOURCES testrendercopyex.c NAME83 rndcopex) 463add_sdl_test_executable(testmessage SOURCES testmessage.c NAME83 message) 464add_sdl_test_executable(testdisplayinfo SOURCES testdisplayinfo.c NAME83 dispinfo) 465add_sdl_test_executable(testqsort NONINTERACTIVE SOURCES testqsort.c NAME83 qsort) 466if(EMSCRIPTEN) 467 target_link_options(testqsort PRIVATE -sALLOW_MEMORY_GROWTH) 468endif() 469add_sdl_test_executable(testbounds NONINTERACTIVE SOURCES testbounds.c NAME83 bounds) 470add_sdl_test_executable(testcustomcursor SOURCES testcustomcursor.c NAME83 custcurs) 471add_sdl_test_executable(testvulkan SOURCES testvulkan.c NAME83 vulkan) 472add_sdl_test_executable(testoffscreen SOURCES testoffscreen.c NAME83 offscrn) 473add_sdl_test_executable(testpopup SOURCES testpopup.c NAME83 popup) 474add_sdl_test_executable(testdialog SOURCES testdialog.c NAME83 dialog) 475add_sdl_test_executable(testtime SOURCES testtime.c NAME83 timesdl) 476add_sdl_test_executable(testmanymouse SOURCES testmanymouse.c NAME83 manymous) 477add_sdl_test_executable(testmodal SOURCES testmodal.c NAME83 modal) 478add_sdl_test_executable(testtray NEEDS_RESOURCES TESTUTILS SOURCES testtray.c NAME83 tray) 479 480 481add_sdl_test_executable(testprocess 482 NONINTERACTIVE THREADS 483 NONINTERACTIVE_ARGS $<TARGET_FILE:childprocess> 484 INSTALLED_ARGS "${CMAKE_INSTALL_FULL_LIBEXECDIR}/installed-tests/SDL3/childprocess${CMAKE_EXECUTABLE_SUFFIX}" 485 SOURCES testprocess.c 486 NAME83 process 487) 488add_sdl_test_executable(childprocess SOURCES childprocess.c NAME83 chldproc) 489add_dependencies(testprocess childprocess) 490 491get_property(SDL_TEST_EXECUTABLES DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY SDL_TEST_EXECUTABLES) 492 493if (HAVE_WAYLAND) 494 # Set the GENERATED property on the protocol file, since it is first created at build time 495 set_property(SOURCE ${SDL3_BINARY_DIR}/wayland-generated-protocols/xdg-shell-protocol.c PROPERTY GENERATED 1) 496 add_sdl_test_executable(testwaylandcustom NEEDS_RESOURCES SOURCES testwaylandcustom.c ${SDL3_BINARY_DIR}/wayland-generated-protocols/xdg-shell-protocol.c) 497 # Needed to silence the documentation warning in the generated header file 498 target_compile_options(testwaylandcustom PRIVATE -Wno-documentation-unknown-command) 499 target_link_libraries(testwaylandcustom PRIVATE PkgConfig::PkgWaylandClient) 500endif() 501 502check_c_compiler_flag(-Wformat-overflow HAVE_WFORMAT_OVERFLOW) 503if(HAVE_WFORMAT_OVERFLOW) 504 target_compile_definitions(testautomation PRIVATE HAVE_WFORMAT_OVERFLOW) 505endif() 506 507check_c_compiler_flag(-Wformat HAVE_WFORMAT) 508if(HAVE_WFORMAT) 509 target_compile_definitions(testautomation PRIVATE HAVE_WFORMAT) 510endif() 511 512cmake_push_check_state() 513if(HAVE_WFORMAT) 514 # Some compilers ignore -Wformat-extra-args without -Wformat 515 string(APPEND CMAKE_REQUIRED_FLAGS " -Wformat") 516endif() 517check_c_compiler_flag(-Wformat-extra-args HAVE_WFORMAT_EXTRA_ARGS) 518cmake_pop_check_state() 519if(HAVE_WFORMAT_EXTRA_ARGS) 520 target_compile_definitions(testautomation PRIVATE HAVE_WFORMAT_EXTRA_ARGS) 521endif() 522 523if(SDL_DUMMYAUDIO) 524 set_property(TARGET testaudioinfo PROPERTY SDL_NONINTERACTIVE 1) 525endif() 526 527if(SDL_DUMMYVIDEO) 528 set_property(TARGET testkeys PROPERTY SDL_NONINTERACTIVE 1) 529 set_property(TARGET testbounds PROPERTY SDL_NONINTERACTIVE 1) 530 set_property(TARGET testdisplayinfo PROPERTY SDL_NONINTERACTIVE 1) 531endif() 532 533if(OPENGL_FOUND) 534 if(TARGET OpenGL::GL) 535 target_link_libraries(testshader PRIVATE OpenGL::GL) 536 target_link_libraries(testgl PRIVATE OpenGL::GL) 537 else() 538 if(EMSCRIPTEN AND OPENGL_gl_LIBRARY STREQUAL "nul") 539 set(OPENGL_gl_LIBRARY GL) 540 endif() 541 # emscripten's FindOpenGL.cmake does not create OpenGL::GL 542 target_link_libraries(testshader PRIVATE ${OPENGL_gl_LIBRARY}) 543 target_link_libraries(testgl PRIVATE ${OPENGL_gl_LIBRARY}) 544 endif() 545endif() 546if(MACOS) 547 target_link_options(testnative PRIVATE "-Wl,-framework,Cocoa") 548endif() 549if(APPLE) 550 cmake_push_check_state() 551 check_c_compiler_flag(-Wno-error=deprecated-declarations HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS) 552 cmake_pop_check_state() 553 if(HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS) 554 set_property(SOURCE "testnativecocoa.m" APPEND PROPERTY COMPILE_OPTIONS "-Wno-error=deprecated-declarations") 555 set_property(TARGET testgles APPEND PROPERTY COMPILE_OPTIONS "-Wno-error=deprecated-declarations") 556 endif() 557endif() 558 559 560if(PSP) 561 # Build EBOOT files if building for PSP 562 foreach(APP ${SDL_TEST_EXECUTABLES}) 563 create_pbp_file( 564 TARGET ${APP} 565 TITLE SDL-${APP} 566 ICON_PATH NULL 567 BACKGROUND_PATH NULL 568 PREVIEW_PATH NULL 569 OUTPUT_DIR $<TARGET_FILE_DIR:${APP}>/sdl-${APP} 570 ) 571 endforeach() 572endif() 573 574if(N3DS) 575 foreach(APP ${SDL_TEST_EXECUTABLES}) 576 get_target_property(TARGET_BINARY_DIR ${APP} BINARY_DIR) 577 set(ROMFS_DIR "${TARGET_BINARY_DIR}/sdl-${APP}") 578 set(SMDH_FILE "${TARGET_BINARY_DIR}/${APP}.smdh") 579 file(MAKE_DIRECTORY ${ROMFS_DIR}) 580 ctr_generate_smdh("${SMDH_FILE}" 581 NAME "SDL-${APP}" 582 DESCRIPTION "SDL3 Test suite" 583 AUTHOR "SDL3 Contributors" 584 ICON "${CMAKE_CURRENT_SOURCE_DIR}/n3ds/logo48x48.png" 585 ) 586 ctr_create_3dsx( 587 ${APP} 588 ROMFS "${ROMFS_DIR}" 589 SMDH "${SMDH_FILE}" 590 ) 591 endforeach() 592endif() 593 594if(RISCOS) 595 set(SDL_TEST_EXECUTABLES_AIF) 596 foreach(APP ${SDL_TEST_EXECUTABLES}) 597 set_property(TARGET ${APP} APPEND_STRING PROPERTY LINK_FLAGS " -static") 598 add_custom_command( 599 OUTPUT ${APP},ff8 600 COMMAND elf2aif ${APP} ${APP},ff8 601 DEPENDS ${APP} 602 ) 603 add_custom_target(${APP}-aif ALL DEPENDS ${APP},ff8) 604 list(APPEND SDL_TEST_EXECUTABLES_AIF ${CMAKE_CURRENT_BINARY_DIR}/${APP},ff8) 605 endforeach() 606endif() 607 608# Set Apple App ID / Bundle ID. This is needed to launch apps on some Apple 609# platforms (iOS, for example). 610if(APPLE) 611 foreach(CURRENT_TARGET ${SDL_TEST_EXECUTABLES}) 612 set_target_properties("${CURRENT_TARGET}" PROPERTIES 613 MACOSX_BUNDLE_GUI_IDENTIFIER "org.libsdl.${CURRENT_TARGET}" 614 MACOSX_BUNDLE_BUNDLE_VERSION "${SDL3_VERSION}" 615 MACOSX_BUNDLE_SHORT_VERSION_STRING "${SDL3_VERSION}" 616 ) 617 endforeach() 618endif() 619 620set(SDLTEST_TIMEOUT_MULTIPLIER "1" CACHE STRING "SDL test time-out multiplier") 621 622set(SDLTEST_AUDIO_DRIVER_DEFAULT "dummy") 623set(SDLTEST_VIDEO_DRIVER_DEFAULT "dummy") 624if(EMSCRIPTEN) 625 set(SDLTEST_AUDIO_DRIVER_DEFAULT "emscripten") 626 set(SDLTEST_VIDEO_DRIVER_DEFAULT "emscripten") 627endif() 628set(SDLTEST_AUDIO_DRIVER "${SDLTEST_AUDIO_DRIVER_DEFAULT}" CACHE STRING "SDL audio driver for CTest") 629set(SDLTEST_VIDEO_DRIVER "${SDLTEST_VIDEO_DRIVER_DEFAULT}" CACHE STRING "SDL video driver for CTest") 630 631set(TESTS_ENVIRONMENT 632 "SDL_AUDIO_DRIVER=${SDLTEST_AUDIO_DRIVER}" 633 "SDL_VIDEO_DRIVER=${SDLTEST_VIDEO_DRIVER}" 634 "SDL_ASSERT=abort" 635) 636 637function(add_sdl_test TEST TARGET) 638 cmake_parse_arguments(ast "INSTALL" "" "" ${ARGN}) 639 get_property(noninteractive TARGET ${TARGET} PROPERTY SDL_NONINTERACTIVE) 640 if(noninteractive) 641 if(EMSCRIPTEN) 642 set(command "${PYTHON3_EXECUTABLE};${CMAKE_CURRENT_SOURCE_DIR}/emscripten/driver.py;--server;http://localhost:${SDLTEST_PORT};--browser;${SDLTEST_BROWSER}") 643 if(SDLTEST_CHROME_BINARY) 644 list(APPEND command "--chrome-binary;${SDLTEST_CHROME_BINARY}") 645 endif() 646 list(APPEND command "--;${TARGET}") 647 else() 648 set(command ${TARGET}) 649 endif() 650 get_property(noninteractive_arguments TARGET ${TARGET} PROPERTY SDL_NONINTERACTIVE_ARGUMENTS) 651 get_property(installed_arguments_list TARGET ${TARGET} PROPERTY SDL_INSTALLED_ARGUMENTS) 652 # This assumes that none of the arguments need quoting 653 list(JOIN installed_arguments_list " " installed_arguments) 654 get_property(disable_threads_args TARGET ${TARGET} PROPERTY SDL_DISABLE_THREADS_ARGS) 655 get_property(uses_threads TARGET ${TARGET} PROPERTY SDL_THREADS) 656 if(noninteractive_arguments) 657 list(APPEND command ${noninteractive_arguments}) 658 endif() 659 if(SDLTEST_TRACKMEM) 660 get_property(notrackmem TARGET ${TARGET} PROPERTY SDL_NOTRACKMEM) 661 if(NOT notrackmem) 662 list(APPEND command --trackmem) 663 endif() 664 endif() 665 if(EMSCRIPTEN) 666 list(APPEND command ${disable_threads_args}) 667 endif() 668 add_test( 669 NAME ${TEST} 670 COMMAND ${command} 671 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 672 ) 673 if(WIN32 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.27") 674 set_property(TEST ${TEST} APPEND PROPERTY ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$<TARGET_RUNTIME_DLL_DIRS:${TARGET}>") 675 endif() 676 if(NOT notrackmem) 677 set_property(TEST ${TEST} PROPERTY FAIL_REGULAR_EXPRESSION "Total: [0-9]+\\.[0-9]+ Kb in [1-9][0-9]* allocations") 678 endif() 679 set_tests_properties(${TEST} PROPERTIES ENVIRONMENT "${TESTS_ENVIRONMENT}") 680 if(EMSCRIPTEN AND uses_threads) 681 set_tests_properties(${TEST} PROPERTIES DISABLED 1) 682 endif() 683 get_property(noninteractive_timeout TARGET ${TARGET} PROPERTY SDL_NONINTERACTIVE_TIMEOUT) 684 if(NOT noninteractive_timeout) 685 set(noninteractive_timeout 10) 686 endif() 687 math(EXPR noninteractive_timeout "${noninteractive_timeout}*${SDLTEST_TIMEOUT_MULTIPLIER}") 688 set_tests_properties(${TEST} PROPERTIES TIMEOUT "${noninteractive_timeout}") 689 if(ast_INSTALL AND SDL_INSTALL_TESTS) 690 set(exe ${TARGET}) 691 set(installedtestsdir "${CMAKE_INSTALL_FULL_LIBEXECDIR}/installed-tests/SDL3") 692 configure_file(template.test.in "${exe}.test" @ONLY) 693 install( 694 FILES "${CMAKE_CURRENT_BINARY_DIR}/${exe}.test" 695 DESTINATION ${CMAKE_INSTALL_DATADIR}/installed-tests/SDL3 696 ) 697 endif() 698 if(TARGET pretest AND NOT "${TARGET}" MATCHES "pretest") 699 set_property(TEST ${TEST} APPEND PROPERTY DEPENDS pretest) 700 endif() 701 endif() 702endfunction() 703 704foreach(TARGET ${SDL_TEST_EXECUTABLES}) 705 add_sdl_test(${TARGET} ${TARGET} INSTALL) 706endforeach() 707 708if(NOT EMSCRIPTEN) 709 add_sdl_test(testautomation-no-simd testautomation) 710 add_sdl_test(testplatform-no-simd testplatform) 711 set_property(TEST testautomation-no-simd testplatform-no-simd APPEND PROPERTY ENVIRONMENT "SDL_CPU_FEATURE_MASK=-all") 712 713 # testautomation creates temporary files which might conflict 714 set_property(TEST testautomation-no-simd testautomation PROPERTY RUN_SERIAL TRUE) 715endif() 716 717if(SDL_INSTALL_TESTS) 718 if(RISCOS) 719 install( 720 FILES ${SDL_TEST_EXECUTABLES_AIF} 721 DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3 722 ) 723 else() 724 foreach(test IN LISTS SDL_TEST_EXECUTABLES) 725 get_property(install_target TARGET ${test} PROPERTY "SDL_INSTALL") 726 if(install_target) 727 install( 728 TARGETS ${test} 729 DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3 730 ) 731 get_property(extra_install TARGET ${test} PROPERTY "EXTRA_INSTALL") 732 if(extra_install) 733 install( 734 FILES ${extra_install} 735 DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3 736 OPTIONAL 737 ) 738 endif() 739 endif() 740 endforeach() 741 endif() 742 if(MSVC) 743 foreach(test IN LISTS SDL_TEST_EXECUTABLES) 744 SDL_install_pdb(${test} "${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3") 745 endforeach() 746 endif() 747 install( 748 FILES ${RESOURCE_FILES} 749 DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3 750 ) 751endif() 752 753if(ANDROID AND TARGET SDL3::Jar) 754 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../cmake/android") 755 find_package(SdlAndroid MODULE) 756 if(SdlAndroid_FOUND) 757 set(apks "") 758 set(packages "") 759 760 include(SdlAndroidFunctions) 761 sdl_create_android_debug_keystore(SDL_test-debug-keystore) 762 sdl_android_compile_resources(SDL_test-resources RESFOLDER android/res) 763 add_custom_target(sdl-test-apks) 764 foreach(TEST ${SDL_TEST_EXECUTABLES}) 765 set(ANDROID_MANIFEST_APP_NAME "${TEST}") 766 set(ANDROID_MANIFEST_LABEL "${TEST}") 767 set(ANDROID_MANIFEST_LIB_NAME "$<TARGET_FILE_BASE_NAME:${TEST}>") 768 set(ANDROID_MANIFEST_PACKAGE "org.libsdl.sdl.test.${TEST}") 769 set(generated_manifest_path "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-src/AndroidManifest.xml") 770 string(REPLACE "." "/" JAVA_PACKAGE_DIR "${ANDROID_MANIFEST_PACKAGE}") 771 set(GENERATED_SRC_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-src") 772 set(GENERATED_RES_FOLDER "${GENERATED_SRC_FOLDER}/res") 773 set(JAVA_PACKAGE_DIR "${GENERATED_SRC_FOLDER}/${JAVA_PACKAGE_DIR}") 774 configure_file(android/cmake/SDLEntryTestActivity.java.cmake "${JAVA_PACKAGE_DIR}/SDLEntryTestActivity.java" @ONLY) 775 configure_file(android/cmake/SDLTestActivity.java.cmake "${JAVA_PACKAGE_DIR}/SDLTestActivity.java" @ONLY) 776 configure_file(android/cmake/res/values/strings.xml.cmake android/res/values/strings-${TEST}.xml @ONLY) 777 configure_file(android/cmake/res/xml/shortcuts.xml.cmake "${GENERATED_RES_FOLDER}/xml/shortcuts.xml" @ONLY) 778 # Use XR-specific manifest for XR tests, standard manifest for others 779 if("${TEST}" MATCHES "_xr$") 780 # Meta Quest-specific manifest sections (enabled by default, set to empty to disable) 781 # These are ignored by non-Meta runtimes but required for proper Quest integration 782 if(NOT DEFINED SDL_ANDROID_XR_META_SUPPORT OR SDL_ANDROID_XR_META_SUPPORT) 783 set(ANDROID_XR_META_FEATURES 784" <!-- Meta Quest hand tracking support --> 785 <uses-feature android:name=\"oculus.software.handtracking\" android:required=\"false\" /> 786") 787 set(ANDROID_XR_META_METADATA 788" <!-- Meta Quest supported devices --> 789 <meta-data android:name=\"com.oculus.supportedDevices\" android:value=\"quest|quest2|questpro|quest3|quest3s\" /> 790 <meta-data android:name=\"com.oculus.vr.focusaware\" android:value=\"true\" /> 791 <!-- Hand tracking support level (V2 allows launching without controllers) --> 792 <meta-data android:name=\"com.oculus.handtracking.version\" android:value=\"V2.0\" /> 793 <meta-data android:name=\"com.oculus.handtracking.frequency\" android:value=\"HIGH\" /> 794") 795 set(ANDROID_XR_META_INTENT_CATEGORY 796" <!-- VR intent category for Meta Quest --> 797 <category android:name=\"com.oculus.intent.category.VR\" />") 798 else() 799 set(ANDROID_XR_META_FEATURES "") 800 set(ANDROID_XR_META_METADATA "") 801 set(ANDROID_XR_META_INTENT_CATEGORY "") 802 endif() 803 configure_file(android/cmake/AndroidManifest.xr.xml.cmake "${generated_manifest_path}" @ONLY) 804 else() 805 configure_file(android/cmake/AndroidManifest.xml.cmake "${generated_manifest_path}" @ONLY) 806 endif() 807 file(GENERATE 808 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-$<CONFIG>/res/values/strings.xml" 809 INPUT "${CMAKE_CURRENT_BINARY_DIR}/android/res/values/strings-${TEST}.xml" 810 ) 811 812 sdl_android_compile_resources(${TEST}-resources 813 RESOURCES 814 "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-$<CONFIG>/res/values/strings.xml" 815 "${GENERATED_RES_FOLDER}/xml/shortcuts.xml" 816 ) 817 818 sdl_android_link_resources(${TEST}-apk-linked 819 MANIFEST "${generated_manifest_path}" 820 PACKAGE ${ANDROID_MANIFEST_PACKAGE} 821 RES_TARGETS SDL_test-resources ${TEST}-resources 822 TARGET_SDK_VERSION 31 823 ) 824 825 set(CMAKE_JAVA_COMPILE_FLAGS "-encoding;utf-8") 826 set(classes_path "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TEST}-java.dir/classes") 827 # Some CMake versions have a slow `cmake -E make_directory` implementation 828 if(NOT IS_DIRECTORY "${classes_path}") 829 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${classes_path}") 830 endif() 831 set(OUT_JAR "${CMAKE_CURRENT_BINARY_DIR}/${TEST}.jar") 832 add_custom_command( 833 OUTPUT "${OUT_JAR}" 834 COMMAND ${CMAKE_COMMAND} -E rm -rf "${classes_path}" 835 COMMAND ${CMAKE_COMMAND} -E make_directory "${classes_path}" 836 COMMAND ${Java_JAVAC_EXECUTABLE} 837 -source 1.8 -target 1.8 838 -bootclasspath "$<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>" 839 "${JAVA_PACKAGE_DIR}/SDLEntryTestActivity.java" 840 "${JAVA_PACKAGE_DIR}/SDLTestActivity.java" 841 $<TARGET_PROPERTY:${TEST}-apk-linked,JAVA_R> 842 -cp "$<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>:${SDL_ANDROID_PLATFORM_ANDROID_JAR}" 843 -d "${classes_path}" 844 COMMAND ${Java_JAR_EXECUTABLE} cf "${OUT_JAR}" -C "${classes_path}" . 845 DEPENDS $<TARGET_PROPERTY:${TEST}-apk-linked,OUTPUTS> "$<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>" "${JAVA_PACKAGE_DIR}/SDLTestActivity.java" "${JAVA_PACKAGE_DIR}/SDLEntryTestActivity.java" 846 ) 847 add_custom_target(${TEST}-jar DEPENDS "${OUT_JAR}") 848 set_property(TARGET ${TEST}-jar PROPERTY OUTPUT "${OUT_JAR}") 849 850 set(dexworkdir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TEST}-dex.dir") 851 # Some CMake versions have a slow `cmake -E make_directory` implementation 852 if(NOT IS_DIRECTORY "${dexworkdir}") 853 execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${dexworkdir}") 854 endif() 855 set(classes_dex_base_name "classes.dex") 856 set(classes_dex "${dexworkdir}/${classes_dex_base_name}") 857 add_custom_command( 858 OUTPUT "${classes_dex}" 859 COMMAND SdlAndroid::d8 860 $<TARGET_PROPERTY:${TEST}-jar,OUTPUT> 861 $<TARGET_PROPERTY:SDL3::Jar,JAR_FILE> 862 --lib "${SDL_ANDROID_PLATFORM_ANDROID_JAR}" 863 --output "${dexworkdir}" 864 DEPENDS $<TARGET_PROPERTY:${TEST}-jar,OUTPUT> $<TARGET_PROPERTY:SDL3::Jar,JAR_FILE> 865 ) 866 add_custom_target(${TEST}-dex DEPENDS "${classes_dex}") 867 set_property(TARGET ${TEST}-dex PROPERTY OUTPUT "${classes_dex}") 868 set_property(TARGET ${TEST}-dex PROPERTY OUTPUT_BASE_NAME "${classes_dex_base_name}") 869 870 sdl_add_to_apk_unaligned(${TEST}-unaligned-apk 871 APK_IN ${TEST}-apk-linked 872 OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/intermediates" 873 ASSETS ${RESOURCE_FILES} 874 NATIVE_LIBS SDL3::SDL3-shared ${TEST} 875 DEX ${TEST}-dex 876 ) 877 878 sdl_apk_align(${TEST}-aligned-apk ${TEST}-unaligned-apk 879 OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/intermediates" 880 ) 881 sdl_apk_sign(${TEST}-apk ${TEST}-aligned-apk 882 KEYSTORE SDL_test-debug-keystore 883 ) 884 add_dependencies(sdl-test-apks ${TEST}-apk) 885 886 if(TARGET SdlAndroid::adb) 887 add_custom_target(install-${TEST} 888 COMMAND "${CMAKE_COMMAND}" -DACTION=install "-DAPKS=$<TARGET_PROPERTY:${TEST}-apk,OUTPUT>" -P "${SDL3_SOURCE_DIR}/cmake/android/SdlAndroidScript.cmake" 889 DEPENDS "${TEST}-apk" 890 ) 891 add_custom_target(start-${TEST} 892 COMMAND "${ADB_BIN}" shell am start-activity -S "${ANDROID_MANIFEST_PACKAGE}/.SDLTestActivity" 893 ) 894 add_custom_target(build-install-start-${TEST} 895 COMMAND "${CMAKE_COMMAND}" -DACTION=build-install-run "-DEXECUTABLES=${TEST}" "-DBUILD_FOLDER=${CMAKE_BINARY_DIR}" -P "${SDL3_SOURCE_DIR}/cmake/android/SdlAndroidScript.cmake" 896 ) 897 endif() 898 899 list(APPEND packages "${ANDROID_MANIFEST_PACKAGE}") 900 list(APPEND install_targets install-${TEST}) 901 endforeach() 902 903 if(TARGET SdlAndroid::adb) 904 add_custom_target(install-sdl-test-apks 905 DEPENDS ${install_targets} 906 VERBATIM 907 ) 908 add_custom_target(uninstall-sdl-test-apks 909 COMMAND "${CMAKE_COMMAND}" "-DADB=$<TARGET_FILE:SdlAndroid::adb>" -DACTION=uninstall "-DPACKAGES=${packages}" -P "${SDL3_SOURCE_DIR}/cmake/android/SdlAndroidScript.cmake" 910 VERBATIM 911 ) 912 endif() 913 endif() 914endif() 915
[FILE END]
(C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.