# 指定CMake最低版本 [5,7](@ref)
cmake_minimum_required(VERSION 3.22)

# Setup compiler settings
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)

# Define the build type
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()

# 定义项目名称（可指定语言）[3,8](@ref)
set(CMAKE_PROJECT_NAME CMakeDemo)

set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)

# 核心工程设置
project(${CMAKE_PROJECT_NAME})
message("Build type: " ${CMAKE_BUILD_TYPE})

# 允许使用C, C++和ASM
enable_language(C CXX ASM)

# 工程宏定义
set(Defines_Syms 
    GD32H7XX
    $<$<CONFIG:Debug>:DEBUG>
)

# 创建可执行对象
add_executable(${CMAKE_PROJECT_NAME})

# 源文件
set(ASM_SOURCE_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/CMSIS/GD/GD32H7xx/Source/GCC/startup_gd32h7xx.S
)

set(APP_SOURCE_FILES 
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/CMSIS/GD/GD32H7xx/Source/system_gd32h7xx.c
    ${CMAKE_CURRENT_SOURCE_DIR}/App/Src/gd32h7xx_it.c
    ${CMAKE_CURRENT_SOURCE_DIR}/App/Src/systick.c
    ${CMAKE_CURRENT_SOURCE_DIR}/App/Src/main.c
)

################################ Firmware ################################
set(FIRMWARE_SOURCE_FILE
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_adc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_adc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_can.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_cau_aes.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_cau.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_cau_des.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_cau_tdes.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_cmp.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_cpdm.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_crc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_ctc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_dac.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_dbg.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_dci.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_dma.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_edout.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_efuse.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_enet.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_exmc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_exti.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_fac.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_fmc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_fwdgt.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_gpio.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_hau.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_hau_sha_md5.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_hpdf.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_hwsem.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_i2c.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_ipa.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_lpdts.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_mdio.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_mdma.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_misc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_ospi.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_ospim.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_pmu.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_rameccmu.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_rcu.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_rspdif.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_rtc.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_rtdec.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_sai.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_sdio.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_spi.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_syscfg.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_timer.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_tli.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_tmu.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_trigsel.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_trng.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_usart.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_vref.c
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Source/gd32h7xx_wwdgt.c
)

# 包含路径
set(APP_INCLUDE_DIR
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/GD32H7xx_standard_peripheral/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/CMSIS/GD/GD32H7xx/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/CMSIS
    ${CMAKE_CURRENT_SOURCE_DIR}/App/Inc
)

target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
    ${FIRMWARE_INCLUDE_DIR}
    ${APP_INCLUDE_DIR}
)

target_sources(${CMAKE_PROJECT_NAME} PRIVATE
    ${ASM_SOURCE_FILES}
    ${APP_SOURCE_FILES}
    ${FIRMWARE_SOURCE_FILE}
)


# 链接库目录
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
)


target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
    ${Defines_Syms}
)


# 构建后反汇编
add_custom_command(
  TARGET ${CMAKE_PROJECT_NAME}
  POST_BUILD
  COMMAND ${CMAKE_OBJDUMP} -d -S $<TARGET_FILE:${CMAKE_PROJECT_NAME}> > ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.asm
  COMMENT "反汇编中..."
  VERBATIM
)

# 构建后导出符号表
add_custom_command(
  TARGET ${CMAKE_PROJECT_NAME}
  POST_BUILD
  COMMAND ${CMAKE_NM} -n $<TARGET_FILE:${CMAKE_PROJECT_NAME}> > ${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_symbol_table.txt
  COMMENT "导出符号表中..."
  VERBATIM
)

# 构建后输出Hex和bin
add_custom_command(
  TARGET ${CMAKE_PROJECT_NAME}
  POST_BUILD
  COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${CMAKE_PROJECT_NAME}> ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.hex
  COMMENT "输出Hex文件..."
  VERBATIM
)
add_custom_command(
  TARGET ${CMAKE_PROJECT_NAME}
  POST_BUILD
  COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${CMAKE_PROJECT_NAME}> ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin
  COMMENT "输出Bin文件..."
  VERBATIM
)

# Remove wrong libob.a library dependency when using cpp files
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_LIBRARIES ob)

