1. 概述以及难点这里的概述仅仅是我的理解。如果要获得准确全面的信息,建议阅读“参考文献”一章。 开发者需要书写一个后缀名为spec的文本文件(简称spec文件),该文件提供了将应用程序打包(package)必须的配置信息。开发者在填写完这个配置文件(就是spec文件)后,只需要运行打包软件rpmbuild(通常是输入命令行"rpmbuild -ba your_application.spec),rpmbuild读入spec文件上的配置信息,自动生成rpm包。书写spec文件的内容是打包者的主要工作。 这里有个关键,理解这个关键是阅读并正确书写spec文件的前提。 关键在于,rpm是为开源软件设计的打包软件,它假设软件的打包者对于要打包的软件并不熟悉,例如打包者对他(她)要打包的软件的熟悉度,只是知道如何获得源代码包并解压缩源代码包,然后“./configure;make;make install”。即使这样,打包者也可以成功地制作rpm包。如果不理解这点,你可能会误会打包过程中的“install”(意义见后文),就是普通用户安装程序中的“安装”。实际上,打包过程中的install仅仅是处理源代码包的一个步骤而已。后文会详细解释这个问题。 和通常商业打包软件不同的是,在spec文件中,你*可以*提供(通过设置Source变量)软件的源代码包的完整文件名(注意:不是完整路径!具体原因见后文)。几乎所有的开源软件都提供源代码包的文件名(例如hello-1.0.0.tar.gz)。打包系统会根据且*仅*根据文件名(和文件名一起提供的路径自动被忽略)在并且*仅仅在*某个特定目录找到这个源代码包。这里的“特定目录”由%/SOURCES指定,_topdir是环境变量,可以输入命令行rpmbuild --showrc查看这个变量,在redhat linux系统中,%的值是/usr/src/redhat,具体细节参考RPM Tutorial和Maximum RPM。 打包系统找到这个源代码包后,它会解压缩源代码包(解压缩至%/BUILD目录中)并且将当前工作目录切换到解压缩后的源代码包根目录里(这个阶段可以认为是prepare阶段,在spec文件中简写为%prep),然后它开始编译源代码包(这个阶段是build阶段,在spec文件中简写为%build),然后它会将编译出的binary文件安装(这个阶段是install阶段,在spec文件中简写为%install)到用户指定的某个目录(可以由$RPM_BUILD_ROOT这个环境变量访问)。接着打包系统进入清理阶段,它会删除一些打包过程中产生的临时文件(这个阶段是clean阶段,在spec文件中简写为%clean)。最后它会输出binary rpm包到%/RPMS/i386中(子目录是i386还是i486,i586,取决于系统的architecture设置),输出source rpm包到%/SRPMS/中。 注意!以上描述中的主语始终是“打包系统”,也就是说,上段中的各个动作都是在打包过程中发生的动作。就是你运行“rpmbuild -ba your_application.spec”后打包系统的一些自动的动作。 即使是install阶段,也只是打包过程中的一个阶段(这个阶段移动了某些临时文件)而已。和最终用户安装rpm包中的“安装”根本是两回事!!! 在cos系统中的spec文件,没有上文所说的“prepare,build”两个阶段,而所谓install阶段,我理解只是例行公事地把编译好的二进制文件移动到$RPM_BUILD_ROOT目录中去。