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

2023-05-16

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(使用前将#替换为@)

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

随机推荐

  • C++ Qt智能指针使用教程

    C Qt智能指针使用教程 contents 一 QSharedPointer用法 二 QWeakPointer 三 QScopedPointer 四 QPointer 五 Qt智能指针需要注意的坑 Qt提供了类似C 11智能指针的实现 用于
  • 编程题:有两个字符串str1和str2,写一个函数实现在str1中查找str2的初始位置,要求不区分大小写

    编程题 xff1a 有两个字符串str1和str2 xff0c 写一个函数实现在str1中查找str2的初始位置 xff0c 要求不区分大小写 思路 xff1a 1 xff1a 首先判断两个字符串的大小 xff0c 作初步比较 2 xff1
  • vscode对C++程序进行调试

    调试helloworld 先建立一个文件夹然后在文件夹 xff0c 创建一个test cpp 写下一下内容 span class token macro property span class token directive hash sp
  • C++模拟go defer

    go defer介绍 在Go语言中 defer语句用于在函数返回之前执行一些代码 这对于释放资源或记录函数执行时间非常有用 当函数中有多个defer语句时 它们将按照后进先出 LIFO 的顺序执行 以下是一个简单的示例 演示了如何使用def
  • C++设计模式13:责任链模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式7:桥接模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式8:组合模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式11:享元模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式15:解释器模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式16:迭代器模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式21:策略模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式18:备忘录模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式20:状态模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • stm32直流电机驱动与测速

    stm32直流电机驱动与测速 说实话就现在的市场应用中stm32已经占到了绝对住到的地位 xff0c 51已经成为过去式 xff0c 32的功能更加强大 xff0c 虽然相应的难度有所增加 xff0c 但是依然阻止不了大家学习32的脚步 x
  • C++设计模式22:模板方法模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++ 设计模式23:访问者模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式17:中介者模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • C++设计模式14:命令模式

    C 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式 第9式 装饰器模式
  • GPS 和 RTK 定位

    refers xff1a https blog csdn net u012241570 article details 80802675 GPS定位的基本原理 测量出已知位置的卫星到地面GPS接收器之间的距离 xff0c 然后接收器通过与至
  • 关于GD32的CMakeLists以及gcc部分编译选项的解释

    set CMAKE SYSTEM NAME Generic cmake最低版本 cmake minimum required VERSION 3 0 0 工程名称 语言 project TEST PRJ NAME LANGUAGES C C