二进制兼容性¶
这个插件位于缓存的 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
值。可以通过在包的 conanfile.py
配方中添加 extension_properties = {"compatibility_cppstd": False}
属性来禁用特定包的此行为,请阅读 extension_properties 文档。
从 Conan 2.4 开始,compiler.cstd
设置可用。它只会在计算包的 package_id
时考虑,前提是其配方显式声明了 languages = "C"
属性。
一些重要规则
内置的
compatibility.py
在未来的版本中可能会发生变化。为避免将来被更新,请删除第一个注释# This file was generated by Conan.
警告
compatibility.py
功能处于 预览 阶段。当前的默认 compatibility.py
是 实验性 的。更多信息请参见 Conan 稳定性 部分。
另请参阅
阅读 二进制模型参考 以全面了解 Conan 二进制模型。