threeal/CheckWarning.cmake
GitHub: threeal/CheckWarning.cmake
该模块为 CMake 项目提供跨编译器的编译器警告自动检查与配置功能。
Stars: 3 | Forks: 0
# CheckWarning.cmake
在 [CMake](https://cmake.org) 项目中检查编译器警告。
该模块使得在 CMake 项目中检查编译器警告变得非常容易。默认情况下,它会在不同编译器的目标上启用所有推荐的警告标志,从而避免用户手动指定需要启用的警告标志。
该模块提供了两个实用函数来检查编译器警告:
- [`target_check_warning`](#target_check_warning):用于检查单个目标上的编译器警告。
- [`add_check_warning`](#add_check_warning):用于检查当前目录下所有目标上的编译器警告。
这些函数会在目标上启用所有推荐的警告标志,并可选择将警告视为错误。
## 主要特性
- 支持在 [MSVC](https://visualstudio.microsoft.com/vs/features/cplusplus/)、[GNU](https://gcc.gnu.org/) 和 [Clang](https://clang.llvm.org/) 编译器上检查警告。
- 可选择将警告视为错误。
- 语法简单,易于集成。
## 使用指南
### 模块集成
将该模块集成到项目中的推荐方法是,在项目配置阶段使用 [`file(DOWNLOAD)`](https://cmake.org/cmake/help/v3.21/command/file.html#download) 函数下载它:
```
file(
DOWNLOAD https://github.com/threeal/CheckWarning.cmake/releases/download/v3.2.0/CheckWarning.cmake
${CMAKE_BINARY_DIR}/cmake/CheckWarning.cmake
EXPECTED_MD5 8f9c3170e816ba99a3ddc6848a8456f0)
include(${CMAKE_BINARY_DIR}/cmake/CheckWarning.cmake)
```
### 检查目标上的警告
使用 [`target_check_warning`](#target_check_warning) 函数检查单个目标上的编译器警告。
```
add_executable(main main.cpp)
target_check_warning(main)
```
如果指定了 `TREAT_WARNINGS_AS_ERRORS` 选项,它会将该目标的所有警告视为错误。这会导致触发警告时构建过程失败。
```
target_check_warning(main TREAT_WARNINGS_AS_ERRORS)
```
此外,也可以使用 [`add_check_warning`](#add_check_warning) 函数检查当前目录下所有目标上的编译器警告。
```
add_check_warning(TREAT_WARNINGS_AS_ERRORS)
add_library(lib lib.cpp)
add_executable(main main.cpp)
```
### 获取警告标志
要在不将警告标志添加到目标的情况下检索它们,请使用 [`get_warning_flags`](#get_warning_flags) 函数。
```
get_warning_flags(FLAGS)
message("Warning flags: ${FLAGS}")
```
使用 `TREAT_WARNINGS_AS_ERRORS` 选项可同时包含将警告视为错误的标志。
```
get_warning_flags(FLAGS TREAT_WARNINGS_AS_ERRORS)
```
## API 参考
### `CHECK_WARNING_VERSION`
此变量包含所包含的 [`CheckWarning.cmake`](./cmake/CheckWarning.cmake) 模块的版本。
### `get_warning_flags`
根据当前编译器检索警告标志。
```
get_warning_flags( [TREAT_WARNINGS_AS_ERRORS])
```
此函数检索当前编译器的警告标志,并将它们保存到变量 `` 中。它使用 [`CMAKE_CXX_COMPILER_ID`](https://cmake.org/cmake/help/v3.21/variable/CMAKE_LANG_COMPILER_ID.html) 变量确定编译器,并检索相应的警告标志,如下表所示:
| 编译器 | 警告标志 |
| ------------ | -------------------------- |
| MSVC | `/permissive- /W4 /EHsc` |
| GNU 或 Clang | `-Wall -Wextra -Wpedantic` |
如果指定了 `TREAT_WARNINGS_AS_ERRORS` 选项,它会附加将警告视为错误的标志,如下表所示:
| 编译器 | 标志 |
| ------------ | --------- |
| MSVC | `/WX` |
| GNU 或 Clang | `-Werror` |
如果编译器正在模拟其他编译器(通过判断 [`CMAKE_CXX_SIMULATE_ID`](https://cmake.org/cmake/help/v3.21/variable/CMAKE_LANG_SIMULATE_ID.html) 变量是否存在来确定),它将使用该变量来确定警告标志。
对于上表中未列出的编译器,此函数将触发致命错误,指示该编译器不受支持。
### `target_check_warning`
在特定目标上启用警告检查。
```
target_check_warning( [TREAT_WARNINGS_AS_ERRORS])
```
此函数通过将 [`get_warning_flags`](#get_warning_flags) 函数获取的警告标志附加到该目标的编译选项中,从而在 `` 上启用警告检查。这等效于在该目标上使用警告标志调用 [`target_compile_options`](https://cmake.org/cmake/help/v3.21/command/target_compile_options.html) 命令。
如果指定了 `TREAT_WARNINGS_AS_ERRORS` 选项,它还会附加将警告视为错误的标志。
### `add_check_warning`
在当前目录下的所有目标上启用警告检查。
```
add_check_warning([TREAT_WARNINGS_AS_ERRORS])
```
此函数通过将 [`get_warning_flags`](#get_warning_flags) 函数获取的警告标志附加到默认编译选项中,从而在当前目录下的所有目标上启用警告检查。这等效于使用警告标志调用 [`add_compile_options`](https://cmake.org/cmake/help/v3.21/command/add_compile_options.html) 命令。
如果指定了 `TREAT_WARNINGS_AS_ERRORS` 选项,它还会附加将警告视为错误的标志。
## 许可证
本项目根据 [MIT License](./LICENSE) 的条款授权。
版权所有 © 2023-2026 [Alfi Maulana](https://github.com/threeal)
标签:Bash脚本, C/C++, CMake, 事务性I/O, 静态检查