如何在 Fedora 中创建 GNU Hello World RPM 包
RPM(RPM Package Manager 的递归缩写)是 Linux 的免费开源包管理系统。虽然它最初是为在 Red Hat Linux 中使用而创建的,但现在它已在许多 Linux 发行版中使用,例如 CentOS、Fedora 和>OpenSuse。重要的是,名称 RPM 指的是包管理器程序,而 .rpm
是一种文件格式。
在本文中,我们将讲解如何编写 RPM 文件,展示如何轻松创建简单的源代码和二进制软件包,例如 Fedora Linux 中的 GNU “Hello World” RPM 包强>分布。我们假设您对预制 RPM 包以及免费开源软件构建过程有一些基本了解。
在 Fedora 中安装开发工具
我们首先在 Fedora Linux 中设置开发环境,运行以下命令来安装构建 RPM 所需的工具。
sudo dnf install fedora-packager @development-tools
接下来,将您的非特权帐户添加到“mock”组,如下所示(将 howtoing 替换为您的实际用户名)。这将使您能够在干净的 chroot 中测试构建过程。
sudo usermod -a -G mock tecmint
现在,在 ~/rpmbuild
目录中创建 RPM 构建,并使用以下命令验证构建。它将显示子目录列表,其中包含项目源代码、RPM 配置文件和二进制包。
rpmdev-setuptree
tree ~/rpmbuild/
以下是每个目录的含义:
- BUILD – 构建包时存储各种 %buildroot 目录。
- RPMS – 将在 Architecture 的子目录中包含二进制 RPM。
- SOURCES – 存储压缩源档案和任何补丁,rpmbuild 命令将在此处查找它们。
- SPECS – 存储 SPEC 文件。
- SRPMS – 存储源 RPM,而不是二进制 RPM。
构建“Hello World”RPM
这一步需要下载我们正在打包的Hello World项目的源码(也称为“上游”源码),放入~/rpmbuild/SOURCE 目录,使用以下 wget 命令。
cd ~/rpmbuild/SOURCES
wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz -P ~/rpmbuild/SOURCES
接下来,让我们使用 ~/rpmbuild/SPECS 中的 .spec
文件(在本例中将其命名为 hello.spec
)来配置 RPM 包> 目录,使用 rpmdev-newspec 程序。
cd ~/rpmbuild/SPECS
rpmdev-newspec hello
ls
然后使用您喜欢的编辑器打开 hello.spec
文件。
vim hello.spec
默认模板应如下所示:
Name: hello
Version:
Release: 1%{?dist}
Summary:
License:
URL:
Source0:
BuildRequires:
Requires:
%description
%prep
%autosetup
%build
%configure
%make_build
%install
rm -rf $RPM_BUILD_ROOT
%make_install
%files
%license add-license-file-here
%doc add-docs-here
%changelog
* Tue May 28 2019 Aaron Kili
我们简单解释一下 .spec
文件中的默认参数:
- 名称 – 用于设置包的名称。
- 版本 – 应镜像上游。
- 发布 – 您在 Fedora 中工作的号码。
- Summary – 是对包的简短单行描述,第一个字母应大写以避免 rpmlint 投诉。
- 许可证 – 通过检查源文件和/或其许可证文件和/或与作者交谈来检查软件的许可证状态。
- URL – 指定软件包的主页。
- Source0 – 指定源文件。它可以是直接的 URL,也可以是软件压缩源代码的路径。
- BuildRequires – 指定构建软件所需的依赖项。
- 需要 – 指定运行软件所需的依赖项。
- %prep – 用于创建构建 rpm 包的环境。
- %build – 用于编译和构建源代码。
- %install – 用于安装程序。它列出了将生成的文件从构建过程复制到 BUILDROOT 目录所需的命令。
- %files – 此部分列出了软件包提供的文件,这些文件将安装在系统上。
- %changelog – 应存储准备 RPM 的工作,特别是在基本上游源代码之上包含安全和错误补丁的情况下。它是在创建 hello.spec 文件时自动生成的。变更日志数据通常通过 rpm --changelog -q
显示。
现在编辑您的 .spec
文件并进行更改,如图所示。
Name: hello
Version: 2.10
Release: 1%{?dist}
Summary: The "Hello World" program from GNU
License: GPLv3+
URL: http://ftp.gnu.org/gnu/%{name}
Source0: http://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.gz
BuildRequires: gettext
Requires(post): info
Requires(preun): info
%description
The "Hello World" program package
%prep
%autosetup
%build
%configure
make %{make_build}
%install
%make_install
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi
%files -f %{name}.lang
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello
%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING
%changelog
* Tue May 28 2019 Aaron Kili
您会注意到我们在上面的文件中使用了一些尚未解释的新参数。这些称为宏,用于构建由 RPM 定义的系统调用来设置软件包的安装路径。因此,通常最好不要在规范文件中硬编码这些路径,而是使用相同的宏以保持一致性。
以下是 RPM 构建和目录宏及其定义和默认值:
- %{make_build} – 用于规范文件的 %build 部分,它运行 make 命令。
- %{name} – 定义包或目录名称。
- %{buildroot} – %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch},与 $BUILDROOT 相同
- %{_infodir} – %{_datarootdir}/info,默认:/usr/share/info
- %{_mandir} – %{_datarootdir}/man,默认:/usr/share/man
- %{_bindir} – %{_exec_prefix}/bin,默认:/usr/bin
请注意,您可以在 /usr/lib/rpm/platform/*/macros 中找到这些宏的值,或者参阅打包指南:RPM 宏。
构建 RPM 包
要构建源代码包、二进制包和调试包,请运行以下 rpmbuild 命令。
rpmbuild -ba hello.spec
构建过程结束后,源 RPM 和二进制 RPM 将分别在 ../SRPMS/
和 ../RPMS/
目录中创建。您可以使用rpmlint程序来检查并确保创建的spec文件和RPM文件符合RPM设计规则:
rpmlint hello.spec ../SRPMS/hello* ../RPMS/*/hello*
如果出现如上屏幕截图所示的任何错误,请先修复它们,然后才能继续。
最后但并非最不重要的一点是,使用模拟程序来检查软件包构建是否会在 Fedora 受限构建环境中成功。
mock --verbose ../SRPMS/hello-2.10-1.fc29.src.rpm
有关更多信息,请参阅 Fedora 文档:创建 RPM 包。
就这样!在本文中,我们解释了如何升级 Fedora 系统以创建简单的源代码和二进制软件包。我们还展示了如何创建 GUN Hello Word RPM 包。如有任何问题或意见,请使用下面的反馈表联系我们。