简要记录如何编写spec文件来打rpm包。
安装 (1)
以CentOS-7为例:
1 | yum install -y rpmdevtools.noarch rpmlint.noarch |
Spec文件的结构 (2)
首先,假设要打多个rpm包,例如
lua-5.3.6-1.el7.x86_64.rpm
lua-devel-5.3.6-1.el7.x86_64.rpm
lua-static-5.3.6-1.el7.x86_64.rpm
第一个叫main package。打单个rpm包(main package)是打多个包的特例,不比细说。
Spec文件主要包含:
- 元信息:
Name
,Version
,Release
,License
,URL
,Source0
,Source1
, …,Patch0
,Patch1
, …,BuildRequires
Summary
,Group
,Provides
,Requires
- 每个package的元信息写在
%package ${package-name}
的下面,main package除外,可以认为默认是main的元信息。 - 上面我故意把元信息分层2部分(
Name
开头的一行和Summary
开头的一行)。通常,只有main包含第1部分,其它package不须重复,因为一般情况下多个package是一个工程编译构建出来的,源代码(Source)、Patch、编译依赖(BuildRequires)是共同的。
- 编译前准备(
%prep
段):一般是解压并进入源代码目录(%setup
命令),安装patch(%patch0
命令),也可以添加一些自定义操作(用bash写即可); - 编译(
build
段):前一步已经进入源代码目录,现在开始编译。一般linux程序的编译步骤是./configure && make
(用bash写即可)。Rpmbuild工具也提供了一个%configure
命令,应该是调用./configure
。 - 安装到buildroot(
%install
段):- 通常是
make install DESTDIR=%{buildroot}
- 注意,这不是
rpm -hiv
,也不是在目标机器上执行。从命令make install
也可以看出来,是在编译机器上是把编译产生的binaries, headers, libraries, docs, scripts等文件拷贝到buildroot(通常是/root/rpmbuild/BUILDROOT/{name}-{release}.{arch})目录。
- 通常是
- 定义每个package包含哪些文件(
%files
段):例如main应该包含binaries和一些libraries, scripts及docs;devel package应该包含headers和libraries等等。注意:上一步install拷贝的文件要被全覆盖,否则报错。 - 安装前脚本(
%pre
段):在目标机器上执行。执行rpm -hiv
时拷贝文件之前的动作。 - 安装后脚本(
%post
段):在目标机器上执行。执行rpm -hiv
时拷贝文件之后的动作。例如,安装可执行包之后把binaries的目录添加到PATH
;安装devel package之后执行ldconfig
建立libraries索引; - 删除前脚本(
preun
段):在目标机器上执行。执行rpm -e
时删除文件之前的动作。 - 删除后脚本(
%postun
段):在目标机器上执行。执行rpm -e
时删除文件之后的动作。通常是%post
段的反操作,例如把binaries的目录从PATH
删除;删除devel package之后再次执行ldconfig
更新索引; - 清理(
%clean
段): 通常是rm -rf ${buildroot}
. - 修改日志(
%changelog
段):每个release的更新记录;
Spec skeleton:
1 | #%package foo declaration neglected |