cmake_minimum_required(VERSION 3.31)
project(magenta C ASM)

set(CMAKE_C_STANDARD 17)

set(kernel_arch x86_64)

set(kernel_name "Magenta")
set(kernel_exe_name "magenta_kernel")

set(generic_src_dirs ds init kernel libc sched util vm syscall)
set(kernel_sources "")
set(kernel_headers "")

set(version_args --arch ${CMAKE_SYSTEM_PROCESSOR})

if (CMAKE_BUILD_TYPE)
	if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
		set(version_args ${version_args} "--release")
	endif ()
endif()

execute_process(
	COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/magenta.buildid
		${version_args}
	OUTPUT_VARIABLE kernel_version
	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
	OUTPUT_STRIP_TRAILING_WHITESPACE)

message(STATUS "Magenta kernel version: ${kernel_version}")

foreach (dir ${generic_src_dirs})
	file(GLOB_RECURSE dir_sources ${dir}/*.c)
	file(GLOB_RECURSE dir_headers ${dir}/*.h)

	set(kernel_sources ${kernel_sources} ${dir_sources})
	set(kernel_headers ${kernel_headers} ${dir_headers})
endforeach (dir)

file(GLOB_RECURSE arch_sources_c arch/${kernel_arch}/*.c)
file(GLOB_RECURSE arch_sources_asm arch/${kernel_arch}/*.S)
file(GLOB_RECURSE arch_headers arch/${kernel_arch}/*.h)

add_executable(${kernel_exe_name}
	${kernel_sources}
	${kernel_headers}
	${arch_sources_c}
	${arch_sources_asm}
	${arch_headers})

target_include_directories(${kernel_exe_name} PRIVATE
	include
	libc/include
	libmagenta/include
	arch/${kernel_arch}/include)
target_compile_options(${kernel_exe_name} PRIVATE
	-nostdlib -ffreestanding
	-Wall -Werror -pedantic -Wno-language-extension-token -Wno-unused-function  -Wno-gnu-statement-expression
	-g -fPIC -Iinclude -Iarch/${kernel_arch}/include -Ilibc/include)

add_custom_command(
	TARGET ${kernel_exe_name}
	POST_BUILD
	COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${kernel_exe_name}> $<TARGET_FILE:${kernel_exe_name}>.debug
	COMMAND ${CMAKE_STRIP} -g $<TARGET_FILE:${kernel_exe_name}>)

target_link_libraries(${kernel_exe_name} -nostdlib -ffreestanding -lgcc)
target_compile_definitions(${kernel_exe_name} PRIVATE
	KERNEL_NAME="${kernel_name}"
	KERNEL_VERSION="${kernel_version}"
	KERNEL_ARCH="${kernel_arch}")

include(arch/${kernel_arch}/config.cmake)
include(arch/${kernel_arch}/targets.cmake)

add_subdirectory(debug)
target_link_libraries(${kernel_exe_name} magenta_debug)
target_compile_definitions(magenta_debug PRIVATE KERNEL_VERSION="${kernel_version}")
target_include_directories(magenta_debug PRIVATE
	include
	libc/include
	libmagenta/include
	arch/${kernel_arch}/include)

install(TARGETS ${kernel_exe_name} DESTINATION boot)
