我们很高兴地宣布 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 的配方中添加。



除了上面列出的内容外,还有一些小的错误修复,您可能希望了解。如果是这样,请参阅 更改日志 以获取完整列表。

我们希望您喜欢此版本,并期待您的 反馈