cmake_minimum_required(VERSION 3.25)

project(DGeneration
    VERSION 1.0.0
    DESCRIPTION "Native reimplementation of D/Generation (1991)"
    LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
endif()

# Common warning set, applied per target via dgen_set_warnings().
function(dgen_set_warnings target)
    target_compile_options(${target} PRIVATE
        $<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -Wpedantic -Wconversion -Wshadow>)
endfunction()

# SDL3 (3.4 or later, for its pixel-art scaling) is the only external dependency (window,
# input, audio output); Nuked OPL3 is vendored in third_party/.
find_package(SDL3 3.4 REQUIRED CONFIG)

# MinGW's GCC keeps std::print's Windows console output in libstdc++exp.
if(MINGW)
    link_libraries(stdc++exp)
endif()

add_subdirectory(third_party)
add_subdirectory(src)
# The release folder: what `cmake --install` and `cpack` put together (packaging/).
add_subdirectory(packaging)

# The developer tools and the tests are not part of the released source: built when present.
option(DGEN_BUILD_TOOLS "Build the developer tools" ON)
if(DGEN_BUILD_TOOLS AND EXISTS ${PROJECT_SOURCE_DIR}/tools/CMakeLists.txt)
    add_subdirectory(tools)
endif()
if(EXISTS ${PROJECT_SOURCE_DIR}/tests/CMakeLists.txt)
    include(CTest)
    if(BUILD_TESTING)
        add_subdirectory(tests)
    endif()
endif()
