cmake_minimum_required(VERSION 3.15)
project(RTOS C ASM)

set(CMAKE_C_STANDARD 11)

if (NOT DEFINED RTOS_KERNEL_TYPE)
    set(RTOS_KERNEL_TYPE "SingleCore")
endif ()

set(BASE_PATH ${CMAKE_CURRENT_LIST_DIR}/Base)
set(KERNEL_PATH ${CMAKE_CURRENT_LIST_DIR}/Kernel/$ENV{RTOS_KERNEL_TYPE})
set(CPU_PATH ${CMAKE_CURRENT_LIST_DIR}/CPU)
set(APPKIT_PATH ${CMAKE_CURRENT_LIST_DIR}/AppKit)
set(DEVICE_KIT_PATH ${CMAKE_CURRENT_LIST_DIR}/DeviceKit)

if (NOT EXISTS ${KERNEL_PATH})
    message(FATAL_ERROR "KERNEL_PATH: ${KERNEL_PATH} doesn't exist!!!")
endif ()

if (NOT DEFINED CPU_PORT_NAME)
    set(CPU_PORT_NAME $ENV{RTOS_PORT_NAME})
    if(NOT EXISTS ${CPU_PATH}/${RTOS_PORT_NAME})
        message(FATAL_ERROR "CPU Port Not Exist: ${CPU_PATH}/${CPU_PORT_NAME}")
    endif ()
endif ()

set(CPU_PORT_PATH ${CPU_PATH}/${CPU_PORT_NAME})

configure_file(${KERNEL_PATH}/os_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/os_config.h @ONLY)

file(GLOB BASE_SOURCES ${BASE_PATH}/*.c)
file(GLOB KERNEL_SOURCES ${KERNEL_PATH}/*.c)
file(GLOB CPU_PORT_SOURCES ${CPU_PORT_PATH}/*.c)
file(GLOB APPKIT_SOURCES ${APPKIT_PATH}/*.c)
file(GLOB DEVICE_KIT_SOURCES ${DEVICE_KIT_PATH}/*.c)

if (CMAKE_C_COMPILER_ID MATCHES GNU)
    file(GLOB CPU_ASM_SOURCES ${CPU_PORT_PATH}/*_gnu.S)
endif ()

if (CMAKE_C_COMPILER_ID MATCHES ARMCC)
    file(GLOB CPU_ASM_SOURCES ${CPU_PORT_PATH}/*_armcc.S)
endif ()

set(RTOS_SOURCES ${BASE_SOURCES} ${KERNEL_SOURCES} ${CPU_PORT_SOURCES} ${CPU_ASM_SOURCES} ${APPKIT_SOURCES} ${DEVICE_KIT_SOURCES} PARENT_SCOPE)
set(RTOS_INCLUDE_PATH ${BASE_PATH} ${KERNEL_PATH} ${CPU_PORT_PATH} ${APPKIT_PATH} ${CMAKE_CURRENT_BINARY_DIR} ${DEVICE_KIT_PATH} PARENT_SCOPE)
