本文档翻译自:https://docs.conan.io/en/latest/creating_packages/define_abi_compatibility.html#compatible-compilers
一些编译器使用基本编译器进行操作,例如,intel
编译器在Windows环境中使用Visual Studio
编译器,在Linux环境中使用gcc
。intel
编译器在settings.yml中以这种方式声明:
intel:
version: ["11", "12", "13", "14", "15", "16", "17", "18", "19"]
base:
gcc:
<<: *gcc
threads: [None]
exception: [None]
Visual Studio:
<<: *visual_studio
请记住,您可以扩展Conan以支持其他编译器。
您可以使用package_id()
方法来定义base
编译器生成的包与parent
编译器之间的兼容性。 您可以将以下帮助程序与兼容软件包功能一起使用:
- 当配置文件中的输入编译器为
intel
时,使用本机Visual Studio
包(如果没有intel
包可用)。
- 相反,当使用者配置文件将
Visual Studio
指定为输入编译器时(如果没有可用的Visual Studio
程序包),将使用intel
编译器程序包。
base_compatible()
: 此函数将用于计算包ID的设置转换为 “base” 编译器。
def package_id(self):
if self.settings.compiler == "intel":
p = self.info.clone()
p.base_compatible()
self.compatible_packages.append(p)
- 使用上述
package_id()
方法,如果使用者使用intel配置文件(-s complier==”intel”)指定了配置文件,并且没有可用的二进制文件,它将解析为与基本编译器相对应的Visual Studio程序包ID。 parent_compatible(compiler="compiler", version="version")
: 此函数使用指定的设置作为基本编译器,将编译器的设置转换为父编译器的设置。由于无法猜测 “parent” 兼容的详细信息,因此您必须将它们作为关键字参数提供给函数。“编译器” 参数是强制性的,其余的关键字参数将用于初始化info.settings.com piler.XXX
对象,以计算正确的包ID。def package_id(self):
if self.settings.compiler == "Visual Studio":
compatible_pkg = self.info.clone()
compatible_pkg.parent_compatible(compiler="intel", version=16)
self.compatible_packages.append(compatible_pkg)
在这种情况下,对于指定Visual Studio编译器的使用者,如果找不到软件包,它将为版本16搜索“ intel”软件包。
考虑到您也可以不使用“兼容软件包”功能而使用这些帮助程序:
def package_id(self):
if self.settings.compiler == "Visual Studio":
self.info.parent_compatible(compiler="intel", version=16)
在上面的示例中,我们将Visual Studio
软件包的软件包ID转换为与intel 16
相同的软件包,但是您将无法区分使用intel
构建的软件包与Visual Studio
所构建的软件包。 相同的包裹ID,这并不总是可取的。