网站搜索

如何在 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/

以下是每个目录的含义:

  1. BUILD – 构建包时存储各种 %buildroot 目录。
  2. RPMS – 将在 Architecture 的子目录中包含二进制 RPM。
  3. SOURCES – 存储压缩源档案和任何补丁,rpmbuild 命令将在此处查找它们。
  4. SPECS – 存储 SPEC 文件。
  5. 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 包。如有任何问题或意见,请使用下面的反馈表联系我们。