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, 静态检查