linux rpm包的制作详解

上传人:小** 文档编号:90015265 上传时间:2019-06-06 格式:PDF 页数:8 大小:617.49KB
返回 下载 相关 举报
linux rpm包的制作详解_第1页
第1页 / 共8页
linux rpm包的制作详解_第2页
第2页 / 共8页
linux rpm包的制作详解_第3页
第3页 / 共8页
linux rpm包的制作详解_第4页
第4页 / 共8页
linux rpm包的制作详解_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《linux rpm包的制作详解》由会员分享,可在线阅读,更多相关《linux rpm包的制作详解(8页珍藏版)》请在金锄头文库上搜索。

1、RPMRPM 包的制作包的制作详解详解 常见的 Linux 发行版主要可以分为两类,类 ReadHat 系列和类 Debian 系列,这里我们是 以其软件包的格式来划分的,这两类系统分别提供了自己的软件包管理系统和相应的工具。 类 RedHat 系统中软件包的后缀是 rpm;类 Debian 系统中软件包的后缀是 deb。另一方面,类 RedHat 系统提供了同名的 rpm 命令来安装、卸载、升级 rpm 软件包;类 Debian 系统同样提 供了 dpkg 命令来对后缀是 deb 的软件包进行安装、卸载和升级等操作。 rpm 的全称是 Redhat Package Manager,常见的使用

2、 rpm 软件包的系统主要有 Fedora、 CentOS、openSUSE、SUSE 企业版、PCLinuxOS 以及 Mandriva Linux、Mageia 等。使用 deb 软 件包后缀的类 Debian 系统最常见的有 Debian、Ubuntu、Finnix 等。 无论是 rpm 命令还是 dpkg 命令在安装软件包时都存在一个让人非常头疼的问题, 那就是 软件包的依赖关系。这一点很多人应该深有体会,这也使初学者在接触 Linux 系统时觉得很 不方便的地方。庆幸的是,很多发行版都考虑到了这问题,于是 Fedora 和 CentOS 提供了 yu m 来自动解决软件包的安装依赖,

3、同样的 openSUSE 提供了 zypper,类 Debian 系统提供了 ap t-*命令。 也就是说这些工具本质上最终还是调用了 rpm(或者 dpkg)是不过安装前自动帮用户 解决了软件包的安装依赖。如下表所示: 分类 发行版 手动安装命令 自动安装命令 软件包后缀 类 RedHat Fedora/CentOS rpm yum *.rpm openSUSE/SUSE zypper Mandriva Linux/Mageia urpmi 类 Debian Debian/Ubuntu dpkg apt-get *.deb 简单点了说,如果你会在 Fedora 或者 CentOS 上用 yu

4、m 来自动安装软件包,那么在 Debi an 或者 Ubuntu 上你就会用 apt-get 自动安装软件,同理,在 openSUSE 上你就会用 zypper 自动安装软件包。 本文档主要描述如何通过软件包的源代码构建自己的 rpm 软件安装包。 从软件运行的结构来说,一个软件主要可以分为三个部分:可执行程序、配置文件和动 态库。当然还有可能会有相关文档、手册、供二次开发用的头文件以及一些示例程序等等。 其他部分都是可选的,只有可执行文件是必须的。 关于如何制作 rpm 软件包的方法,网上教程也一大堆,谈及最多的当属 rpmbuild 这个命 令行工具。这也是本文要介绍的“配角”,而主角是它

5、的输入对象,也就是所谓的 SPEC 文件 的格式,写法和说明。 rpm 的打包流程相比 deb 的要稍微麻烦一些,因为它对打包目录有一些严格的层次上的 要求。如果你的 rpm 的版本=4.2.2。还有 其他依赖的话则以逗号分别继续写道后面。 Requires: = 编译好的 rpm 软件在其他机器上安装时, 需要 依赖的其他软件包,也以逗号分隔,有版本需求的可以 %description = 软件包的详细说明信息, 但最多只能有 80 个英 文字符。 下面我们来看一下制作 rpm 包的几个关键阶段,以及所发生的事情: 阶段 动作 %prep 将%_sourcedir 目录下的源代码解压到%_b

6、uilddir 目录下。如果有补丁的需要 在这个阶段进行打补丁的操作 %build 在%_builddir 目录下执行源码包的编译。一般是执行./configure 和 make 指令 %install 将需要打包到 rpm 软件包里的文件从%_builddir 下拷贝%_buildrootdir 目录 下。当用户最终用 rpm -ivh name-version.rpm 安装软件包时,这些文件会安 装到用户系统中相应的目录里 制作rpm包 这个阶段是自动完成的,所以在 SPEC 文件里面是看不到的,这个阶段会将%_bu ildroot 目录的相关文件制作成 rpm 软件包最终放到%_rpmd

7、ir 目录里 %clean 编译后的清理工作,这里可以执行 make clean 以及清空%_buildroot 目录等 每个阶段的详细说明如下: %prep%prep 阶段阶段 这个阶段里通常情况,主要完成对源代码包的解压和打补丁(如果有的话),而解压时最 常见到的就是一句指令: %setup -q 当然,这句指令可以成功执行的前提是你位于 SOURCES 目录下的源码包必须是 name-ver sion.tar.gz 的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用 这条指令,那么后面每个阶段都要自己手动去改变相应的目录。解压完成之后如果有补丁文 件,也在这里做。想了解

