使用构建工具作为 Conan 包

在前面的示例中,我们构建了我们的 CMake 项目,并使用 Conan 安装并定位了 **Zlib** 库。我们使用系统中已安装的 CMake 来构建我们的压缩器二进制文件。但是,如果您想使用与系统范围安装的版本不同的特定 CMake 版本构建您的项目会发生什么情况?Conan 还可以帮助您安装这些工具并使用它们来编译消费者项目或其他 Conan 包。在这种情况下,您可以使用名为 tool_requires 的需求类型在 Conan 中声明此依赖项。让我们来看一个如何向我们的项目添加 tool_requires 并使用不同的 CMake 版本构建它的示例。

请先克隆源代码以重新创建此项目。您可以在 GitHub 上的 examples2 存储库 中找到它们。

$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/tutorial/consuming_packages/tool_requires

项目的结构与上一个示例相同。

.
├── conanfile.txt
├── CMakeLists.txt
└── src
    └── main.c

主要区别在于在 conanfile.txt 文件中添加了 [tool_requires] 部分。在此部分中,我们声明我们希望使用 CMake **v3.22.6** 构建我们的应用程序。

conanfile.txt
[requires]
zlib/1.2.11

[tool_requires]
cmake/3.22.6

[generators]
CMakeDeps
CMakeToolchain

重要

请注意,此 conanfile.txt 将分别安装 zlib/1.2.11cmake/3.22.6。但是,如果 Conan 在 Conan Center 中找不到 Zlib 的二进制文件并且需要从源代码构建,则您的系统中必须已经存在 CMake 安装,因为在您的 conanfile.txt 中声明的 cmake/3.22.6 仅适用于您的当前项目,而不适用于所有依赖项。如果您想使用该 cmake/3.22.6 也在安装时(如果需要)构建 Zlib,则可以将 [tool_requires] 部分添加到您正在使用的配置文件中。有关更多信息,请查看 配置文件文档

我们还在 CMakeLists.txt 中添加了一条消息以输出 CMake 版本。

CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(compressor C)

find_package(ZLIB REQUIRED)

message("Building with CMake version: ${CMAKE_VERSION}")

add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

现在,与前面的示例一样,我们将使用 Conan 安装 **Zlib** 和 **CMake 3.22.6** 并生成查找它们的文件。我们将生成这些文件到 build 文件夹中。为此,只需运行

$ conan install . --output-folder=build --build=missing

注意

Powershell 用户需要在前面的命令中添加 --conf=tools.env.virtualenv:powershell=True 以生成 .ps1 文件而不是 .bat 文件。为了避免每次都需要添加此行,我们建议在您的配置文件的 [conf] 部分中对其进行配置。有关详细信息,请参阅 配置文件部分

您可以检查输出

-------- Computing dependency graph ----------
cmake/3.22.6: Not found in local cache, looking in remotes...
cmake/3.22.6: Checking remote: conancenter
cmake/3.22.6: Trying with 'conancenter'...
Downloading conanmanifest.txt
Downloading conanfile.py
cmake/3.22.6: Downloaded recipe revision 3e3d8f3a848b2a60afafbe7a0955085a
Graph root
    conanfile.txt: /Users/user/Documents/developer/conan/examples2/tutorial/consuming_packages/tool_requires/conanfile.txt
Requirements
    zlib/1.2.11#f1fadf0d3b196dc0332750354ad8ab7b - Cache
Build requirements
    cmake/3.22.6#3e3d8f3a848b2a60afafbe7a0955085a - Downloaded (conancenter)

-------- Computing necessary packages ----------
Requirements
    zlib/1.2.11#f1fadf0d3b196dc0332750354ad8ab7b:2a823fda5c9d8b4f682cb27c30caf4124c5726c8#48bc7191ec1ee467f1e951033d7d41b2 - Cache
Build requirements
    cmake/3.22.6#3e3d8f3a848b2a60afafbe7a0955085a:f2f48d9745706caf77ea883a5855538256e7f2d4#6c519070f013da19afd56b52c465b596 - Download (conancenter)

-------- Installing packages ----------

Installing (downloading, building) binaries...
cmake/3.22.6: Retrieving package f2f48d9745706caf77ea883a5855538256e7f2d4 from remote 'conancenter'
Downloading conanmanifest.txt
Downloading conaninfo.txt
Downloading conan_package.tgz
Decompressing conan_package.tgz
cmake/3.22.6: Package installed f2f48d9745706caf77ea883a5855538256e7f2d4
cmake/3.22.6: Downloaded package revision 6c519070f013da19afd56b52c465b596
zlib/1.2.11: Already installed!

-------- Finalizing install (deploy, generators) ----------
conanfile.txt: Generator 'CMakeToolchain' calling 'generate()'
conanfile.txt: Generator 'CMakeDeps' calling 'generate()'
conanfile.txt: Generating aggregated env files

现在,如果您检查文件夹,您会看到 Conan 生成了一个名为 conanbuild.sh/bat 的新文件。这是当我们在 conanfile.txt 中声明 tool_requires 时自动调用 VirtualBuildEnv 生成器的结果。此文件设置了一些环境变量,例如一个新的 PATH,我们可以使用它将 CMake v3.22.6 的位置注入到我们的环境中。

激活虚拟环境,并运行 cmake --version 以检查您是否已在路径中安装了新的 CMake 版本。

Windows
$ cd build
$ conanbuild.bat
# conanbuild.ps1 if using Powershell
Linux、macOS
$ cd build
$ source conanbuild.sh
Capturing current environment in deactivate_conanbuildenv-release-x86_64.sh
Configuring environment variables

运行 cmake 并检查版本

$ cmake --version
cmake version 3.22.6
...

如您所见,激活环境后,CMake v3.22.6 二进制文件文件夹已添加到路径中,并且是当前活动的版本。现在您可以像以前一样构建您的项目,但这次 Conan 将使用 CMake 3.22.6 来构建它。

Windows
# assuming Visual Studio 15 2017 is your VS version and that it matches your default profile
$ cmake .. -G "Visual Studio 15 2017" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
$ cmake --build . --config Release
...
Building with CMake version: 3.22.6
...
[100%] Built target compressor
$ Release\compressor.exe
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.2.11
Linux、macOS
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
...
Building with CMake version: 3.22.6
...
[100%] Built target compressor
$ ./compressor
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.2.11

请注意,当我们激活环境时,在同一文件夹中创建了一个名为 deactivate_conanbuild.sh/bat 的新文件。如果您使用此文件,则可以将环境恢复到激活之前的状态。

Windows
$ deactivate_conanbuild.bat
Linux、macOS
$ source deactivate_conanbuild.sh
Restoring environment

运行 cmake 并检查版本,它将是环境激活之前安装的版本。

$ cmake --version
cmake version 3.22.0
...

注意

最佳实践

tool_requires 和工具包适用于可执行应用程序,例如 cmakeninja。不要使用 tool_requires 来依赖库或类似库的依赖项。