Files
gd32/CMakeLists.txt
2025-10-18 16:51:59 +08:00

109 lines
3.1 KiB
CMake

cmake_minimum_required(VERSION 3.15)
# Set toolchain for ARM cross-compilation
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
# Specify the cross compiler
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
# Set toolchain utilities
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_SIZE arm-none-eabi-size)
# Skip compiler test (we'll configure it properly below)
set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)
# Set project name and languages
project(GD32E230C_EVAL C ASM)
# Set C standard
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
# Export compile commands for IDEs
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# MCU specific settings
set(MCU_FAMILY GD32E23x)
set(MCU_MODEL GD32E230C8)
set(CPU_TYPE cortex-m23)
# Define macros
add_compile_definitions(
GD32E230
USE_STDPERIPH_DRIVER
)
# Compiler options
set(MCU_FLAGS "-mcpu=${CPU_TYPE} -mthumb")
set(COMMON_FLAGS "${MCU_FLAGS} -Wall -fdata-sections -ffunction-sections")
set(CMAKE_C_FLAGS "${COMMON_FLAGS} -Os -g3")
set(CMAKE_ASM_FLAGS "${MCU_FLAGS} -x assembler-with-cpp")
set(CMAKE_EXE_LINKER_FLAGS "${MCU_FLAGS} -specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -Wl,-Map=${PROJECT_NAME}.map,--cref")
# Linker script
set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Source/GCC/gd32e23x_flash.ld")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T${LINKER_SCRIPT}")
# Include directories
include_directories(
${CMAKE_SOURCE_DIR}/user
${CMAKE_SOURCE_DIR}/user/Soft_Drive
${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Include
${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/CMSIS
${CMAKE_SOURCE_DIR}/CMSIS_5-develop/CMSIS/Core/Include
${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/GD32E23x_standard_peripheral/Include
${CMAKE_SOURCE_DIR}/Utilities
${CMAKE_SOURCE_DIR}/Utilities/LCD_Common
)
# Source files
file(GLOB_RECURSE USER_SOURCES
"user/*.c"
)
file(GLOB PERIPHERAL_SOURCES
"GD32E23x_Firmware_Library/GD32E23x_standard_peripheral/Source/*.c"
)
file(GLOB CMSIS_SOURCES
"GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Source/system_gd32e23x.c"
)
file(GLOB UTILITIES_SOURCES
"Utilities/*.c"
"Utilities/LCD_Common/*.c"
)
set(STARTUP_FILE
"GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Source/GCC/startup_gd32e23x.s"
)
# Create executable
add_executable(${PROJECT_NAME}.elf
${USER_SOURCES}
${PERIPHERAL_SOURCES}
${CMSIS_SOURCES}
${UTILITIES_SOURCES}
${STARTUP_FILE}
)
# Custom commands to generate additional output formats
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O ihex ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex
COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin
COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}.elf
COMMENT "Building ${PROJECT_NAME}.hex and ${PROJECT_NAME}.bin"
)
# Print executable size
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_SIZE} --format=berkeley ${PROJECT_NAME}.elf
COMMENT "Firmware size:"
)