kobodl/CMakeLists.txt
Ville Lindholm 0263be65d4
Add deterministic bench harness (KOBO_BENCH=1)
When KOBO_BENCH=1 is set in the environment, the game becomes a
hands-off benchmark:

  * Skips the intro/menu sequence and pushes st_game directly with
    scene=0, skill=CLASSIC, invulnerable ship, always_fire = constant
    auto-fire, countdown = 0 so "GET READY" auto-pops in 700ms.
  * Seeds pubrand and gamerand from KOBO_BENCH_SEED (default 12345)
    so the map, stress spawn pattern, and enemy AI are identical
    run-to-run.
  * Defaults KOBO_STRESS=1500 unless overridden, so the move pass has
    a steady workload, and KOBO_PROF=1 so the profiler is on.
  * Counts frames in run_game; after KOBO_BENCH_FRAMES (default 1800)
    it dumps prof to stderr and exits cleanly.

Usage from repo root (the cwd matters — relative GFX paths only
resolve from here):
    KOBO_BENCH=1 ./build/kobodl 2>bench-logs/phaseN.log

A single command produces a comparable profiler dump at every phase
of the DOD refactor — no menus to navigate, no keyboard input,
identical workload.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-04 15:37:44 +03:00

204 lines
7.9 KiB
CMake

