cmake_minimum_required(VERSION 3.27) project(snivy LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(BUILD_SHARED_LIBS OFF) if(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") set(CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "" FORCE) set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE) endif() set(SDL_SHARED OFF CACHE BOOL "" FORCE) set(SDL_STATIC ON CACHE BOOL "" FORCE) set(SDL_TESTS OFF CACHE BOOL "" FORCE) set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE) set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE) add_subdirectory(external/SDL) set(SDL3_DIR "${CMAKE_CURRENT_BINARY_DIR}/external/SDL" CACHE PATH "" FORCE) set(SDLMIXER_VORBIS_STB ON CACHE BOOL "" FORCE) set(SDLMIXER_VORBIS_VORBISFILE OFF CACHE BOOL "" FORCE) set(SDLMIXER_VORBIS_TREMOR OFF CACHE BOOL "" FORCE) add_subdirectory(external/SDL_mixer) set(IMGUI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/imgui) set(TINYXML2_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/tinyxml2) set(GLM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/glm) set(IMGUI_SOURCES ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_tables.cpp ${IMGUI_DIR}/imgui_widgets.cpp ${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp ${IMGUI_DIR}/backends/imgui_impl_sdl3.cpp ) set (TINYXML2_SOURCES ${TINYXML2_DIR}/tinyxml2.cpp) file(GLOB PROJECT_SRC CONFIGURE_DEPENDS include/*.cpp src/*.cpp src/resource/*.cpp src/util/*.cpp src/util/*.h ) add_executable(${PROJECT_NAME} ${PROJECT_SRC} ${IMGUI_SOURCES} ${TINYXML2_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/include/glad/glad.cpp ) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external/SDL/include ${CMAKE_CURRENT_SOURCE_DIR}/external/SDL_mixer/include ${CMAKE_CURRENT_SOURCE_DIR}/external # tinyxml2 headers are included as ${IMGUI_DIR} ${IMGUI_DIR}/backends ${GLM_DIR} ${TINYXML2_DIR} include/glad include/KHR include ) target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3-static SDL3_mixer::SDL3_mixer-static) set(PROJECT_RESOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/resources") set(PROJECT_RESOURCES_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/resources") if(EXISTS "${PROJECT_RESOURCES_DIR}") file(GLOB_RECURSE PROJECT_RESOURCE_FILES CONFIGURE_DEPENDS "${PROJECT_RESOURCES_DIR}/*") add_custom_target(copy_resources ALL COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_RESOURCES_DIR}" "${PROJECT_RESOURCES_BINARY_DIR}" DEPENDS ${PROJECT_RESOURCE_FILES} COMMENT "Copying resources directory") add_dependencies(${PROJECT_NAME} copy_resources) set(HAS_PROJECT_RESOURCES TRUE) else() set(HAS_PROJECT_RESOURCES FALSE) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") target_link_options(${PROJECT_NAME} PRIVATE "-sMIN_WEBGL_VERSION=2" "-sMAX_WEBGL_VERSION=2" "-sFULL_ES2=1" "-sUSE_OGG=1" "-sUSE_VORBIS=1" "-sALLOW_MEMORY_GROWTH=1" ) if(HAS_PROJECT_RESOURCES) target_link_options(${PROJECT_NAME} PRIVATE "--preload-file" "${PROJECT_RESOURCES_BINARY_DIR}@resources" ) endif() set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "index" SUFFIX ".html") else() find_package(OpenGL REQUIRED COMPONENTS OpenGL) target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL) endif() message(STATUS "System: ${CMAKE_SYSTEM_NAME}") message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Compiler: ${CMAKE_CXX_COMPILER}") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")