如果我更新一个 RPM,我是否必须重建所有基于它的 RPM

If I update an RPM, do I have to rebuild all RPMs that are based on it

我们有一系列或 RPM 作为我们项目的一部分构建,其中一些依赖于其他。假设我有 3 个 RPM A.rpm、B.rpm 和 C.RPM,其中 B 和 C 都依赖于 A,我是否需要在每次更新 A 时都重建它们?如果我向 A 添加新功能以支持 B 中的功能,但为生成 C 而构建的代码不知道新功能。我需要根据更新后的 A 重建 C 吗?

或者更接近我的实际情况,我有一个库 RPM,大约有 25 个 RPM 依赖它。我们向库中添加了一项新功能以支持 1 个 RPM 的更新,我是否需要重建所有其他 24 个 RPM?

提前致谢。

是也不是。有两种依赖:生成的和隐式的。

如果您谈论 C 库,那么 rpmbuild 会生成如下依赖项:

$ rpm -R bash
...
libdl.so.2()(64bit)
...

并且当提供这个库的包被更新时,但它保持不变SONAME,即相同的二进制接口,那么你不需要重建使用它的包(在这个例子中bash)。但是当出现SONAME bump 并且包突然提供了libdl.so.3,那么你必须重新构建需要它的包。

如果依赖关系是其他东西,那么你不需要重建包。例如包 firefox 需要 bash,但它适用于任何版本。所以当 bash 正在更新时,你不需要重建 firefox.

有时碰巧你依赖某个东西(python-2.x)并且它得到了非常重大的升级(python-3.x),那么你需要重建需要它的包。在这些极少数情况下,您通常会提前知道它,因为您不仅要重建包,还要重写应用程序本身的代码。例如。从 python2 到 python3 的迁移非常重要。

大多数情况下的快捷提示: 除非 DNF/YUM 告诉你你已经破坏了依赖关系,否则你不需要重建你的包。