rpmbuild制作rpm包
以制作lttng-ust软件的rpm包为例,进行讲解。
rpmbuild制作rpm包执行流程
rpmbuild 命令选项执行的动作
-bp nginx.spec制作到%prep段
-bc nginx.spec制作到%build段
-bi nginx.spec执行 spec 文件的 “%install” 阶段 (在执行了 %prep 和 %build 阶段之后)。这通常等价于执行了一次 “make install”
-bb nginx.spec制作二进制包(在执行了 %prep 和 %build 阶段之后)
-bs nginx.spec仅制作源码包
-bl nginx.spec从spec文件宏扩展%files段,检查并且验证每个文件是否存在
-ba nginx.spec表示既制作二进制包又制作src格式包(在执行了 %prep 和 %build 阶段之后)
spec文件简介
spec file由%开头的宏定义的域段落组成,我们可以在不同的段落写执行shell命令来完成编译,安装等功能。
%prep 预处理段,顾名思义,该段内容通常用来执行一些解压缩开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,比如mkdir,cp。
%build 主要执行make命令。
%install 执行make install安装程序 ,可以指定PREFIX。也可以做其他shell 命令满足安装软件的需求。
%clean 安装完,清理临时文件或者编译的文件
%files 用于定义程序所包含的文件,可执行程序,配置文件,说明文档(doc),还可定义文件访问权限,owner 属组。
%changelog 操作日志,记录rpm变更的记录 谁,什么时间,做了什么内容。
%prerpm 安装前执行的脚本
%postrpm 安装后执行的脚本
%preun rpm卸载前执行的脚本
%postunrpm 卸载后执行的脚本
根据日志来看,上面的每个阶段相当于执行了一个shell脚本。
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.nQjypc
...
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.393q2l
...
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.GMGUry
...
安装rpm工具
sudo yum install rpm-build rpmdevtools -y
创建rpm目录
rpmdev-setuptree
这六个目录的作用分别是:
BUILD : rpmbuild编译软件的目录
BUILDROOT : rpmbuild安装软件的目录
RPMS : rpmbuild创建binary RPM所存放的目录
SOURCES : 存放源代码的目录
SPECS : 存放spec文件的目录
SRPMS : rpmbuild创建souce RPM所存放的目录
制作源码包
从github下载lttng-ust-2.10.3.tar.gz源码包,解压并进入源码目录:
./bootstrap
./configure
make
make dist-gzip # 生成tar包
制作rpm包
将上一步生成的tar包拷贝到SOURCES目录下,然后进入到SPECS目录,执行以下命令:
rpmdev-newspec lttng-ust
生成一个lttng-ust.spec文件,如下图所示:
填写相关的内容,重点关注%file的内容:
%files
%defattr(-,root,root,-)
%{_bindir}
%{_libdir}
%{_datadir}
生成rpm包:
rpmbuild -ba lttng-ust.spec
在RPMS目录下查看rpm包的内容:
rpm -qpl lttng-ust-2.10.3-1.el7.centos.x86_64.rpm
制作rpm包的过程中,若出现错误Installed (but unpackaged) file(s) found,解决方案如下:
1. 修改/usr/lib/rpm/macros文件中下面的行:
%__check_files /usr/lib/rpm/check-files %{buildroot} #注释掉
2. 修改/usr/lib/rpm/macros文件中以下的行:
%_unpackaged_files_terminate_build 1 #把1改为0只警告
同一个spec文件同时生成多个rpm包
添加一个%package阶段,例如要多生成一个devel包,配置如下:
%package devel
Summary: The LTTng User Space Tracing (LTTng-UST) library allows any C/C++ application to be instrumented for and traced by LTTng.
%description devel
查看spec配置文件中相关宏的定义
rpm --eval "%{_bindir}"
常见的宏:
%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_lib} lib (lib64 on 64bit systems)
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datadir} %{_prefix}/share
%{_includedir} %{_prefix}/include
%{_oldincludedir} /usr/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
spec配置文件的写法
spec配置文件基础知识