######################################################################
# Automatically generated by cppiniter {{{date_time}}}
######################################################################

cmake_minimum_required (VERSION 3.25)
project ({{{project_name}}})

include(GNUInstallDirs)

if(NOT DEFINED VERSION_NAME)
    file(READ "version.properties" versions)

    string(REGEX MATCH "MAJOR_VERSION=([0-9]*)" _ ${versions})
    set(MAJOR_VERSION ${CMAKE_MATCH_1})

    string(REGEX MATCH "MINOR_VERSION=([0-9]*)" _ ${versions})
    set(MINOR_VERSION ${CMAKE_MATCH_1})

    string(REGEX MATCH "PATCH_VERSION=([0-9]*)" _ ${versions})
    set(PATCH_VERSION ${CMAKE_MATCH_1})

    set(VERSION_NAME "T.${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}.0")
endif()
if(DEFINED ENV{GIT_COMMIT})
    set(VERSION_NAME "${VERSION_NAME}-$ENV{GIT_COMMIT}")
endif()
message(STATUS "${PROJECT_NAME} version ${VERSION_NAME}")
add_definitions(-DVERSION_NAME="${VERSION_NAME}")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
file(CREATE_LINK "${CMAKE_BINARY_DIR}/compile_commands.json" "${CMAKE_SOURCE_DIR}/compile_commands.json" SYMBOLIC)

set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)

if(NOT CMAKE_GENERATOR STREQUAL "Xcode")
    set(CMAKE_COMPILE_WARNING_AS_ERROR ON)
endif()

if(WIN32)
    add_definitions(-DWINVER=0x0601)
    add_definitions(-D_WIN32_WINNT=0x0601)
endif()


if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -Og -g3 -Wall -Wextra -Wno-sign-compare")
    set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -O2")
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -Og -g3 -Wall -Wextra -Wno-sign-compare")
    set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -O2")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,ALL")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    add_definitions(-D_SCL_SECURE_NO_WARNINGS=1)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)

    string (REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS} /EHsc /utf-8 /MP /Zc:__cplusplus")
    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_DEBUG} /wd4244 /wd4018 /wd4267 /wd4307")
    if (BUILD_SHARED_LIBS)
        set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_RELEASE} /Zi")
    else()
        string (REGEX REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
        set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS_RELEASE} /Z7")
    endif()


    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
    set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
endif()

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install/ CACHE PATH "default install prefix" FORCE)
endif()

{{^is_exe}}
option(BUILD_TEST "build test" OFF)
option(BUILD_EXAMPLE "build example" OFF)
{{/is_exe}}

add_subdirectory(src)
{{^is_exe}}
if(BUILD_TEST)
    add_subdirectory (test)
endif()

if(BUILD_EXAMPLE)
    add_subdirectory (example)
endif()

if (BUILD_EXAMPLE OR BUILD_TEST)
    if (WIN32)
        include(InstallRequiredSystemLibraries)
        set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
        set(CMAKE_INSTALL_DEBUG_LIBRARIES TRUE)

        file(GLOB DLLS ${CMAKE_BINARY_DIR}/*.dll)
        INSTALL(FILES ${DLLS} DESTINATION bin)
    elseif(APPLE)
        file(GLOB DYLIBS ${CMAKE_BINARY_DIR}/*.dylib)
        INSTALL(FILES ${DYLIBS} DESTINATION lib)
    endif()
endif()
{{/is_exe}}
