rpmbuild 常见问题

同时编译 src.rpm 包

我们对 src.rpm 包修改之后,可以编译 rpm 时也打包成新的 src.rpm 包:

~# rpmbuild -ba rpmbuild/SOURCES/inih.spec

宏命令问题

  • %make_build 可以使用 make 代替;
  • %ldconfig_scriptlets 可以使用 ldconfig 代替。

例如 CentOS 7 系统,安装 epel-rpm-macros 软件包之后就可以支持这些宏命令。

指定编译核数

通过环境变量指定核树:

~# export RPM_BUILD_NCPUS=16

如果 spec 文件中以类似 make %{?_smp_mflags} 的方式进行编译,也可以使用 rpm 命令确认核数:

~# rpm --eval "%{?_smp_mflags}"
-j16

忽略依赖 RPM 包

如果 spec 文件指定了依赖某些 RPM 包,rpmbuild 命令可以增加 --nodeps 参数跳过。

如果需要使用依赖的 RPM 包提供的库和头文件,可以增加环境变量使用之前编译的 BUILDROOT 目录:

LIBRARY_PATH=~/rpmbuild/BUILDROOT/XXX/usr/lib64 C_INCLUDE_PATH=~/rpmbuild/BUILDROOT/XXX/usr/include rpmbuild --rebuild --nodeps XXX.src.rpm

忽略 buildroot 检查

rpmbuild 编译到最后可能出现文件报错:

+ /usr/lib/rpm/check-buildroot
/root/rpmbuild/BUILDROOT/at-3.1.10-49.lns8.loongarch64/usr/share/man/man8/atrun.8:.B /root/rpmbuild/BUILDROOT/at-3.1.10-49.lns8.loongarch64/usr/sbin/atd
Found '/root/rpmbuild/BUILDROOT/at-3.1.10-49.lns8.loongarch64' in installed files; aborting
error: Bad exit status from /var/tmp/rpm-tmp.WZgOHN (%install)

可以考虑使用 QA_SKIP_BUILD_ROOT=1 rpmbuild -bb rpmbuild/SOURCES/at.spec 命令增加 QA_SKIP_BUILD_ROOT 环境变量来跳过 buildroot 检查。

条件编译

spec 文件有些功能可以可选编译,例如某些版本的 inih src.rpm 包中包含:

%bcond_without mingw

这样我们就可以使用 rpmbuild 参数关闭 mingw 支持:

~# rpmbuild -bb rpmbuild/SOURCES/inih.spec --without mingw

meson 编译问题

某些系统的 rpmbuild 执行 spec 文件,无法进行 meson 编译,spec 文件中的 %meson 宏实际可能为:

/usr/bin/meson ... '%{_vpath_srcdir}' '%{_vpath_builddir}'

而默认的 %_vpath_srcdir 值为:.,默认的 %_vpath_builddir 值为:%{_target_platform},可能不能正确识别。

可以通过 --define 参数手工定义需要的宏:

~# rpmbuild --define '_vpath_srcdir .' --define '_vpath_builddir %{_target_platform}' --define '__global_ldflags ""' --define '__global_cxxflags ""' --define '__ninja ninja' -bb rpmbuild/SOURCES/inih.spec