cmake_minimum_required(VERSION 3.20)
project(ksOSKernel LANGUAGES ASM C)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

file(GLOB_RECURSE KERNEL_SOURCES CMAKE_CONFIGURE_DEPENDS 
    ${CMAKE_CURRENT_SOURCE_DIR}/Source/KernelMain.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Source/Arch/entry.S
#    ${CMAKE_CURRENT_SOURCE_DIR}/Source/IO/*.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Source/**/*.c
)

add_executable(Kernel ${KERNEL_SOURCES})
target_include_directories(Kernel PRIVATE 
    ${CMAKE_CURRENT_SOURCE_DIR}/Include/
    ${CMAKE_CURRENT_SOURCE_DIR}/../Common
)

target_compile_options(Kernel PRIVATE 
    $<$<COMPILE_LANGUAGE:C>:
        -ffreestanding
        -fno-stack-protector
        -fno-builtin
        -Wall -Wextra
        -g
        -mgeneral-regs-only
    >
)

target_link_options(Kernel PRIVATE 
    -nostdlib
    -static
    -no-pie
    -T "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld"
    -z max-page-size=0x1000
)

set_target_properties(Kernel PROPERTIES
    OUTPUT_NAME "Kernel.elf"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)

add_custom_command(TARGET Kernel POST_BUILD
    COMMAND ${LLVM_OBJCOPY} -O binary ${CMAKE_BINARY_DIR}/Kernel.elf ${CMAKE_BINARY_DIR}/Kernel.bin
    COMMENT "Generating ksOSKernel.bin from Kernel.elf"
)