cmake_minimum_required(VERSION 3.21)

include(cmake/sdcc-mcs51.cmake)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_C_STANDARD 11)

project(STC32G144K246_SDCC_Template C ASM)

add_executable(${CMAKE_PROJECT_NAME})

#message("${PROJECT_BINARY_DIR} ${CMAKE_BINARY_DIR} ${PROJECT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}")

# 添加构建前清理命令，清除所有编译产物
add_custom_command(
        TARGET ${CMAKE_PROJECT_NAME}
        PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E echo "Cleaning old build artifacts..."
        # 清理主要编译产物
        COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_PROJECT_NAME}.ihx
        COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_PROJECT_NAME}.hex
        COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_PROJECT_NAME}.lk
        COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_PROJECT_NAME}.map
        COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_PROJECT_NAME}.mem
        COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_PROJECT_NAME}.rst
        COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_PROJECT_NAME}.sym
        # 清理所有中间文件（.asm, .lst, .rel, .sym）
        COMMAND ${CMAKE_COMMAND} -E remove -f *.asm
        COMMAND ${CMAKE_COMMAND} -E remove -f *.lst
        COMMAND ${CMAKE_COMMAND} -E remove -f *.rel
        COMMAND ${CMAKE_COMMAND} -E remove -f *.rst
        COMMAND ${CMAKE_COMMAND} -E remove -f *.sym
        # 清理CMakeFiles目录下的中间文件
        COMMAND ${CMAKE_COMMAND} -E remove -f CMakeFiles/${CMAKE_PROJECT_NAME}.dir/Core/Src/*.asm
        COMMAND ${CMAKE_COMMAND} -E remove -f CMakeFiles/${CMAKE_PROJECT_NAME}.dir/Core/Src/*.lst
        COMMAND ${CMAKE_COMMAND} -E remove -f CMakeFiles/${CMAKE_PROJECT_NAME}.dir/Core/Src/*.rel
        COMMAND ${CMAKE_COMMAND} -E remove -f CMakeFiles/${CMAKE_PROJECT_NAME}.dir/Core/Src/*.rst
        COMMAND ${CMAKE_COMMAND} -E remove -f CMakeFiles/${CMAKE_PROJECT_NAME}.dir/Core/Src/*.sym
        COMMENT "Cleaned all build artifacts and intermediate files"
)

# 构建后转换为hex文件并输出内存使用情况
add_custom_command(
        TARGET ${CMAKE_PROJECT_NAME}
        POST_BUILD
        COMMAND ${SDCC_PACKIHX} ${CMAKE_PROJECT_NAME}.ihx > ${CMAKE_PROJECT_NAME}.hex
        COMMAND ${CMAKE_COMMAND} -E echo "==================================================================="
        COMMAND ${CMAKE_COMMAND} -E echo "Memory Usage Report (${CMAKE_PROJECT_NAME}.mem):"
        COMMAND ${CMAKE_COMMAND} -E echo "==================================================================="
        COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_PROJECT_NAME}.mem
        COMMAND ${CMAKE_COMMAND} -E echo "==================================================================="
        COMMENT "Converting to HEX and displaying memory usage"
)

target_sources(${CMAKE_PROJECT_NAME} PRIVATE
        ${CMAKE_SOURCE_DIR}/Core/Src/main.c
        ${CMAKE_SOURCE_DIR}/Core/Src/clock.c
        ${CMAKE_SOURCE_DIR}/Core/Src/port.c
        ${CMAKE_SOURCE_DIR}/Core/Src/timer.c
        ${CMAKE_SOURCE_DIR}/Core/Src/uart.c
#        Drivers/usb/usb_cdc_bk/Src/usb.c
#        Drivers/usb/usb_cdc_bk/Src/usb_desc.c
#        Drivers/usb/usb_cdc_bk/Src/usb_req_class.c
#        Drivers/usb/usb_cdc_bk/Src/usb_req_std.c
#        Drivers/usb/usb_cdc_bk/Src/usb_req_vendor.c
#        Drivers/usb/usb_cdc_bk/Src/util.c
)

target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
        ${CMAKE_SOURCE_DIR}/Core/Inc
        ${CMAKE_SOURCE_DIR}/Drivers/Inc
        ${CMAKE_SOURCE_DIR}/Hardware/Inc
#        Drivers/usb/usb_cdc_bk/Inc
)
