173 lines
5.8 KiB
CMake
173 lines
5.8 KiB
CMake
# 设置交叉编译目标系统为通用(无操作系统)
|
|
set(CMAKE_SYSTEM_NAME Generic)
|
|
# 设置目标处理器架构为ARM
|
|
set(CMAKE_SYSTEM_PROCESSOR ARM)
|
|
# 设置系统版本号
|
|
set(CMAKE_SYSTEM_VERSION 1)
|
|
|
|
# 指定CMake最低版本要求
|
|
cmake_minimum_required(VERSION 3.31.12)
|
|
|
|
# [优化] 设置交叉编译查找规则
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 不在目标系统查找程序
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 只在目标系统查找库
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 只在目标系统查找头文件
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # 只在目标系统查找包
|
|
|
|
# 设置编译目标类型为静态库,跳过编译器测试
|
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|
|
|
# [优化] 编译器检查
|
|
if(NOT CMAKE_C_COMPILER)
|
|
message(FATAL_ERROR "ARM GCC编译器未找到,请安装arm-none-eabi-gcc工具链")
|
|
endif()
|
|
|
|
# 项目定义,支持C、C++和汇编语言
|
|
project(Project C CXX ASM)
|
|
|
|
# 设置C++标准为C++17
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
# 设置C标准为C11
|
|
set(CMAKE_C_STANDARD 11)
|
|
|
|
# 添加核心编译选项
|
|
add_compile_options(
|
|
-mcpu=cortex-m3 # 指定CPU内核为Cortex-M3
|
|
-mthumb # 使用Thumb指令集
|
|
-mthumb-interwork # 支持ARM/Thumb指令集交互
|
|
|
|
# 代码段优化选项
|
|
-ffunction-sections # 将每个函数放在独立的段中
|
|
-fdata-sections # 将每个数据放在独立的段中
|
|
-fno-common # 禁止未初始化变量使用公共段
|
|
-fmessage-length=0 # 错误消息不限制长度
|
|
|
|
# 警告选项
|
|
-Wall # 开启所有警告
|
|
-Wextra # 开启额外警告
|
|
-Wno-unused-parameter # 抑制未使用参数警告
|
|
)
|
|
|
|
# 启用汇编器文件预处理
|
|
add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-x$<SEMICOLON>assembler-with-cpp>)
|
|
|
|
# [优化] 构建类型配置
|
|
string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER)
|
|
if("${BUILD_TYPE_UPPER}" STREQUAL "RELEASE")
|
|
message(STATUS "Release模式:速度最大化优化")
|
|
add_compile_options(-Ofast)
|
|
elseif("${BUILD_TYPE_UPPER}" STREQUAL "RELWITHDEBINFO")
|
|
message(STATUS "RelWithDebInfo模式:速度优化,包含调试信息")
|
|
add_compile_options(-Ofast -g)
|
|
elseif("${BUILD_TYPE_UPPER}" STREQUAL "MINSIZEREL")
|
|
message(STATUS "MinSizeRel模式:代码大小最小化优化")
|
|
add_compile_options(-Os)
|
|
else()
|
|
message(STATUS "Debug模式:最小优化,包含完整调试信息")
|
|
add_compile_options(-Og -g -DDEBUG)
|
|
endif()
|
|
|
|
# 添加预处理器宏定义
|
|
add_compile_definitions(
|
|
USE_STDPERIPH_DRIVER
|
|
STM32F10X_HD
|
|
)
|
|
|
|
# [我加的] 添加头文件搜索路径 - 根据你的项目结构调整
|
|
include_directories(
|
|
App
|
|
Port/Stm32F10x/StdLib/Inc
|
|
Port/Stm32F10x/System
|
|
Port/Stm32F10x/System/CMSIS
|
|
)
|
|
|
|
# [我加的] 自动收集源文件(递归搜索指定目录下的所有源文件)
|
|
file(GLOB_RECURSE SOURCES
|
|
Port/Stm32F10x/System/Startup/Gcc/startup_stm32f10x_hd.s
|
|
App/*.c
|
|
Port/Stm32F10x/StdLib/Src/*.c
|
|
Port/Stm32F10x/CMSIS/*.c
|
|
Port/Stm32F10x/System/*.c
|
|
)
|
|
# [我加的] 排除模板文件和测试套件
|
|
list(FILTER SOURCES EXCLUDE REGEX ".*template.*")
|
|
list(FILTER SOURCES EXCLUDE REGEX ".*TestSuite.*")
|
|
list(FILTER SOURCES EXCLUDE REGEX ".*ARMCC.*")
|
|
|
|
# [我加的] 显示找到的源文件信息
|
|
message(STATUS "找到的源文件数量: ${SOURCES}")
|
|
foreach(source ${SOURCES})
|
|
get_filename_component(FILENAME ${source} NAME)
|
|
message(STATUS " - ${FILENAME}")
|
|
endforeach()
|
|
|
|
# [我加的] 排除模板文件
|
|
list(FILTER SOURCES EXCLUDE REGEX ".*template.*")
|
|
|
|
# [我加的] 显示找到的源文件信息
|
|
message(STATUS "找到的源文件数量: ${SOURCES}")
|
|
foreach(source ${SOURCES})
|
|
get_filename_component(FILENAME ${source} NAME)
|
|
message(STATUS " - ${FILENAME}")
|
|
endforeach()
|
|
|
|
# 设置链接脚本路径
|
|
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Port/Stm32F10x/System/LinkScripts/Gcc/stm32_flash_ze.ld)
|
|
|
|
# 检查链接脚本是否存在
|
|
if(NOT EXISTS "${LINKER_SCRIPT}")
|
|
message(FATAL_ERROR "链接脚本不存在,请检查路径: ${LINKER_SCRIPT}")
|
|
else()
|
|
message(STATUS "链接脚本验证成功: ${LINKER_SCRIPT}")
|
|
endif()
|
|
|
|
# [修正] 链接器选项语法
|
|
add_link_options(
|
|
# 链接器优化选项
|
|
"LINKER:-gc-sections" # 垃圾回收未使用的段
|
|
"LINKER:--print-memory-usage" # 打印内存使用情况
|
|
"LINKER:-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map" # 生成内存映射文件
|
|
|
|
# CPU架构选项
|
|
-mcpu=cortex-m3
|
|
-mthumb
|
|
-mthumb-interwork
|
|
|
|
# 指定链接脚本
|
|
-T "${LINKER_SCRIPT}"
|
|
|
|
# 标准库规格
|
|
-specs=nano.specs # 使用精简版C库
|
|
-specs=nosys.specs # 无系统调用支持
|
|
)
|
|
|
|
# 创建可执行文件目标
|
|
add_executable(${PROJECT_NAME}.elf ${SOURCES}
|
|
App/main.c
|
|
App/main.h)
|
|
|
|
# [优化] 添加自定义目标用于分析
|
|
add_custom_target(size
|
|
COMMAND ${CMAKE_SIZE_UTIL} ${PROJECT_NAME}.elf
|
|
DEPENDS ${PROJECT_NAME}.elf
|
|
COMMENT "分析程序内存使用情况"
|
|
)
|
|
|
|
# 设置输出文件路径
|
|
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
|
|
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
|
|
|
|
# 添加自定义命令生成HEX和BIN文件
|
|
add_custom_command(
|
|
TARGET ${PROJECT_NAME}.elf
|
|
POST_BUILD
|
|
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
|
|
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
|
|
COMMENT "Generate HEX and BIN files: ${HEX_FILE}, ${BIN_FILE}"
|
|
)
|
|
|
|
# [优化] 显示构建信息
|
|
message(STATUS "目标MCU: Cortex-M3")
|
|
message(STATUS "链接脚本: ${LINKER_SCRIPT}")
|
|
message(STATUS "编译器: ${CMAKE_C_COMPILER}")
|