cmake_minimum_required(VERSION 3.25) option(APPLICATION_NAME "Application name" "Antkeeper") option(APPLICATION_VERSION "Application version string" "0.0.0") option(APPLICATION_AUTHOR "Application author" "C. J. Howard") # Slugify application name string(TOLOWER ${APPLICATION_NAME} APPLICATION_SLUG) string(REPLACE " " "-" APPLICATION_SLUG ${APPLICATION_SLUG}) project(${APPLICATION_SLUG} VERSION ${APPLICATION_VERSION} LANGUAGES CXX) set(APPLICATION_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) set(APPLICATION_VERSION_MINOR ${PROJECT_VERSION_MINOR}) set(APPLICATION_VERSION_PATCH ${PROJECT_VERSION_PATCH}) # Find dependency packages find_package(dr_wav REQUIRED CONFIG) find_package(stb REQUIRED CONFIG) find_package(tinyexr REQUIRED CONFIG) find_package(glad REQUIRED CONFIG) find_package(EnTT REQUIRED CONFIG) find_package(OpenGL REQUIRED) find_package(SDL2 REQUIRED CONFIG) find_package(OpenAL REQUIRED CONFIG) find_library(physfs REQUIRED NAMES physfs-static PATHS "${CMAKE_PREFIX_PATH}/lib") find_package(freetype REQUIRED CONFIG) # Determine dependencies set(STATIC_LIBS dr_wav stb tinyexr glad SDL2::SDL2-static SDL2::SDL2main OpenAL::OpenAL ${physfs} freetype) set(SHARED_LIBS ${OPENGL_gl_LIBRARY}) # Generate configuration header file configure_file(${PROJECT_SOURCE_DIR}/src/engine/config.hpp.in ${PROJECT_BINARY_DIR}/src/engine/config.hpp) # Collect source files file(GLOB_RECURSE SOURCE_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp) # Remove platform-specific source files set(EXCLUDE_DIR "${PROJECT_SOURCE_DIR}/src/game/platform/") foreach(TMP_PATH ${SOURCE_FILES}) string(FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND) if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1) list(REMOVE_ITEM SOURCE_FILES ${TMP_PATH}) endif () endforeach(TMP_PATH) if(MSVC) # Add platform-specific source files list(APPEND SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/game/platform/windows/high-performance-graphics.cpp") # Generate Windows icon resource file set(ICON_FILE "${PROJECT_SOURCE_DIR}/../antkeeper-data/src/icons/antkeeper.ico") if(EXISTS "${ICON_FILE}") configure_file(${PROJECT_SOURCE_DIR}/src/game/platform/windows/icon.rc.in ${PROJECT_BINARY_DIR}/src/game/platform/windows/icon.rc) list(APPEND SOURCE_FILES "${PROJECT_BINARY_DIR}/src/game/platform/windows/icon.rc") endif() # Generate Windows version-information resource file configure_file(${PROJECT_SOURCE_DIR}/src/game/platform/windows/version.rc.in ${PROJECT_BINARY_DIR}/src/game/platform/windows/version.rc) list(APPEND SOURCE_FILES "${PROJECT_BINARY_DIR}/src/game/platform/windows/version.rc") # Make executable DPI-aware on Windows list(APPEND SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/game/platform/windows/dpi-aware.manifest") endif() # Add executable target set(EXECUTABLE_TARGET ${APPLICATION_SLUG}-executable) add_executable(${EXECUTABLE_TARGET} ${SOURCE_FILES}) set_target_properties(${EXECUTABLE_TARGET} PROPERTIES OUTPUT_NAME ${APPLICATION_SLUG} COMPILE_WARNING_AS_ERROR ON CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF) target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING) if(MSVC) target_compile_options(${EXECUTABLE_TARGET} PRIVATE /W3) set_target_properties(${EXECUTABLE_TARGET} PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE" LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"" MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") else() target_compile_options(${EXECUTABLE_TARGET} PRIVATE -Wall -Wextra -Wpedantic) endif() # Add compile definitions if(CMAKE_BUILD_TYPE STREQUAL "Debug") target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE DEBUG) else() target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE NDEBUG) endif() # Set include directories target_include_directories(${EXECUTABLE_TARGET} PUBLIC ${PROJECT_SOURCE_DIR}/src ${PROJECT_BINARY_DIR}/src) # Link to dependencies target_link_libraries(${EXECUTABLE_TARGET} ${STATIC_LIBS} ${SHARED_LIBS}) # Install executable if(PACKAGE_PLATFORM MATCHES "linux") install(TARGETS ${EXECUTABLE_TARGET} DESTINATION bin) elseif(PACKAGE_PLATFORM MATCHES "win") install(TARGETS ${EXECUTABLE_TARGET} DESTINATION .) endif()