二进制兼容性¶
此插件位于缓存中的 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 设置。只有当其声明明确指定了 languages = "C" 属性时,它才会在计算软件包 package_id 时被考虑。
在某些情况下,默认的 compatibility.py 将不足以满足需求,用户需要根据自身需求进行自定义。以下是一些有关自定义的规则和技巧。
重要的是,内置的
compatibility.py**在未来版本中可能会发生更改**。为了避免未来被更新,请删除开头的注释# This file was generated by Conan.如果
settings或options允许取消设置,则可以通过将要移除的项目值指定为None来从返回的列表中删除这些值。
警告
compatibility.py 功能处于 **预览** 状态。当前的默认 compatibility.py 是 **实验性** 的。有关更多信息,请参阅 Conan 稳定性 部分。
另请参阅
请参阅 二进制模型参考 以完整了解 Conan 二进制模型。