大多数 rpm 包的制作都是用源码包来编译构建,而我的需求是直接将可运行的二进制文件制作成 rpm 包,而且是在 Ubuntu 系统上。 上的大部分资料都是源码来制作 rpm 包,且比较零乱、不完整。rpm 制作的重要一步就是编写 spec 文件,在该文件中定义了如何编译源码,然后又如何打包的过程。通过大量的资料查阅和分析,最后发现在 spec 文件中把 源码编译的部分删掉便可以直接将二进制文件制作成 rpm 包。
安装 rpm 工具
制作 rpm 包需要用到 rpmbuild 工具。在 ubuntu 上,该工具包含在 rpm 包中,可以直接从源里安装:
sudo apt-get install rpm
配置工作路径
在制作 rpm 包之前,首先要配置工作路径,也就是制作 rpm 包所在的目录。制作 rpm 包需要有一个特定的目录结构。当前的工作路径保存在宏 中,可以通过 rpmbuild 命令查看:
rpmbuild –showrc | grep topdir
默认情况下工作路径为当前用户目录下的 rpmbuild 目录。如果你不想在用户目录下的rpmbuild目录制作rpm包,可以在当前用户目录下的 .rpmmacros 文件(如果没有,则创建)中修改宏 的配置,例如:
建立构建目录结构
在类 redhat 系统中,可以用 rpmdev-setuptree 命令直接在常见所需的目录结构,而在 Ubuntu 系统貌似没有该工具,那么手动创建即可:
mkdir -pv /home/konghy/workdir/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
目录说明:
通过源码编译制作软件包时, 一般都把源码打包成 tar.gz 格式然后存放于 SOURCES 路径下,而在 SPECS 路径下编写 spec 文档,编译生成的二进制文件会临时的存放在 BUILDROOT 目录下等待打包,打包完成后会被删除,通过命令打包后,默认会把打包后的 rpm 包放在 RPMS 下,而源码包会被放置在SRPMS下。
编写 spec 文件
在我看来, spec 文件核心的部分就只有两个部分:一个是软件包的基本信息描述部分,其中、、 三个字段是必须的,最终生成的软件包的名字会依赖于此;另一个是 段,它定义需要打包的文件。剩下的大致也可以分为两个部分:一个是定义源码的编译过程,这里不做详述;另一个是定义安装和卸载前后要做的工作,主要在四个段中定义:
对于 阶段有两个比较重要的特性:
-
%{buildroot}里的所有文件都要明确被指定是否要被打包到rpm里。例如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要 错的;
-
如果声明了%{buildroot}里不存在的文件或者目录也会 错。
下面是一个 spec 文件模板:
spec 文档中常用的几个宏(变量):
开始打包
制作 rpm 包需要用 rpmbuild 命令,其基本格式为:
rpmbuild [options] [spec文档|tarball包|源码包]
其他的一些选项
例如我的构建方式为:
rpmbuild -bb –target=i686 SPECS/codeblocks.spec
构建过程输出如下信息:
参考资料
https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn
http://blog.csdn.net/justlinux2010/article/details/9905425
http://blog.chinaunix.net/uid-23069658-id-3944462.html
http://www.jinbuguo.com/redhat/rpmbuild.html
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!