cmake_minimum_required(VERSION 3.10.0)

# ==========================
# Toolchain Setup
# ==========================
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/riscv64-unknown-elf.cmake)

# ==========================
# Project Setup
# ==========================
project(pec930_motor VERSION 0.0.1 LANGUAGES C ASM)

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

set(EXECUTABLE ${PROJECT_NAME}.elf)
set(LINKER_DIR ${CMAKE_SOURCE_DIR}/ld)
set(LINKER_FILE ${LINKER_DIR}/gcc_flashxip.ld)
set(PEC930_SDK_DIR ${CMAKE_SOURCE_DIR}/../pec930_sdk/pec930_sdk-v1.0.1)

set(RISCV_ABI "ilp32e")
set(RISCV_CMODEL "medlow")
set(RISCV_ARCH rv32emac_zba_zbb_zbs_zicsr_zcmp)

# ==========================
# Compiler Flags and Defines
# ==========================
# ==========================
# Configuration Interface
# ==========================
# ==========================
# Subdirectories
# ==========================
# ==========================
# Source Files
# ==========================
set(STARTUP_SOURCES
    ${PEC930_SDK_DIR}/Drivers/PEC930/Device/src/Startup/trap.S
    ${PEC930_SDK_DIR}/Drivers/PEC930/Device/src/Startup/startup.S
)

set(DEVICE_SOURCES
    ${PEC930_SDK_DIR}/Drivers/PEC930/Device/src/system_dev.c
    ${PEC930_SDK_DIR}/Drivers/PEC930/Device/src/interrupt.c
    ${PEC930_SDK_DIR}/Drivers/PEC930/Device/src/syscalls.c
)

set(HAL_SOURCES
    ${PEC930_SDK_DIR}/Drivers/PEC930/HAL_Lib/src/hal_syscfg.c
    ${PEC930_SDK_DIR}/Drivers/PEC930/HAL_Lib/src/hal_uart.c
    ${PEC930_SDK_DIR}/Drivers/PEC930/HAL_Lib/src/hal_gpio.c
)

set(COMMON_SOURCES
    ${PEC930_SDK_DIR}/Common/printf.c
)

file(GLOB_RECURSE APP_SOURCES "app/src/*.c")

# ==========================
# Executable and Linker
# ==========================
add_executable(${EXECUTABLE}
    ${STARTUP_SOURCES}
    ${DEVICE_SOURCES}
    ${HAL_SOURCES}
    ${COMMON_SOURCES}
    ${APP_SOURCES}
)

target_include_directories(${EXECUTABLE} PRIVATE 
    ${CMAKE_SOURCE_DIR}/app/inc
    ${PEC930_SDK_DIR}/Drivers/PEC930/NMSIS/Core/Include
    ${PEC930_SDK_DIR}/Drivers/PEC930/Device/inc
    ${PEC930_SDK_DIR}/Drivers/PEC930/HAL_Lib/inc
    ${PEC930_SDK_DIR}/Common
)

target_compile_definitions(${EXECUTABLE} PRIVATE 
    -DCONFIG_USE_PEC930=1
)

target_compile_options(${EXECUTABLE} PRIVATE 
    -march=${RISCV_ARCH}
    -mabi=${RISCV_ABI}
    -mcmodel=${RISCV_CMODEL}
    -ffunction-sections
    -fdata-sections
    -fno-common
    -Wall 
)

target_link_options(${EXECUTABLE} PRIVATE
    -march=${RISCV_ARCH}
    -mabi=${RISCV_ABI}
    -mcmodel=medlow
    -T${LINKER_FILE}
    -nostartfiles
    --specs=nosys.specs
    --specs=nano.specs    
    -Wl,-gc-sections
    -Wl,--cref 
    -Wl,-Map=${CMAKE_BINARY_DIR}/${PROJECT_NAME}.map
    -Wl,--check-sections
    -Wl,--no-warn-rwx-segments
)

# target_link_libraries(${EXECUTABLE} PRIVATE
#     "${PEC930_SDK_DIR}/Drivers/PEC930/libSysDev_PEC930.a"
# )

# Optional: Print executable size as part of the post build process
add_custom_command(TARGET ${EXECUTABLE}
        POST_BUILD
        COMMAND ${CMAKE_SIZE} ${EXECUTABLE})

if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
    add_compile_options(-g3 -ggdb -gdwarf-2 -O2)
else()
    add_compile_options(-O2)
    add_definitions(-DNDEBUG)
endif()