我目前正在使用 OpenSUSE Build Service (https://build.opensuse.org/) 来构建 ArangoDB。但是,对于一些较新的 C++ 功能,我需要一个相当新的 C++ 编译器。对于一些较旧的发行版(如 Debian6 或 CentOS),默认编译器实在是太旧了。
我很确定一定有办法将较新的编译器与 OBS 结合使用,但我在 OBS 的文档中迷失了方向。有人能给我指明正确的方向吗?
答案1
我以前曾对库做过这样的事情,但从未对构建工具做过这样的事情,因此,除了构建任何库时出现的二进制兼容性问题外,我不明白为什么下面的方法不起作用。正如 vitalyster 指出的那样,这不是一个理想的方法,您可能会遇到问题,但从技术上讲,这样做是可行的。
我这样做的方法是将包(在您的情况下是 GCC)包含在我的项目中,并在构建中(在存储库下)设置它的构建/使用,以便仅为没有足够新版本的体系结构构建。
我也会将BuildRequires: gcc >= 4.8
你的规格纳入其中,以确保新版本被采纳,但这并不是必要的
一个例子可以在https://build.opensuse.org/project/monitor/X11:Enlightenment:Factory包裹卢阿吉特仅在openSUSE:工厂存储库,所以我在存储库中有一个副本,用于构建所有内容,但openSUSE:工厂它使用上游存储库中提供的那个。
在您的存储库中您可以分支现有包这意味着您可以找到 obs 上已有的 gcc 版本并使用该版本,而不必创建自己的版本。
答案2
是的,你没看错,OpenSUSE Build Service 允许你为许多 Linux 发行版构建软件包,但是不,您认为在所有发行版中使用最新的 C++ 编译器版本是错误的。您的应用程序应该使用发行版提供的编译器和库,OBS 允许您测试应用程序与大多数主要发行版的兼容性,而无需安装所有发行版。因此您有两个选择:
- 按预期执行操作 - 检查您想要支持的发行版,并使您的代码适应其编译器和库版本 - 使用预处理器块隐藏较新编译器的“新功能”,并为旧编译器/库编写兼容代码。OBS 可以自动构建您的应用程序并向您显示问题,您可以轻松修复它。
- 使用最新的编译器并静态链接所有必需的库,包括当前的 libgcc 和依赖库,不依赖于分发编译器/库版本,并将其部署在一个大包中。这是专有应用程序和 Linux 用户主要使用的方式讨厌他们- 这些应用程序为系统带来了相同库的多个副本,没有人关心它们将如何更新 - 想象一下,你正在使用 OpenSSL,并将你的应用程序静态链接到 OpenSSL 1.0.1e,它具有Heartbleed 漏洞- 发行版供应商发送安全更新,并且所有使用发行版提供的库的应用程序在用户安装更新时都将是安全的,但您的应用程序将继续使用您的静态链接不安全库。是的,您可以自己维护所有必需的库,并在安全更新准备就绪时更新您的应用程序,但这是发行版供应商的工作,您将重复他们的辛勤工作。