rpmbuild 制作rpm 包
准备工作
要使用 rpmbuild 制作rpm包,需要安装以下软件
yum install -y rpm-build gcc make rpmlint rpmdevtools
下载软件的源码包
wget xxx-1.0.1.tar.gz
生成需要的目录结构
rpmdev-setuptree
#
tree
……
└── rpmbuild
├── BUILD
├── BUILDROOT(有时不存在,rpmbuild过程会自动创建)
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
准备一个普通用户,rpm包的制作不需要root的权限,普通用户就可以完成,以最小化权限,使用普通用户
useradd rpmbuilder
su - rpmbuilder
查看 rpm 包信息
# 查看rpm的Info 信息 rpm -qi xxx
[root@localhost ~]# rpm -qi openssh
Name : openssh
Version : 7.4p1
Release : 22.el7_9
Architecture: x86_64
Install Date: 2023年04月05日 星期三 13时07分24秒
Group : Applications/Internet
Size : 1991172
License : BSD
Signature : RSA/SHA256, 2021年12月01日 星期三 22时15分22秒, Key ID 24c6a8a7f4a80eb5
Source RPM : openssh-7.4p1-22.el7_9.src.rpm
Build Date : 2021年11月25日 星期四 00时35分17秒
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.openssh.com/portable.html
Summary : An open source implementation of SSH protocol versions 1 and 2
Description :
SSH (Secure SHell) is a program for logging into and executing
commands on a remote machine. SSH is intended to replace rlogin and
rsh, and to provide secure encrypted communications between two
untrusted hosts over an insecure network. X11 connections and
arbitrary TCP/IP ports can also be forwarded over the secure channel.
OpenSSH is OpenBSD's version of the last free version of SSH, bringing
it up to date in terms of security and features.
This package includes the core files necessary for both the OpenSSH
client and server. To make this package useful, you should also
install openssh-clients, openssh-server, or both.
install 命令
参数 | 功能 |
---|---|
-b | 类似--backup 但不接受参数 |
-c | (忽略) |
-C, --compare | 比较每组源文件和目标文件,在一些情况下不修改目标文件 |
-d, --directory | 将所有参数视为目录名称;为指定的目录创建所有组件 |
-D | 创建目标目录的所有必要的父目录,然后将源文件复制至该目录 |
-g, --group=组 | 自行设置所属组,而不是进程目前的所属组 |
-m, --mode=模式 | 自行设置权限模式(像chmod),而不是rwxr-xr-x |
-o, --owner=所有者 | 自行设置所有者(只适用于超级用户) |
-p, --preserve-timestamps | 修改源文件的访问/修改时间以与目标文件保持一致 |
-s, --strip | 拆解符号表 |
--strip-program=程序 | 指定拆解二进制文件的程序 |
-S, --suffix=后缀 | 覆盖常用备份文件后缀 |
-t, --target-directory=目录 | 将源文件所有参数复制到指定目录 |
-T, --no-target-directory | 将目标文件视为普通文件 |
-v, --verbose | 创建目录时显示其名称 |
-P, --preserve-context | preserve SELinux security context (-P deprecated) |
-Z --context[=CTX] --help --version | set SELinux security context of destination file to default type like -Z, or if CTX is specified then set the SELinux or SMACK security context to CTX 显示此帮助信息并退出 显示版本信息并退出 |
什么是宏
在RPM打包中,SPEC文件是用来描述如何构建一个RPM包的文件。宏(Macro)是SPEC文件中一种特殊的占位符,它们被预定义或自定义,用于在构建过程中动态地生成和替换值。宏的使用使得SPEC文件更加灵活和可重用,尤其在不同系统环境下构建软件包时非常有用。
在SPEC文件中,宏以%
符号开头,后面跟着宏的名称。宏的形式有两种:
内置宏(Built-in Macros):这些是RPM系统预定义的宏,用于描述系统相关的信息,如操作系统版本、CPU架构、时间戳等。一些常见的内置宏包括:
%{name}
:RPM包的名称。%{version}
:RPM包的版本号。%{release}
:RPM包的发布号。%{dist}
:系统的发行版信息。%{buildroot}
:构建时的根目录。
用户定义宏(User-defined Macros):这些是在SPEC文件中自定义的宏,用于在构建过程中使用用户指定的值。用户可以根据需要自由定义宏,并在SPEC文件的其他部分引用它们。这样可以方便地在SPEC文件中多处使用相同的值,从而减少冗余和错误。
例如,我们在之前提供的Redis的SPEC文件中使用了%{?dist}
宏。在构建RPM包时,这个宏将被替换为系统的发行版信息,例如"el7"(表示CentOS 7)或"fc32"(表示Fedora 32)等。这样,即使在不同的系统上构建Redis的RPM包,都能正确地包含系统相关的信息。
理解和使用宏可以使SPEC文件更加灵活、通用,并且可以轻松地适应不同的构建环境。在创建自己的SPEC文件时,可以根据需要合理地利用内置宏和自定义宏来提高构建效率和可维护性。
在以下位置可以查看已经定义的宏
rpmbuild --showrc | grep macrofile #查看macro文件在哪里
cat /usr/lib/rpm/macros
#根据实际情况 redhat
可能有所变化
cat /usr/lib/rpm/redhat/macros
关于目录的宏
%_builddir
= %{_topdir}/BUILD
%_rpmdir
= %{_topdir}/RPMS
%_sourcedir
= %{_topdir}/SOURCES
%_specdir
= %{_topdir}/SPECS
%_srcrpmdir
= %{_topdir}/SRPMS
%_buildrootdir
= %{_topdir}/BUILDROOT
%_topdir
= %{getenv:HOME}/rpmbuild
%_buildrootdir
= %{_topdir}/BUILDROOT
%buildroot
= %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
%{_bindir}
= %{_exec_prefix}/bin
%{_exec_prefix}
= %{_prefix}
%{_prefix}
= /usr
什么是 GROUP
GROUP 用来标识软件的分组,系统支持哪些分组可以查看如下文件:
rpm-4.11.3 是当前rpm 的版本,实际情况根据自己的环境有所变化
cat /usr/share/doc/rpm-4.11.3/GROUPS
目录介绍
使用 rpmdev-setuptree
命令会在用户的家目录下创建一个 rpmbuild 目录,并在下面创建6个子目录
├── BUILD
├── BUILDROOT(有时不存在,可手动创建)
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
目录 | 功能 |
---|---|
BUILD | 编译rpm 包的临时目录 |
BUILDROOT | 编译后生成的软件临时安装目录 |
RPMS | 最终生成的可安装rpm 的所有目录 |
SOURCES | 所有源代码和补丁文件的存放目录 |
SPECS | 存放SPEC文件的目录(重要) |
SRPMS | 软件最终的rpm 源码格式存放路径 |
SPEC 文件介绍
以redis的某个版本为例 redis-6.2.5.tar.gz
参考,不能直接运行
Name: redis
Version: 6.2.5
Release: 1%{?dist}
Summary: Persistent key-value database
License: BSD
URL: https://redis.io/
Source0: %{name}-%{version}.tar.gz
Source1: redis.conf
BuildRequires: gcc
BuildRequires: make
Requires: bash
%description
Redis is an open-source, in-memory key-value store.
%prep #
%setup -q
%build
make %{?_smp_mflags}
%install
make DESTDIR=%{buildroot} install
%files
%{_bindir}/redis-server
%{_bindir}/redis-cli
%{_bindir}/redis-benchmark
%{_bindir}/redis-check-aof
%{_bindir}/redis-check-rdb
%{_mandir}/man1/redis-server.1.gz
%{_mandir}/man1/redis-cli.1.gz
%{_mandir}/man1/redis-benchmark.1.gz
%{_mandir}/man1/redis-check-aof.1.gz
%{_mandir}/man1/redis-check-rdb.1.gz
%changelog
* Fri Jul 23 2023 Your Name <your.email@example.com> - 6.2.5-1
- Initial RPM release
Name
:- 功能介绍:指定RPM包的名称,这里设置为"redis"。
- 注意事项:名称应该简短、描述性,并且只能包含小写字母、数字和连字符(-)。
Version
:- 功能介绍:指定RPM包的版本号,这里设置为"6.2.5"。
- 注意事项:版本号应该遵循一致的格式,通常使用"主版本.次版本.修订版本"的形式。
Release
:- 功能介绍:指定RPM包的发布号,这里设置为
1%{?dist}
。 - 注意事项:发布号通常表示软件包的更新或修订,可以是任意整数。
%{?dist}
是一个宏,用于在构建过程中包含系统的发行版信息。
- 功能介绍:指定RPM包的发布号,这里设置为
Summary
:- 功能介绍:提供RPM包的简短描述,这里设置为
Persistent key-value database
。 - 注意事项:应该简洁地描述RPM包的用途,帮助用户快速了解其作用。
- 功能介绍:提供RPM包的简短描述,这里设置为
License
:- 功能介绍:指定RPM包的许可证,这里设置为"BSD"。
- 注意事项:确保正确声明软件的许可证,根据源码文件的许可填写,这对于一些开源许可证是必要的。
URL
:- 功能介绍:指定软件的官方网址,这里设置为"https://redis.io/"。
- 注意事项:提供一个有效的URL,使用户能够获取有关软件的更多信息。
Source0
:- 功能介绍:指定RPM构建时使用的源代码包的名称和位置。如果有多个源文件,可依赖添加
Source1
,Source2
- 注意事项:确保
Source0
字段与SOURCES
目录下实际的源代码包名称一致。
- 功能介绍:指定RPM构建时使用的源代码包的名称和位置。如果有多个源文件,可依赖添加
BuildRequires
:- 功能介绍:指定构建RPM包所需的软件包和依赖项。
- 注意事项:列出所有在构建过程中需要的软件包,以确保构建成功。
Requires
- 功能介绍:指定安装RPM包所需的软件包和依赖项。
- 注意事项:列出所有在安装过程中需要的软件包,以确保安装成功,安装时,如果指定的包没有安装则安装会失败。
%description
:
- 功能介绍:提供对RPM包的详细描述,用于说明软件包的功能和特性。
- 注意事项:应该清楚、详细地描述软件包,帮助用户了解它的用途。
%prep
:- 功能介绍:准备构建过程的预处理阶段。(通常不需要编写,除非有特殊需求)
- 注意事项:在此部分可以执行必要的预处理操作,例如解压源码包等。
%build
:- 功能介绍:执行实际的编译过程。(一般是
make
) - 注意事项:在此部分应该调用make或其他适当的构建命令。
- 功能介绍:执行实际的编译过程。(一般是
%configure
:- 功能介绍:用于自动配置源代码目录中的软件包,以便根据目标系统的配置和环境进行适当的设置。这通常用于自动执行
./configure
脚本,用于生成Makefile
等构建文件,以便构建软件包。 - 注意事项:尽管
%configure
在某些常见的 SPEC 文件中被广泛使用,但实际上,它并不是RPM SPEC 文件的标准宏。这意味着它并不是预定义的内置宏,而是由一些发行版或软件包维护者定义的自定义宏。
- 功能介绍:用于自动配置源代码目录中的软件包,以便根据目标系统的配置和环境进行适当的设置。这通常用于自动执行
%install
:- 功能介绍:将编译得到的二进制文件和其他文件安装到构建根目录, (一般是
make install
)。 - 注意事项:确保安装所有必要的文件,并将它们放置在正确的位置。
- 功能介绍:将编译得到的二进制文件和其他文件安装到构建根目录, (一般是
%files
:- 功能介绍:列出RPM包中包含的文件和目录。(把需要打包进rpm的文件都要添加进入,通常包含
bin
文件,config
文件,及man
帮助文件) - 注意事项:应该仅包含构建过程中安装到构建根目录的文件,多写会少写都可能在制作过程中报错。
- 功能介绍:列出RPM包中包含的文件和目录。(把需要打包进rpm的文件都要添加进入,通常包含
%changelog
:- 功能介绍:提供RPM包的变更历史,注意编写格式即可。
- 注意事项:在每次更新或发布RPM包时,都应该更新变更历史以提供相关信息。
%post
:- 功能:在安装软件包后执行脚本或命令。
%preun
:- 功能:在卸载软件包之前执行脚本或命令。
%postun
:- 功能:在卸载软件包后执行脚本或命令。
%triggerpostun
:- 功能:在卸载软件包后执行触发脚本。
%pretrans
:- 功能:在安装软件包之前执行事务脚本。
%verifyscript
:- 功能:提供脚本用于在安装和卸载时验证软件包。
%preverify
:- 功能:在安装之前执行验证脚本。
%postverify
:- 功能:在安装后执行验证脚本。
%triggerin
:- 功能:在安装时执行触发脚本。
%triggerun
:- 功能:在卸载时执行触发脚本。
%triggerprein
:- 功能:在安装之前执行触发脚本。
%clean
:- 功能:清理构建过程中生成的临时文件。
%check
:- 功能:执行自动化测试,用于检查软件包是否正确构建。
Group(组)
:- 功能:在旧版的RPM SPEC文件中,"Group"字段用于指定RPM包所属的类别或组别。例如,可以在该字段中指定"System Environment/Daemons"或"Development/Libraries"等类别。
- 注意:然而,从RPM版本4.13开始,"Group"字段已被弃用,不再使用。相反,"Group"字段的功能已由"Categories"和"Keywords"属性所取代,这些属性可以在AppStream元数据中定义。
在创建SPEC文件时,注意正确填写字段值、包含所有必要的依赖项和文件,并且确保所有操作在目标系统上是安全和正确的。SPEC文件的正确性对于构建高质量的RPM包至关重要。不是所有字段都需要写的
案例
以redis的某个版本为例 redis-7.0.12.tar.gz
详情
Name: redis
Version: 7.0.12
Release: 1%{?dist}
Summary: Persistent key-value database
License: BSD
URL: https://redis.io/
Source0: %{name}-%{version}.tar.gz
Source1: redis.conf
BuildRequires: gcc
BuildRequires: make
Requires: bash
%description
Redis is an open-source, in-memory key-value store.
%prep #
%setup -q
%build
make %{?_smp_mflags}
%install
make PREFIX=%{buildroot} install
install -D -m 0644 %{SOURCE1} %{buildroot}/etc/redis/redis.conf
%files
%defattr(-,root,root,-)
/bin/redis-*
/etc/redis/redis.conf
%changelog
* Sun Jul 23 2023 Change <your.email@example.com> - 7.0.12-1
- Initial RPM release
[root@localhost ~]# rpm -qi redis
Name : redis
Version : 7.0.12
Release : 1.el7
Architecture: x86_64
Install Date: 2023年07月23日 星期日 22时52分48秒
Group : Unspecified
Size : 4270062
License : BSD
Signature : (none)
Source RPM : redis-7.0.12-1.el7.src.rpm
Build Date : 2023年07月23日 星期日 22时52分23秒
Build Host : localhost
Relocations : (not relocatable)
URL : https://redis.io/
Summary : Persistent key-value database
Description :
Redis is an open-source, in-memory key-value store.
# spec中的 %{?dist} = el7
注意事项
1、制作rpm 包之前一定要细节查看源码包的安装过程及依赖,这些信息在 BuildRequires
, %build
,%install
, %configure
可能起到至关重要的作用
2、在编辑 spec 的时候,尽量使用宏
这样编写更直观、维护更简单
3、 %files
的默认根路径是 %{buildroot},所以 spec文件中的 /etc/redis
= %{buildroot}/etc/redis
,默认情况 %{buildroot}
= 用户家目录/rpmbuild/BUILDROOT/
4、有能力话可以自定义宏
来管理整个 rpmbuild
构建过程中的一些特殊需求
5、%files
中添加的路径是什么,rpm 安装后就放在什么位置,所以要合理规划路径