CMakeLists.txt 15 KB

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