如何强制柯南从源代码构建,但前提是它不在缓存中?

How to force conan to build from source, but only if it is not in the cache?

我在企业环境中使用 conan,其中的操作系统相当陈旧并且有旧版本的 glibc (2.11)。因此,conan.io 上的许多预构建二进制文件最终无法在我的环境中运行。然而,conan 并不知道这一点,并且会很乐意将它们下载并安装到我的系统上,从而导致 link-time 错误。

我发现,如果我从源代码构建,我可以让这些库正常工作。

我想要的行为如下:

我在实践中遇到了这种行为。 以下是我 运行 面临的挑战:

这是我要找的东西(我假设存在但找不到):

conan可以吗?

glibc 版本是柯南的一个老头疼的问题,因为它不是设置的一部分,因此不计入包 ID 的一部分。 Conan Docker张图片是运行Ubuntu张,有些是旧的,有些是新的。但是有一个特定的 Docker 图像 运行 CentOS6,它是由于 glibc 2.12 而创建的,可以帮助生成软件包。

对于您的具体情况,我们有几个选择:

  • 添加 glibc 作为设置的一部分,这样 Conan 就不会因为包 ID 而替换您的包。由于你应该有更多的同事,你可以使用conan config命令进行设置分发。

    # ~/.conan/settings.yml
    glibc: [None, 2.11, ...]
    

    添加它,您也可以更新您的个人资料,使 glibc=2.11 成为默认设置。

  • 另一种选择是 package revisions 功能,您可以在其中锁定特定的二进制包以供使用,这意味着您要使用该特定的包。您只需要使用 glibc 上传生成的包并使用其二进制包修订版,例如lib/1.0@conan/stable#RREV:PACKAGE_ID#PREV

另外,回答你的问题:

Some setting I can place in my conanfile.txt (or some other configuration file) that tells conan to ignore pre-built binaries for a given library or libraries and instead build from source, but use the cached version if it is available.

你的缓存是柯南第一选项,它会首先在那里寻找一个预构建的包,如果它不可用,它会按照排序顺序查看你的遥控器。您的请求是不可能的,首先,因为 conanfile.txt doesn't support build policies, second, because conanfile.py 只支持从源构建全部,或者仅构建缺失。

我的建议是,安装一个 Artifactory 实例,构建你需要的东西,上传你的自定义包,并将其作为你的默认远程。

I don't necessarily want to build all libraries from source, just the ones that won't run on my ancient OS, but if I have to settle for "all-or-nothing" I will take "all".

您可以将一些包引用与远程 运行 conan remote 命令相关联。假设您要下载使用 glibc-2.11 构建的 zlib/1.2.11,并且它仅在您的组织远程可用:

$ conan remote add_ref zlib/1.2.11@org/stable my_org_repo
$ conan remote list_ref # only to validate, not mandatory
zlib/1.2.11@org/stable: my_org_repo

现在您的特定包已关联到您的组织。 Conan 仍然会首先在您的本地缓存中查找该包,但是当找不到时,它会尝试在您的 Artifactory 中查找。

如您所见,使用新设置可以更轻松地解决您的案例,而不是试图破解构建策略。作为另一种选择,您可以将 glib 设置替换为 distro 及其版本。