本文档翻译自:https://docs.conan.io/en/latest/creating_packages/define_abi_compatibility.html#compatible-compilers

    一些编译器使用基本编译器进行操作,例如,intel编译器在Windows环境中使用Visual Studio编译器,在Linux环境中使用gcc
    intel 编译器在settings.yml中以这种方式声明:

    1. intel:
    2. version: ["11", "12", "13", "14", "15", "16", "17", "18", "19"]
    3. base:
    4. gcc:
    5. <<: *gcc
    6. threads: [None]
    7. exception: [None]
    8. Visual Studio:
    9. <<: *visual_studio

    请记住,您可以扩展Conan以支持其他编译器。
    您可以使用package_id()方法来定义base编译器生成的包与parent编译器之间的兼容性。 您可以将以下帮助程序与兼容软件包功能一起使用:

    1. 当配置文件中的输入编译器为intel时,使用本机Visual Studio包(如果没有intel包可用)。
    1. 相反,当使用者配置文件将Visual Studio指定为输入编译器时(如果没有可用的Visual Studio程序包),将使用intel编译器程序包。
    • base_compatible(): 此函数将用于计算包ID的设置转换为 “base” 编译器。
    1. def package_id(self):
    2. if self.settings.compiler == "intel":
    3. p = self.info.clone()
    4. p.base_compatible()
    5. 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。

      1. def package_id(self):
      2. if self.settings.compiler == "Visual Studio":
      3. compatible_pkg = self.info.clone()
      4. compatible_pkg.parent_compatible(compiler="intel", version=16)
      5. self.compatible_packages.append(compatible_pkg)

      在这种情况下,对于指定Visual Studio编译器的使用者,如果找不到软件包,它将为版本16搜索“ intel”软件包。

    考虑到您也可以不使用“兼容软件包”功能而使用这些帮助程序:

    1. def package_id(self):
    2. if self.settings.compiler == "Visual Studio":
    3. self.info.parent_compatible(compiler="intel", version=16)

    在上面的示例中,我们将Visual Studio软件包的软件包ID转换为与intel 16相同的软件包,但是您将无法区分使用intel构建的软件包与Visual Studio所构建的软件包。 相同的包裹ID,这并不总是可取的。