二进制兼容性

此插件位于缓存的 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 值构建的二进制文件(对于相同的编译器和编译器版本)是二进制兼容的,并且可以毫无问题地链接在一起。

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