我有一个包含 C 和 C++ 文件的 CMake 项目,并且设置了 CI。在 CI 中,我想使用一些附加标志来构建我的项目,以使编译器更加严格,特别是-Wall -Wextra -Werror -pedantic.
为了配置该项目,我目前正在重复执行以下操作:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Wall -Wextra -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -pedantic"
Run Code Online (Sandbox Code Playgroud)
由于我不希望将这些标志嵌入到 CMakeLists 文件中(因为这种严格性只在 CI 中需要),因此我在 CI 中的配置命令上设置标志。
有没有办法以不需要重复标志的方式重写此命令?
注意:CMAKE_CPP_FLAGS不起作用。
这正是CMake 预设的发明用途。请不要在您的构建中进行硬编码。对于可能不使用与您完全相同的编译器的最终用户来说,这是一种责任。我在一个相关问题上写了另一个答案,内容更详细。-Werror
这是一个例子CMakePresets.json:
{
"version": 4,
"cmakeMinimumRequired": {
"major": 3,
"minor": 23,
"patch": 0
},
"configurePresets": [
{
"name": "ci-gcc",
"displayName": "CI with GCC",
"description": "CI build with GCC-compatible compiler",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_C_FLAGS": "-Wall -Wextra -Werror -pedantic",
"CMAKE_CXX_FLAGS": "-Wall -Wextra -Werror -pedantic"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
然后只需将 CI 配置为cmake --preset ci-gcc && cmake --build build从源目录构建即可。
从 CMake 3.24+ 开始,-Werror即使在预设中,您也应该避免按字面书写,而更喜欢将缓存变量设置CMAKE_COMPILE_WARNING_AS_ERROR在ON预设内。