cmake_minimum_required(VERSION 3.16)
project(KoboDeluxe VERSION 0.5.1 LANGUAGES C CXX)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_EXTENSIONS OFF)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
option(KOBO_ENABLE_OPENGL "Use OpenGL rendering layer" ON)
option(KOBO_ENABLE_OSS "Build OSS audio backend (Linux)" OFF)
option(KOBO_ENABLE_ALSA "Build ALSA audio backend (Linux)" OFF)
option(KOBO_ENABLE_EPM "Extreme Pickyness Mode (-Wall -Werror)" OFF)
# ---------------------------------------------------------------------------
# Feature detection
# ---------------------------------------------------------------------------
include(CheckIncludeFile)
include(CheckSymbolExists)
include(CheckLibraryExists)
check_include_file(dirent.h HAVE_DIRENT_H)
check_symbol_exists(getegid unistd.h HAVE_GETEGID)
check_symbol_exists(setgid unistd.h HAVE_SETGID)
check_symbol_exists(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY)
check_symbol_exists(stat "sys/stat.h" HAVE_STAT)
check_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)
check_symbol_exists(vsnprintf stdio.h HAVE_VSNPRINTF)
check_symbol_exists(_snprintf stdio.h HAVE__SNPRINTF)
check_symbol_exists(_vsnprintf stdio.h HAVE__VSNPRINTF)
# ---------------------------------------------------------------------------
# Third-party libraries
# ---------------------------------------------------------------------------
# Migrating to SDL 3. Homebrew: `brew install sdl3 sdl3_image`.
find_package(SDL3 CONFIG REQUIRED)
find_package(SDL3_image CONFIG REQUIRED)
if(KOBO_ENABLE_OPENGL)
find_package(OpenGL)
if(OpenGL_FOUND OR OPENGL_FOUND)
set(HAVE_OPENGL 1)
endif()
endif()
if(KOBO_ENABLE_OSS)
check_include_file("sys/soundcard.h" _has_soundcard_sys)
check_include_file("soundcard.h" _has_soundcard)
if(_has_soundcard_sys OR _has_soundcard)
set(HAVE_OSS 1)
endif()
endif()
if(KOBO_ENABLE_ALSA)
find_library(ALSA_LIB asound)
check_include_file("sys/asoundlib.h" _has_asoundlib)
if(ALSA_LIB AND _has_asoundlib)
set(HAVE_ALSA 1)
endif()
endif()
# ---------------------------------------------------------------------------
# Platform-specific install layout (matches the old autotools behavior)
# ---------------------------------------------------------------------------
if(APPLE)
set(KOBO_BUNDLE_STYLE "macosx")
set(KOBO_EXEFILE "kobodl")
set(KOBO_DATA_DIR "EXE>>../Resources")
set(KOBO_SCORE_DIR "/Library/Preferences/KoboDeluxe/scores")
set(KOBO_CONFIG_DIR "HOME>>Library/Preferences")
set(KOBO_CONFIG_FILE "KoboDeluxe Preferences")
elseif(WIN32)
set(KOBO_BUNDLE_STYLE "simple")
set(KOBO_EXEFILE "kobodl.exe")
set(KOBO_DATA_DIR "EXE>>")
set(KOBO_SCORE_DIR "EXE>>scores")
set(KOBO_CONFIG_DIR "EXE>>")
set(KOBO_CONFIG_FILE "kobodl.cfg")
else()
set(KOBO_BUNDLE_STYLE "unix")
set(KOBO_EXEFILE "kobodl")
set(KOBO_DATA_DIR "${CMAKE_INSTALL_PREFIX}/share/kobo-deluxe")
set(KOBO_SCORE_DIR "${CMAKE_INSTALL_PREFIX}/var/lib/kobo-deluxe/scores")
set(KOBO_CONFIG_DIR "HOME>>")
set(KOBO_CONFIG_FILE ".kobodlrc")
endif()
# ---------------------------------------------------------------------------
# Generated headers
# ---------------------------------------------------------------------------
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/aconfig.h.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/aconfig.h
@ONLY
)
if(APPLE)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/Info.plist
@ONLY
)
endif()
# ---------------------------------------------------------------------------
# Shared interface target — every component links this for flags/defines/SDL
# ---------------------------------------------------------------------------
add_library(kobo_deps INTERFACE)
target_compile_definitions(kobo_deps INTERFACE
HAVE_CONFIG_H
KOBO_DATA_DIR="${KOBO_DATA_DIR}"
KOBO_SCORE_DIR="${KOBO_SCORE_DIR}"
KOBO_CONFIG_DIR="${KOBO_CONFIG_DIR}"
KOBO_CONFIG_FILE="${KOBO_CONFIG_FILE}"
SYSCONF_DIR="${CMAKE_INSTALL_PREFIX}/etc"
)
target_include_directories(kobo_deps INTERFACE
${CMAKE_CURRENT_BINARY_DIR} # for generated aconfig.h
${CMAKE_CURRENT_SOURCE_DIR} # for config.h
)
target_link_libraries(kobo_deps INTERFACE SDL3::SDL3 SDL3_image::SDL3_image)
if(HAVE_OPENGL)
target_compile_definitions(kobo_deps INTERFACE HAVE_OPENGL)
target_link_libraries(kobo_deps INTERFACE OpenGL::GL)
endif()
if(HAVE_OSS)
target_compile_definitions(kobo_deps INTERFACE HAVE_OSS)
endif()
if(HAVE_ALSA)
target_compile_definitions(kobo_deps INTERFACE HAVE_ALSA)
target_link_libraries(kobo_deps INTERFACE ${ALSA_LIB})
endif()
if(UNIX AND NOT APPLE)
target_link_libraries(kobo_deps INTERFACE m)
endif()
if(KOBO_ENABLE_EPM)
target_compile_options(kobo_deps INTERFACE
-Wall -Werror -Wwrite-strings -fno-builtin
)
endif()
# ---------------------------------------------------------------------------
# Subprojects
# ---------------------------------------------------------------------------
add_subdirectory(graphics)
add_subdirectory(sound)
add_subdirectory(eel)
# ---------------------------------------------------------------------------
# Main executable
# ---------------------------------------------------------------------------
set(KOBO_SOURCES
enemies.cpp enemy.cpp pfile.cpp gamectl.cpp manage.cpp map.cpp
myship.cpp radar.cpp random.cpp scenes.cpp score.cpp screen.cpp
filemap.cpp prefs.cpp cfgform.cpp options.cpp gamestate.cpp
states.cpp form.cpp cfgparse.cpp game.cpp kobo.cpp logger.c
dashboard.cpp sound.cpp prof.cpp bench.cpp
)
add_executable(kobodl ${KOBO_SOURCES})
target_include_directories(kobodl PRIVATE ${CMAKE_SOURCE_DIR}/data/sfx)
target_link_libraries(kobodl PRIVATE graphics sound eel kobo_deps)
set_target_properties(kobodl PROPERTIES OUTPUT_NAME ${KOBO_EXEFILE})
# ---------------------------------------------------------------------------
# Install rules
# ---------------------------------------------------------------------------
if(KOBO_BUNDLE_STYLE STREQUAL "macosx")
# Build a .app bundle alongside the binary.
set(KOBO_APP_DIR ${CMAKE_BINARY_DIR}/KoboDeluxe.app)
add_custom_command(TARGET kobodl POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${KOBO_APP_DIR}/Contents/MacOS
COMMAND ${CMAKE_COMMAND} -E make_directory ${KOBO_APP_DIR}/Contents/Resources
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/Info.plist ${KOBO_APP_DIR}/Contents/Info.plist
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:kobodl> ${KOBO_APP_DIR}/Contents/MacOS/
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/data/gfx ${KOBO_APP_DIR}/Contents/Resources/gfx
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/data/sfx ${KOBO_APP_DIR}/Contents/Resources/sfx
COMMENT "Assembling KoboDeluxe.app bundle"
VERBATIM
)
install(DIRECTORY ${KOBO_APP_DIR} DESTINATION /Applications USE_SOURCE_PERMISSIONS)
elseif(KOBO_BUNDLE_STYLE STREQUAL "simple")
install(TARGETS kobodl RUNTIME DESTINATION KoboDeluxe)
install(DIRECTORY data/gfx data/sfx DESTINATION KoboDeluxe)
install(FILES COPYING COPYING.LIB README ChangeLog TODO DESTINATION KoboDeluxe)
else()
include(GNUInstallDirs)
install(TARGETS kobodl RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES kobodl.6 DESTINATION ${CMAKE_INSTALL_MANDIR}/man6)
install(DIRECTORY data/gfx data/sfx
DESTINATION ${CMAKE_INSTALL_DATADIR}/kobo-deluxe)
install(DIRECTORY DESTINATION ${KOBO_SCORE_DIR}
DIRECTORY_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_WRITE GROUP_EXECUTE
WORLD_READ WORLD_WRITE WORLD_EXECUTE)
endif()