【stm32】cmake脚本(二)

GenericDefinie 通常用于集中管理项目配置 ,避免在多个地方重复定义,在嵌入式开发中非常常见

GenericDefinitions.cmake

这里并没有说明一些库的路径具体什么,因为放到别处定义了。

cpp 复制代码
# 1. CMake行为配置
set(CMAKE_COLOR_MAKEFILE ON)        # 彩色输出
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)   # VSCode智能提示需要,生成 compile_commands.json 文件
set(CMAKE_CXX_STANDARD 14)          # 嵌入式建议用C++14或11
# set(CMAKE_C_STANDARD_REQUIRED ON) # 含义:严格要求使用指定的C标准,如果编译器不支持则报错
# set(CMAKE_C_EXTENSIONS ON)      # 允许编译器扩展,知道就行
# set(CMAKE_C_STANDARD 11)        # 使用C11标准
add_definitions(-D_GLIBCXX_USE_C99=1) # proper to_string definition

set(PROJECT_DIRECTORY ${PROJECT_SOURCE_DIR}/project)
set(PROJECT_SRC_DIR ${PROJECT_DIRECTORY}/src)
set(TOOLS_DIR ${PROJECT_SOURCE_DIR}/tools)
set(UTILS_DIR ${PROJECT_SOURCE_DIR}/project/util)

# set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)

string(TIMESTAMP DATE "%Y-%m-%d")
string(TIMESTAMP TIME "%H:%M:%S")

include(Macros)
# git_id(GIT_STR)

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")  # regular Clang or AppleClang
  set(CLANG TRUE)
endif()

if(CMAKE_HOST_APPLE)
  execute_process(COMMAND xcrun --show-sdk-path
    OUTPUT_VARIABLE SDKROOT
    ERROR_QUIET
    OUTPUT_STRIP_TRAILING_WHITESPACE)

  message("-- SDKROOT: ${SDKROOT}")
  #set(CMAKE_OSX_SYSROOT ${SDKROOT})
  set(SYSROOT_ARG -isysroot ${SDKROOT})
endif()

# options shared by all targets
option(VERBOSE_CMAKELISTS "Show extra information while processing CMakeLists.txt files." OFF)# 显示CMake处理时的额外信息
option(WARNINGS_AS_ERRORS "Treat any compiler warning as an error (adds -Werror flag)." OFF)# 将所有编译器警告视为错误

预配置变量(部分没使用)

cpp 复制代码
# 这些是CMake的内置变量,有特定含义
CMAKE_COLOR_MAKEFILE          # CMake生成Makefile时是否使用颜色
CMAKE_EXPORT_COMPILE_COMMANDS # 是否生成compile_commands.json
CMAKE_CXX_STANDARD           # C++标准版本
CMAKE_CXX_COMPILER_ID        # 编译器类型(GCC/Clang/MSVC)
CMAKE_HOST_APPLE             # 是否在macOS上运行
PROJECT_SOURCE_DIR           # 项目源码目录
PROJECT_BINARY_DIR           # 构建目录
CMAKE_MODULE_PATH           # CMake模块查找路径

# 1. CMake行为配置(保留有用的)

cpp 复制代码
# 1. CMake行为配置
set(CMAKE_COLOR_MAKEFILE ON)                    # 彩色输出
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)           # VSCode智能提示需要,生成 compile_commands.json 文件
set(CMAKE_CXX_STANDARD 14)                      # 嵌入式建议用C++14或11
# set(CMAKE_C_STANDARD_REQUIRED ON)    # 含义:严格要求使用指定的C标准,如果编译器不支持则报错
# set(CMAKE_C_EXTENSIONS ON)        # 允许编译器扩展,知道就行
# set(CMAKE_C_STANDARD 11)    # 使用C11标准

CMAKE_COLOR_MAKEFILE设置在make编译的时候输出的控制台调试信息会有彩色显示,尤其是报错更明显。

CMAKE_EXPORT_COMPILE_COMMANDS 会在编译后再build文件夹(一般在这里放编译文件)产生compile_commands文件,记录了源文件的库文件路径,专门给编译器看的。使用方法如下:

歌词请忽略,在c_cpp_properties.json 文件里配置项添加compileCoommands项目 指明compile_commands 文件位置,这样就不用刻意去告诉vscode文件在哪里,他自己会查。这个只是方便vscode查看代码,编译还是用cmake,不用vscode编译,因此其他选项不用管。

使用C++和C的版本就14和11就可以了。

CMA_CXX_EXTENSIONS 也是编译器扩展,默认也是开的。

CMAKE_C_EXTENSIONS 编译器扩展一定要开,不用也要开,说不定有些库要使用。默认也是开启的。

cpp 复制代码
add_definitions(-D_GLIBCXX_USE_C99=1) # proper to_string definition

