二进制兼容性

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

接口是一个名为 def compatibility(conanfile) 的单个函数,它接收一个 conanfile 对象作为参数。它的返回值将等于 compatibility() recipe 方法,一个有序的关于 settingsoptions 的变体列表,这些变体被认为是二进制兼容的。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 值(对于相同的编译器和编译器版本)构建的二进制文件是二进制兼容的,并且可以链接在一起而不会出现问题。

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

从 Conan 2.4 开始,compiler.cstd 设置可用。它仅在计算包的 package_id 时才会被考虑,当它们的 recipe 显式声明 languages = "C" 属性时。

在某些情况下,默认的 compatibility.py 将不足以满足用户的需求,用户需要根据自己的需求对其进行自定义。下面解释了一些规则和自定义技巧。

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

  • 当它们允许被取消设置时,可以通过将项目的 value 指定为 None,可以从返回的列表中删除 settingsoptions 的值。

警告

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

另请参阅

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