CMakeToolchain:使用 Conan 生成的配置扩展你的 CMakePresets

在这个例子中,我们将看到如何扩展你自己的 CMakePresets 来包含 Conan 生成的配置。

注意

我们在这个例子中使用 CMake 预设。这需要 CMake >= 3.23,因为从 CMakeUserPresets.jsonCMakePresets.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()
    ...

现在,除了 CMakeLists.txt 之外,你还可以提供你自己的 CMakePresets.json

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"], 以及每个预设都 inherits 了 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!