将构建工具用作 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.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
仅适用于您当前的项目,而不适用于所有依赖项。 如果您想使用该 *cmake/3.22.6* 也来构建 Zlib(如果需要安装),您可以将 [tool_requires]
部分添加到您正在使用的 profile 中。 有关更多信息,请查看 profile 文档。
我们还在 *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
已被弃用。
为了避免每次都需要添加此行,我们建议在您的 profile 的 [conf]
部分中配置它。 有关详细信息,请参阅 profile 部分。
您可以检查输出
-------- 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
来依赖库或类似库的依赖项。
另请参阅
使用 conf 从 tool requires 设置 toolchain