专门解决GNU C++标准库中C99函数支持问题的,就是to_string的一系列使用。

复制代码
std::to_string(123);      // 整数转字符串 

使用了to_string但是没开启编译会成功,但是链接阶段会出问题,固件不会生成。

2.路径包含(个人的)

cpp 复制代码
set(PROJECT_DIRECTORY ${PROJECT_SOURCE_DIR}/project)
set(PROJECT_SRC_DIR ${PROJECT_DIRECTORY}/src)
set(TOOLS_DIR ${PROJECT_SOURCE_DIR}/tools)
set(UTILS_DIR ${PROJECT_SOURCE_DIR}/project/util)

# set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)

配置变量

  • CMAKE_LIBRARY_OUTPUT_DIRECTORY: 控制共享库(.so/.dll)和静态库(.a/.lib)的输出位置
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY: 控制可执行文件(.exe/无后缀)的输出位置
  • CMAKE_MODULE_PATH # CMake模块查找路径这个

前两个不需要,交叉编译stm32只要固件,如果你交叉编译龙芯板卡的可执行文件和共享库和静态库可以使用这个。如果你的项目里不只是编译stm32还有自己做的上位机就知道了。

###Util 通常用于表示一组通用的、与业务逻辑无关的工具函数或类###可以放python脚本处理预处理的数据作为库。

3.获取时间戳(特殊功能)

cpp 复制代码
string(TIMESTAMP DATE "%Y-%m-%d")
string(TIMESTAMP TIME "%H:%M:%S")

TIMESTAMP是 CMake 的一个内置命令。 这里获取时间可以在C代码使用每次自动更新时间**。**

__DATE____TIME__ 是C/C++编译器的内置预处理器宏 ,用于在编译时自动嵌入日期和时间信息。这两个可以直接使用比如:

复制代码
printf("固件编译时间: %s %s\n", __DATE__, __TIME__);
cpp 复制代码
# 或在C代码中使用
configure_file(
    "version.h.in"
    "version.h"
)#作用把version.h.in中的@DATE@和@TIME@转换,生成文件version.h
cpp 复制代码
c
// version.h.in - 模板文件
#ifndef VERSION_H
#define VERSION_H

#define FW_BUILD_DATE "@DATE@"
#define FW_BUILD_TIME "@TIME@"

#endif

4.假如是macos系统

cpp 复制代码
if(CMAKE_HOST_APPLE)
  execute_process(COMMAND xcrun --show-sdk-path
    OUTPUT_VARIABLE SDKROOT
    ERROR_QUIET
    OUTPUT_STRIP_TRAILING_WHITESPACE)

  message("-- SDKROOT: ${SDKROOT}")
  #set(CMAKE_OSX_SYSROOT ${SDKROOT})
  set(SYSROOT_ARG -isysroot ${SDKROOT})
endif()

简单说就是Linux本来是/usr/bin,但是macos不是,假如要用这里的修改一下,反正不要留着也行。

5.包含cmake使用的函数模块文件

cpp 复制代码
include(Macros)    #cmake中专门用于存放自定义函数和CMake宏
# git_id(GIT_STR)

Macros.cmake(或类似命名的CMake宏/函数文件)在复杂的CMake项目中非常常见,它是一种组织代码和实现复用的最佳实践。这里git_id就是类似的。

macro就是宏的意思。

6.用户自定义的配置选项(取决于你的选择了)

cpp 复制代码
# options shared by all targets
option(VERBOSE_CMAKELISTS "Show extra information while processing CMakeLists.txt files." OFF)# 显示CMake处理时的额外信息
option(WARNINGS_AS_ERRORS "Treat any compiler warning as an error (adds -Werror flag)." OFF)# 将所有编译器警告视为错误

这个写了要调整到这里就可以,可以在主CMakeLists中用if。

相关推荐
智者知已应修善业几秒前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
dashizhi20152 分钟前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
我是一棵无人问荆的小草31 分钟前
单片机通电后延迟启动策略
单片机·嵌入式硬件
坏柠1 小时前
ESP32-S3 蓝牙 BLE 从零到一:广播、服务、特征,用一个智能灯的例子全讲透
嵌入式硬件
日更嵌入式的打工仔1 小时前
UART RX为什么要上拉
单片机
三佛科技-187366133974 小时前
FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
stm32·单片机·嵌入式硬件
LCMICRO-133108477465 小时前
长芯微LDC90810完全P2P替代ADC128D818,是一款八通道系统监控器,专为监控复杂系统状态而设计。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换芯片adc
嵌入式老菜鸟qq1252427735 小时前
关于S2-LP休眠
单片机·嵌入式硬件·mcu·射频工程
SUNNYSPY0015 小时前
65R310-ASEMI超结MOS管TO-252封装
单片机
somi75 小时前
ARM-01-硬件基础
arm开发·嵌入式硬件