set(CMAKE_SYSTEM_NAME Generic)
#cmake最低版本
cmake_minimum_required(VERSION 3.0.0)
#工程名称,语言
project(TEST_PRJ_NAME
LANGUAGES C CXX ASM
)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD 99)
############ 交叉编译工具 #############
set(CROSS_COMPILE_PREFIX arm-none-eabi)
set(CMAKE_C_COMPILER ${CROSS_COMPILE_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILE_PREFIX}-g++)
set(CMAKE_ASM_COMPILER ${CROSS_COMPILE_PREFIX}-gcc)
set(CMAKE_OBJCOPY ${CROSS_COMPILE_PREFIX}-objcopy)
set(CMAKE_OBJDUMP ${CROSS_COMPILE_PREFIX}-objdump)
set(CMAKE_SIZE ${CROSS_COMPILE_PREFIX}-size)
set(CMAKE_AR ${CROSS_COMPILE_PREFIX}-ar) # 可用来编译静态库
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# 浮点类型
# -mfloat-abi=soft/softfp/hard
# soft 不使用硬件浮点单元,gcc使用软浮点库来完成浮点运算。适用于不含FPU的CPU
# softfp 使用硬浮点单元,会生成硬浮点指令,生成何种类型的硬浮点指令由-mfpu选项指定。调用接口的规则和soft选项一致
# hard 使用硬浮点单元,生成硬浮点指令。与softfp的区别在于调用接口的规则不同
# -fsingle-precision-constant 将浮点常量做为单精度常量对待,而不是隐式地将其转换为双精度
############ 编译标志 #############
#型号
set(MCU_FAMILY_STD GD32F30X_HD)
#布局文件
set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/Cmsis/Device/gd32f303cct6.ld)
#内核相关
set(CPU "-mcpu=cortex-m4")
set(CPU_ARCH "-mthumb -mthumb-interwork") # 生成thumb目标,arm和thumb可交叉调用
set(FPU "-mfpu=fpv4-sp-d16")
set(FPU_MEATHOD "-fsingle-precision-constant")
set(FLOAT_ABI "-mfloat-abi=softfp")
#可执行文件
set(ELF_FILE ${PROJECT_NAME}.elf)
# Release - Adds the -O3 -DNDEBUG flags to the compiler
# Debug - Adds the -g flag
# MinSizeRel - Adds -Os -DNDEBUG
# RelWithDebInfo - Adds -O2 -g -DNDEBUG flags
# 注意: 当CMAKE_BUILD_TYPE 匹配到这几个标志后再单独设置是不生效的
#调试参数,优化选项
if(NOT CMAKE_BUILD_TYPE)
# set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
# "Choose the type of build, options are:
# Debug Release RelWithDebInfo MinSizeRel."
# FORCE)
set(DBG_FLAGS "-O2 -g")
message("options -O2 -g")
else()
if(CMAKE_BUILD_TYPE MATCHES Release)
message("Release - Adds the -O3 -DNDEBUG flags to the compiler")
elseif(CMAKE_BUILD_TYPE MATCHES MinSizeRel)
message("MinSizeRel - Adds -Os -DNDEBUG")
elseif(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
message("RelWithDebInfo - Adds -O2 -g -DNDEBUG flags")
elseif(CMAKE_BUILD_TYPE MATCHES Debug)
message("Debug - Adds the -g flag")
endif()
endif(NOT CMAKE_BUILD_TYPE)
#MCU
set(MCU_FLAGS "${CPU} ${CPU_ARCH} ${FPU} ${FPU_MEATHOD} ${FLOAT_ABI}")
#C
# -fstack-usage 显示堆栈使用情况;-Wstack-usage=512 当单个函数栈使用超过512字节,编译器发出警告
# -ffunction-sections, -fdata-sections会使compiler为每个function和data item分配独立的section。 --gc-sections会使ld删除没有被使用的section。
# 而对于全局变量来说,如果初始化了不为0的值,那么该全局变量则被保存在data段,如果初始化的值为0,那么将其保存在bss段;
# 如果没有初始化,则将其保存在common段,等到链接时再将其放入到bss段。关于第三点不同编译器行为会不同,有的编译器会把没有初始化的全局变量直接放到bss段
# -fno-common参数,禁止将未初始化的全局变量放入到common段,这样就不会出现存在多个同名全局变量而编译时不报错的情况
# -fmessage-length=0 输出信息会根据控制台的宽度自动换行,防止显示不全信息
set(CMAKE_C_FLAGS "${MCU_FLAGS} -std=gnu99 -Wall -fstack-usage -Wstack-usage=512 -fdata-sections -ffunction-sections -fno-common -fmessage-length=0 ${DBG_FLAGS} " CACHE INTERNAL "C compiler flags")
#CPP
set(CMAKE_CXX_FLAGS "${MCU_FLAGS} -fno-rtti -fno-exceptions -fno-builtin -Wall -fdata-sections -ffunction-sections ${DBG_FLAGS} " CACHE INTERNAL "Cxx compiler flags")
#ASFLAGS
set(CMAKE_ASM_FLAGS "${MCU_FLAGS} -x assembler-with-cpp ${DBG_FLAGS} " CACHE INTERNAL "ASM compiler flags")
#LDFLAGS
# -specs=nosys.specs //使用静态库 libnosys.a -specs=nano.specs //使用静态库 libc_nano.a
# libnosys.a用于串口重定向,libc_nano.a用于降低ram和rom的使用
# --cref :Cross Reference的简写,输出交叉引用表(cross reference table)
# -Wl,option 把选项 option 传递给连接器。如果 option 中含有逗号,就在逗号处分割成多个选项
# --wrap=symbol 允许对标准库中已经定义的函数(假设为symbol)再加一层封装,这样编译器在进行函数调用的解引用的时候,
# 对symbol的解引用会被解析成__wrap_symbol,而如果你要使用真正的标准库里的函数,在调用symbol的时候必须要写成__real_symbol才可以
set(CMAKE_EXE_LINKER_FLAGS "${MCU_FLAGS} -specs=nosys.specs -specs=nano.specs -Wl,--print-memory-usage,-Map=${PROJECT_NAME}.map,--cref -Wl,--gc-sections CACHE INTERNAL "Exe linker flags")
#要链接的库 对应makefile的 LIBS
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-lc -lm -lnosys" CACHE INTERNAL "Shared linker flags")
#宏定义
# add_compile_definitions(${MCU_FAMILY_STD} USE_STDPERIPH_DRIVER ARM_MATH_CM4 __FPU_PRESENT=1)
add_definitions(-D${MCU_FAMILY_STD} -DUSE_STDPERIPH_DRIVER -D__FPU_PRESENT=1 -D__VFP_FP__)
add_definitions(-DARM_MATH_CM4 -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING )
# C includes
set(C_INCLUDES
App
Bsp
Cmsis/Core
Cmsis/Device
Cmsis/lwrb
Cmsis/letter-shell
Cmsis/RTT
Cmsis/cm_backtrace
Cmsis/perf_counter
Cmsis/easylogger/inc
Cmsis/ringbuf
Freertos/include
Freertos/portable/GCC/ARM_CM4F
StdLib/inc
)
include_directories(
${C_INCLUDES}
)
# sources
set(USER_SOURCES
App/main.c
App/gd32f30x_it.c
App/test_cmd.c
)
set(CMSIS_SOURCES
Cmsis/Device/startup_gd32f303.S
Cmsis/Device/system_gd32f30x.c
Cmsis/lwrb/lwrb.c
Cmsis/letter-shell/shell.c
Cmsis/letter-shell/shell_ext.c
Cmsis/RTT/SEGGER_RTT.c
Cmsis/RTT/SEGGER_RTT_printf.c
Cmsis/cm_backtrace/cm_backtrace.c
Cmsis/cm_backtrace/fault_handler/gcc/cmb_fault.S
Cmsis/perf_counter/perf_counter.c
Cmsis/perf_counter/perf_os_patch_freertos.c
Cmsis/perf_counter/systick_wrapper_gcc.s
# Cmsis/easylogger/src/elog_utils.c
# Cmsis/easylogger/src/elog.c
# Cmsis/easylogger/port/elog_port.c
)
aux_source_directory("./Stdlib/src" STDLIB_SOURCES) # 这种方法全部将src目录下源文件全部包含了,如果只需要包含部分源文件,则使用下面的方式
# set(STDLIB_SOURCES
# Stdlib/src/misc.c
# Stdlib/src/stm32f10x_adc.c
# Stdlib/src/stm32f10x_bkp.c
# Stdlib/src/stm32f10x_can.c
# Stdlib/src/stm32f10x_cec.c
# Stdlib/src/stm32f10x_crc.c
# Stdlib/src/stm32f10x_dac.c
# Stdlib/src/stm32f10x_dbgmcu.c
# Stdlib/src/stm32f10x_dma.c
# Stdlib/src/stm32f10x_exti.c
# Stdlib/src/stm32f10x_flash.c
# Stdlib/src/stm32f10x_fsmc.c
# Stdlib/src/stm32f10x_gpio.c
# Stdlib/src/stm32f10x_i2c.c
# Stdlib/src/stm32f10x_iwdg.c
# Stdlib/src/stm32f10x_pwr.c
# Stdlib/src/stm32f10x_rcc.c
# Stdlib/src/stm32f10x_rtc.c
# Stdlib/src/stm32f10x_sdio.c
# Stdlib/src/stm32f10x_spi.c
# Stdlib/src/stm32f10x_tim.c
# Stdlib/src/stm32f10x_usart.c
# Stdlib/src/stm32f10x_wwdg.c
# )
set(FREERTOS_SOURCES
FreeRTOS/portable/GCC/ARM_CM4F/port.c
FreeRTOS/portable/MemMang/heap_4.c
FreeRTOS/croutine.c
FreeRTOS/event_groups.c
FreeRTOS/list.c
FreeRTOS/queue.c
FreeRTOS/stream_buffer.c
FreeRTOS/tasks.c
FreeRTOS/timers.c
)
# 编译可执行文件
#elf
add_executable(${ELF_FILE}
${USER_SOURCES}
${CMSIS_SOURCES}
${STDLIB_SOURCES}
${FREERTOS_SOURCES}
)
# 设置代码分布属性
set_target_properties(${ELF_FILE} PROPERTIES LINK_FLAGS "-T ${LINKER_SCRIPT}") # 设置链接属性,这里可通过不同的链接脚本去生成不同的执行文件(.bin)
#bin
set(BIN_FILE ${PROJECT_NAME}.bin)
add_custom_command(TARGET ${ELF_FILE}
POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${ELF_FILE}> ${BIN_FILE}
COMMENT "Building ${BIN_FILE}")
用来记录此次的GD32的CMakeLists使用
20221104: 更新优化选项的配置
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)