将构建工具用作 Conan 包¶
在上一个示例中,我们构建了 CMake 项目,并使用 Conan 安装和定位了 Zlib 库。我们使用了系统中已安装的 CMake 来构建压缩器二进制文件。然而,如果您想使用特定版本的 CMake 来构建项目,而不是系统中已安装的版本,该怎么办?Conan 还可以帮助您安装这些工具,并使用它们来编译消费者项目或其他 Conan 包。在这种情况下,您可以使用一种名为 tool_requires
的需求类型在 Conan 中声明此依赖。让我们看看如何向项目中添加一个 tool_requires
并使用不同的 CMake 版本来构建它。
请首先克隆源代码以重新创建此项目。您可以在 GitHub 的 examples2 repository 中找到它们
$ 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.2.11
[tool_requires]
cmake/3.22.6
[generators]
CMakeDeps
CMakeToolchain
重要
请注意,此 conanfile.txt 将分别安装 zlib/1.2.11 和 cmake/3.22.6。然而,如果 Conan 在 Conan Center 中找不到 Zlib 的二进制文件,并且需要从源代码构建,则您的系统上必须已经存在 CMake 安装,因为在您的 conanfile.txt
中声明的 cmake/3.22.6
仅适用于您的当前项目,而不适用于所有依赖项。如果您想在必要时安装 Zlib 时,也使用该 cmake/3.22.6 来构建 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.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 版本安装到路径中。
$ 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
的新文件。如果您 source 此文件,可以将环境恢复到之前状态。
$ deactivate_conanbuild.bat
$ source deactivate_conanbuild.sh
Restoring environment
运行 cmake
并检查版本,它将是激活环境之前安装的版本
$ cmake --version
cmake version 3.22.0
...
注意
最佳实践
tool_requires
和工具包适用于可执行应用程序,例如 cmake
或 ninja
。请勿使用 tool_requires
来依赖库或类似库的依赖项。
另请参阅