Files
FilmForge/CMakeLists.txt
T

140 lines
5.6 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
cmake_minimum_required(VERSION 3.20)
# 包含项目配置
include(${CMAKE_SOURCE_DIR}/cmake/project_config.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/project.cmake)
project(${PROJECT_NAME} LANGUAGES C CXX ASM)
# Generate version header from CMake version variables
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated)
configure_file(${CMAKE_SOURCE_DIR}/cmake/version.h.in ${CMAKE_BINARY_DIR}/generated/version.h @ONLY)
# 添加SDK库
add_subdirectory(SDK/CMSIS)
add_subdirectory(SDK/GD32F4xx_standard_peripheral)
add_subdirectory(SDK/SEGGER_RTT)
# USB 库默认不编译,需要时:cmake --preset Debug -DGD32_ENABLE_USB=ON,
# 并在下方链接区追加 target_link_libraries(${PROJECT_NAME} PRIVATE GD32F4xx_usb_library)
add_subdirectory(SDK/GD32F4xx_usb_library)
# 业务代码源文件
set(TARGET_SRC
# Core
Src/gd32f4xx_it.c
Src/main.c
Src/systick.c
Src/system_gd32f4xx.c
# Startup
SDK/CMSIS/startup/startup_gd32f405_425.S
# User
Src/syscalls.c
# Add new source files here
Src/uart.c
Src/led.c
Src/uart_ring_buffer.c
Src/rs485.c
Src/ntc.c
Src/command.c
Src/pwr_hold.c
Src/heat.c
# TODO: 待从 GD32E23x 工程移植后启用
# Src/i2c.c
)
# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Application)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Application)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Application)
add_executable(${PROJECT_NAME} ${TARGET_SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME Application)
project_add_target_properties(${PROJECT_NAME})
# 头文件路径
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_SOURCE_DIR}/Inc
${CMAKE_BINARY_DIR}/generated
# Add new include directories here, e.g. ${CMAKE_SOURCE_DIR}/Application/User/Inc
)
# 按 GD32_FLASH_CAPACITY 选择链接脚本与容量宏(cmake/project_config.cmake 中定义)
if(GD32_FLASH_CAPACITY STREQUAL "xE")
set(GD32_FLASH_LD "gd32f405_407_xE_flash.ld")
set(GD32_FLASH_SIZE_KB 512)
elseif(GD32_FLASH_CAPACITY STREQUAL "xG")
set(GD32_FLASH_LD "gd32f405_407_xG_flash.ld")
set(GD32_FLASH_SIZE_KB 1024)
elseif(GD32_FLASH_CAPACITY STREQUAL "xK")
set(GD32_FLASH_LD "gd32f405_407_xK_flash.ld")
set(GD32_FLASH_SIZE_KB 2048)
else()
message(FATAL_ERROR "Invalid GD32_FLASH_CAPACITY='${GD32_FLASH_CAPACITY}', expected xE/xG/xK")
endif()
message(STATUS "Target flash capacity: ${GD32_FLASH_CAPACITY} (${GD32_FLASH_SIZE_KB} KB), LD: ${GD32_FLASH_LD}")
# 链接脚本
target_link_options(${PROJECT_NAME} PRIVATE
-T${CMAKE_SOURCE_DIR}/LD/${GD32_FLASH_LD} -Xlinker
-L${CMAKE_SOURCE_DIR}/LD
)
# 容量宏(代码中如需按容量分支使用 GD32_FLASH_SIZE_KB)
target_compile_definitions(${PROJECT_NAME} PRIVATE GD32_FLASH_SIZE_KB=${GD32_FLASH_SIZE_KB})
# 生成 map 文件等。`--no-warn-rwx-segments` 仅用于抑制新版本
# binutils 的 RWX 段警告,旧版(例如 xPack GCC 11.3 搭配 binutils 2.38)
# 不认识该选项,因此先探测链接器能力,避免因工具链版本差异导致链接失败。
target_link_options(${PROJECT_NAME} PRIVATE
-Wl,-Map=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Application.map
)
execute_process(
COMMAND "${CMAKE_LINKER}" --help
OUTPUT_VARIABLE FILMFORGE_LINKER_HELP
ERROR_VARIABLE FILMFORGE_LINKER_HELP_ERROR
RESULT_VARIABLE FILMFORGE_LINKER_HELP_RESULT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(FILMFORGE_LINKER_HELP_RESULT EQUAL 0 AND
FILMFORGE_LINKER_HELP MATCHES "no-warn-rwx-segments")
target_link_options(${PROJECT_NAME} PRIVATE -Wl,--no-warn-rwx-segments)
else()
message(STATUS "Linker does not support --no-warn-rwx-segments; skipping it")
endif()
# 链接SDK库
target_link_libraries(${PROJECT_NAME} PRIVATE CMSIS)
target_link_libraries(${PROJECT_NAME} PRIVATE GD32F4xx_standard_peripheral)
target_link_libraries(${PROJECT_NAME} PRIVATE SEGGER_RTT)
# 生成 bin/hex/list 文件名格式:[工程名_版本号_编译条件_编译日期]
set(OUTPUT_PREFIX "${PROJECT_NAME}_${VERSION}_${BUILD_VARIANT}_${BUILD_DATE}")
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND echo -- Running Post Build Commands
COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${PROJECT_NAME}> ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.hex
COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${PROJECT_NAME}> $<TARGET_FILE_DIR:${PROJECT_NAME}>/Application.hex
COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${PROJECT_NAME}> ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.bin
COMMAND ${CMAKE_SIZE} $<TARGET_FILE:${PROJECT_NAME}>
COMMAND ${CMAKE_OBJDUMP} -h -S $<TARGET_FILE:${PROJECT_NAME}> > ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.list
COMMAND ${CMAKE_SIZE} --format=berkeley $<TARGET_FILE:${PROJECT_NAME}> > ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.bsz
COMMAND ${CMAKE_SIZE} --format=sysv -x $<TARGET_FILE:${PROJECT_NAME}> > ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.ssz
)
# =========================
# Tips for project maintainers:
# 1. If you add new source files (e.g. Src/my_module.c), add them to TARGET_SRC above.
# 2. If you add new header files or directories, add them to target_include_directories above.
# 3. If you add new SDK modules, use add_subdirectory(SDK/YourModule) and link with target_link_libraries.
# 4. 换用其它型号时:修改 cmake/project.cmake 与 SDK/GD32F4xx_standard_peripheral/CMakeLists.txt 中的
# GD32F405 宏、TARGET_SRC 中的启动文件(startup_gd32f405_425.S / startup_gd32f407_427.S /
# startup_gd32f450_470.S)以及上面的链接脚本(LD/gd32f405_407_xE_flash.ld 等)。
# =========================