CMakeToolchain: 使用 Conan 生成的预设文件扩展你的 CMakePresets 文件¶
在此示例中,我们将了解如何扩展你自己的 CMakePresets 文件,使其包含 Conan 生成的预设文件。
注意
此示例中使用 CMake 预设。这需要 CMake >= 3.23,因为从 CMakeUserPresets.json
到 CMakePresets.json
的 “include” 功能仅在该版本之后才支持。如果你不想使用预设功能,可以使用类似以下的方法:
cmake <path> -G <CMake generator> -DCMAKE_TOOLCHAIN_FILE=<path to
conan_toolchain.cmake> -DCMAKE_BUILD_TYPE=Release
如果你无法使用预设功能,Conan 会在你每次运行 conan install
时显示准确的 CMake 命令。
首先,请克隆源码以重现此项目。你可以在 GitHub 上的 examples2 仓库中找到它们
$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/examples/tools/cmake/cmake_toolchain/extend_own_cmake_presets
请打开 conanfile.py 并查看它是如何设置 tc.user_presets_path = 'ConanPresets.json'
的。通过修改 CMakeToolchain 的此属性,你可以更改生成的预设文件的默认文件名。
def generate(self):
tc = CMakeToolchain(self)
tc.user_presets_path = 'ConanPresets.json'
tc.generate()
...
现在你可以提供自己的 CMakePresets.json
文件,以及 CMakeLists.txt
文件
CMakePresets.json¶
{
"version": 4,
"include": ["./ConanPresets.json"],
"configurePresets": [
{
"name": "default",
"displayName": "multi config",
"inherits": "conan-default"
},
{
"name": "release",
"displayName": "release single config",
"inherits": "conan-release"
},
{
"name": "debug",
"displayName": "debug single config",
"inherits": "conan-debug"
}
],
"buildPresets": [
{
"name": "multi-release",
"configurePreset": "default",
"configuration": "Release",
"inherits": "conan-release"
},
{
"name": "multi-debug",
"configurePreset": "default",
"configuration": "Debug",
"inherits": "conan-debug"
},
{
"name": "release",
"configurePreset": "release",
"configuration": "Release",
"inherits": "conan-release"
},
{
"name": "debug",
"configurePreset": "debug",
"configuration": "Debug",
"inherits": "conan-debug"
}
]
}
请注意 "include": ["./ConanPresets.json"],
以及每个预设如何 继承
Conan 生成的预设。
现在我们可以针对 Release 和 Debug (如果需要,也可以借助 build_folder_vars
进行其他配置) 进行安装
$ conan install .
$ conan install . -s build_type=Debug
并使用 我们自己的预设(这些预设扩展了 Conan 生成的预设)构建和运行我们的应用程序
# Linux (single-config, 2 configure, 2 builds)
$ cmake --preset debug
$ cmake --build --preset debug
$ ./build/Debug/foo
> Hello World Debug!
$ cmake --preset release
$ cmake --build --preset release
$ ./build/Release/foo
> Hello World Release!
# Windows VS (Multi-config, 1 configure 2 builds)
$ cmake --preset default
$ cmake --build --preset multi-debug
$ build\\Debug\\foo
> Hello World Debug!
$ cmake --build --preset multi-release
$ build\\Release\\foo
> Hello World Release!