rpmbuild制作rpm包

rpmbuild制作rpm包

以制作lttng-ust软件的rpm包为例,进行讲解。

参考:
rpmbuild 中文手册
如何制作RPM包
工具|学习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包

参考:Development Packages

添加一个%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配置文件的写法

参考:How to create an RPM package/zh-cn

spec配置文件基础知识

1565257658876

posted @ 2019-08-08 17:49  IUNI_JM  阅读(1507)  评论(0编辑  收藏  举报