合并和/或覆盖 CMakePresets.json 中不同配置预设的标志

Via*_*rus 3 c++ cmake cmake-presets

我的 CMakePresets.json 中有两个配置预设,我想将继承 configurePresets (gcc) 的标志与另一个预设 (gcc-arm-embedded) 合并

这是一个简化版本:

  "configurePresets": [
    {
      "name": "gcc",
      "hidden": true,
      "cacheVariables": {
        "CMAKE_CXX_FLAGS": "-Wall -Wextra",
        "CMAKE_BUILD_TYPE": "Release"
      }
    },
    {
      "name": "gcc-arm-embedded",
      "hidden": true,
      "inherits": ["gcc"],
      "cacheVariables": {
        "CMAKE_CXX_FLAGS": "-ffunction-sections -fdata-sections",
        "CMAKE_EXE_LINKER_FLAGS": "-mcpu=cortex-m7 -mthumb",
        "CMAKE_BUILD_TYPE": "MinSizeRel"
      }
    },
    {
      "name": "embedded",
      "inherits": ["gcc", "gcc-arm-embedded"]
    }
  ]
Run Code Online (Sandbox Code Playgroud)

问题是,如果我使用预设,embedded生成的 CMAKE 标志为:

CMAKE_CXX_FLAGS: "-Wall -Wextra"
CMAKE_EXE_LINKER_FLAGS: "-mcpu=cortex-m7 -mthumb",
CMAKE_BUILD_TYPE: "Release"
Run Code Online (Sandbox Code Playgroud)

我的目标是这样的:

CMAKE_CXX_FLAGS: "-Wall -Wextra -ffunction-sections -fdata-sections"
CMAKE_EXE_LINKER_FLAGS: "-mcpu=cortex-m7 -mthumb",
CMAKE_BUILD_TYPE: "MinSizeRel"
Run Code Online (Sandbox Code Playgroud)

这可以通过 CMakePresets 实现吗?

Ale*_*ing 7

首先,将inherits输入简化为:

"inherits": ["gcc-arm-embedded"]
Run Code Online (Sandbox Code Playgroud)

解析顺序从左到右工作,从不覆盖,但由于已经gcc-arm-embedded继承gcc,因此无需同时指定两者。所以这会让你看到这个:

CMAKE_CXX_FLAGS: "-ffunction-sections -fdata-sections"
CMAKE_EXE_LINKER_FLAGS: "-mcpu=cortex-m7 -mthumb",
CMAKE_BUILD_TYPE: "MinSizeRel"
Run Code Online (Sandbox Code Playgroud)

现在让我们添加一个基本预设:

    {
      "name": "base",
      "hidden": true,
      "cacheVariables": {
        "CMAKE_CXX_FLAGS": "$env{CXX_WARNINGS} $env{CXX_OPT}",
        "CMAKE_BUILD_TYPE": "Release"
      }
    },
Run Code Online (Sandbox Code Playgroud)

然后gcc继承base并删除该cacheVariables部分。相反,设置:

      "environment": {
        "CXX_WARNINGS": "-Wall -pedantic"
      }
Run Code Online (Sandbox Code Playgroud)

gcc-arm-embedded附加设置:

      "environment": {
        "CXX_OPT": "-ffunction-sections -fdata-sections"
      }
Run Code Online (Sandbox Code Playgroud)

最终结果是这样的:

{
  "version": 3,
  "cmakeMinimumRequired": {
    "major": 3,
    "minor": 21,
    "patch": 0
  },
  "configurePresets": [
    {
      "name": "base",
      "hidden": true,
      "cacheVariables": {
        "CMAKE_CXX_FLAGS": "$env{CXX_WARNINGS} $env{CXX_OPT}",
        "CMAKE_BUILD_TYPE": "Release"
      }
    },
    {
      "name": "gcc",
      "inherits": ["base"],
      "hidden": true,
      "environment": {
        "CXX_WARNINGS": "-Wall -pedantic"
      }
    },
    {
      "name": "gcc-arm-embedded",
      "hidden": true,
      "inherits": ["gcc"],
      "cacheVariables": {
        "CMAKE_EXE_LINKER_FLAGS": "-mcpu=cortex-m7 -mthumb",
        "CMAKE_BUILD_TYPE": "MinSizeRel"
      },
      "environment": {
        "CXX_OPT": "-ffunction-sections -fdata-sections"
      }
    },
    {
      "name": "embedded",
      "inherits": ["gcc-arm-embedded"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)