CMakeLists.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. cmake_minimum_required(VERSION 3.0)
  2. project(SDL3_test)
  3. include(CheckCCompilerFlag)
  4. include(CMakeParseArguments)
  5. include(CMakePushCheckState)
  6. set(SDL_TEST_EXECUTABLES)
  7. set(SDL_TESTS_NONINTERACTIVE)
  8. set(SDL_TESTS_NEEDS_ESOURCES)
  9. macro(add_sdl_test_executable TARGET)
  10. cmake_parse_arguments(AST "NONINTERACTIVE;NEEDS_RESOURCES" "" "" ${ARGN})
  11. add_executable(${TARGET} ${AST_UNPARSED_ARGUMENTS})
  12. list(APPEND SDL_TEST_EXECUTABLES ${TARGET})
  13. if(AST_NONINTERACTIVE)
  14. list(APPEND SDL_TESTS_NONINTERACTIVE ${TARGET})
  15. endif()
  16. if(AST_NEEDS_RESOURCES)
  17. list(APPEND SDL_TESTS_NEEDS_ESOURCES ${TARGET})
  18. endif()
  19. endmacro()
  20. if(NOT TARGET SDL3::SDL3-static)
  21. find_package(SDL3 3.0.0 REQUIRED COMPONENTS SDL3-static SDL3test)
  22. endif()
  23. enable_testing()
  24. if(SDL_INSTALL_TESTS)
  25. include(GNUInstallDirs)
  26. endif()
  27. if(N3DS)
  28. link_libraries(SDL3::SDL3main)
  29. endif()
  30. if(PSP)
  31. link_libraries(
  32. SDL3::SDL3main
  33. SDL3::SDL3test
  34. SDL3::SDL3-static
  35. GL
  36. pspvram
  37. pspvfpu
  38. pspdisplay
  39. pspgu
  40. pspge
  41. pspaudio
  42. pspctrl
  43. psphprm
  44. psppower
  45. )
  46. elseif(PS2)
  47. link_libraries(
  48. SDL3main
  49. SDL3_test
  50. SDL3-static
  51. patches
  52. gskit
  53. dmakit
  54. ps2_drivers
  55. )
  56. else()
  57. link_libraries(SDL3::SDL3test SDL3::SDL3-static)
  58. endif()
  59. if(WINDOWS)
  60. # mingw32 must come before SDL3main to link successfully
  61. if(MINGW OR CYGWIN)
  62. link_libraries(mingw32)
  63. endif()
  64. # CET support was added in VS 16.7
  65. if(MSVC_VERSION GREATER 1926 AND CMAKE_GENERATOR_PLATFORM MATCHES "Win32|x64")
  66. link_libraries(-CETCOMPAT)
  67. endif()
  68. # FIXME: Parent directory CMakeLists.txt only sets these for mingw/cygwin,
  69. # but we need them for VS as well.
  70. link_libraries(SDL3main)
  71. add_definitions(-Dmain=SDL_main)
  72. endif()
  73. # CMake incorrectly detects opengl32.lib being present on MSVC ARM64
  74. if(NOT MSVC OR NOT CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64")
  75. # Prefer GLVND, if present
  76. set(OpenGL_GL_PREFERENCE GLVND)
  77. find_package(OpenGL)
  78. endif()
  79. if (OPENGL_FOUND)
  80. add_definitions(-DHAVE_OPENGL)
  81. endif()
  82. add_sdl_test_executable(checkkeys checkkeys.c)
  83. add_sdl_test_executable(checkkeysthreads checkkeysthreads.c)
  84. add_sdl_test_executable(loopwave NEEDS_RESOURCES loopwave.c testutils.c)
  85. add_sdl_test_executable(loopwavequeue NEEDS_RESOURCES loopwavequeue.c testutils.c)
  86. add_sdl_test_executable(testsurround testsurround.c)
  87. add_sdl_test_executable(testresample NEEDS_RESOURCES testresample.c)
  88. add_sdl_test_executable(testaudioinfo testaudioinfo.c)
  89. file(GLOB TESTAUTOMATION_SOURCE_FILES testautomation*.c)
  90. add_sdl_test_executable(testautomation NEEDS_RESOURCES ${TESTAUTOMATION_SOURCE_FILES})
  91. add_sdl_test_executable(testmultiaudio NEEDS_RESOURCES testmultiaudio.c testutils.c)
  92. add_sdl_test_executable(testaudiohotplug NEEDS_RESOURCES testaudiohotplug.c testutils.c)
  93. add_sdl_test_executable(testaudiocapture testaudiocapture.c)
  94. add_sdl_test_executable(testatomic NONINTERACTIVE testatomic.c)
  95. add_sdl_test_executable(testintersections testintersections.c)
  96. add_sdl_test_executable(testrelative testrelative.c)
  97. add_sdl_test_executable(testhittesting testhittesting.c)
  98. add_sdl_test_executable(testdraw2 testdraw2.c)
  99. add_sdl_test_executable(testdrawchessboard testdrawchessboard.c)
  100. add_sdl_test_executable(testdropfile testdropfile.c)
  101. add_sdl_test_executable(testerror NONINTERACTIVE testerror.c)
  102. if(LINUX)
  103. add_sdl_test_executable(testevdev NONINTERACTIVE testevdev.c)
  104. endif()
  105. add_sdl_test_executable(testfile testfile.c)
  106. add_sdl_test_executable(testgamecontroller NEEDS_RESOURCES testgamecontroller.c testutils.c)
  107. add_sdl_test_executable(testgeometry testgeometry.c testutils.c)
  108. add_sdl_test_executable(testgesture testgesture.c)
  109. add_sdl_test_executable(testgl2 testgl2.c)
  110. add_sdl_test_executable(testgles2 testgles2.c)
  111. add_sdl_test_executable(testhaptic testhaptic.c)
  112. add_sdl_test_executable(testhotplug testhotplug.c)
  113. add_sdl_test_executable(testrumble testrumble.c)
  114. add_sdl_test_executable(testthread NONINTERACTIVE testthread.c)
  115. add_sdl_test_executable(testiconv NEEDS_RESOURCES testiconv.c testutils.c)
  116. add_sdl_test_executable(testime NEEDS_RESOURCES testime.c testutils.c)
  117. add_sdl_test_executable(testjoystick testjoystick.c)
  118. add_sdl_test_executable(testkeys testkeys.c)
  119. add_sdl_test_executable(testloadso testloadso.c)
  120. add_sdl_test_executable(testlocale NONINTERACTIVE testlocale.c)
  121. add_sdl_test_executable(testlock testlock.c)
  122. add_sdl_test_executable(testmouse testmouse.c)
  123. if(APPLE)
  124. add_sdl_test_executable(testnative NEEDS_RESOURCES
  125. testnative.c
  126. testnativecocoa.m
  127. testnativex11.c
  128. testutils.c
  129. )
  130. cmake_push_check_state(RESET)
  131. check_c_compiler_flag(-Wno-error=deprecated-declarations HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS)
  132. cmake_pop_check_state()
  133. if(HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS)
  134. set_property(SOURCE "testnativecocoa.m" APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-error=deprecated-declarations")
  135. endif()
  136. elseif(WINDOWS)
  137. add_sdl_test_executable(testnative NEEDS_RESOURCES testnative.c testnativew32.c testutils.c)
  138. elseif(HAVE_X11)
  139. add_sdl_test_executable(testnative NEEDS_RESOURCES testnative.c testnativex11.c testutils.c)
  140. target_link_libraries(testnative X11)
  141. endif()
  142. add_sdl_test_executable(testoverlay2 NEEDS_RESOURCES testoverlay2.c testyuv_cvt.c testutils.c)
  143. add_sdl_test_executable(testplatform NONINTERACTIVE testplatform.c)
  144. add_sdl_test_executable(testpower NONINTERACTIVE testpower.c)
  145. add_sdl_test_executable(testfilesystem NONINTERACTIVE testfilesystem.c)
  146. add_sdl_test_executable(testrendertarget NEEDS_RESOURCES testrendertarget.c testutils.c)
  147. add_sdl_test_executable(testscale NEEDS_RESOURCES testscale.c testutils.c)
  148. add_sdl_test_executable(testsem testsem.c)
  149. add_sdl_test_executable(testsensor testsensor.c)
  150. add_sdl_test_executable(testshader NEEDS_RESOURCES testshader.c)
  151. add_sdl_test_executable(testshape NEEDS_RESOURCES testshape.c)
  152. add_sdl_test_executable(testsprite2 NEEDS_RESOURCES testsprite2.c testutils.c)
  153. add_sdl_test_executable(testspriteminimal NEEDS_RESOURCES testspriteminimal.c testutils.c)
  154. add_sdl_test_executable(teststreaming NEEDS_RESOURCES teststreaming.c testutils.c)
  155. add_sdl_test_executable(testtimer NONINTERACTIVE testtimer.c)
  156. add_sdl_test_executable(testurl testurl.c)
  157. add_sdl_test_executable(testver NONINTERACTIVE testver.c)
  158. add_sdl_test_executable(testviewport NEEDS_RESOURCES testviewport.c testutils.c)
  159. add_sdl_test_executable(testwm2 testwm2.c)
  160. add_sdl_test_executable(testyuv NEEDS_RESOURCES testyuv.c testyuv_cvt.c)
  161. add_sdl_test_executable(torturethread torturethread.c)
  162. add_sdl_test_executable(testrendercopyex NEEDS_RESOURCES testrendercopyex.c testutils.c)
  163. add_sdl_test_executable(testmessage testmessage.c)
  164. add_sdl_test_executable(testdisplayinfo testdisplayinfo.c)
  165. add_sdl_test_executable(testqsort NONINTERACTIVE testqsort.c)
  166. add_sdl_test_executable(testbounds testbounds.c)
  167. add_sdl_test_executable(testcustomcursor testcustomcursor.c)
  168. add_sdl_test_executable(controllermap NEEDS_RESOURCES controllermap.c testutils.c)
  169. add_sdl_test_executable(testvulkan testvulkan.c)
  170. add_sdl_test_executable(testoffscreen testoffscreen.c)
  171. cmake_push_check_state(RESET)
  172. check_c_compiler_flag(-Wformat-overflow HAVE_WFORMAT_OVERFLOW)
  173. if(HAVE_WFORMAT_OVERFLOW)
  174. target_compile_definitions(testautomation PRIVATE HAVE_WFORMAT_OVERFLOW)
  175. endif()
  176. check_c_compiler_flag(-Wformat HAVE_WFORMAT)
  177. if(HAVE_WFORMAT)
  178. target_compile_definitions(testautomation PRIVATE HAVE_WFORMAT)
  179. endif()
  180. check_c_compiler_flag(-Wformat-extra-args HAVE_WFORMAT_EXTRA_ARGS)
  181. if(HAVE_WFORMAT_EXTRA_ARGS)
  182. target_compile_definitions(testautomation PRIVATE HAVE_WFORMAT_EXTRA_ARGS)
  183. endif()
  184. cmake_pop_check_state()
  185. if(SDL_DUMMYAUDIO)
  186. list(APPEND SDL_TESTS_NONINTERACTIVE
  187. testaudioinfo
  188. testsurround
  189. )
  190. endif()
  191. if(SDL_DUMMYVIDEO)
  192. list(APPEND SDL_TESTS_NONINTERACTIVE
  193. testkeys
  194. testbounds
  195. testdisplayinfo
  196. )
  197. endif()
  198. if(OPENGL_FOUND)
  199. if(TARGET OpenGL::GL)
  200. target_link_libraries(testshader OpenGL::GL)
  201. target_link_libraries(testgl2 OpenGL::GL)
  202. else()
  203. if(EMSCRIPTEN AND OPENGL_gl_LIBRARY STREQUAL "nul")
  204. set(OPENGL_gl_LIBRARY GL)
  205. endif()
  206. # emscripten's FindOpenGL.cmake does not create OpenGL::GL
  207. target_link_libraries(testshader ${OPENGL_gl_LIBRARY})
  208. target_link_libraries(testgl2 ${OPENGL_gl_LIBRARY})
  209. endif()
  210. endif()
  211. if(EMSCRIPTEN)
  212. target_link_libraries(testshader -sLEGACY_GL_EMULATION)
  213. endif()
  214. file(GLOB RESOURCE_FILES *.bmp *.wav *.hex moose.dat utf8.txt)
  215. file(COPY ${RESOURCE_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
  216. if(PSP)
  217. # Build EBOOT files if building for PSP
  218. set(BUILD_EBOOT
  219. ${SDL_TESTS_NEEDS_ESOURCES}
  220. testatomic
  221. testaudiocapture
  222. testaudioinfo
  223. testbounds
  224. testdisplayinfo
  225. testdraw2
  226. testdrawchessboard
  227. testerror
  228. testfile
  229. testfilesystem
  230. testgeometry
  231. testgl2
  232. testhittesting
  233. testiconv
  234. testintersections
  235. testjoystick
  236. testlock
  237. testmessage
  238. testoverlay2
  239. testplatform
  240. testpower
  241. testqsort
  242. testsem
  243. teststreaming
  244. testsurround
  245. testthread
  246. testtimer
  247. testver
  248. testviewport
  249. testwm2
  250. torturethread
  251. )
  252. foreach(APP IN LISTS BUILD_EBOOT)
  253. create_pbp_file(
  254. TARGET ${APP}
  255. TITLE SDL-${APP}
  256. ICON_PATH NULL
  257. BACKGROUND_PATH NULL
  258. PREVIEW_PATH NULL
  259. )
  260. add_custom_command(
  261. TARGET ${APP} POST_BUILD
  262. COMMAND ${CMAKE_COMMAND} -E make_directory
  263. $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}
  264. )
  265. add_custom_command(
  266. TARGET ${APP} POST_BUILD
  267. COMMAND ${CMAKE_COMMAND} -E rename
  268. $<TARGET_FILE_DIR:${ARG_TARGET}>/EBOOT.PBP
  269. $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}/EBOOT.PBP
  270. )
  271. if(${BUILD_PRX})
  272. add_custom_command(
  273. TARGET ${APP} POST_BUILD
  274. COMMAND ${CMAKE_COMMAND} -E copy
  275. $<TARGET_FILE_DIR:${ARG_TARGET}>/${APP}
  276. $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}/${APP}
  277. )
  278. add_custom_command(
  279. TARGET ${APP} POST_BUILD
  280. COMMAND ${CMAKE_COMMAND} -E rename
  281. $<TARGET_FILE_DIR:${ARG_TARGET}>/${APP}.prx
  282. $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}/${APP}.prx
  283. )
  284. endif()
  285. add_custom_command(
  286. TARGET ${APP} POST_BUILD
  287. COMMAND ${CMAKE_COMMAND} -E remove
  288. $<TARGET_FILE_DIR:${ARG_TARGET}>/PARAM.SFO
  289. )
  290. endforeach()
  291. endif()
  292. if(N3DS)
  293. set(ROMFS_DIR "${CMAKE_CURRENT_BINARY_DIR}/romfs")
  294. file(COPY ${RESOURCE_FILES} DESTINATION "${ROMFS_DIR}")
  295. foreach(APP IN LISTS SDL_TEST_EXECUTABLES)
  296. get_target_property(TARGET_BINARY_DIR ${APP} BINARY_DIR)
  297. set(SMDH_FILE "${TARGET_BINARY_DIR}/${APP}.smdh")
  298. ctr_generate_smdh("${SMDH_FILE}"
  299. NAME "SDL-${APP}"
  300. DESCRIPTION "SDL3 Test suite"
  301. AUTHOR "SDL3 Contributors"
  302. ICON "${CMAKE_CURRENT_SOURCE_DIR}/n3ds/logo48x48.png"
  303. )
  304. ctr_create_3dsx(
  305. ${APP}
  306. ROMFS "${ROMFS_DIR}"
  307. SMDH "${SMDH_FILE}"
  308. )
  309. endforeach()
  310. endif()
  311. if(RISCOS)
  312. set(SDL_TEST_EXECUTABLES_AIF)
  313. foreach(APP IN LISTS SDL_TEST_EXECUTABLES)
  314. target_link_options(${APP} PRIVATE -static)
  315. add_custom_command(
  316. OUTPUT ${APP},ff8
  317. COMMAND elf2aif ${APP} ${APP},ff8
  318. DEPENDS ${APP}
  319. )
  320. add_custom_target(${APP}-aif ALL DEPENDS ${APP},ff8)
  321. list(APPEND SDL_TEST_EXECUTABLES_AIF ${CMAKE_CURRENT_BINARY_DIR}/${APP},ff8)
  322. endforeach()
  323. endif()
  324. foreach(APP IN LISTS SDL_TESTS_NEEDS_RESOURCES)
  325. foreach(RESOURCE_FILE ${RESOURCE_FILES})
  326. if(PSP OR PS2)
  327. add_custom_command(TARGET ${APP} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILE} $<TARGET_FILE_DIR:${APP}>/sdl-${APP})
  328. else()
  329. add_custom_command(TARGET ${APP} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${RESOURCE_FILE} $<TARGET_FILE_DIR:${APP}>)
  330. endif()
  331. endforeach(RESOURCE_FILE)
  332. if(APPLE)
  333. # Make sure resource files get installed into macOS/iOS .app bundles.
  334. target_sources(${APP} PRIVATE "${RESOURCE_FILES}")
  335. set_target_properties(${APP} PROPERTIES RESOURCE "${RESOURCE_FILES}")
  336. endif()
  337. endforeach()
  338. # Set Apple App ID / Bundle ID. This is needed to launch apps on some Apple
  339. # platforms (iOS, for example).
  340. if(APPLE)
  341. if(${CMAKE_VERSION} VERSION_LESS "3.7.0")
  342. # CMake's 'BUILDSYSTEM_TARGETS' property is only available in
  343. # CMake 3.7 and above.
  344. message(WARNING "Unable to set Bundle ID for Apple .app builds due to old CMake (pre 3.7).")
  345. else()
  346. get_property(TARGETS DIRECTORY ${CMAKE_CURRENT_LIST_DIR} PROPERTY BUILDSYSTEM_TARGETS)
  347. foreach(CURRENT_TARGET IN LISTS TARGETS)
  348. get_property(TARGET_TYPE TARGET ${CURRENT_TARGET} PROPERTY TYPE)
  349. if(TARGET_TYPE STREQUAL "EXECUTABLE")
  350. set_target_properties("${CURRENT_TARGET}" PROPERTIES
  351. MACOSX_BUNDLE_GUI_IDENTIFIER "org.libsdl.${CURRENT_TARGET}"
  352. MACOSX_BUNDLE_BUNDLE_VERSION "${SDL_VERSION}"
  353. MACOSX_BUNDLE_SHORT_VERSION_STRING "${SDL_VERSION}"
  354. )
  355. endif()
  356. endforeach()
  357. endif()
  358. endif()
  359. set(TESTS_ENVIRONMENT
  360. SDL_AUDIODRIVER=dummy
  361. SDL_VIDEODRIVER=dummy
  362. )
  363. foreach(TESTCASE ${SDL_TESTS_NONINTERACTIVE})
  364. add_test(
  365. NAME ${TESTCASE}
  366. COMMAND ${TESTCASE}
  367. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  368. )
  369. set_tests_properties(${TESTCASE}
  370. PROPERTIES
  371. ENVIRONMENT "${TESTS_ENVIRONMENT}"
  372. TIMEOUT 10
  373. )
  374. if(SDL_INSTALL_TESTS)
  375. set(exe ${TESTCASE})
  376. set(installedtestsdir "${CMAKE_INSTALL_FULL_LIBEXECDIR}/installed-tests/SDL3")
  377. configure_file(template.test.in "${exe}.test" @ONLY)
  378. install(
  379. FILES "${CMAKE_CURRENT_BINARY_DIR}/${exe}.test"
  380. DESTINATION ${CMAKE_INSTALL_DATADIR}/installed-tests/SDL3
  381. )
  382. endif()
  383. endforeach()
  384. set_tests_properties(testthread PROPERTIES TIMEOUT 40)
  385. set_tests_properties(testtimer PROPERTIES TIMEOUT 60)
  386. if(SDL_INSTALL_TESTS)
  387. if(RISCOS)
  388. install(
  389. FILES ${SDL_TEST_EXECUTABLES_AIF}
  390. DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3
  391. )
  392. else()
  393. install(
  394. TARGETS ${SDL_TEST_EXECUTABLES}
  395. DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3
  396. )
  397. endif()
  398. install(
  399. FILES ${RESOURCE_FILES}
  400. DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3
  401. )
  402. endif()