Conan 1.44:引入 `tool_requires` 属性以替换通用的 `build_requires`,新增工具用于显式处理符号链接,CMakeToolchain 现在可以应用多个用户工具链,为 CMakeDeps 添加了变量以更好地匹配上游。
我们很高兴地宣布 Conan 1.44 已经发布,并带来了一些重要的新功能和错误修复。我们添加了一个 tool_requires 属性,以提供一种兼容的方式迁移到 Conan 2.0。此外,此版本还附带了 conan.tools.files.symlinks
下的几个函数,以帮助管理符号链接。我们还为 CMakeToolchain 添加了应用多个用户工具链的功能。最后,CMakeDeps 添加了一些变量,以尽可能地匹配上游 CMake 模块。
新的 `tool_requires` 属性
从 Conan 1.44 开始,我们将“构建需求”重命名为“工具需求”。这样做的目的是强调此类需求的使用必须专门用于“工具”,而不是用于库来表达“私有”需求或其他含义。现在配方将如下所示
class MyPkg(ConanFile):
tool_requires = "cmake/3.19.6"
尽管 build_requires
属性在 Conan 1.X 中仍然有效,但它将在 Conan 2.0 中消失,因此请 开始迁移您的配方 以使其准备好用于 2.0。
用于显式处理符号链接的新工具
在 conan.tools.files.symlinks
下有 几个新函数 用于管理符号链接。使用这些工具,您可以将绝对符号链接转换为相对符号链接,删除损坏的符号链接,删除外部符号链接并获取文件夹中的符号链接。请记住,Conan 2.0 不会自动处理包符号链接。这些工具对于迁移配方并使其在 2.0 中按预期工作非常方便。
让我们看看它们
- **将具有绝对路径的符号链接转换为相对符号链接**。它只会考虑 `base_folder` 内部的符号链接。
def absolute_to_relative_symlinks(conanfile, base_folder):
- **删除指向 `base_folder` 外部的外部符号链接**,无论其是相对的还是绝对的。
def remove_external_symlinks(conanfile, base_folder):
- **删除损坏的符号链接**,无论其是相对的还是绝对的。
def remove_broken_symlinks(conanfile, base_folder):
使用 CMakeToolchain 应用多个用户工具链
CMakeToolchain 现在可以应用多个用户工具链。例如,您可以有多个 tool_requires
,每个工具链在其 package_info
方法中定义一个工具链
import os
from conans import ConanFile
class ToolchainPackage(ConanFile):
name = "toolchain1"
...
def package_info(self):
f = os.path.join(self.package_folder, "mytoolchain.cmake")
self.conf_info["tools.cmake.cmaketoolchain:user_toolchain"] = f
如果您想在一个配方中使用多个工具链,您可以从所有依赖项配置中收集值,并调整 user_toolchain
块以应用所有工具链
from conans import ConanFile
from conan.tools.cmake import CMake, CMakeToolchain
class Pkg(ConanFile):
...
tool_requires = "toolchain1/1.0", "toolchain2/1.0"
def generate(self):
# Get the toolchains from "tools.cmake.cmaketoolchain:user_toolchain" conf at the
# tool_requires
user_toolchains = []
for dep in self.dependencies.direct_build.values():
ut = dep.conf_info["tools.cmake.cmaketoolchain:user_toolchain"]
if ut:
user_toolchains.append(ut)
# Modify the context of the user_toolchain block
t = CMakeToolchain(self)
t.blocks["user_toolchain"].values["paths"] = user_toolchains
t.generate()
...
这样,Conan 生成的 conan_toolchain.cmake
文件将在声明任何其他内容之前包含这两个工具链
...
include("/path/to/mytoolchain.cmake")
include("/otherpath/to/mytoolchain.cmake")
...
为 CMakeDeps 添加变量以更好地与上游匹配
为了更接近 CMake 官方查找模块 通常声明的变量,我们添加了这些变量,以便在使用 CMakeDeps Conan 生成器时可以使用它们
- **PackageName_**LIBRARIES
- **PackageName_**INCLUDE_DIRS
- **PackageName_**INCLUDE_DIR
- **PackageName_**DEFINITIONS
- **PackageName_**VERSION_STRING
这些定义在绝大多数情况下肯定会有所帮助。我们的目的不是尝试定义官方模块定义的每个可能的变量,这些变量应该在使用 自定义 build_module 的配方中添加。
除了上面列出的内容外,还有一些小的错误修复,您可能希望了解。如果是这样,请参阅 更改日志 以获取完整列表。
我们希望您喜欢此版本,并期待您的 反馈。