【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。

相关推荐
LS_learner19 小时前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
来自晴朗的明天20 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT20 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠20 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
代码游侠1 天前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg20051 天前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT1 天前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen1 天前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠2 天前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件