cmake_minimum_required(VERSION 3.30)
set(target itcpc)
project(${target} LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Это у нас дополнительные флаги компиляции
if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
	message(STATUS "Compiler is gcc")
	set(CMAKE_CXX_FLAGS "-Wall -Wextra")
	set(CMAKE_CXX_FLAGS_DEBUG "-g")
	set(CMAKE_CXX_FLAGS_RELEASE "-O3")
    if (WIN32) # Configure static association
        set(CMAKE_CXX_FLAGS "-static-libgcc")
        set(CMAKE_CXX_FLAGS "-static-libstdc++")
    endif(WIN32)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
	message(STATUS "Compiler is MSVC")
	set(CMAKE_CXX_FLAGS_RELEASE "/O2 /Ot /Ob2 /Oi /GT /GL")
endif()

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Зададим общие с другими проектами исходники
set(shared_dir "${CMAKE_CURRENT_SOURCE_DIR}/../shared")
file(GLOB shared_files
	"${shared_dir}/StringUtil.cpp"
	"${shared_dir}/StringUtil.h"
	"${shared_dir}/platform_defines.h"
)

# Зададим исходники проекта
file(GLOB itcpc_src
	"*.h"
	"*.cpp"
)

# Добавляем исходники в проект
add_executable(${target}
	${itcpc_src}
	${shared_files}
)

# Это только для винды
if(CMAKE_SYSTEM_NAME MATCHES "Windows")
	# Под виндовс в MinGW не будет работать, потому что MinGW не понимает кодировку UTF16LE
    # а если ресурс перекодировать в utf-8, то окажется, что MinGW не знает путей к SDK винды
    # в общем, пока нафиг.
	enable_language("RC") # Явно указываем поддержку RC
	set(app_resource_windows "${CMAKE_CURRENT_SOURCE_DIR}/version.rc")
    # Добавим к исходникам файл ресурсов
	target_sources(${target}
		PRIVATE
		    ${app_resource_windows}
	)
    # Добавим к исходникам дополнительные исходники, только для виндовс
	target_sources(${target}
		PRIVATE
		"${shared_dir}/getopt.cpp"
		"${shared_dir}/getopt.h"
	)
    # А ещё добавим определение препроцессора, в винде компилим в юникоде
    target_compile_definitions(${target}
		PUBLIC
		    _UNICODE
		    UNICODE
	)

endif()

# Ещё раз говорим, что используем стандарт с++20
target_compile_features(${target}
	PUBLIC
	    cxx_std_20
)

# Тут зададим определения препроцессора проекта
target_compile_definitions(${target}
	PUBLIC
	    _CONSOLE
		$<$<CONFIG:Debug>:_DEBUG>
		$<$<CONFIG:Release>:NDEBUG>
)

# Используем предкомпилированные заголовки
target_precompile_headers(${target}
	PRIVATE
	    ${CMAKE_CURRENT_SOURCE_DIR}/pch.h
)

# Ещё раз, используем предкомпилированные заголовки
set (PRECOMPILED_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/pch.h)
if(precompile_header AND NOT PRECOMPILED_HEADER_ISEMPTY)
    target_compile_definitions(${target} PRIVATE
        USING_PCH
    )
endif()

# Зададим пути поиска инклуд
target_include_directories(${target}
	PRIVATE
	    ${CMAKE_CURRENT_SOURCE_DIR}
		${shared_dir}
)

set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../temp/${target})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir}) # туда помещается всё для сборки

set(dir1 ${CMAKE_CURRENT_SOURCE_DIR}/../out) # это первый кусок выходной директории
if(CMAKE_BUILD_TYPE STREQUAL "Debug") # затем второй - в зависимости от типа сборки
	set(dir2 "debug")
else()
	set(dir2 "release")
endif() # вот нихера по простому не получается, всё хардкодить приходится, там же не два вида сборок
# и теперь, всё, что не дебаг и не релиз, попадёт в релиз
set (output_path "${dir1}/${dir2}/tools")  # и вот наконец, туда будут помещаться собранные файлы
# зададим выходную директорию
set_target_properties(${target} PROPERTIES
	RUNTIME_OUTPUT_DIRECTORY "${output_path}"
)
