RPM 简易打包

本文为RPM打包简易指南,只讲解如何将二进制文件或脚本文件进行RPM打包。

准备工作

笔者的打包环境为Ubuntu 12.10,因此后续的打包过程只适用Ubuntu和Debian系统(openSuSE和Fedora等系统有所区别)。

安装打包工具

首先安装RPM打包工具,使用以下命令进行安装:

1
$ sudo apt-get install rpm

注:上述命令适用Ubuntu 12.04、Ubuntu 12.10以及Debian 6,其它发行版本未验证。

创建打包目录

接着自定义打包目录,使用以下命令创建打包目录:

1
2
3
4
5
6
7
8
$ mkdir ~/rpm
$ mkdir -p ~/rpm/BUILD
$ mkdir -p ~/rpm/BUILDROOT
$ mkdir -p ~/rpm/RPMS/i386
$ mkdir -p ~/rpm/RPMS/x86_64
$ mkdir -p ~/rpm/SOURCES
$ mkdir -p ~/rpm/SPECS
$ mkdir -p ~/rpm/SRPMS

其中BUILD是存放编译过程中的临时文件,BUILDROOT存放打包文件(一般为打包二进制文件),RPMS存放根据不同架构生成的rpm包,SOURCES用来存放源码包,SPECS用来存放spec文件,SRPMS用来存放srpm包。

设置环境

创建完打包目录后,还需设置打包路径,可通过修改topdir宏的值来自定打包路径:

1
$ echo %_topdir $HOME/rpm > ~/.rpmmacros

设置完毕后,可以使用以下命令查看自定打包路径:

1
$ rpm --showrc|grep _topdir
-14: _builddir    %{_topdir}/BUILD
-14: _buildrootdir    %{_topdir}/BUILDROOT
-14: _rpmdir    %{_topdir}/RPMS
-14: _sourcedir    %{_topdir}/SOURCES
-14: _specdir    %{_topdir}/SPECS
-14: _srcrpmdir    %{_topdir}/SRPMS
-14: _topdir    /home/yyhoo/rpm

打包

老生常谈,以Hello World为例,开始讲解二进制文件的打包过程。

编写源码

1
2
3
4
5
6
7
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}

将上述文件保存为 hello.c,并使用gcc进行编译:

1
$ gcc hello.c -o hello

创建hello包目录

使用终端进入BUILDROOT目录,并创建hello包目录:

1
2
$ mkdir hello-1.0-1.i386
$ mkdir -p hello-1.0-1.i386/usr/local/bin

将之前生成的hello移至hello-1.0-1.i386/usr/local/bin目录中。

编写spec文件

切换至SPEC目录下,并编写hello.spec文件,内容如下:

Summary: Hello World rpm package
Name: hello
Version: 1.0
Release: 1
License: GPL
Packager: mutse
Group: Application
URL: http://mutse.tk

BuildRoot: %{_builddir}/%{name}
AutoReqProv: no

%description
This is a software for rpm package.

%prep
%build
%install

%pre
%post
chmod 755 /usr/local/bin/hello

%files
/usr/local/bin/hello

打包

一切准备就绪,开始使用rpmbuild工具打包,操作如下:

1
2
$ cd ~/rpm/SPEC
$ rpmbuild -bb --target=i386 hello.spec

输出内容如下:

构建目标平台:i386
构建目标 i386
正在执行 (%prep):/bin/sh -e /var/tmp/rpm-tmp.myHgCr
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ exit 0
正在执行 (%build):/bin/sh -e /var/tmp/rpm-tmp.T5dlla
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ exit 0
正在执行 (%install):/bin/sh -e /var/tmp/rpm-tmp.Wl7B4S
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip /usr/bin/strip
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
Processing files: hello-1.0-1.i386
正在检查未被打包的文件:/usr/lib/rpm/check-files
 /home/yyhoo/rpm/BUILDROOT/hello-1.0-1.i386
已写入:/home/yyhoo/rpm/RPMS/i386/hello-1.0-1.i386.rpm
正在执行 (%clean):/bin/sh -e /var/tmp/rpm-tmp.1zLS0k
+ umask 022
+ cd /home/yyhoo/rpm/BUILD
+ /bin/rm -rf /home/yyhoo/rpm/BUILDROOT/hello-1.0-1.i386
+ exit 0

至此,打包过程结束。生成的rpm包存放在~/rpm/RPMS/i386目录下。

结语

本文档只作为RPM打包的简易指南,更详细内容请查阅RPM官方最新打包手册。

参考资料: