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

Set*_*ton 12 c++ conan

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

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

我期望的行为如下

  • 第一次使用conan install安装库(例如它不在的缓存中)然后conan将从源代码构建并将其放置在我的缓存中,然后使用它。
  • 在后续调用 时conan installconan查找缓存的库并使用它,而无需从源重建。
  • conan install作为自动构建脚本的一部分进行调用,因此我希望不必根据是否是第一次安装库来修改调用(但修改配置文件就可以了)。

我在实践中很难获得这种行为。以下是我遇到的挑战

  • 如果我使用conan install --build=thelibrarythen ,每次调用时conan都会从源代码重建该库,即使它已经存在于我的缓存中。conan install --build=thelibrary
  • 如果我使用conan install --build=missing,那么我可以conan通过设置一些没有与之关联的预构建二进制文件的构建选项来欺骗构建库。
    • 这是脆弱的,因为它仅适用于具有足够构建选项的项目,因此很难为所有组合创建预构建选项。
    • 如果我需要的所有构建选项都对应于预构建的二进制文件,它也不起作用。

这是我正在寻找的内容(我假设存在但无法找到):

  • conanfile.txt我可以在我的(或其他一些配置文件)中放置一些设置,告诉conan我忽略给定库的预构建二进制文件,而是从源代码构建,但使用缓存版本(如果可用)。
    • 理想情况下,这应该可以工作,而无需我修改构建选项。
  • 我不一定想从源代码构建所有库,只是那些不能在我的古老操作系统上运行的库,但如果我必须满足于“全有或全无”,我会选择“全部”。

这可能吗conan

uil*_*ies 2

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

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

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

    # ~/.conan/settings.yml
    glibc: [None, 2.11, ...]
    
    Run Code Online (Sandbox Code Playgroud)

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

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

另外,回答一下你的问题:

我可以在 conanfile.txt (或其他一些配置文件)中放置一些设置,告诉 conan 忽略给定库的预构建二进制文件,而是从源代码构建,但使用缓存版本(如果可用)。

您的缓存是柯南的首选,它会首先在那里查找预构建的包,如果不可用,它将按照排序顺序查看您的遥控器。您的请求是不可能的,首先,因为conanfile.txt不支持构建策略,其次,因为conanfile.py仅支持从源构建全部,或仅支持缺失构建。

我的建议是,安装一个Artifactory实例,构建您需要的内容,上传您的自定义包,并将其作为您的默认遥控器。

我不一定想从源代码构建所有库,只是那些不能在我的古老操作系统上运行的库,但如果我必须满足于“全有或全无”,我会选择“全部”。

您可以将某些包引用关联到远程运行conan 远程命令。假设您想要下载zlib/1.2.11内置的glibc-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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好的。所以我在设置 glibc 方面没有任何运气。但是,通过在“~/.conan/settings.yml”的“os: Linux:”部分将“distro”设置为“[SLES11]”,然后调用“conan profile update”,我**确实**获得了所需的结果settings.os.distro=SLES11 默认`。这导致除了仅标头库之外的所有内容都是从源代码构建的。谢谢各位的指点! (2认同)