project(Phoskrnl LANGUAGES C)

set(CMAKE_ASM_NASM_OBJECT_FORMAT win64)
enable_language(ASM_NASM)

set(CMAKE_C_STANDARD_LIBRARIES "")
add_executable(${PROJECT_NAME})

target_sources(
	${PROJECT_NAME} PRIVATE
		../Phosdb/Protocol.c
		Hal/Gdt.c
		Hal/Gdtr.asm
		Hal/Serial.c
		Kd/Kd.c
		Ke/Ke.c
		Rtl/Memory.c
		Rtl/String.c
		Main.c
)

set_target_properties(
	${PROJECT_NAME} PROPERTIES
		SUFFIX ""
		OUTPUT_NAME Phoskrnl
		RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/System"
)

target_compile_definitions(${PROJECT_NAME} PRIVATE PHOSKRNL)

target_include_directories(
	${PROJECT_NAME} PRIVATE
		../
		.
)

target_compile_options(
	${PROJECT_NAME} PRIVATE
		$<$<COMPILE_LANGUAGE:C>:
			-mno-red-zone
			-fno-builtin
			-O
			-fno-stack-protector
			-fno-short-wchar
			-ffreestanding
			-fmsc-version=0
			-mno-stack-arg-probe
		>
)

target_link_options(
	${PROJECT_NAME} PRIVATE
		-nodefaultlibs
		-nostartfiles
		-nostdlib
		-Wl,-entry:KiMain
		-Wl,-subsystem:native
)

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    target_compile_options(${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:C>:-target x86_64-pc-win32-coff>)
    target_link_options(${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:C>:-target x86_64-pc-win32-coff>)
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    message(FATAL_ERROR "Phos should compile under x86_64.")

	target_compile_options(${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:C>:-target i386-pc-win32-coff>)
	target_link_options(${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:C>:-target i386-pc-win32-coff>)
endif()

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
	target_compile_definitions(${PROJECT_NAME} PRIVATE DEBUG)
    target_compile_options(${PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:C>:-g -glldb -gdwarf-4>)
endif()
