cmake_minimum_required(VERSION 3.16)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# cmake -DCMAKE_PREFIX_PATH="." -DCMAKE_TOOLCHAIN_FILE="../cmake/gcc.cmake" -DARM_CPU="cortex-m0plus" -G "Ninja" ..


project(LE0_Lin_BaudRateSync)

# USER CODE BEGIN start

# USER CODE END start

set(PROJ_DIR ${CMAKE_SOURCE_DIR})
set(SDK_VER 1_3_1)
set(SDK_DIR C:/Users/sunxuehu/AppData/Roaming/yt_config_tool/sdk/YTM32B1LE0_1_3_1)

include(${CMAKE_SOURCE_DIR}/cmake/config.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/targets/GENERATED_CONFIG_TARGET.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/targets/GENERATED_SDK_TARGET.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/targets/UTILITY_PRINT.cmake)

# USER CODE BEGIN include
# include(...)
# USER CODE END include

set(project_elf LE0_Lin_BaudRateSync.elf)
add_executable(${project_elf} app/main.c)
#add app as include path
target_include_directories(${project_elf} PRIVATE app)
#add all source files in app folder 
file(GLOB dir_sources "app/*.c" "app/*.cpp" "app/*.S")
if(dir_sources)
    foreach(src ${dir_sources})
        target_sources(${project_elf} PRIVATE ${src})
    endforeach()
endif()

# USER CODE BEGIN add_executable
# target_include_directories()
# target_sources(${project_elf} PRIVATE ..)
# USER CODE END add_executable

configcore(${project_elf} ${CMAKE_SOURCE_DIR})


# USER CODE BEGIN target_compile_definitions
# target_compile_definitions(...)
# USER CODE END target_compile_definitions

target_compile_definitions(${project_elf} PUBLIC
    "YTM32B1LE0"
    "CPU_YTM32B1LE0"
)

# USER CODE BEGIN target_compile_options
# target_compile_options(...)
# USER CODE END target_compile_options


target_link_libraries(${project_elf} "-Wl,--whole-archive" GENERATED_CONFIG_TARGET GENERATED_SDK_TARGET UTILITY_PRINT  "-Wl,--no-whole-archive")

# USER CODE BEGIN target_link_libraries
# target_link_libraries(...)
# USER CODE END target_link_libraries


if (CORTEXM)
    compilerSpecificPlatformConfigAppForM(${project_elf} ${CMAKE_SOURCE_DIR} )
elseif(CORTEXA)
    compilerSpecificPlatformConfigAppForA(${project_elf} ${CMAKE_SOURCE_DIR} )
else()
    compilerSpecificPlatformConfigAppForR(${project_elf} ${CMAKE_SOURCE_DIR} )
endif()

target_link_libraries(${project_elf} "--entry=Reset_Handler;-T${PROJ_DIR}/board/yt_linker.ld")
target_link_libraries(${project_elf} "-Wl,-Map=LE0_Lin_BaudRateSync.map;-Wl,--end-group")
add_custom_command(TARGET ${project_elf} POST_BUILD COMMAND arm-none-eabi-size --format=berkeley ${project_elf})
add_custom_target(genbin
    DEPENDS ${project_elf}
    COMMAND ${CMAKE_OBJCOPY} -F elf32-littlearm -O binary ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin
)
add_custom_target(genhex
    DEPENDS ${project_elf}
    COMMAND ${CMAKE_OBJCOPY} -F elf32-littlearm -O ihex ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.hex
)
add_custom_command(
    TARGET ${project_elf} POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -F elf32-littlearm -O ihex ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.hex
)
add_custom_target(gens19
    DEPENDS ${project_elf}
    COMMAND ${CMAKE_OBJCOPY} -F elf32-littlearm -O srec ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.s19
)
add_custom_target(genlist
    DEPENDS ${project_elf}
    COMMAND ${CMAKE_OBJDUMP}  --source --all-headers --demangle --line-numbers --wide ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf > ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.lst
)



# yct file as depend
file(GLOB yct_files "${CMAKE_SOURCE_DIR}/*.yct")
if(yct_files)
    list(APPEND CMAKE_CONFIGURE_DEPENDS ${yct_files})
endif()

# USER CODE BEGIN others

set(OZONE_CONFIG_FILE ${CMAKE_SOURCE_DIR}/build/ozone.jdebug)
# 定义设备列表
set(DeviceList
    YTM32B1ME05
    YTM32B1ME15
    YTM32B1MD14
    YTM32B1LE05
    YTM32B1LE15
    YTM32B1HA01
    YTM32B1HA11
    YTM32B1HB02
    YTM32B1LD04
    YTM32B1MC03
    YTM32Z1DS0
    YTM32Z1LS06
    YTM32Z1MC03
    YTM32Z1ME05
)

# 模糊关键字
set(TargetKeyword ${DEVICE_NAME}) # 模糊匹配的关键字
set(MatchedDevice "")          # 初始化匹配结果为空

# 遍历设备列表，找到最后一个匹配的设备
foreach(Device ${DeviceList})
    if("${Device}" MATCHES "${TargetKeyword}.*") # 模糊匹配关键字
        set(MatchedDevice ${Device})            # 更新为当前匹配到的设备
    endif()
endforeach()

# 如果没有找到匹配设备，则设置默认设备
if(MatchedDevice STREQUAL "")
    set(MatchedDevice "YTM32B1ME05") # 默认设备
    message(WARNING "No match found. Using default device: ${MatchedDevice}")
else()
    message(STATUS "Matched device: ${MatchedDevice}")
endif()

file(WRITE ${OZONE_CONFIG_FILE} "
/*********************************************************************
*
*       OnProjectLoad
*
* Function description
*   Project load routine. Required.
*
**********************************************************************
*/
void OnProjectLoad (void) {

  Project.SetDevice (\"${MatchedDevice}\");
  Project.SetHostIF (\"USB\", \"\");
  Project.SetTargetIF (\"SWD\");
  Project.SetTIFSpeed (\"8\ MHz\");
  Project.AddSvdFile (\"${CMAKE_SOURCE_DIR}/.vscode/chip.svd\");
  //
  // User settings
  //
  File.Open (\"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf\");
}")
# USER CODE END others