在 Ubuntu 下直接将二进制文件制作成 rpm 包

大多数 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进行处理,非常感谢!

上一篇 2016年10月11日
下一篇 2016年10月12日

相关推荐