二进制兼容性

这个插件位于缓存 extensions/plugins/compatibility/compatibility.py 中,允许定义跨设置和选项的软件包二进制兼容性的自定义规则。它实现了一些内置逻辑,但可以自定义。

接口是一个名为 def compatibility(conanfile) 的单个函数,它接收一个 conanfile 对象作为参数。 它的返回值将等于 compatibility() recipe 方法,这是对 settings, options 的变化的有序列表,被认为是二进制兼容的。 Conan 将按顺序检查该列表以查找二进制文件是否存在,直到找到一个二进制文件。 以下将是有效的语法(但不是有用的或可行的,因为它在 Windows 中会失败,例如)

def compatibility(conanfile):
    result = []
    if conanfile.settings.build_type == "Debug":
        result.append({"settings": [("build_type", "Release")]})
    return result

Conan 提供了一个默认的 compatibility.py 实现,该实现实现了不同 compiler.cppstdcompiler.cstd 值的二进制兼容性。 也就是说,默认情况下,它假设使用不同的 cppstdcstd 值(对于相同的编译器和编译器版本)构建的二进制文件是二进制兼容的,并且可以毫无问题地链接在一起。

compiler.cppstd 必须在大多数 C++ 场景的 profile 文件中定义。 如果给定 compiler.cppstd 值的二进制文件不存在(这意味着,使用该设置完全构建的二进制文件),Conan 默认的 compatibility.py 将迭代该编译器版本支持的 cppstd 值。 可以为任何特定的软件包禁用此行为,方法是将 extension_properties = {"compatibility_cppstd": False} 属性添加到软件包 conanfile.py recipe 中,阅读 extension_properties 文档

从 Conan 2.4 开始,可以使用 compiler.cstd 设置。 仅当软件包的 recipe 显式声明 languages = "C" 属性时,才会将其考虑在软件包 package_id 的计算中。

一些重要的规则

  • 内置的 compatibility.py 在将来的版本中可能会发生更改。 为了避免将来被更新,请删除第一个注释 # This file was generated by Conan.

警告

compatibility.py 功能处于预览阶段。 当前默认的 compatibility.py实验性的。 有关更多信息,请参见Conan 稳定性部分。

另请参阅

阅读二进制模型参考以全面了解 Conan 二进制模型。