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

C++ 如何强制conan从源代码构建,但前提是它不在缓存中?,c++,conan,C++,Conan,我在一个企业环境中使用conan,在这个环境中,操作系统非常旧,并且有一个旧版本的glibc(2.11)。因此,conan.io上的许多预构建二进制文件最终无法在我的环境中工作。但是,conan不知道这一点,并且会很高兴地将它们下载并安装到我的系统上,从而导致链接时间错误 我发现,如果我从源代码构建,我可以让库正常工作 我想要的行为如下所示: 第一次使用conan install安装库(例如,它不在我的缓存中),然后conan将从源代码生成并将其放置在我的缓存中,然后使用它 在随后调用cona

我在一个企业环境中使用
conan
,在这个环境中,操作系统非常旧,并且有一个旧版本的
glibc
(2.11)。因此,
conan.io
上的许多预构建二进制文件最终无法在我的环境中工作。但是,
conan
不知道这一点,并且会很高兴地将它们下载并安装到我的系统上,从而导致链接时间错误

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

我想要的行为如下所示:

  • 第一次使用
    conan install
    安装库(例如,它不在我的缓存中),然后
    conan
    将从源代码生成并将其放置在我的缓存中,然后使用它
  • 在随后调用
    conan install
    时,
    conan
    查找缓存库并使用它,而无需从源代码重建
  • 我正在调用
    conan install
    ,作为自动构建脚本的一部分,因此我不想根据这是不是第一次安装库来修改调用(但是修改配置文件是可以的)
我在实践中很难获得这种行为以下是我遇到的挑战

  • 如果我使用
    conan install--build=thelibrary
    ,那么每当我调用
    conan install--build=thelibrary
    ,即使它已经存在于我的缓存中,conan都会从源代码重新构建该库
  • 如果我使用
    conan install--build=missing
    ,那么我可以通过设置一些没有预构建二进制文件的构建选项来诱使
    conan
    构建库。
    • 这是脆弱的,因为它只适用于具有足够构建选项的项目,因此无法为所有组合创建预构建选项
    • 如果我需要的所有构建选项都对应于预构建的二进制文件,那么它也不起作用
以下是我正在寻找的内容(我假设存在,但无法找到):

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

对于柯南来说,glibc版本是一个老问题,因为它不是设置的一部分,因此不算是软件包ID的一部分。这些图像正在运行Ubuntu,其中一些是旧的,另一些是新的。但是有一个运行CentOS6的特定Docker映像,它是由glibc 2.12创建的,可以帮助生成包

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

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

    #~/.conan/settings.yml
    glibc:[无,2.11,…]
    
    添加它,您也可以更新您的配置文件,将
    glibc=2.11
    作为默认设置

  • 另一种选择是特性,您可以锁定特定的二进制软件包以供使用,这意味着您需要使用该特定软件包。您只需使用glibc上传生成的包,并使用其二进制包版本,例如
    lib/1。0@conan/稳定#RREV:PACKAGE#ID#PREV

另外,回答你的问题:

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

您的缓存是Conan first选项,它将首先在那里查找预构建的包,如果它不可用,它将按照排序顺序查找您的远程设备。您的请求不可能,第一,因为不支持,第二,因为只支持从源代码生成所有,或者只支持缺少的生成

我的建议是,安装一个实例,构建您需要的,上传您的自定义包,并将其作为您的默认远程服务器

我不一定要从源代码构建所有库,只是那些不会在我的古代操作系统上运行的库,但是如果我必须满足于“要么全部要么什么都没有”,我会选择“全部”

您可以将某些包引用与远程运行的命令相关联。假设您想下载使用
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
现在,您的特定包与您的组织相关联。柯南仍将首先在本地缓存中查找该包,但如果找不到,它将尝试在您的人工工厂中查找


正如您所看到的,使用新设置可以更轻松地解决您的问题,而不是试图破解构建策略。作为另一种选择,您可以通过<代码>发行版>代码>及其版本来替换<代码> GLUB设置。

您可以考虑使用(如果允许的话),而柯南是开源的,您可以在旧主机上编译它。你只需要征得你老板的同意,花几个小时做soAh,所以基本上我有个XY问题。glibc设置听起来正是我想要的——我会尝试一下,然后再报告。所以我正在尝试这样做,但我遇到了一些问题。我不认为“glibc”是一个有文件记录的选项或选项。当我尝试将它添加到我的设置或配置文件时,
conan
不断告诉我它是无效的设置