diff options
| author | LLLL Colonq <llll@colonq> | 2026-07-21 13:53:20 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-07-21 13:53:20 -0400 |
| commit | 3ec03ba57474aa4320cb7901980b55706adbc111 (patch) | |
| tree | 97fcf8d1825cd4bdda65c4b516853dfda60f3610 /2026/submissions/threecoff/clennis/CMakeLists.txt | |
| parent | 47c0d930736bb5247a7f7ba05c7d41e33038102a (diff) | |
Update
Diffstat (limited to '2026/submissions/threecoff/clennis/CMakeLists.txt')
| -rw-r--r-- | 2026/submissions/threecoff/clennis/CMakeLists.txt | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/2026/submissions/threecoff/clennis/CMakeLists.txt b/2026/submissions/threecoff/clennis/CMakeLists.txt new file mode 100644 index 0000000..8d1ca09 --- /dev/null +++ b/2026/submissions/threecoff/clennis/CMakeLists.txt @@ -0,0 +1,98 @@ +cmake_minimum_required(VERSION 3.16) +project(clonk_tennis C) + +set(CMAKE_C_STANDARD 17) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # for clangd (see .clangd) + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) +endif() + +include(FetchContent) + +# --- raylib: windowing, rendering, input (native + web) --- +set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +set(BUILD_GAMES OFF CACHE BOOL "" FORCE) +FetchContent_Declare( + raylib + URL https://github.com/raysan5/raylib/archive/refs/tags/5.5.tar.gz +) + +# --- box3d: 3D rigid body physics (Erin Catto). Only the library builds via +# FetchContent: its samples/tests (and their forced -pthread) are gated +# behind PROJECT_IS_TOP_LEVEL, and it sets its own SIMD flags for wasm. --- +FetchContent_Declare( + box3d + URL https://github.com/erincatto/box3d/archive/refs/tags/v0.1.0.tar.gz +) + +FetchContent_MakeAvailable(raylib box3d) + +add_executable(tennis src/main.c) +target_link_libraries(tennis PRIVATE raylib box3d::box3d) + +if(NOT EMSCRIPTEN) + # main.c pokes GLFW directly (glfwSetInputMode, to undo raylib's + # raw-mouse-motion default); use the GLFW bundled inside raylib. + target_include_directories(tennis PRIVATE + "${raylib_SOURCE_DIR}/src/external/glfw/include") +endif() + +# Where the game finds its models at runtime: baked into the wasm bundle on +# web, read straight from the source tree natively (dev builds only). +if(EMSCRIPTEN) + target_compile_definitions(tennis PRIVATE ASSETS_DIR="assets") +else() + target_compile_definitions(tennis PRIVATE ASSETS_DIR="${CMAKE_CURRENT_SOURCE_DIR}/assets") +endif() + +if(EMSCRIPTEN) + # Work around an LLVM optimizer crash in emcc's clang (6.0.3) that segfaults + # while compiling some Box3D files at -O2/-O3 (independent of SIMD). Build the + # physics library at -O1 on web; it's more than fast enough for this game. + # The trailing -O1 wins over the build-type -O3 for this target only. + if(TARGET box3d) + target_compile_options(box3d PRIVATE -O1) + endif() + + # Produce tennis.html + tennis.js + tennis.wasm + set_target_properties(tennis PROPERTIES SUFFIX ".html") + target_compile_definitions(tennis PRIVATE PLATFORM_WEB) + target_link_options(tennis PRIVATE + -sUSE_GLFW=3 + -sALLOW_MEMORY_GROWTH=1 + # dr_mp3's whole-file decode (raylib LoadSound on .mp3) keeps ~30KB of + # scratch structs on the stack and overflows Emscripten's 64KB default, + # crashing at startup with "memory access out of bounds". + -sSTACK_SIZE=262144 + -sGL_ENABLE_GET_PROC_ADDRESS=1 + # Emscripten 4+ stopped putting the heap views on Module by default, + # but raylib's miniaudio audio callback reads Module.HEAPF32 — without + # this every audio tick throws "Cannot read properties of undefined + # (reading 'buffer')" in the ScriptProcessorNode handler. + "-sEXPORTED_RUNTIME_METHODS=HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64" + --shell-file "${CMAKE_CURRENT_SOURCE_DIR}/shell.html" + --preload-file "${CMAKE_CURRENT_SOURCE_DIR}/assets@assets" + ) + + # Also expose the page as index.html so a plain directory server's bare + # URL (e.g. http://localhost:8000/) serves the game, not a file listing. + add_custom_command(TARGET tennis POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$<TARGET_FILE:tennis>" "${CMAKE_CURRENT_BINARY_DIR}/index.html" + VERBATIM + ) + + # `cmake --install` publishes just the runtime files (what a web server + # needs), leaving all the CMake/emscripten machinery in the build dir. + install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/index.html" + "${CMAKE_CURRENT_BINARY_DIR}/tennis.html" + "${CMAKE_CURRENT_BINARY_DIR}/tennis.js" + "${CMAKE_CURRENT_BINARY_DIR}/tennis.wasm" + "${CMAKE_CURRENT_BINARY_DIR}/tennis.data" + DESTINATION . + COMPONENT web # keeps raylib/box3d's own install rules out + ) +endif() |