8、的童鞋可以自己去查查如何实现,也不难,这里我就不展开了。 %build%build 阶段阶段 这个阶段就是执行常见的 configure 和 make 操作,如果有些软件需要最先执行 bootstr ap 之类的,可以放在 configure 之前来做。这个阶段我们最常见只有两条指令: %configure make %?_smp_mflags 它就自动将软件安装时的路径自动设置成如下约定: 可执行程序可执行程序/usr/bin/usr/bin 依赖的动态库依赖的动态库/usr/lib/usr/lib 或者或者/usr/lib64/usr/lib64 视操作系统版本而定视操作系统版本而定。 二

9、次开发的头文件二次开发的头文件/usr/include/usr/include 文档及手册文档及手册/usr/share/man/usr/share/man 注意,这里的%configure 是个宏常量,会自动将 prefix 设置成/usr。另外,这个宏还 可以接受额外的参数,如果某些软件有某些高级特性需要开启,可以通过给%configure 宏传 参数来开启。如果不用 %configure 这个宏的话,就需要完全手动指定 configure 时的配置 参数了。同样地,我们也可以给 make 传递额外的参数,例如: make %?_smp_mflags CFLAGS=“ %install%i

10、nstall 阶段阶段 这个阶段就是执行 make install 操作。这个阶段会在%_buildrootdir 目录里建好目录 结构, 然后将需要打包到 rpm 软件包里的文件从%_builddir 里拷贝到%_buildrootdir 里对应 的目录里。这个阶段最常见的两条指令是: rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT 其中$RPM_BUILD_ROOT 也可以换成我们前面定义的 BuildRoot 变量,不过要写成%build root才可以,必须全部用小写,不然要报错。 如果软件有配置文件或者额外的启动

11、脚本之类, 就要手动用 copy 命令或者 install 命令 你给将它也拷贝到%buildroot相应的目录里。用 copy 命令时如果目录不存在要手动建立, 不然也会报错,所以推荐用 install 命令。 %clean%clean 阶段阶段 编译完成后一些清理工作,主要包括对%buildroot目录的清空(当然这不是必须的), 通常执行诸如 make clean 之类的命令。 制作制作 rpmrpm 软件包的阶段软件包的阶段 这个阶段必须引出下面一个叫做%files 的阶段。它主要用来说明会将%buildroot目录 下的哪些文件和目录最终打包到 rpm 包里。 %files %def

12、attr(-,root,root,-) %doc 在%files 阶段的第一条命令的语法是: %defattr(文件权限,用户名,组名,目录权限) 如果不牵扯到文件、 目录权限的改变则一般用%defattr(-,root,root,-)这条指令来为其 设置缺省权限。所有需要打包到 rpm 包的文件和目录都在这个地方列出,例如: %files %_bindir/* %_libdir/* %config(noreplace) %_sysconfdir/*.conf 在安装 rpm 时,会将可执行的二进制文件放在/usr/bin 目录下,动态库放在/usr/lib 或 者/usr/lib64 目录下

13、,配置文件放在/etc 目录下,并且多次安装时新的配置文件不会覆盖以 前已经存在的同名配置文件。 这里在写要打包的文件列表时,既可以以宏常量开头既可以以宏常量开头,也可以为也可以为“/”“/”开头开头,没任何本质没任何本质 的区别的区别,都表示从%buildroot中拷贝文件到最终的 rpm 包里;如果是相对路径,则表示要 拷贝的文件位于%_builddir目录,这主要适用于那些在%install 阶段没有被拷贝到%buil droot目录里的文件,最常见的就是诸如 README、LICENSE 之类的文件。如果不想将%buil droot里的某些文件或目录打包到 rpm 里,则用: %exc

14、lude dic_name 或者 file_name 但是关于%files 阶段有两个特性要牢记: %buildroot里的所有文件都要明确被指定是否要被打包到 rpm 里。 什么意思呢?假如, % buildroot目录下有 4 个目录 a、b、c 和 d,在%files 里仅指定 a 和 b 要打包到 rpm 里,如 果不把 c 和 d 用 exclude 声明是要报错的; 如果声明了%buildroot里不存在的文件或者目录也会报错。 关于%doc 宏, 所有跟在这个宏后面的文件都来自%_builddir目录, 当用户安装 rpm 时, 由这个宏所指定的文件都会安装到/usr/share

15、/doc/name-version/目录里。 %changelog%changelog 阶段阶段 这是最后一个阶段,主要记录的每次打包时的修改变更日志。标准格式是: * date +“%a %b %d %Y“ 修改人 邮箱 本次版本 x.y.z-p - 本次变更修改了那些内容 说了这么多,我们实战一下。网上很多教程都是拿 Tomcat 或者 Nigix 开头,这里我就先 从简单的 mp3 解码库 libmad 入手,将它打成一个 rpm 包,具体步骤如下: (如果自己系统上没有 rpmbuild 命令就安装之: yum install rpm* rpm-build rpmdev*) 1、构建

16、rpm 的编译目录结构: 2、下载 libmad 源码到 rpmbuild/SOURCES 目录下,可以从 http:/downloads.source 这里下载。 3、在 rpmbuild/SPECS 目录下执行 rpmdev-newspec -o libmad-0.15.1b.spec,会在当 前目录下生成名为 libmad-0.15.1b.spec 的模板文件。 4、将 libmad-0.15.1b.spec 修改成如下的样子: 5、在 rpmbuild/SPECS 目录下执行打包编译: rpmbuild -bb libmad-0.15.1b.spec 最终生成的 rpm 包如下: 因为我是 64 位系统,所以编译出的 libmad 适用于 CentOS6.0-64。 如果我们将 libmad 的源码和 spec 文件拷贝 32 位系统上,再执行 rpm 打包,看看结果: 结果如下: 后记

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号