本文档翻译自:https://docs.conan.io/en/latest/creating_packages/define_abi_compatibility.html#defining-a-custom-package-id

    默认的package_id()直接使用所定义的 settingsoptions ,并假定在 require 中定义了依赖项的语义版本控制。
    可以覆盖此package_id() 方法来控制包ID的生成。在package_id() 中,我们可以访问self.Info对象,该对象经过散列以计算二进制ID,并包含:

    • self.Info.settings: 包含所有声明的设置,始终作为字符串值。我们可以访问/修改设置,例如self.info.settings.compiler.version
    • self.Info.options: 包含所有声明的选项,也始终作为字符串值,例如,self.Info.options.shared

    最初,此 info 对象包含原始设置和选项,但可以不受任何其他字符串值的约束地对其进行更改。
    例如,如果您确定您的软件包ABI兼容性对于> 4.5和<5.0的GCC版本来说是很好的,则可以执行以下操作:

    1. from conans import ConanFile, CMake, tools
    2. from conans.model.version import Version
    3. class PkgConan(ConanFile):
    4. name = "pkg"
    5. version = "1.0"
    6. settings = "compiler", "build_type"
    7. def package_id(self):
    8. v = Version(str(self.settings.compiler.version))
    9. if self.settings.compiler == "gcc" and (v >= "4.5" and v < "5.0"):
    10. self.info.settings.compiler.version = "GCC version between 4.5 and 5.0"

    我们使用任意字符串设置了self.info.settings.compiler.version,该字符串的值并不重要(可以是任何字符串)。 唯一重要的是,对于4.5到5.0之间的任何GCC版本,它都是相同的。 对于所有这些版本,编译器版本将始终哈希为相同的ID。
    让我们尝试使用GCC 4.5 时它是否正常工作:

    1. $ conan create . pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.5 ...
    2. Requirements
    3. pkg/1.0@myuser/mychannel from local
    4. Packages
    5. pkg/1.0@myuser/mychannel:af044f9619574eceb8e1cca737a64bdad88246ad
    6. ...

    我们可以看到,计算出的包ID是af04 ... 46ad(不是真实的)。 如果我们指定GCC 4.6会发生什么?

    1. $ conan install pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.6 ...
    2. Requirements
    3. pkg/1.0@myuser/mychannel from local
    4. Packages
    5. pkg/1.0@myuser/mychannel:af044f9619574eceb8e1cca737a64bdad88246ad

    他要求包装再次在af04 ... 46ad中具有相同的结果。 现在我们可以尝试使用GCC 4.4(<4.5):

    1. $ conan install Pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.4 ...
    2. Requirements
    3. pkg/1.0@myuser/mychannel from local
    4. Packages
    5. pkg/1.0@myuser/mychannel:7d02dc01581029782b59dcc8c9783a73ab3c22dd

    计算出的软件包ID是不同的,这意味着我们需要针对GCC 4.4的提供不同二进制软件包。
    与调整self.info.settings的方式相同,如果需要,我们可以设置self.info.options值。

    :::info See also
    检查package_id()以查看可用的帮助程序方法,并更改其行为,例如:

    • 配方仅包含头文件。
    • 调整Visual Studio工具集的兼容性。 :::