cmake_minimum_required(VERSION 3.13.4)

set(CMAKE_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/src)
set(CMAKE_BINARY_DIR ${CMAKE_CURRENT_LIST_DIR}/build)

include(x86-baremetal-toolchain.cmake)

project(ClassicOSBL VERSION 0.0.1 LANGUAGES ASM_NASM)
project(ClassicOS VERSION 0.0.1 LANGUAGES C CXX ASM_NASM)

enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf32)

set(IS_OS_WINDOWS FALSE)
set(IS_OS_LINUX FALSE)
set(IS_OS_MAC FALSE)

if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows")
	set(IS_OS_WINDOWS TRUE)
	message("Building on the Windows operating system.")
elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux")
	set(IS_OS_LINUX TRUE)
	message("Building on the Linux operating system.")
elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin")
	set(IS_OS_MAC TRUE)
	message("Building on the Mac operating system.")
endif ()

# Source files
set(BOOT_SOURCE_FILES
    src/boot/boot.asm
    src/boot/linker.ld
)

set(GRUB_SOURCE_FILES
    src/boot/grub/grub.cfg
    src/boot/grub/menu.lst
)

set(DRIVERS_SOURCE_FILES
    src/drivers/audio/audio.c
    src/drivers/audio/audio.h
	src/drivers/bus/eisa.c
	src/drivers/bus/eisa.h
	src/drivers/bus/isa.c
	src/drivers/bus/isa.h
	src/drivers/bus/mca.c
	src/drivers/bus/mca.h
	#src/drivers/bus/pci.asm
	src/drivers/bus/pci.c
	src/drivers/bus/pci.h
	src/drivers/bus/vesa.c
	src/drivers/bus/vesa.h
    src/drivers/display/display.c
    src/drivers/display/display.h
    src/drivers/io/io.c
	src/drivers/io/io.asm
    src/drivers/io/io.h
    src/drivers/keyboard/keyboard.c
    src/drivers/keyboard/keyboard.h
    src/drivers/screen/screen.c
    src/drivers/screen/screen.h
    src/drivers/tty/tty.c
    src/drivers/tty/tty.h
)
set(KERNEL_SOURCE_FILES
	src/kernel/arch/x86/include/memory.h
	src/kernel/arch/x86/include/types.h
	src/kernel/arch/x86/include/types.h
	src/kernel/arch/x86/memory/memory.c
	src/kernel/arch/x86/gdt.c
	src/kernel/arch/x86/gdt.asm
	src/kernel/arch/x86/gdt.h
	src/kernel/arch/x86/idt.c
	src/kernel/arch/x86/idt.asm
	src/kernel/arch/x86/idt.h
	src/kernel/arch/x86/isr/isr.c
	src/kernel/arch/x86/isr/isr.h
	src/kernel/arch/x86/isr/exceptions.c
	src/kernel/arch/x86/isr/exceptions.h
    src/kernel/kernel.c
    src/kernel/kernel.h
    src/kernel/linker.ld
    src/kernel/print.c
		src/kernel/stack.c
		src/kernel/stack.h
)

set(UTIL_SOURCE_FILES
	src/EHS.h
	src/sys/CPU.h src/sys/CPU.cpp src/sys/CPU_GCC_AMD64.asm
	src/Util.h src/Util.cpp
	src/Version.h src/Version.cpp
	src/Serializer.h
	src/Array.h
	src/Vector.h
	src/SArray.h
	src/Str.h
	src/PRNG.h
	src/HRNG.h src/HRNG_GCC.s
	src/Math.h src/Math.cpp src/Math_GCC_AMD64.s
	src/Rect.h
	src/Range.h src/Range.cpp
	src/Color4.h src/Color4.cpp
	src/Color3.h src/Color3.cpp
	src/Quat.h
	src/Vec4.h
	src/Vec3.h
	src/Vec2.h
	src/Mat4.h
	src/Mat3.h
	src/Mat2.h
)

set_source_files_properties(src/boot/boot.asm PROPERTIES LANGUAGE ASM_NASM)

add_executable(ClassicOS
	${KERNEL_SOURCE_FILES}
    ${DRIVERS_SOURCE_FILES}
)

add_executable(ClassicOSBL
	${BOOT_SOURCE_FILES}
	${GRUB_SOURCE_FILES}
)

message("${CMAKE_EXE_LINKER_FLAGS}")