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。