71 lines
3.4 KiB
CMake
71 lines
3.4 KiB
CMake
cmake_minimum_required(VERSION 3.24)
|
|
if(POLICY CMP0205)
|
|
cmake_policy(SET CMP0205 NEW)
|
|
endif()
|
|
project(shweets_sim LANGUAGES C CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
# Two builds: Release (the default) and Debug.
|
|
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
set(CMAKE_BUILD_TYPE Release)
|
|
endif()
|
|
|
|
# Release builds: -O2, link-time optimization, unused code and data dropped, and the symbols stripped.
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON)
|
|
add_compile_options("$<$<CONFIG:Release>:-O2;-ffunction-sections;-fdata-sections>")
|
|
add_link_options("$<$<CONFIG:Release>:-Wl,--gc-sections;-s>")
|
|
endif()
|
|
|
|
# SDL: static, with only the video (OpenGL) and audio pieces the game uses.
|
|
set(SDL_SHARED OFF CACHE BOOL "" FORCE)
|
|
set(SDL_STATIC ON CACHE BOOL "" FORCE)
|
|
set(SDL_OPENGL ON CACHE BOOL "" FORCE)
|
|
set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)
|
|
set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE)
|
|
foreach(OPTION RENDER GPU VULKAN CAMERA HAPTIC HIDAPI JOYSTICK POWER SENSOR DIALOG TRAY OPENGLES OFFSCREEN DUMMYVIDEO
|
|
DISKAUDIO DUMMYAUDIO OSS JACK SNDIO KMSDRM IBUS LIBURING)
|
|
set(SDL_${OPTION} OFF CACHE BOOL "" FORCE)
|
|
endforeach()
|
|
add_subdirectory(external/sdl EXCLUDE_FROM_ALL)
|
|
|
|
# simdjson: its single-file build, static, without exceptions, with only the AVX2 parser and the portable one.
|
|
add_library(simdjson STATIC external/simdjson/singleheader/simdjson.cpp)
|
|
target_include_directories(simdjson SYSTEM PUBLIC external/simdjson/singleheader)
|
|
target_compile_definitions(simdjson PUBLIC SIMDJSON_EXCEPTIONS=0 SIMDJSON_IMPLEMENTATION_ICELAKE=0
|
|
SIMDJSON_IMPLEMENTATION_WESTMERE=0)
|
|
|
|
# Dear ImGui: the core, and its SDL3 and OpenGL 3 backends.
|
|
add_library(imgui STATIC external/imgui/imgui.cpp external/imgui/imgui_draw.cpp external/imgui/imgui_tables.cpp
|
|
external/imgui/imgui_widgets.cpp external/imgui/backends/imgui_impl_sdl3.cpp
|
|
external/imgui/backends/imgui_impl_opengl3.cpp)
|
|
target_include_directories(imgui SYSTEM PUBLIC external/imgui external/imgui/backends)
|
|
target_compile_definitions(imgui PUBLIC IMGUI_DISABLE_OBSOLETE_FUNCTIONS IMGUI_DISABLE_DEMO_WINDOWS)
|
|
target_link_libraries(imgui PUBLIC SDL3::SDL3-static)
|
|
|
|
file(GLOB SOURCES CONFIGURE_DEPENDS src/*.cpp)
|
|
add_executable(shweets_sim ${SOURCES})
|
|
target_include_directories(shweets_sim SYSTEM PRIVATE external/stb)
|
|
target_link_libraries(shweets_sim PRIVATE imgui simdjson)
|
|
target_compile_definitions(shweets_sim PRIVATE "$<$<CONFIG:Debug>:DEBUG>")
|
|
set_target_properties(shweets_sim PROPERTIES OUTPUT_NAME shweets-sim)
|
|
|
|
file(CREATE_LINK ${CMAKE_SOURCE_DIR}/resources ${CMAKE_BINARY_DIR}/resources COPY_ON_ERROR SYMBOLIC)
|
|
|
|
if(WIN32)
|
|
set_target_properties(shweets_sim PROPERTIES WIN32_EXECUTABLE ON)
|
|
target_sources(shweets_sim PRIVATE shweets-sim.rc)
|
|
endif()
|
|
|
|
# Emscripten: WebGL2, the resources preloaded, the prefs folder kept in browser storage (web/pre.js), and a page whose
|
|
# canvas fills the window.
|
|
if(EMSCRIPTEN)
|
|
set_target_properties(shweets_sim PROPERTIES OUTPUT_NAME index SUFFIX ".html")
|
|
target_link_options(shweets_sim PRIVATE -sALLOW_MEMORY_GROWTH=1 -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2
|
|
-lidbfs.js "--preload-file=${CMAKE_SOURCE_DIR}/resources@/resources"
|
|
"--shell-file=${CMAKE_SOURCE_DIR}/web/index.html" "--pre-js=${CMAKE_SOURCE_DIR}/web/pre.js")
|
|
endif()
|