|
发表于 2003-6-9 13:52:46
|
显示全部楼层
重新排版!
另一个如下:[code:1]
制作Linux RPM包
RPM是Redhat Package Manage的缩写。透过RPM的管理,使用者可以把Source Code包装成一种
Source和Binary的档案形式。利用它,我们可以用Binary的档案进行安装,用 Source 的档案形式重新
整理包装。许多Linux爱好者对安装RPM包比较熟悉,但对如何在Linux下制作RPM包不甚了解,因此,
我将通过实例,讲解如何在Linux下制作RPM包。
1. 最初要求
为了创建RPM,你需要RPM要编译的源代码、一个rpmrc文件(设置一些RPM的缺省值并控制它的行为),
以及一个spec文件(控制包的建立过程)。这里假定已有其它的开发环境(gcc、make、install、vi等),
而且你的源代码已经编译成功。
2. 制作流程
1)确定/etc/rpmrc(也可能是/usr/lib/rpm/rpmrc)已经正确设定。rpmrc文件控制几乎所有RPM的行
为。如果你想重载一个或多个全局设置,可以在~/.rpmrc文件中包含你的定制。可以使用rpm--showrc
来显示RPM的当前设置。大多数情况下,rpmrc 文件的设置不需要改变。
2)取回所建造的源代码并放入正确的目录中。
3)编写spec文件。
4)使用rpm -ba 来构造整个程式套件。
3.应用举例
现在以Lynx实用程序来介绍构造RPM包的整个过程。Lynx是在文本方式下的Web浏览器,可以从
ftp://www.slcc.edu/pub/lynx/取得。
1)得到lynx源代码。
2)lynx-2.8.spec文件的详细编写方法略。
3)使用RPM来构造包。
按照rpmrc文件的缺省设置,应该把lynx-2.8.spec文件放入SPECS/目录下,然后执行:
rpm -ba lynx-2.8.spec
其中-b 表示prep、compile、install,并build出一份binary RPM包。-a 表示执行所有的build动作,
即还要build 出一份source code RPM包。
如果一切顺利的话,可以在RPMS/目录下找到lynx-2.8-4.i386.rpm文件。可以执行:
rpm -qpl lynx-2.8-4.i386.rpm
来观察RPM 包中是否包含了要求的所有文件。
为了测试它的正确性,可以拷贝此文件到另一台机器上,并执行:
rpm -ivh lynx-2.8-4.i386.rpm
进行安装测试。
一旦测试成功,就可以上载你的大作,享受成功的喜悦。
制作RPM包需要开发人员做很多工作。比如不仅要懂得c/c++编程,而且还要能熟练掌握像make、
autoconf、diff、patch、tar、install等工具的使用并能编写spec文件。但从长远来看,应用RPM,在
软件包的维护和方便性方面使得开发者受益。
在使用linux的过程中可能可能需要安装新的软件,升级已安装的软件或删除已安装的
软件,这就或多或少要涉及到rpm.
Rpm是redhat公司开发的一种源代码和二进制代码封装的方式,这种封装的方式能让用
户轻松的进行软件包的管理,包括软件包的安装、升级、删除、查询和管理。由于采用rpm
方式安装软件包无论是从二进制和源代码方面来讲,都比用.tar.gz的方式要简单的多.故用
rpm安装软件成了一个linux下安装软件的标准.对于一个有志于linux下软件软件编程的程
序员来说,掌握简易的rpm套件的制作对于推广自己的程序非常有用.
Rpm套件的制作大致可分为:
1. 取得.tar.gz格式的软件源程序和补丁文件.
2. 制作rpm套件的spec规格文件.
3. 执行rpm –ba 产生并测试rpm套件.
整个包装rpm套件的重心就在于如何定义完整的rpm套件规格文件(specification)以及包装后的测试工
作.制作rpm套件之前,必须先了解整个系统文件的目录结构与运行,因为某些rpm套件的制作会常常牵扯
到系统运行的问题,比如安装了某种新的shell,就必须在/etc/shells中加入该shell的可执行文件路径和名
称,才能正确的使用该shell.为了免除考虑这个顾虑,可以先从无关系统运行的应用软件做起,等对linux系
统相当熟悉了,再尝试这些涉及到系统运
行的rpm套件制作.
Rpm的Spec就如同编译程序时的Makefile,定义制作Rpm包的所有文件信息及制作流程,其主要工作将
源程序解压缩,为源程序打补丁,编译源程序,包装二进制码Rpm包,包装源代码Rpm包,清除包装过程在
Build目录产生的临时目录.它山之石,可以攻玉.多看看他人已经编好的spec文件,是学习spec文件编写
的捷径,用以下命令将spec文件取出.
$:rpm –qlp *.src.rpm
$:rpm2cpio *.src.rpm|cpio –ivh *.spec
首先执行rpm –qlp查询,得知该套件中有个.spec文件,再执行rpm2cpio将rpm文件转换成cpio文件
格式,并将转换结果输出给cpio程序,把source rpm套件中的sepc文件解压取出.打开一个spec文件,
可以发现它可以分为以下几个段: %define、 %description、%prep、%build、%install、%clean、
%files、%changelog。
%define段主要用来做一些全局定义,如:版本号:Version;简单的概要:Summary;程序的名称:
Name;版权:Copyright;软件所属的组:Group;Source名称是最重要的位置,这里定义Source的
来源(一些tar.gz文件和一些补丁文件,若该软件的Source不仅只有一个文件,可以指定多重源程序,只需
要将"Source"和"Patch"标签编号,依次指定即可),用户必须把该文件放在/usr/src/redhat/SOURCES
目录下,rpm才可以进行包装工作;icon指名该套件的图标,前提必须是一个gif文件,且位于
/usr/src/redhat/source目录下;常常在安装某些软件是会出现某些依赖关系信息,告诉用户必须先安装
某些套件才能安装这个rpm套件的情况,需要制作这种功能的rpm套件,就是依赖"Requires"这个标签,
Requires共有<、〉、<=、=、 >=这五种.若某软件同时需要用到三四个函数库,则Requires标签就必须
定义三四行.或用逗号隔开写成一行.如: Requires: kdesupport.当然, %define段的标签还有几个,不过
不 常用,这里就不再多说了.
%description段较为简单,主要是对该软件的一个简要的介绍.
%prep 段是spec的准备段,该段主要执行包装Rpm包的准备工作,检查标签语法是否正
确,检查/usr/src/redhat/SOURCES目录是否存放源程序及补丁文件,删除旧的软件源程序,
并替程序作untar、patch等工作。当然,这些工作可以写一些shell script来进行指定的
工作,但是如果真的写shell script来进行这些准备工作,可能会令人苦恼。于是rpm开
发人员为用户提供了%setup和%patch这两个命令来替用户处理这些繁杂的准备工作。
%setup 不加任何选项,仅将软件包打开。
%setup –n newdir 将软件包解压在newdir目录。
%setup -c 解压缩之前先产生目录。
%setup –b num 将第num个source文件解压缩。
%setup –T 不使用default的解压缩操作。
%setup –T –b 0 将第0个源代码文件解压缩。
%setup –c –n newdir 指定目录名称newdir,并在此目录产生rpm套件。
%patch 最简单的补丁方式,自动指定patch level。
%patch 0 使用第0个补丁文件,相当于%patch –p 0。
%patch –s 不显示打补丁时的信息。
%patch –T 将所有打补丁时产生的输出文件删除。
%build 段主要是用来完成程序的编译,通常情况下是一个make命令用来完成编译。
%install这个段较为复杂,该段主要执行安装的工作,在这里你可以写一些脚本将程序加入菜单栏中,由
于各个发行版不同,各个脚本也不通用,简单的就是执行make install来完成程序的安装(视不同程序的
安装而定)。
%clean段是spec的删除段,它是使用rm –f命令删除编译时的临时目录,一般用rm -rf
$RPM_BUILD_ROOT即可。
%files、%changelog段分别用来告诉用户软件安装的地方和软件的一些更新的日志等。
做完这些后,一个spec文件便就完成了,执行rpm –ba 产生并测试rpm套件,如果没出什么错的话,
便就会产生相应的二进制rpm包和源代码的srpm包。它们分别位于/usr/src/Redhat/RPMS和
/usr/src/Redhat/SRPMS目录下(注:我使用的是Redhat 7.0,不同的发行版本路径有差别). [/code:1]
献给樱家冢斑竹!因为我的RPM做的很丑,希望他能一直为了我们共同的LINUX努力! |
|