简述
若要构建一个标准的 RPM 包,需要创建 .spec 文件,其中包含软件打包的全部信息。然后,使用 rpmbuild 命令,按照 spec 文件的配置,系统会按照步骤生成最终的 RPM 包。
另外,需要注意的是,在使用时,需要使用普通用户,一定不要用 root 用户。
过程
yum install rpmdevtools -y
rpmdev-setuptree
cp example.spec ~/rpmbuild/SPECS
cp example.tar.bz2 ~/rpmbuild/SOURCES/
rpmbuild -ba ~/rpmbuild/SPECS/example.spec
其中example.tar.bz2是源码包,编译步骤已经在example.spec中有所定义
制作RPM包
spec文件规范
序号 | 参数 | 详解 |
1 | Name | 软件包的名称,后面可使用%{name}的方式引用 |
2 | Version | 版本号,后面可使用%{version}引用 ,一般是x.y.z的格式,其中xyz都是数字 |
3 | Release | 发行号,后面可使用%{release}引用 默认设置为1%{?dist},即每次制作RPM包时递增1,dist代表的是特定操作系统,如el7代表centos7 |
4 | Summary | 对软件包的简要说明 |
5 | License | 软件授权方式,如GPL(自由软件)或GPLv2,BSD |
6 | URL | 软件的主页 ,如:URL: http://example.com/ |
7 | Source0 | 源代码包的名字 (默认都是*.tar.bz2方式的) |
8 | %prep | 预处理用来执行一些解开源程序包的命令,为下一步的编译安装作准备 |
9 | %setup | 解压源代码,将当前目录改为源代码解压之后产生的目录 |
10 | %build | 编译软件包所要执行的命令 |
11 | %install | 安装软件包时将执行命令 |
12 | %clean | 清理(作用同rm-rf $RPM_BUILD_ROOT) |
13 | %files | 软件包所包含的文件,包括说明文档(doc),配置文件(config)及执行程序 |
14 | %changelog | 更新日志,每次软件的更新内容可以记录在此到这里,以便查用 |
15 | BuildRequires | 制作过程中依赖的软件包 |
16 | Requires | 安装时所依赖的软件包 |
17 | %if …… %endif |
rpmbuild目录
序号 | 默认位置 | 宏代码 | 名称 | 用途 |
1 | ~/rpmbuild/SPECS | %_specdir | spec文件目录 | 保存RPM包配置(.spec)文件 |
2 | ~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如tar包)和所有patch补丁 |
3 | ~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
4 | ~/rpmbuild/BUILDROOT | %_buildrootdir | 最终安装目录 | 保存%install阶段安装的文件 |
5 | ~/rpmbuild/RPMS | %_rpmdir | 标准RPM包目录 | 生成保存二进制RPM包 |
6 | ~/rpmbuild/SRPMS | %_srcrpmdir | 源代码RPM包目录 | 生成保存源码RPM包(SRPM) |
rpmbuild 构建 debuginfo包
在使用rpmbuild构建rpm包时,往往能够自动打出debuginfo包。如果不想要,可以
echo "%debug_package %{nil}" >> ~/.rpmmacros
如果不想拆分出debuginfo包,让binary包里就是带调试符号的,可以在spec文件头加上
%global debug_package %{nil}
如果想打出debuginfo包,而默认却打不出来,可以检查机器是否安装了redhat-rpm-config包,如果没有,就会因为缺少brp-compress工具而打不出debuginfo包
查看当前系统发行版
rpm -qi centos-release
- 查看大版本
rpm -q --qf %{Version} centos-release;echo
- 查看发行版本
rpm -q --qf %{Release} centos-release;echo
- 查看CPU架构
rpm -q --qf %{Arch} centos-release;echo
批量检测包是否安装
rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n'
gcc \
gcc-c++ \
glibc \
glibc-devel
包名可以随意增加或替换