二进制兼容性¶
此插件位于缓存 extensions/plugins/compatibility/compatibility.py
中,允许为跨设置和选项的包的二进制兼容性定义自定义规则。它实现了一些内置逻辑,但可以自定义。
接口是一个名为 def compatibility(conanfile)
的单个函数,它接收一个 conanfile
对象作为参数。其返回值将等于 compatibility()
配方方法,一个关于 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.cppstd
和 compiler.cstd
值实现了二进制兼容性。也就是说,默认情况下,它假设使用不同的 cppstd
和 cstd
值(对于相同的编译器和编译器版本)构建的二进制文件是二进制兼容的,并且可以互联而不会出现问题。
在大多数 C++ 场景中,必须在配置文件中定义 compiler.cppstd
。如果不存在给定 compiler.cppstd
值的二进制文件(这意味着,使用完全相同的设置构建的二进制文件),则 Conan 默认的 compatibility.py
将按该编译器版本的受支持的 cppstd
值进行迭代。可以为任何特定包禁用此行为,将 extension_properties = {"compatibility_cppstd": False}
属性添加到包 conanfile.py
配方中,请阅读 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 二进制模型。