使用构建工具作为 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.27.9 构建我们的应用程序。
[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.27.9,并生成用于查找两者的文件。 我们将在 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.27.9 的位置注入到我们的环境中。
激活虚拟环境,并运行 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.27.9
...
如您所见,激活环境后,CMake v3.27.9 二进制文件夹已添加到路径中,现在是当前活动版本。 现在您可以像以前一样构建项目,但这次 Conan 将使用 CMake 3.27.9 构建它
# 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.27.9
...
[100%] Built target compressor
$ Release\compressor.exe
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.3.1
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
...
Building with CMake version: 3.27.9
...
[100%] Built target compressor
$ ./compressor
Uncompressed size is: 233
Compressed size is: 147
ZLIB VERSION: 1.3.1
请注意,当我们激活环境时,会在同一文件夹中创建了一个名为 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 来依赖库或类似库的依赖项。