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

set(CMP0141 NEW)
cmake_minimum_required (VERSION 3.25)
project ({{{project_name}}})

include(GNUInstallDirs)

if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.git)
    execute_process(COMMAND pre-commit install COMMAND_ERROR_IS_FATAL ANY)
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_OBJCXX_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")
    add_compile_options(-Wall -Wextra -Wno-unused-function -Wno-sign-compare)
    add_compile_options("$<$<CONFIG:DEBUG>:-O0>")
    add_compile_options("$<$<CONFIG:RELEASE>:-Wno-unused-but-set-variable;-Wno-unused-variable;-Wno-unused-parameter>")
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    add_compile_options(-Wall -Wextra -Wno-unused-function -Wno-sign-compare)
    add_compile_options("$<$<CONFIG:DEBUG>:-O0>")
    add_compile_options("$<$<CONFIG:RELEASE>:-Wno-unused-but-set-variable;-Wno-unused-variable;-Wno-unused-parameter>")
    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)
    add_definitions(-DWINVER=0x0601)
    add_definitions(-D_WIN32_WINNT=0x0601)

    add_compile_options(/utf-8 /MP /Zc:__cplusplus)
    add_compile_options(/W4 /wd4244 /wd4018 /wd4267 /wd4307)

    if (NOT BUILD_SHARED_LIBS)
        set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
    endif()
    set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD TRUE)
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)
        set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
        if(CMAKE_BUILD_TYPE STREQUAL "Debug")
            set(CMAKE_INSTALL_DEBUG_LIBRARIES TRUE)
            set(CMAKE_INSTALL_DEBUG_LIBRARIES_ONLY TRUE)
        endif()
        include(InstallRequiredSystemLibraries)

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