cmake_minimum_required(VERSION 3.20)

# 跳过编译器链接测试（裸机 ARM 无系统调用 _exit/_sbrk 等）
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

project(blink C)

# 输出固件带 .elf 后缀，pyOCD 自动识别格式
set(CMAKE_EXECUTABLE_SUFFIX ".elf")

set(SDK_DIR        "C:/ti/mspm0_sdk_2_11_00_07")
set(SYSCONFIG_CLI  "C:/ti/sysconfig_1.28.0/sysconfig_cli.bat")
set(DEVICE         "MSPM0G350X")
set(PACKAGE        "LQFP-64(PM)")

# ── SysConfig code generation ──────────────────────────────────────
set(SYSCFG_OUTPUT_DIR "${CMAKE_BINARY_DIR}/syscfg")

add_custom_command(
    OUTPUT
        "${SYSCFG_OUTPUT_DIR}/ti_msp_dl_config.c"
        "${SYSCFG_OUTPUT_DIR}/ti_msp_dl_config.h"
        "${SYSCFG_OUTPUT_DIR}/device_linker.lds"
        "${SYSCFG_OUTPUT_DIR}/device.opt"
        "${SYSCFG_OUTPUT_DIR}/device.lds.genlibs"
    COMMAND cmd /c "${SYSCONFIG_CLI}"
        --compiler gcc
        --product "${SDK_DIR}/.metadata/product.json"
        --device "${DEVICE}"
        --package "${PACKAGE}"
        --output "${SYSCFG_OUTPUT_DIR}"
        "${CMAKE_SOURCE_DIR}/blink.syscfg"
    DEPENDS "${CMAKE_SOURCE_DIR}/blink.syscfg"
    COMMENT "Running SysConfig..."
)

# ── Source files ────────────────────────────────────────────────────
set(GEN_DIR ${SYSCFG_OUTPUT_DIR})

add_executable(${PROJECT_NAME}
    src/main.c
    "${GEN_DIR}/ti_msp_dl_config.c"
    "${SDK_DIR}/source/ti/devices/msp/m0p/startup_system_files/gcc/startup_mspm0g350x_gcc.c"
)

# SysConfig outputs are dependencies
add_dependencies(${PROJECT_NAME} syscfg_gen)
add_custom_target(syscfg_gen DEPENDS "${GEN_DIR}/ti_msp_dl_config.c")

# ── Include directories ─────────────────────────────────────────────
target_include_directories(${PROJECT_NAME} PRIVATE
    "${CMAKE_SOURCE_DIR}/include"
    "${CMAKE_SOURCE_DIR}/src"
    "${GEN_DIR}"
    "${SDK_DIR}/source"
    "${SDK_DIR}/source/third_party/CMSIS/Core/Include"
)

# ── Compile definitions & flags ─────────────────────────────────────
target_compile_definitions(${PROJECT_NAME} PRIVATE
    __MSPM0G3507__
    __USE_SYSCONFIG__
)

target_compile_options(${PROJECT_NAME} PRIVATE
    -mcpu=cortex-m0plus
    -march=armv6-m
    -mthumb
    -mfloat-abi=soft
    -std=c99
    -O2
    -ffunction-sections
    -fdata-sections
    -g
    -Wall
    -gstrict-dwarf
)

# ── Linker flags ────────────────────────────────────────────────────
# Override SysConfig's linker script with G3507 (128KB Flash / 32KB SRAM)
set(LINKER_SCRIPT "${SDK_DIR}/source/ti/devices/msp/m0p/linker_files/gcc/mspm0g3507.lds")

target_link_options(${PROJECT_NAME} PRIVATE
    -mcpu=cortex-m0plus
    -march=armv6-m
    -mthumb
    -mfloat-abi=soft
    -nostartfiles
    -static
    -Wl,--gc-sections
    -Wl,-Map,${PROJECT_NAME}.map
    -T${LINKER_SCRIPT}
    -T${GEN_DIR}/device.lds.genlibs
    -L${SDK_DIR}/source
    --specs=nano.specs
    --specs=nosys.specs
    -lgcc
    -lc
    -lm
)
