有没有办法从 CMake 中提取渲染的预设信息?

and*_*eee 5 build cmake preset

我有一个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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在假设我选择预设release-foo1。这将呈现以下变量等:

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

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

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

Ale*_*ing 3

您可以使用该-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:***"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗨亚历克斯,谢谢你的回答。我知道“-N”,但我想避免解析一些人类可读的输出,这些输出将来也可能会发生变化。但更糟糕的是,似乎只打印了计算的缓存和环境,因此我仍然无法访问“binaryDir”。不管怎样,+1 指向我 CMake 文件 API,我完全不知道它,它看起来对我的工作非常有帮助。 (3认同)