2

我有一个CMakePresets.json利用继承和宏扩展的文件。这是一段摘录,实际上我使用了多个版本的“Foo”:

{
 "configurePresets": [
        {
            "name": "default",
            "hidden": true,
            "generator": "Unix Makefiles",
            "binaryDir": "cmake-build-${presetName}",
            "environment": {
                "PATH":  "/opt/foo/$env{FOO_VERSION}/bin:$penv{PATH}",
                "LD_LIBRARY_PATH": "/opt/foo/$env{FOO_VERSION}.0/lib"
            },
            "cacheVariables": {
                "FOO_VERSION": "$env{FOO_VERSION}",
            }
        },
        {
            "name": "debug-foo1",
            "inherits": "default",
            "environment": { "FOO_VERSION": "1" }
        },
        {
            "name": "release-foo1",
            "inherits": "debug-foo1",
            "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" }
        }
    ],
    "buildPresets": [
        {
            "name": "debug-foo1",
            "configurePreset": "debug-foo1"
        },
        {
            "name": "release-foo1",
            "configurePreset": "release-foo1"
        }
    ]
}

现在假设我选择了预设release-foo1。这将呈现以下变量,其中包括:

  • binaryDir = "cmake-build-release-foo1"
  • FOO_VERSION = "1"
  • LD_LIBRARY_PATH = "/opt/foo/1.0/lib"

有没有办法查询给定预设的这些结果?例如,给定release-foo1,我想知道结果binaryDir

当然,我可以自己解析 JSON,但这似乎很乏味,尤其是因为 CMake 正在进行交叉引用和替换。

4

1 回答 1

1

您可以使用该-N标志打印计算的预设信息,而无需运行配置或生成步骤。在修改您问题中的预设文件以使其正常工作后,我在它旁边创建了一个***的 CMakeLists.txt 并运行了这个测试(代表我的PATH):

$ cmake --preset=release-foo1 -N
Preset CMake variables:

  CMAKE_BUILD_TYPE="Release"
  FOO_VERSION="1"

Preset environment variables:

  FOO_VERSION="1"
  LD_LIBRARY_PATH="/opt/foo/1.0/lib"
  PATH="/opt/foo/1/bin:***"

这足以调试您的预设。如果您需要更进一步,您可以使用标准的 unix 命令行工具处理输出,例如awk, grep,cut等。

我认为这是您目前能做的最好的事情(CMake <=3.21),因为命令行文档IDE 的文件 API 中没有我能找到的其他内容。

于 2021-08-04T20:30:28.503 回答