二进制兼容性

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

接口是一个名为 def compatibility(conanfile) 的单一函数,它接收一个 conanfile 对象作为参数。它的返回值将等于 compatibility() рецепт 方法,即一组有序的 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 必须在配置文件中定义。如果某个 compiler.cppstd 值的二进制文件不存在(即,不存在使用该确切设置构建的二进制文件),Conan 的默认 compatibility.py 将会遍历该编译器版本支持的 cppstd 值。可以通过在包的 conanfile.py рецепт 中添加 extension_properties = {"compatibility_cppstd": False} 属性来禁用此行为,请参阅 extension_properties 文档

从 Conan 2.4 开始,提供了 compiler.cstd 设置。只有当其 рецепт 显式声明 languages = "C" 属性时,才会将其计入包 package_id 的计算中。

一些重要规则

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

警告

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

另请参阅

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