`

如何制作RPM包(转)

阅读更多

以前写的一篇文档,文章重点在于讲清如何快速上手和会碰到的问题。并不是软件文档的中文翻译,要看大全或faq的见参考文献

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目录中去。

2. 一个spec文件的例子
spec文件实际上很简单。一个spec文件可以划分为三个部分(我的理解):必要信息,shell脚本(shell scripts),要打包的文件清单(file list,在spec文件中用%files标示)。

所 谓必要信息,就是诸如公司名,源代码包名,打包者的名字之类的杂七杂八的信息,为什么要提供这些信息是显而易见的。其中的Source变量指定了源代码包 的来源,我的例子给出了源代码包的文件名,有些spec文件会给出源代码包的url,但是结果和我这里没什么区别。对于打包系统来说,它会忽略掉url, 提取出源代码包的文件名。BuildRoot变量设定了$RPM_BUILD_ROOT的值。

shell脚本是在打包以及运行安装程序的 过程中必须运行的一些脚本程序,例如删除文件,移动文件,创建目录等等。在%prep,%build,%install,%clean各section下 (每个section对应打包过程中的一个阶段)都是一些常见的shell脚本或命令。%setup -q是一个宏,对应解压缩源代码包,进入源代码包目录等几个动作,你可以不使用这个宏而自己写脚本命令。但是使用宏显然方便很多。%setup的细节请参 考Maximum RPM。

要打包的文件清单部分在spec文件中用%files标示,例如:
%files
#defattr的定义请参阅RPM HOWTO
%defattr(-,root,root)
#hello文件放入最后生成的安装包中,其安装路径为/usr/local/bin
/usr/local/bin/hello

打包者应该在文件清单部分中指定放入于安装包中的二进制文件名,打包者也要指定运行安装包后该文件最终应被安装到哪里。

例如上例中的"/usr/local/bin/hello",说明了hello这个可执行程序(打包系统会在$RPM_BUILD_ROOT下的相应子目录寻找hello)应被放入安装包中,运行安装包后hello将最终被安装到/usr/local/bin目录下。

以下是一个spec文件的例子,完整的源代码,脚本以及spec文件见附件(附件找不着了!) :
#--------------------hello-1.0.0-1.spec----------------begin
Summary: a simple "hello world" app
Name:hello
Version: 1.0.0
Release: 1
Copyright: Commercial
URL: http://www.kodak.com
Source: %-%.tar.gz
Vendor: Kodak Inc.
Packager:  Jerry Chen <jerry.chen@kodak.com>
Group: Applications/Multimedia
#指定了$RPM_BUILD_ROOT的值
BuildRoot:/var/tmp/%-%-%-root


%description
a simple "hello world" app. you can do nothing useful with it.

%prep
#解压缩源代码包,进入源代码包目录
%setup -q

%build
#就是make了
make

%install
rm -rf $RPM_BUILD_ROOT
#编译好的二进制文件安装到环境变量$RPM_BUILD_ROOT所指定的目录中去。
make DESTDIR="$RPM_BUILD_ROOT" install

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
#hello文件放入最后生成的安装包中,其安装路径为/usr/local/bin
/usr/local/bin/hello

%changelog
#--------------------hello-1.0.0-1.spec----------------end

3. 参考文献
网上关于rpm package的文档,我认为比较有价值的罗列如下:

Packaging software with RPM, Part 1 & Part 2
http://www-128.ibm.com/developerworks/library/l-rpm1/
http://www-128.ibm.com/developerworks/library/l-rpm2/
入门文档,也提供了一些有用的信息。

Maximum RPM
http://www.rpm.org/max-rpm/index.html
大全。

RPM HOWTO
http://www.tldp.org/HOWTO/RPM-HOWTO/
入门文档,相对于"Packaging software with RPM",可读性稍差。

RPM Tutorial
http://genetikayos.com/code/repos/rpm-tutorial/trunk/rpm-tutorial.html
一个操作手册而已,对于没有root权限的打包者有一定的价值。但称为tutorial恐怕有点问题

分享到:
评论

相关推荐

    国产服务器操作系统(麒麟)平台上tar.gz转rpm安装包.docx

    本文针对国产服务器Arm架构及国产操作系统中相关tar.gz转rpm安装包制作步骤

    openssh-9.6p1-1.ky10.src.rpm

    银河麒麟v10 sp2 制作openssh rpm二进制包的源码包 2023年12月29日制作,具体制作过程可阅读我的博客文章,如有疑问咨询本人。

    leap-fedora-rpm:Fedora的LeapMotion RPM

    由于外来Deb到RPM转换不适用于fedora 19和20(由于软件包冲突),我决定为Leap二进制文件制作RPM包装。 RPM非常基本,简单,灵活,可以修改,默认情况下,master分支用于x86,x64分支用于x64 arch。 如何生成RPM ...

    linux.chm文档

    rpm -q -a --qf '{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示...

    pkg.deps:查找R软件包的依赖关系和系统要求

    系统需求:libcurl:libcurl-devel(rpm)或libcurl4-openssl-dev(deb)。 当安装大量软件包(或具有很多依赖性的软件包)时,手动检查这些要求可能很耗时。 运行install.packages ,注意哪些软件包失败并查找...

    Windows Media Player解码器下载.rar

    理论上让你只用操作系统自带的Windows Media Player播放器,可以播放除WMP自身支持的格式外,还能播放以下格式ape、flac、aac、wv、mp4、m4a、m4b、m4p、m4v、mp4v、3gp、3g2、rm、ra、ram、rmvb、rp、rpm、rt、mov...

    python入门到高级全栈工程师培训 第3期 附课件代码

    03 rpm软件包管理 04 yum软件包管理 05 源码安装python3.5 06 ssh服务 07 apache服务 08 samba服务 第9章 01 Python开发系列课程概要 02 Python作业要求以及博客 03 编程语言介绍 04 Python种类介绍 05 Python安装...

    基于Arduino开发板设计的机器人完整电路方案-电路方案

    您还可以通过此视频了解如何制作自己的arduino uno板。 您可以使用此控制板对具有5种不同场景的机器人进行编程。此项目包括以下方案: 相扑模式:这是一项运动,其中两个机器人试图将彼此推出一个圆圈(与相扑运动类似...

    基于ATmega328P控制器设计的避障机器人电路方案(源码+pcb+电路图)-电路方案

    您还可以通过此视频了解如何制作自己的arduino uno板。 您可以使用该控制板对具有5种不同场景的机器人进行编程。此项目包括以下方案: 相扑模式:这是一种运动,其中两个机器人试图将彼此推出一个圆圈(与相扑运动类似...

    阿香婆出品压缩文档管理工具 Ashampoo ZIP Pro 3.0.26 中文多语免费.zip

    ZIP、RAR、TAR、CAB 等等 – Ashampoo ZIP 都能快速可靠的打开,还会自动合并分卷包。 阿香婆出品压缩文档管理工具 Ashampoo ZIP Pro 中文版阿香婆出品压缩文档管理工具 Ashampoo ZIP Pro 中文版 Ashampoo 加密套装...

    LINUX 24学时教程

    本书详细讲解了用Linux的图形配置工具配置Caldera OpenLinux,...19.2.4 使用StarCalc制作数据表图 313 19.3 课时小结 314 19.4 专家答疑 314 19.5 练习题 315 第20学时 休闲与玩Linux操作系统中的 游戏 316 20.1 使用...

    LINUX安装与配置简明手册

    3.2.5 制作一张Windows下的引导盘 24 3.2.6 从软盘开始运行安装程序 25 3.2.7 为一个专用的本地网络分配IP地址 25 3.2.8 从引导管理程序失误中恢复NT 25 3.2.9 制作一张定制的Linux操作系统 引导盘 26 3.2.10 设置...

    linux安装与配置简明手册

    3.2.5 制作一张Windows下的引导盘 24 3.2.6 从软盘开始运行安装程序 25 3.2.7 为一个专用的本地网络分配IP地址 25 3.2.8 从引导管理程序失误中恢复NT 25 3.2.9 制作一张定制的Linux操作系统 引导盘 26 3.2.10 ...

    Linux高级bash编程

    解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释 12-30. Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令 12-32. 在一个脚本中使用 cmp 来比较2个文件. 12-33. basename 和 dirname 12-34. 检查...

    Advanced Bash-Scripting Guide <>

    35.4. 制作这本书的工具 35.4.1. 硬件 35.4.2. 软件和排版软件 35.5. Credits Bibliography A. Contributed Scripts B. Reference Cards C. A Sed and Awk Micro-Primer C.1. Sed C.2. Awk D. Exit Codes With ...

    若干源程序资料12.rar

    2012-06-11 21:09 27,688 用单片机制作的高精度数显计数器.rar 2012-06-11 21:10 9,654 用单片机实现公历到农历换算的新方法.zip 2012-06-11 21:08 2,318 用英文单词模拟数学计算代码.txt 2012-06-11 21:06 13,654 ...

Global site tag (gtag.js) - Google Analytics