内容提要
本文介绍了在Redhat系发行版上打包软件的过程与Archlinux的区别,包括构建命令、目录结构、自动安装依赖和撤销命令效果等。作者建议使用rpmbuild-wrapper脚本实现以makepkg方式打开rpmbuild的目标。
延伸解读
目录结构差异与自定义方法
Redhat 系默认将所有软件包的构建集中在一个 rpmbuild 目录下,而 Archlinux 则为每个软件包创建独立目录。通过修改 $HOME/.rpmmacros 中的宏定义,如 %_topdir、%_builddir 等,可以将 rpmbuild 的目录结构改为类似 Arch 的布局,使每个软件包在当前目录下构建,但构建产物仍会存放在架构子目录中。
依赖管理的自动化与撤销
rpmbuild 本身不支持自动安装依赖,但可以使用 dnf builddep 命令根据 spec 文件安装构建依赖。构建完成后,可通过 dnf history undo 撤销依赖安装,但若依赖在安装过程中被更新,撤销时可能因找不到旧版本而失败,此时可添加 --skip-broken 选项跳过问题包。
源文件下载与构建选项
rpmbuild 默认禁止自动下载源文件,但可以通过 --undefine=_disable_source_fetch 选项或使用 spectool -gR 命令实现自动下载。此外,rpmbuild 默认会构建源码包,若只想构建二进制包,可使用 -bb 选项,这与 makepkg 的默认行为一致。
Q&A
Archlinux 和 Redhat 系发行版在软件打包上有什么主要区别?
Archlinux 的构建目录结构更为简洁,每个软件包有独立目录,而 Redhat 系的 rpmbuild 则在统一的 rpmbuild 目录下构建,包含多个子目录。
如何在 Fedora 中使用 rpmbuild 创建类似 Archlinux 的目录结构?
可以通过修改 $HOME/.rpmmacros 文件,重新定义 %_topdir 和其他相关宏,以实现类似 Archlinux 的目录结构。
Fedora 的 rpmbuild 如何处理依赖安装?
Fedora 的 rpmbuild 不支持自动安装依赖,但可以使用 dnf 的 builddep 命令手动安装依赖。
如何撤销在 Fedora 中安装的依赖?
可以使用 dnf history undo 命令撤销安装的依赖,但可能会遇到版本问题。
rpmbuild 是否支持自动下载源文件?
rpmbuild 默认不支持自动下载源文件,但可以使用 --undefine=_disable_source_fetch 选项或 spectool 命令来实现。
rpmbuild 和 makepkg 的构建行为有什么不同?
makepkg 默认只构建最终的安装包,而 rpmbuild 使用 -bb 选项可以构建最终安装包和源包。