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都会从源代码重新构建该库conan install--build=thelibrary
- 如果我使用
,那么我可以通过设置一些没有预构建二进制文件的构建选项来诱使conan install--build=missing
构建库。conan
- 这是脆弱的,因为它只适用于具有足够构建选项的项目,因此无法为所有组合创建预构建选项
- 如果我需要的所有构建选项都对应于预构建的二进制文件,那么它也不起作用
- 我可以在我的
(或其他一些配置文件)中放置一些设置,告诉conanfile.txt
忽略给定库的预构建二进制文件,而是从源代码构建,但如果可用,则使用缓存版本。conan
- 这在理想情况下应该可以工作,而无需我修改构建选项
- 我不一定要从源代码构建所有库,只是那些不会在我的古代操作系统上运行的库,但是如果我必须满足于“要么全部要么什么都没有”,我会选择“全部”
对于柯南来说,glibc版本是一个老问题,因为它不是设置的一部分,因此不算是软件包ID的一部分。这些图像正在运行Ubuntu,其中一些是旧的,另一些是新的。但是有一个运行CentOS6的特定Docker映像,它是由glibc 2.12创建的,可以帮助生成包 对于您的具体情况,我们有几个选择:
- 添加
作为设置的一部分,这样柯南就不会因为您的包ID而替换您的包。因为您应该有更多的同事,所以可以使用命令分发设置glibc
添加它,您也可以更新您的配置文件,将#~/.conan/settings.yml glibc:[无,2.11,…]
作为默认设置glibc=2.11
- 另一种选择是特性,您可以锁定特定的二进制软件包以供使用,这意味着您需要使用该特定软件包。您只需使用glibc上传生成的包,并使用其二进制包版本,例如
lib/1。0@conan/稳定#RREV:PACKAGE#ID#PREV
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
不断告诉我它是无效的设置