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_INCLUDESAppBspCmsis/CoreCmsis/DeviceCmsis/lwrbCmsis/letter-shellCmsis/RTTCmsis/cm_backtraceCmsis/perf_counterCmsis/easylogger/incCmsis/ringbufFreertos/includeFreertos/portable/GCC/ARM_CM4FStdLib/inc
)
include_directories(${C_INCLUDES}
)# sources
set(USER_SOURCESApp/main.cApp/gd32f30x_it.cApp/test_cmd.c
)
set(CMSIS_SOURCESCmsis/Device/startup_gd32f303.SCmsis/Device/system_gd32f30x.cCmsis/lwrb/lwrb.cCmsis/letter-shell/shell.cCmsis/letter-shell/shell_ext.cCmsis/RTT/SEGGER_RTT.cCmsis/RTT/SEGGER_RTT_printf.cCmsis/cm_backtrace/cm_backtrace.cCmsis/cm_backtrace/fault_handler/gcc/cmb_fault.SCmsis/perf_counter/perf_counter.cCmsis/perf_counter/perf_os_patch_freertos.cCmsis/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_SOURCESFreeRTOS/portable/GCC/ARM_CM4F/port.cFreeRTOS/portable/MemMang/heap_4.cFreeRTOS/croutine.cFreeRTOS/event_groups.cFreeRTOS/list.cFreeRTOS/queue.cFreeRTOS/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_BUILDCOMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${ELF_FILE}> ${BIN_FILE}COMMENT "Building ${BIN_FILE}")

用来记录此次的GD32的CMakeLists使用

20221104: 更新优化选项的配置

关于GD32的CMakeLists以及gcc部分编译选项的解释相关推荐

  1. linux gcc常用编译选项总结

    对于编译源码,Makefile中会用到大量的gcc选项,所以熟悉gcc编译选项对于学习Makefile至关重要. -c:只激活预处理,编译,和汇编,也就生成obj文件 -S:只激活预处理和编译,就是指 ...

  2. gcc的编译选项总结

    目录 前言 1 常用的编译选项 2 其他编译选项 2.1 -x language 2.2 -fno-xxx 2.3 -fxxx 2.4 -Wxxx 2.5 -Wno-xxx 2.6 给链接器使用的选项 ...

  3. gcc -strip编译选项的作用

    从字面上来看strip的意思是脱衣服.拆卸,那么gcc --strip的作用大概能猜错来了. 没错就是有选择地除去行号信息.重定位信息.调试段.typchk 段.注释段.文件头以及所有或部分符号表. ...

  4. 【工程项目经验】查看gcc arch编译选项

    gcc --target-help gcc -Q --help=target 参考网址:https://stackoverflow.com/questions/5470257/how-to-see-w ...

  5. gcc常用编译选项汇总

    -Wall 使用它能够使GCC产生尽可能多的警告信息 -Werror 它要求GCC将所有的警告当成错误进行处理 -g 和 -ggdb 他们都是令 gcc 生成调试信息,但是它们也是有区别的      ...

  6. gcc常用编译选项及相关知识

    Linux   gcc编译常用编译命令 谢凡凡 2010-10-28  于西安高新区冉科公司 gcc命令格式:gcc [options][filename] -x language        指定 ...

  7. 关于 gcc/g++编译选项: -fPIC 功能的解释

    原文地址: https://my.oschina.net/yepanl/blog/2222613 看到了一片讲解-fPic选项的文章,讲的还是比较清楚. 在理解PIC概念之前,先了解一下动态链接库的载 ...

  8. GCC 参数列举及解释

    GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分. gcc 与 g++ 分 ...

  9. GCC 命令行具体解释

    作者: www.linuxfans.org mozilla 1.gcc包括的c/c++编译器 gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的.(没有看太明确前面这半句是什 ...

最新文章

  1. hibernate插入Mysql数据库出现中文乱码情况从这5个方面解决
  2. python修改父类属性_Python super和设置父类属性
  3. Linux 之二 Linux 多线程
  4. epoll机制:epoll_create、epoll_ctl、epoll_wait、close
  5. 深入了解tcmalloc(一):windows环境下无缝拦截技术初探
  6. 第 7 章 排序算法
  7. python字典按照value进行排序
  8. 定制自己的Unity场景编辑工具界面(一)
  9. Adobe Illustrator CS3
  10. Excel表格样式CellStyle的DataFormat可选值
  11. VIN码识别/车架号识别独家支持云识别
  12. 关于datetimepicker 鼠标滚动调节日期变化遇到的问题
  13. Java中文件File相关知识
  14. python等待执行完毕 再继续执行_Python等待操作完成后再继续
  15. Rockchip RK3588 kernel dts解析之MMC
  16. C语言源代码系列-管理系统之电子英汉词典
  17. 中科院、MIT等5大专家解读黑瞳:金融业幕后的新一代反欺诈卫士
  18. 【DASH】MPD例子
  19. hdoj 开门人和关门人
  20. taobao.top.oaid.client.decrypt( 端侧OAID解密 )

热门文章

  1. 实战Kubernetes动态卷存储(NFS)
  2. edge插件默认下载位置
  3. 上海11.15特大火灾唱响生命绝唱
  4. 如何在Linux系统中整理磁盘碎片 节省空间
  5. github上有什么好的node.js的项目?
  6. linux sort -k
  7. 小心C++的自动类型转换陷阱
  8. 探寻Cat.1和NB-IoT的发展方向
  9. 2022最新<浙江>教师资格证报考条件
  10. 高通导航器软件开发包使用指南(13)