如何在Fedora中创建GNU Hello World RPM包

本文解释了如何轻松创建简单的源代码和二进制软件包,例如Fedora Linux中的GNU“Hello World”RPM软件包。

RPMRPM Package Manager的递归首字母缩写)是一个用于Linux的免费开源包管理系统 虽然它最初是为Red Hat Linux创建的,但现在它被用于许多Linux发行版,如CentOSFedoraOpenSuse 重要的是,名称RPM指的是包管理器程序,而.rpm是文件格式。

在本文中,我们将解释编写RPM文件,展示如何轻松创建简单的源代码和二进制软件包,例如, Fedora Linux发行版中的GNU“Hello World” RPM包。 我们假设您对预制RPM包以及免费开源软件构建过程有一些基本的了解。

在Fedora中安装开发工具

让我们首先在Fedora Linux中设置开发环境,方法是运行以下命令来安装构建RPM的必要工具。

$ sudo dnf install fedora-packager @development-tools
在Fedora中安装开发工具

在Fedora中安装开发工具

接下来,将您的非特权帐户添加到“ 模拟 ”组,如下所示(将howtoing替换为您的实际用户名)。 这将使您能够在干净的chroot中测试构建过程。

$ sudo usermod -a -G mock howtoing

现在,在~/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

在此步骤中,您需要使用以下wget命令将我们正在打包的Hello World项目的源代码(也称为“上游 ”源)下载到〜/ rpmbuild / SOURCE目录中。

$ cd ~/rpmbuild/SOURCES
$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz -P ~/rpmbuild/SOURCES

接下来,让我们使用rpmdev-newspec程序在〜/ rpmbuild / SPECS目录中使用.spec文件(在本例中将其命名为hello.spec )配置RPM包。

$ cd ~/rpmbuild/SPECS
$ rpmdev-newspec hello
$ ls
创建Hello规范文件

创建Hello规范文件

然后使用您喜欢的编辑器打开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中工作的数字。
  • 总结 - 是一个简短的单行描述包,第一个字母应该是大写的,以避免rpmlint的投诉。
  • 许可证 - 通过检查源文件和/或其LICENSE文件和/或与作者交谈来检查软件的许可证状态。
  • URL - 指定软件包的主页。
  • Source0 - 指定源文件。 它可以是直接URL或软件压缩源代码的路径。
  • BuildRequires - 指定构建软件所需的依赖项。
  • 要求 - 指定运行软件所需的依赖项。
  • %prep - 用于创建用于构建rpm包的环境。
  • %build - 用于编译和构建源代码。
  • %install - 用于安装程序。 它列出了将生成的文件从构建过程复制到BUILDROOT目录所需的命令。
  • %files - 此部分列出了程序包提供的文件,这些文件将安装在系统上。
  • %changelog - 应该存储准备RPM的工作,特别是如果在基础上游源上包含安全性和bug补丁。 它是在创建hello.spec文件时自动生成的。 changelog数据通常以rpm --changelog -q <packagename>

现在编辑.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定义的系统调用,以设置包的安装路径。 因此,通常最好不要在spec文件中对这些路径进行硬编码,而是使用相同的宏来保持一致性。

以下是RPM构建和目录宏及其定义和默认值:

  • %{make_build} - 用于spec文件的%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中找到这些的值,或参考Packaging Guidelines:RPM Macros

构建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
检查RPM包构建

检查RPM包构建

有关更多信息,请参阅Fedora文档: 创建RPM包

就这样! 在本文中,我们已经解释了如何升级Fedora系统以创建简单的源代码和二进制软件包。 我们还展示了如何创建GUN Hello Word RPM包。 如果您有任何问题或意见,请使用下面的反馈表与我们联系。