将 CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS 设置为同一件事而不重复自己?

Ber*_*ard 3 c c++ cmake

我有一个包含 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不起作用。

Ale*_*ing 6

这正是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_ERRORON预设内。