cmake_minimum_required(VERSION 3.30)
set(target BKTurbo8)
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(shared_dir "${CMAKE_SOURCE_DIR}/../shared")
set(src_dir "${CMAKE_CURRENT_SOURCE_DIR}/../src")
add_executable(${target}
	${shared_dir}/StringUtil.cpp
    ${src_dir}/Assemble.cpp
    ${src_dir}/BKMemory.cpp
    ${src_dir}/ConvW2k.cpp
    ${src_dir}/ErrorManager.cpp
    ${src_dir}/Globals.cpp
    ${src_dir}/LabelManager.cpp
    ${src_dir}/LabelTable.cpp
    ${src_dir}/LabelTableRef.cpp
    ${src_dir}/Listing.cpp
    ${src_dir}/Object1.cpp
    ${src_dir}/Object2.cpp
    ${src_dir}/Parser.cpp
    ${src_dir}/Parser2.cpp
    ${src_dir}/Reader.cpp
    ${src_dir}/RPNChain.cpp
    ${src_dir}/ScriptAsm.cpp
    ${src_dir}/pch.cpp
	BKTurbo8.cpp
)
# Это только для винды
if(CMAKE_SYSTEM_NAME MATCHES "Windows")
	# Под виндовс в MinGW не будет работать, потому что MinGW не понимает кодировку UTF16LE
	# а если ресурс перекодировать в utf-8, то окажется, что MinGW не знает путей к SDK винды
	# в общем, пока нафиг.
	enable_language("RC") # Явно указываем поддержку RC
	set(app_resource_windows "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} PRIVATE
        _UNICODE
        UNICODE
	)

endif()


target_compile_features(${target} PUBLIC
    cxx_std_20
)


target_compile_definitions(${target} PRIVATE
    _CONSOLE
    TARGET_TURBO8
    $<$<CONFIG:Debug>:_DEBUG>
    $<$<CONFIG:Release>:NDEBUG>
)

target_precompile_headers(${target} PRIVATE
	    ${src_dir}/pch.h
)
# Ещё раз, используем предкомпилированные заголовки
set (PRECOMPILED_HEADER ${src_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}
    ${src_dir}
    ${shared_dir}
)


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

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

install(TARGETS ${target}
    BUNDLE DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
