cmake_minimum_required(VERSION 3.22)

set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/arm-none-eabi-gcc.cmake)

project(rtos_lib C ASM)

# MCU-specific flags for Cortex-M4 with FPU (STM32G474RE)
set(MCU_FLAGS "-mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard")

set(CMAKE_C_FLAGS "${MCU_FLAGS} -Wall -fdata-sections -ffunction-sections -save-temps=obj" CACHE STRING "" FORCE)
set(CMAKE_ASM_FLAGS "${MCU_FLAGS} -x assembler-with-cpp" CACHE STRING "" FORCE)

set(CMAKE_C_FLAGS_DEBUG "-Og -g3 -gdwarf-2" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE "-Os" CACHE STRING "" FORCE)

# Linker script
set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/STM32G474XX_FLASH.ld)
set(CMAKE_EXE_LINKER_FLAGS "${MCU_FLAGS} -specs=nano.specs -T${LINKER_SCRIPT} -Wl,--gc-sections -Wl,-Map=${PROJECT_NAME}.map,--cref" CACHE STRING "" FORCE)

# Define the STM32 device
add_definitions(-DSTM32G474xx)

# Include paths
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/cmsis/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/cmsis/Device/ST/STM32G4xx/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)

# Source files
file(GLOB_RECURSE SOURCES
    "src/*.c"
    "src/*.s"
    "startup/*.s"
)

# Build the ELF
add_executable(${PROJECT_NAME} ${SOURCES})

# Generate .hex and .bin after build
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${PROJECT_NAME}> ${PROJECT_NAME}.hex
    COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${PROJECT_NAME}> ${PROJECT_NAME}.bin
    COMMAND ${CMAKE_SIZE} $<TARGET_FILE:${PROJECT_NAME}>
    COMMENT "Generating .hex and .bin, printing size"
)
