cmake_minimum_required(VERSION 3.20)
project(opencoreC C CXX ASM)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 20)

# Freestanding flags
set(FREESTANDING_FLAGS "-ffreestanding -fno-stack-protector -fno-pie -no-pie -mno-red-zone -m64")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FREESTANDING_FLAGS} -Wall -Wextra -O2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FREESTANDING_FLAGS} -Wall -Wextra -O2 -fno-exceptions -fno-rtti")

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/libc/include
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/libipc_cpp/include
    ${CMAKE_CURRENT_SOURCE_DIR}/hal/include
)

# Bare-metal libc
add_library(freestanding_libc STATIC
    lib/libc/src/string.c
    lib/libc/src/syscalls.c
)

# HAL Library
add_library(hal STATIC
    hal/src/uart.c
    hal/src/pci.c
    hal/src/apic.c
)

# Ring 3 User Servers
add_executable(init_server servers/init/main.cpp)
target_link_options(init_server PRIVATE -T${CMAKE_CURRENT_SOURCE_DIR}/config/user.ld -nostdlib -static)
target_link_libraries(init_server PRIVATE freestanding_libc)

add_executable(uart_driver servers/uart_driver/main.c)
target_link_options(uart_driver PRIVATE -T${CMAKE_CURRENT_SOURCE_DIR}/config/user.ld -nostdlib -static)
target_link_libraries(uart_driver PRIVATE hal freestanding_libc)

add_executable(procmgr servers/procmgr/main.cpp)
target_link_options(procmgr PRIVATE -T${CMAKE_CURRENT_SOURCE_DIR}/config/user.ld -nostdlib -static)
target_link_libraries(procmgr PRIVATE freestanding_libc)
