如何处理源 RPM 中的构建依赖项?

How to deal with build dependencies in source RPM?

我通常不使用 Fedora 或 RPM,所以我在这里盲目飞行。这里有很多类似的问题,但我发现 none 正是我遇到的问题。

我有 Fedora 上一个旧游戏程序的源 RPM(“六”是游戏)。我想添加几个功能,但首先我想确保我知道如何编译它,以便将来出现任何新问题。我还没有做任何改变。

我并非完全无助——当我做到时

rpmbuild --recompile six-*.src.rpm

我收到有关缺少依赖项的投诉:“kdelibs3-devel”,但是

dnf install kdelibs3-devel

处理好了。

然而,现在的投诉更加微妙。当我重试 rpmbuild 时,它以

结束
checking crt_externs.h usability... no
checking crt_externs.h presence... no
checking for crt_externs.h... no
checking for _NSGetEnviron... no
checking for vsnprintf... yes
checking for snprintf... yes
checking for X... libraries /usr/lib64, headers .
checking for IceConnectionNumber in -lICE... yes
checking for libXext... yes
checking for pthread_create in -lpthread... yes
checking for extra includes... no
checking for extra libs... no
checking for libz... -lz
checking for libpng... -lpng -lz -lm
checking for libjpeg6b... no
checking for libjpeg... no
configure: WARNING: libjpeg not found. disable JPEG support.
checking for perl... /usr/bin/perl
checking for Qt... configure: error: Qt (>= Qt 3.3 and < 4.0) (library qt-mt) not found. Please check your installation!
For more details about this problem, look at the end of config.log.
Make sure that you have compiled Qt with thread support!
error: Bad exit status from /var/tmp/rpm-tmp.y8dvN5 (%build)  

RPM build errors:
    user mockbuild does not exist - using root
    user mockbuild does not exist - using root
    user mockbuild does not exist - using root
    user mockbuild does not exist - using root
    Bad exit status from /var/tmp/rpm-tmp.y8dvN5 (%build)

这里有几件事看起来很奇怪,但明显的大问题是未能在 3.3 和 4.0 之间找到 Qt。这显然是为 Fedora 维护者编译的,所以正确的东西应该可用,但我不知道它的确切名称是什么,或者如何找到它并使其可用。

请帮忙。 .

如果您看到有关缺少特定库的错误,您可以使用 dnf 本身来查找名称。例如,在 Fedora 35 上:

$ sudo dnf repoquery --whatprovides '*qt-mt*'
qt3-0:3.3.8b-88.fc35.i686
qt3-0:3.3.8b-88.fc35.x86_64
qt3-devel-0:3.3.8b-88.fc35.i686
qt3-devel-0:3.3.8b-88.fc35.x86_64

我猜你只需要dnf install qt3-devel

至于lib​​jpeg,你有没有安装libjpeg-turbo-devel?配置程序通常寻找 -devel 的东西而不仅仅是库 (libjpeg)。如果您已安装它但仍未被提取,则可能该软件与 libjpeg-turbo 不兼容。解决这个问题将是一个单独的挑战。

这里最好的办法是使用 higher-level 工具。具体来说,使用 mock。这是一个工具:

  • 管理构建环境(chroot 或 container-based), 所以你不必担心,
  • 处理诸如构建依赖项之类的事情,因此您不必担心,并且
  • 确保您的构建是“干净的”而不是受您自己的用户环境的影响,因此您不必担心这一点。

简而言之:mock --rebuild six-*.src.rpm

使用 mock 让我能够构建包,但我无法弄清楚如何对其进行进一步的工作,因为 mock 留下的 chroot 似乎不起作用。所以我用不同的方式问了这个问题,得到了一个非常好的答案(第二个)。