# The sidescroller tutorial game. # # A real target, built by default, so docs/19-tutorial-sidescroller.md cannot # quote a program that does not compile -- and registered as a headless smoke # test, so it cannot quote one that does not run. get_filename_component(SS_ASSET_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../docs/tutorials/assets/sidescroller" ABSOLUTE) add_executable(sidescroller main.c player.c actors.c ) target_include_directories(sidescroller PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") target_compile_options(sidescroller PRIVATE ${AKGL_WARNING_FLAGS}) # Baked in rather than looked up at runtime, so the smoke test can be launched # from any working directory. `--assets DIR` overrides it for a reader who has # moved the art somewhere else. target_compile_definitions(sidescroller PRIVATE "SS_ASSET_DIR=\"${SS_ASSET_DIR}\"") target_link_libraries(sidescroller PRIVATE akstdlib::akstdlib akerror::akerror akgl SDL3::SDL3 SDL3_ttf::SDL3_ttf SDL3_image::SDL3_image SDL3_mixer::SDL3_mixer jansson::jansson -lm) # A vendored build leaves the SDL satellite libraries in per-project # subdirectories that are not on the loader's default search path, which is the # same problem AKGL_VENDORED_RPATH solves for the test executables. if(AKGL_VENDORED_DEPENDENCIES) set_target_properties(sidescroller PROPERTIES BUILD_RPATH "${AKGL_VENDORED_RPATH}") endif() # Four seconds of scripted play under the headless drivers: the level loads, the # player walks and jumps, the swept collision runs against real terrain, and the # program tears down and exits 0. A tutorial that stops working fails here rather # than in front of a reader. # # add_test() rather than _add_test(): the root CMakeLists.txt shadows it only # while this project is top-level, and by the time examples/ is added the # suppression has already been lifted. An embedded build gets the builtin. add_test(NAME example_sidescroller COMMAND sidescroller --frames 240 --autoplay) set_tests_properties(example_sidescroller PROPERTIES TIMEOUT 120) # set_property, not set_tests_properties: the latter parses its PROPERTIES # arguments as name/value *pairs*, so a semicolon-separated value is split and # every element after the first is consumed as a bogus property name. The # audio and render entries of this very list were silently lost that way for # as long as the list existed -- invisible on any machine whose real audio # device works, and found the first time CI ran on a runner without one. set_property(TEST example_sidescroller PROPERTY ENVIRONMENT "SDL_VIDEODRIVER=dummy" "SDL_RENDER_DRIVER=software" "SDL_AUDIODRIVER=dummy" )