使用 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** 来构建我们的应用程序。
[requires]
zlib/1.3.1
[tool_requires]
cmake/3.27.9
[generators]
CMakeDeps
CMakeToolchain
重要
请注意,此 conanfile.txt 将分别安装 zlib/1.3.1 和 cmake/3.27.9。但是,如果 Conan 在 Conan Center 中找不到 Zlib 的二进制文件,并且需要从源代码构建,那么您的系统上必须已经存在 CMake 安装,因为您 conanfile.txt 中声明的 cmake/3.27.9 仅适用于您当前的项目,而不是所有依赖项。如果您希望使用此 cmake/3.27.9 来构建 Zlib,并在必要时进行安装,您可以将 [tool_requires] 部分添加到您使用的配置文件中。有关更多信息,请参阅 配置文件文档。
我们还在 CMakeLists.txt 中添加了一条消息来输出 CMake 版本
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=<executable>(例如,powershell.exe 或 pwsh),以便生成 .ps1 文件而不是 .bat 文件。从 Conan 2.11.0 开始,将此配置设置为 True 或 False 已弃用。
为了避免每次都添加此行,我们建议在配置文件的 [conf] 部分中进行配置。有关详细信息,请参阅 配置文件部分。
您可以检查输出
-------- Computing dependency graph ----------
cmake/3.27.9: Not found in local cache, looking in remotes...
cmake/3.27.9: Checking remote: conancenter
cmake/3.27.9: Trying with 'conancenter'...
Downloading conanmanifest.txt
Downloading conanfile.py
cmake/3.27.9: Downloaded recipe revision 3e3d8f3a848b2a60afafbe7a0955085a
Graph root
conanfile.txt: /Users/user/Documents/developer/conan/examples2/tutorial/consuming_packages/tool_requires/conanfile.txt
Requirements
zlib/1.3.1#f1fadf0d3b196dc0332750354ad8ab7b - Cache
Build requirements
cmake/3.27.9#3e3d8f3a848b2a60afafbe7a0955085a - Downloaded (conancenter)
-------- Computing necessary packages ----------
Requirements
zlib/1.3.1#f1fadf0d3b196dc0332750354ad8ab7b:2a823fda5c9d8b4f682cb27c30caf4124c5726c8#48bc7191ec1ee467f1e951033d7d41b2 - Cache
Build requirements
cmake/3.27.9#3e3d8f3a848b2a60afafbe7a0955085a:f2f48d9745706caf77ea883a5855538256e7f2d4#6c519070f013da19afd56b52c465b596 - Download (conancenter)
-------- Installing packages ----------
Installing (downloading, building) binaries...
cmake/3.27.9: Retrieving package f2f48d9745706caf77ea883a5855538256e7f2d4 from remote 'conancenter'
Downloading conanmanifest.txt
Downloading conaninfo.txt
Downloading conan_package.tgz
Decompressing conan_package.tgz
cmake/3.27.9: Package installed f2f48d9745706caf77ea883a5855538256e7f2d4
cmake/3.27.9: Downloaded package revision 6c519070f013da19afd56b52c465b596
zlib/1.3.1: 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 版本。
$ cd build
$ conanbuild.bat
# conanbuild.ps1 if using Powershell
$ 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 来构建它。
# 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
$ 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 的新文件。如果您源文件此文件,您可以将环境恢复到激活之前的状态。
$ deactivate_conanbuild.bat
$ source deactivate_conanbuild.sh
Restoring environment
运行 cmake 并检查版本,它将是环境激活之前安装的版本。
$ cmake --version
cmake version 3.22.0
...
注意
最佳实践
tool_requires 和工具包用于可执行应用程序,例如 cmake 或 ninja。不要将 tool_requires 用于依赖库或类库依赖项。