LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 12186|回复: 25

RPM 使用和制作教程集合

[复制链接]
发表于 2003-7-29 15:29:55 | 显示全部楼层 |阅读模式
--percent
使用参考:
rpm -i --percent nmap-3.00-4.i386.rpm
用途:
将显示安装的百分比

-h or --hash
使用参考:
rpm -i --hash nmap-3.00-4.i386.rpm
用途:
在大文件安装比较友好,你可以不用怀疑是否机器出毛病了,可知道具体做到哪里.

-vv [for -i option]
使用参考:
rpm -i -vv nmap-3.00-4.i386.rpm
用途:
可以在安装的过程获得更多的信息


--excludedocs
使用参考:
rpm -i --excludedocs nmap-3.00-4.i386.rpm
用途:
将不安装DOC文档, 也就是说你在/usr/share/doc/目下下将没有 nmap-3.00的文档目录. 这在需要斤斤计较安装包所需要的空间比较有用,比如说你在做路由器?

--includedocs
使用参考:
rpm -i --includedocs nmap-3.00-4.i386.rpm
用途:
指定必需安装随包发送的文档

--replacepkgs
使用参考:
rpm -i --replacepkgs nmap-3.00-4.i386.rpm
用途:
即使该包已经安装了,还是强制再次安装一遍 .

--replacefiles
使用参考:
rpm -i --replacefiles nmap-3.00-4.i386.rpm
用途:
即使该包会覆盖一些别的包的文件,也继续安装

--force
使用参考:
rpm -i --force nmap-3.00-4.i386.rpm
用途:
忽略包和文件的冲突,强制安装

--noscripts

使用参考:
rpm -i --noscripts vsftpd
用途:
不执行vsftpd.spec 文件内的 %pre 和 % post脚本
例如: [%pre]
%prep
%setup -q -n %{name}-%{version}
%patch1 -p1 -b .rh
%patch2 -p1 -b .mok
cp %{SOURCE1} .

例如 : [%post]
%post
/sbin/chkconfig --add vsftpd
/usr/sbin/usermod -d /var/ftp ftp >/dev/null 2>&1 || :
                                                                                
                                                                       

--prefix <path>
使用参考:
rpm -i --prefix /tmp/local nmap-3.00-4.i386.rpm
用途:
使该包不安装到默认目录,而是安装到你指定的目录

--ftpproxy
使用参考:
rpm -i --ftpproxy <roxy IP address> ftp://ftp.gnomovision.com/pub/rpms/foobar-1.0-1.i386.rpm

用途:
当你需要通过INTERNET 的FTP直接安装该包的时候,公司的局域网有限制,需要用FTP代理才能访问FTP,那么就应该使用该参数

--ftpport <port>
使用参考:
rpm -i --ftpport <port>  ftp://ftp.gnomovision.com/pub/rpms/foobar-1.0-1.i386.rpm
用途:
当你需要指定特定的端口号时需要使用


如何查询Red Hat 提供的包信息?
先安装一个RPM 包:
rpm -ivh rpmdb-redhat-version.i386.rpm

这个包是redhat的系统生产时附带的rpm包. 你可以通过这个数据包来查看某个特定的文件是由哪个包来提供的,这样可以解决一些包倚赖的问题.

举例说, 当你安装某个包时,出错,说缺少了libX11.so.6, 而你不知道哪个包提供这个文件的,那么可这样做:
rpm --redhatprovides libX11.so.6


--oldpackage
使用参考:
rpm -U --oldpackage packagename-oldversion.rpm
用途:
安装了一个包的更高版本,然后发现该版本有问题? 你更愿意回到低的版本? 没问题,可以"升级"到低的版本.

在RPM中查询更多的游泳信息? 那么应该充分挖掘更多的参数. IT's very powerfull!

--whatprovides
使用参考:
rpm -q --whatprovides /etc/httpd
用途:
查询系统中某个文件,某个目录,某个模块是由哪个包提供的.

--whatrequires
使用参考:
rpm -q --whatrequires module-info

用途:
查询系统中某个文件,某个目录,某个模块是哪个包需要的

-g
使用参考:
rpm -qg Base
用途:
查询属于某个组的包

-d
使用参考:
rpm -qdcf /sbin/dump
用途:
查询某个命令所属的包中相关联的所有已经被安装到系统的文档, 如果你碰到某个命令不知道是什么东西,想找它的参考文档,那么这个命令比较有用

--dump
使用参考:
rpm -ql --dump sendmail
用途:
想知道这个包安装完的所有情况? 包括所有的文件大小?目录位置?所有文件最后被修改的时间?所有文件的owner? group?....可以用这个参数.

--scripts
使用参考:
rpm -q --scripts XFree86
用途:
想看看RPM安装某个包前需要做什么? 安装完做什么? 用这个参数


某些特别的例子.关于查询

-qcf
使用参考:
rpm -qcf /bin/bash
用途:
用于获得某个包的配置文件及其具体位置

-qpil
使用参考:
rpm -qpil nmap-3.00-4.i386.rpm
用途:
查看某个未安装的RPM包的信息









发表于 2003-7-30 16:17:53 | 显示全部楼层

好东西

支持!
发表于 2003-8-12 23:11:42 | 显示全部楼层

回复: 好东西

最初由 boiyoo 发表
支持!

同意。
发表于 2004-1-15 11:19:54 | 显示全部楼层

ZT:rpmfind : rpm2html的客户端工具。(请尊重别人的劳动成果)

作者:Daniel Veillard daniel@veillard.com 翻译:Carelezz carelezz74@hotmail.com 翻译稿版本:0.01 2002/11/02
rpmfind : rpm2html的客户端工具

   1. rpmfind是什么?
   2. 如何使用
         1. 检索软件包
         2. 安装软件包
         3. 升级软件包
         4. 最新软件包的检索
         5. 限定到指定的发行套件
   3. rpmfind的设置文件
   4. 用rpmfind自动升级
   5. 工作原理
   6. 下载
   7. 计划

在给作者发送bug报告邮件之前请先升级rpmfind到最新版,谢谢合作。
rpmfind是什么?

总得来说,rpmfind是一个为你在rufus上寻找RPM软件包的程序。

[译注]rufus是作者D. Veillard 提供的服务器。

举个例子, "rpmfind gimp" ,这个命令告诉你在电脑上安装Gimp需要哪些软件包,哪里可以找到它们,它们会占据多少硬盘空间(因此你也能计算出下载时间),同时为你取得那些软件包。

rpmfind也为电脑上现有的软件包提供查询RPM数据库服务,它支持关键词和正则表达式查询。

rpmfind能运行在一个特别的"upgrade"模式下,这样可以使电脑的上的各种软件包保持最新或者升级软件包到发行套间的新版本。关于此种模式下操作的具体信息,请参考autoupgrade。
如何使用:

Rpmfind有许多种不同的模式,这里只对标准模式下的操作做具体说明
搜寻软件包:

这种模式是根据关键字来检索相关的软件包。语法为"rpmfind --apropos regex" ,它会检索rpmfind.net上所有的软件包,这些软件包以名字和摘要说明为索引。

举个例子,我曾听说过一个类似Borland的编程工具,让我们去找它:

$ rpmfind --apropos borland
1: ftp://rpmfind.net/linux/contrib/i386/rhide-1.3-1.i386.rpm
  rhide : Rhide is a very nice IDE exactly like Borland's
$

看来只检索到一个软件包,理论上所有名字和摘要说明包含关键字的软件包都会显示出来。
安装软件包:

这是rpmfind的“默认”模式,"rpmfind 软件包的名字",rpmfind会根据系统的发行套件为你锁定最合适的软件包,同时也列出其他相关用来处理依存关系的软件包。

举例,让我们在机器上来安装一个名为"xbill"的游戏:

$ rpmfind xbill
Arch : i586, Os : Linux
Default distribution : Red Hat Software(Hurricane)
owning 249 of 338 installed packages
Get http://rpmfind.net//linux/RDF/resources/xbill.rdf
Get http://rpmfind.net//linux/RDF/re ... bill-2.0-2.i386.rdf
Installing xbill will requires 183 KBytes

### To Transfer:
ftp://rpmfind.net/linux/redhat/r ... bill-2.0-2.i386.rpm
Do you want to download these files to /tmp [Y/n/a] ? : y
saving to /tmp/xbill-2.0-2.i386.rpm
$

安装这个游戏只需要一个软件包,它被存在"/tmp"目录下。注意:rpmfind不需要root特权,任何用户都可运行。但是安装软件包无论如何是需要root特权的(执行"rpm -i /tmp/xbill-2.0-2.i386.rpm")。
升级软件包

在“默认”模式下,rpmfind不会尝试着替代现有的软件包,所以存在一个特别的“upgrade”模式用来更新陈旧的软件包。同时它也会检查依存关系并提出更新其它相关软件包的建议:

$ rpmfind -q --upgrade balsa
[search for approx 30 seconds ... 28.8 Kbps PPP connection]
Installing balsa will requires 9574 KBytes

### To Transfer:
ftp://rpmfind.net/linux/freshmeat/libpng/libpng-1.0.1-1.i386.rpm
ftp://rpmfind.net/linux/redhat/r ... ck-3.9.1-1.i386.rpm
ftp://rpmfind.net/linux/redhat-l ... flib-3.0-2.i386.rpm
ftp://rpmfind.net/linux/contrib/ ... flib-3.0-4.i386.rpm
ftp://rpmfind.net/linux/redhat/r ... s-2.0.13-4.i386.rpm
ftp://rpmfind.net/linux/redhat-l ... 1998052414.i386.rpm
ftp://rpmfind.net/linux/redhat-l ... 1998052414.i386.rpm
ftp://rpmfind.net/linux/redhat-l ... 1998052414.i386.rpm
ftp://rpmfind.net/linux/redhat-l ... 1998052414.i386.rpm
ftp://rpmfind.net/linux/redhat-l ... 1998052416.i386.rpm
Do you want to download these files to /tmp [Y/n/a] ? : n
$

"-q" 标志用来减少rpmfind的冗余信息。
最新软件包的检索

rpmfind的最后一个模式是"latest",用来检索最新的软件包。这种模式下rpmfind不会给软件包所属发行套件或厂商优先权,它只会带回最新的软件包:

$ rpmfind -$ rpmfind -q --latest knews
Installing knews will require 668 KBytes

### To Transfer:
ftp://rpmfind.net/linux/redhat/r ... png-0.96-1.i386.rpm
ftp://rpmfind.net/linux/contrib/ ... s-1.0b.0-1.i386.rpm
Do you want to download these files to /tmp [Y/n/a] ? : y
Download libpng-0.96-1.i386.rpm [Y/n/a] ? :y
transfering ftp://rpmfind.net/linux/redhat/r ... png-0.96-1.i386.rpm
saving to /tmp/libpng-0.96-1.i386.rpm
Download knews-1.0b.0-1.i386.rpm [Y/n/a] ? :y
transfering ftp://rpmfind.net/linux/contrib/ ... s-1.0b.0-1.i386.rpm
saving to /tmp/knews-1.0b.0-1.i386.rpm
$

这个选项可能导致对“标准发布”的修改,因此可能致使在用户升级到更新的版本的时候出现问题。
限定到指定的发行套件

"--dist"选项可以使rpmfind按照所指定的发行套件取得相应的软件包:

$ rpmfind --dist redhat gpg

当然也可以在[package]部分使用no_distrib标志:

[packages]

no_distrib=rawhide
Rpmfind配置文件

rpmfind产生并维护一个个人配置文件,保存在"$HOME/.rpmfind"下。

这里有一些选项,它们所代表的意义和默认值是:

version

    这由rpmfind维护,用来检查是否需要升级。

server

    联系指定的RDF服务器,现在rufus是主用的服务器,bu的新镜像服务器也在运行中。

prefix

    定义RPM本地数据库的存放位置,默认在"/usr/local"下,除非RPM不是系统自带的软件包格式。

downloadDir

    定义下载软件包的存放位置,默认是"/tmp"。

httpProxy

    你所使用HTTP代理服务器的地址。

ftpProxy

    你所使用FTP代理服务器的地址

verbose

    设置冗余度,默认是1,0比较安静,1 有点烦人哦:-)

mode

    默认模式是检索,如果你喜欢冒险的话,也可以通过命令行选择"upgrade"和"lates"模式。

配置文件里列出了所有的选项,并作了简单的说明。
用rpmfind来自动升级

我建议选用最新的版本(至少要用1.5或其以上的版本)。

   1. 选择自动升级的来源,就是ftp的地址或者别的什么地址。
   2. 编辑你的".rpmfind"文件,每一个来源添加一个autoupgradeURL, 像这样:

      autoupgradeURL=ftp://rpmfind.net/linux/redhat/updates/6.2/i386

      autoupgradeURL=ftp://myserver.org/pub/rpm-updates/i386/
   3. 运行 "rpmfind --autoupgrade"
   4. 如果觉得满意就可以添加到root的crontab中去。

如果使用crontab,推荐做以下几件事:开启"paranoid"选项,在系统中配置gpg并且将发行套件密钥添加到root的gpg钥匙环中("gpg --import key")。
工作原理

rpm2html能输出软件包的相关信息,这些信息以RDF格式存储在rpmfind.net上。因而所有软件包的说明及其相关信息都输出在这些小RDF文件中。

当用rpmfind查找软件包时,rpmfind首先会查询本地的RPM数据库。当本地没有时,它才会向rufus上发送查询相关RDF文件的请求。文件内容经过分析从软件包提供的信息(厂商、版本、日期、等等.....)中提取到摘要说明。基于此,rpmfind根据适宜程度排列符合条件的软件包。随之,提取排列在第一位的软件包及其所有信息包括依存关系(dependency)等。基于上面的信息,rpmfind通过从网上抓取软件包来证实此软件包所需要的依存关系及其相关的资源都可提供。

最后,rpmfind列出软件包的清单和所需要的营盘空间。

如果rpmfind发现软件包中的一个所需要的资源不能提供,或者需要对libc进行升级,它就会放弃这个软件包进而选择下一个。
下载

最新版位于ftp://rpmfind.net/pub/rpmfind,它也是RedHat like distributions的一部分。
计划

许多事情要做的:

    * 一个用户界面,用户可根据程序所提供的清单对其中的一些软件包再次进行选择。
    * 根据RPM的版本,发行和序列号来选择软件包及其依存关系,但这需要对rpm2html程序和RDF文件的功能进行扩充。(部分已完成)
    * 一个可选的图形界面。 (查看 gnorpm).

想现在使用rpmfind吗?下载!
发表于 2005-4-19 12:17:55 | 显示全部楼层
为什么不翻译一下 rpm 的手册页呢
回复 支持 反对

使用道具 举报

发表于 2005-4-19 12:41:41 | 显示全部楼层
跟平时用的 -Uvh好象没什么差别啊。倒是rpmbuild的几个命令参数值得搞一搞。
回复 支持 反对

使用道具 举报

发表于 2005-4-19 12:44:32 | 显示全部楼层
另外,redhat8还是9的时候 --aid参数我记得是有用的。不知道为什么fedora里面就没用了。
这是个好东西,一定程度上自动解决依赖,会找当前目录下的所有rpm包,看能不能解决依赖的。
回复 支持 反对

使用道具 举报

发表于 2005-4-19 15:32:38 | 显示全部楼层

找到一些有关制作和使用 rpm 的文章

发现只有几个可以勉强看看.
我想知道 %setup 所有参数的含义, 可是还是没有找到
我想知道 %trigger 所有命令的用法,也还没有找到
预定义的变量列表到哪里去找?$RPM_BUILD_ROOT 和 %{buildroot} 都是在哪里定义的?
没头没脑搜索到一大堆, 不知道会不会有用. 好文档太少了

---

http://www.linuxsir.cn/bbs/showthread.php?t=167093


http://www.linuxsir.cn/bbs/showthread.php?t=160180
apeter_2000
用Checkinstall制作你自己的RPM, 包括对 checkinstall 打补丁使之适于 fedora

http://www.linuxsir.cn/bbs/showthread.php?t=124972
lipeng21cn
我有一个linux的问题请各位前辈,我有些客户使用linux,有些软件我以前一直是用tar包的方式把软件给他。但是有些人搞不明白怎么装,尤其是路径的问题(由于我把tar包路径都做在了一起,并设置好了权限,需要cp到根目录解压才能拷贝到相应的目录)。我觉得这样很麻烦。看到网上很多关于rpm制作的文档,我觉得如果有这种方式很方便。但是那个spec怎么写呀,因为需要做成rpm包的都是一些配置文件或者二进制程序。没有源代码,但网上的文档都是介绍一些把源代码编译后做成rpm的。所以我有些糊涂,请前辈们指点

%config或者%doc默认最多只允许34个文件,如果多了在rpmbuild -bb -vv的时候报错。
在spec中加入%define __check_files %{nil}即可解决此问题

http://www.linuxsir.cn/bbs/showthread.php?t=88922
home_king
rpm2cpio 的源代码
perl rpm2cpio filename.src.rpm > filename.tmp && cpio -d -i < ./filename.tmp

http://www.linuxsir.cn/bbs/showthread.php?t=82836
greenforce
RPM Builder plugin for Anjuta

This is a dynamic library plugin for Anjuta v1.1.1.

http://arpmbuilder.sourceforge.net/

http://www.linuxsir.cn/bbs/showthread.php?t=80558
greenforce
使用checkinstall制作的rpm包能否在rh中使用?
他的主页。和软件文档。都标的很清楚。
可惜软件只是制作RPM 无法写出spec

http://www.linuxsir.cn/bbs/showthread.php?t=159315
me
tetex-fonts-zh 的 rpm spec 文件制作


http://www.linuxsir.cn/bbs/showthread.php?t=181413
ttyrone
rpmbuild 安装openpkg的问题, spec 出错


http://www.linuxsir.cn/bbs/showthread.php?t=177979
sherman
fedora core 3 的 release-notes 有关安装内核源码

http://www.linuxsir.cn/bbs/showthread.php?t=87457
beyond_2000
rpmbuild --rebuild kernel-xxx.src.rpm
rpmbuild --rebuild --target=CPU-VENDOR-OS *.src.rpm
或者按照你上面的方法,安装后,到/usr/src/redhat/SPEC下
rpmbuild -bs --target=i686 kernel.spec
2个小时候后,你就可以在/usr/src/redhat/RPMS/i686下面找到几个编译好的内核文件。


http://www.linuxsir.cn/bbs/showthread.php?t=73273
jin.liu

这是一个偏向于 fedora 的,喜欢自己编译,并且可以自行编译 qt 的家伙, 会修改 spec
$RPM_OPT_FLAGS 是在什么地方定义的?


http://www.linuxsir.cn/bbs/showthread.php?t=49344
chemist
如何避免生成 debuginfo?
%define debug_package %{nil}


http://www.linuxsir.cn/bbs/showthread.php?t=85507
哈蜜瓜的 simsun 的 rpm 的 spec 文件



http://www.linuxsir.cn/bbs/showthread.php?t=47028
哪里能找到gnome 2.3.1各tarball的spec文件
winix  Winix Is Not In Xanadu.
http://people.ecsc.co.uk/~matt/downloads/apt/redhat-9-i386/


http://www.linuxsir.cn/bbs/showthread.php?t=62041
greenforce
如果为了管理软件。方便。 可以用 checkinstall 软件。制作RPM包。
http://asic-linux.com.mx/~izto/checkinstall/download.php
通常。 ./configure , make , makeinstall
用checkinstall通常是 ./configure , make , checkinstall –R make install.
就ok了。。。 同时会生成 spec 和 rpm 文件


http://www.linuxsir.cn/bbs/showthread.php?t=54788
freebsdchina
一些 rpm 命令的选项含义
但是没有翻译完整的 man rpm


http://www.linuxsir.cn/bbs/showthread.php?t=78410
dato
mplayer 1.0pre3 SPEC
根据 turbolinux 的文档和 spec 修改而成



http://www.linuxsir.cn/bbs/showthread.php?t=42932
linux 软件专题讨论版
哈蜜瓜
RPM SPEC文件编写通用规范
参考了 RedHatLinux .spec file Specification and RPM HOWTO and Maximum RPM


http://www.linuxfans.org/nuke/mo ... wtopic&t=101392
http://www.linuxfans.org/nuke/mo ... ewtopic&t=86942
lovewilliam
http://www.magiclinux.org/people/lovewilliam
autospec, 写spec打包时用的小工具
http://www.npsnet.com/danf/software/
我对其中的一些文件做了修改
自己试一下就知道了
RPM:
http://www.magiclinux.org/people ... 0.8-3mgc.noarch.rpm
SRPM:
http://www.magiclinux.org/people ... ec-0.8-3mgc.src.rpm


http://www.linuxfans.org/nuke/mo ... ewtopic&t=94883
KDE
对某个 spec 的错误的手把手修改


http://www.linuxfans.org/nuke/mo ... ewtopic&t=86980
KDE
Magic Linux开发培训版
rpm 建包原理(20050405 更新)


http://www.linuxfans.org/nuke/mo ... wtopic&t=110628
KDE
%setup -n %{name} 的含义


http://www.linuxfans.org/nuke/mo ... ewtopic&t=45446
aniuge007
内核的 spec


http://www.linuxfans.org/nuke/mo ... ewtopic&t=33633
myleader
xmame 的 spec



http://download.enet.com.cn/html/262392001011002.html
rpmbuilder 的下载地址
Clear River Technologies
http://www.klabs.net/rpmbuilder/
RPM Builder 能够将tar.gz 格式的文件转换为RPM 格式的包。它可以自动的产生所必需的RPM 格式文件摸板,然后创建RPM 格式文件和SRPM 格式文件。即使你不了解RPM 包,你也可以使用这个软件创建一个RPM 包。


http://www.linuxsir.cn/bbs/showthread.php?t=136091
dato
一段很有道理的 shell 脚本
  1. install -d $RPM_BUILD_ROOT%{_datadir}/mplayer/Skin/
  2. ( cd $RPM_BUILD_ROOT%{_datadir}/mplayer/Skin/
  3. tar Ixf %{SOURCE2}
  4. chmod -Rf a+rX,g-w,o-w .
  5. rm -rf `find -type d -name CVS`
  6. )
复制代码


http://www.linuxsir.cn/bbs/showthread.php?t=24345
http://www.linuxsir.cn/bbs/showthread.php?t=12586
http://www.linuxsir.cn/bbs/showthread.php?t=1223
http://www.cngnu.org/technology/c496/307.html



http://www.linuxsir.cn/bbs/showthread.php?t=28014
http://www.linuxsir.cn/bbs/showthread.php?t=21993
probing
都是从红帽认证学习资料第四章摘录的
4.04 Using the Red Hat Package Manager
Validating a Package Signature. 86
To Add and Remove Components. 94
NOTE: Be very careful about which packages you remove from your system. Like most Linux utilities, RPM assumes omniscience, and will silently let you shoot yourself in the foot. Removing the passwd or kernel package would be devastating. 113
Adding Updates, Security Fixes, and Other Items. 114
Verifying One or More Packages. 127
Seeing What Packages Are Installed. 139
Creating and Using Custom RPMs. 157
Building Custom Source and Binary RPMs. 175
Building an RPM from a Tar Archive. 181



http://book.jqinfo.com/product/314587.html
Linux技术参考手册——系统、综合篇
原价:  ¥42.00元  
出版社:  中国铁道出版社
作者:  赖阿福 高健智
ISBM:  7-113-03615-5
版次:  1
开本:  1/16
页数:  403
出版日期:  2000-01-01

本书是以原文版LDP(The linux DocumentationProject)的HOWTOS及HOWTO文件为主,经由CLDP(Cninese linux documentation project )组织将DP 文件逐步翻译成中文,再经赖阿福及高健知两位老师精选常用的技术文件整理成册,分成系统、综合篇及外设网络篇两册,希望对有心学习Linux的使用者有所助益。
19-6-2 The SpecFile
19- 6-3 The Header
19-6- 4Prep
19-6-5 Build
19-6-6Install
19-6-7 optional pre and post Install/Unlnstall Scripts
19-6-8 Files
19-6-9 Building It
19-6-10 Testing It。
19-6-11 What to do with your new RPMs?
19-6-12 What Now?
19- 7Multi-architectural RPM Building
19-7-1Smple Spec File
19-7 -2 optflags
19-7-3Macros
19-7-4 Excluding Architectures from Packages
19-7-5 Finishing Up
19-8 Copyright Notice




http://www.smsd.com.cn/book.asp?Id=12776
深入LINUX建构与管理
作 者:杨文志 /
出版社:人民邮电出版社
日 期:2000年12月
开 本:787*1092    版 次:1次
页 数:711页
6.8 动手制作RPM套件
RPM spec文件编辑与介绍
自动产生RPM spec文件的工具
RPM package制作例子
RPM高级包装技巧



http://pkgcvs.turbolinux.co.jp/spec/spec-rule-cn.html
TurboLinux RPM SPEC文件编写通用规范


http://www.chinaitlab.com/www/news/article_show.asp?id=8362
RPM 与 Tarball 套件管理员
这是一篇很老的帖子, 收藏只为完整性


http://www.huihoo.org/joyfire.net/6-2.html
自由软件发布方法惯例



http://www.linuxsir.cn/bbs/showthread.php?t=172030
摘要:Checkinstall 是一个能从 tar.gz类的源代码自动生成RPM/Debian或Slackware安装包的程序。这样使你能用几乎所有的 tar.gz 类的源代码生成“干净”的安装或者卸载包。


http://www.rpm.org/support/RPM-HOWTO.html
http://www.rpm.org/RPM-HOWTO/
http://ichi.turbolinux.com/devel/docs/rpmturbo/index.html     TurboLinux RPM Packaging HOWTO
http://www.redhat.com/docs/books/max-rpm/max-rpm-html/
http://pkgcvs.turbolinux.co.jp/spec/maximum-rpm.ps    Maximum RPM
http://www.redhat.com/docs/manua ... e/s1-rpm-using.html
Red Hat Linux 9: Red Hat Linux Customization Guide
Prev        Chapter 32. Package Management with RPM


http://www-128.ibm.com/developer ... pm/part1/index.html
在 Red Hat Linux 7.1 上使用 RPM


http://www.gouhuo.com/CLDP/gb/RPM-HOWTO-6.html
CLDP -- Linux 中文文件计划


http://www.7-zip.org/
# Supported formats: 7z, ZIP, CAB, RAR, ARJ, GZIP, BZIP2, Z, TAR, CPIO, RPM and DEB


http://linux.ournb.net/index/article.php/310
RPM 與 SRPM 套件管理員
作者:VBird
感谢作者VBird同意本站转载这么精彩的文章。
回复 支持 反对

使用道具 举报

发表于 2005-4-19 16:47:17 | 显示全部楼层

晕死 没想到 ccid 的制作篇 (上) 就包含我要的东西

http://www0.ccidnet.com/html//tech/guide/2001/12/05/92_3852.html
当前页面位置:主页:技术天地:编程指南:技术文章
制作篇(上)
(雨亦奇 赵建利 2001年12月05日 14:24)

要想制作一个RPM格式的软件包,需要编写软件包描述文件。其标准命名格式为:软件名-版本号-释出号.spec,这个文件,详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。有了这个文件,RPM就可以制作出相应的包裹文件来。

下面以我制作小赵编辑器LZE的软件包(lze-6.0-2.i386.rpm)为例,详细说明一下软件包描述文件的书写。其描述文件为lze-6.0-2.spec,该文件内容如下用nl -ba命令列出,每行开头的数字为所在行在文件中的行号)
1 # 文件名称: lze-6.0-2.spec
2 # 文件功能: lze软件包描述信息
3 # 文件作者: 纵横软件制作中心雨亦奇 国防大学研究生二队赵建利
4 # 修改时间: 2001.10.19
5
6 Name: lze
7 Version: 6.0
8 Release: 2
9 Summary: 小赵全屏幕中英文多窗口多功能编辑器(LINUX/UNIX系统适用)
10 Group: Applications/Editors
11 License: Share
12 Vendor: 纵横软件制作中心
13 Packager: 雨亦奇(zhsoft@371.net)
14 Source: http://zhsoft.myetang.com/lze-6.0-2.src.tgz
15 Prefix: /usr
16 Requires: /bin/sh
17 Provides: lze-edit
18
19 %description
20 小赵编辑器,是为使用SCO UNIX,LINUX多用户系统的广大用户专门设计的全屏幕多窗
21 口中英文多功能编辑器。
22 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十
23 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特
24 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎
25 添翼。10.即时翻译,按到即译。
26 总之,小赵编辑器会成为您在UNIX,LINUX系统上编制程序和书写一般性文稿的好帮手。
27 它将在工作中助您一臂之力,轻松上阵,游刃有余!
28
29 %prep
30 echo "预处理脚本程序(prep)开始执行"
31 %setup
32
33 %build
34 echo "编译连接脚本程序(build)开始执行"
35 make
36
37 %install
38 echo "安装脚本程序(install)开始执行"
39 make install
40
41 %clean
42 echo "建包结束后清理脚本程序(clean)开始执行"
43
44 %pre
45 echo "安装前执行脚本程序(pre)开始执行"
46
47 %post
48 echo "安装后执行脚本程序(post)开始执行"
49
50 %preun
51 echo "卸载前执行脚本程序(preun)开始执行"
52
53 %postun
54 echo "卸载后执行脚本程序(postun)开始执行"
55
56 %veryfiscript
57 echo "软件包校验脚本程序(verifyscript)开始执行"
58
59 %triggerin -- xiuwu
60 echo "软件包安装时触发脚本程序(triggerin)开始执行"
61
62 %triggerun -- yuntaishan < 2.0
63 echo "软件包卸载前触发脚本程序(triggerun)开始执行"
64
65 %triggerpostun -- dapubu
66 echo "软件包卸载后触发脚本程序(triggerpostun)开始执行"
67
68 %files
69 %defattr (-,root,root)
70 %config /etc/funkey.def
71 %config /etc/inputme.def
72 %doc /usr/doc/lze-6.0/README
73 %doc /usr/doc/lze-6.0/LICENSE
74 /usr/bin/lze
75 /usr/bin/lzeime.py
76 /usr/bin/lzeime.wb
77 /etc/wbzc.dat
78
79 %changelog
80 * Tue Aug 18 1998 雨亦奇 <zhsoft@371.net>
81 - 内置拼音,五笔输入法
82 * Fri May 01 1998 雨亦奇 <zhsoft@371.net>
83 - 增加多窗口操作
84 * Mon Mar 24 1997 雨亦奇 <zhsoft@371.net>
85 - 增加块操作命令
86

该描述文件包括以下几方面的内容:

一、注释行
见第1-4行。
它以#号开头,起注解作用,可帮助用户理解所写的内容,但对软件包的生成不起任何作用。此文件中,注释行集中在文件首部。实际上,它可位于描述文件的任何位置。

二、文件头
见第6-17行。
文件头描述软件包的基本信息,它包含若干个域,其中有必选的域,也有可选的域。一个域占用一行,其描述格式为:
域名 : 域值
注意: 域名不分大小写,并且域值不能为空。
文件头必选域有以下六个:

1. Name :
此域定义软件名。

2. Version :
此域定义版本号。仅当软件较以前有较大改变时才增加版本号。注: 版本号中不能含减号(-)字符。

3. Release :
此域定义释出号。若软件较以前改变较小,则仅增加释出号,不改变版本号。注: 释出号中亦不能含减号(-)字符。
RPM利用上述的Name(软件名),Version(版本号),Release(释出号)及体系号来命名软件包,如本例输出的包裹文件名为lze-6.0-2.i386.rpm。

4. Summary :
此域定义软件包简介,为一句话说明。

5. Group :
此域定义软件所属类别,详见<<精通RPM之五--查询篇>>,本例的Applications/Editors表示本软件属"应用/编辑器"类。

6. License :
此域定义软件适用的许可证或版权规则。该域也可用Copyright(版权)来定义,二者同意。许可证具体有: GPL(通用公共许可证,自由软件适用),BSD,MIT,Public Domain(公共域),Distributable(贡献),Commercial(商业),Share(共享)等。

文件头可选的域包括如下几类:
1. 基本信息

1.1 Vendor :
此域定义软件的供应商(销售商)。

1.2 Distribution :
此域定义软件所属的发行版,这是软件包制作者自己的分类。通常,一个发行版由若干个软件包构成。如我想做一个名为“熊猫'95”的发行版,则其中每个软件包(如竹叶95)的描述文件都应有这么一行:
Distribution : 熊猫'95

1.3 Icon :
此域指定软件包所用的图标文件名。此文件为GIF或XPM格式,必须存放在RPM的%_sourcedir(源码目录)宏所指示目录下,默认为 /usr/src/dist/SOURCES。RPM本身并不使用图标,但它将图标文件内容存贮到包裹文件中,安装时亦存贮到RPM数据库中。此图标可被图形界面的RPM包管理工具使用,用以改善界面效果,增加可视性。如下例指示软件包使用panda.xpm作为图标:
Icon : panda.xpm

1.4 Packager :
此域定义打包者,亦即建立此软件包的人或公司。书写格式是:
打包者的名字 <电子信箱或相关网页>
请参考描述文件第13行。

1.5 Serial :
此域定义软件序列号,也可使用域名Epoch。软件序列号为一整数,由打包者指定,它应随着版本号的增加而不断增加,并且始终保持数值的唯一。软件序列号可被用来说明软件包之间的依赖关系。下例指定软件包序列号为4:
Serial : 4
或用:
Epoch : 4

1.6 URL :
此域定义包含打包软件有关信息的网页地址。如:
URL : http://devplanet.fastethernet.net/gxedit.html

2. 依赖相关
依赖是RPM用来描述软件包之间关系的。一个软件包依赖的东西RPM称作功能,它可以是真实存在的软件包,也可以是虚拟的软件包(虚包)。虚包没有版本号。
依赖相关的域有:

2.1 Provides :
此域定义软件包提供的功能,可重复多行。其描述格式为:
Provides : 功能1 [,功能2] ...

注: []所括为可选项,多个功能之间以逗号或空格分隔。
软件包所提供的功能一般是以虚包形式存在的共享库。当有多个软件包均提供相同的服务时,常用虚包来表示其服务。如,一个邮件客户端软件允许用户使用不同的看信方式(文本形式,HTML形式等),可以要求任何一个看信程序必须提供mail-reader虚包。这样,看信程序的描述文件应有这么一行:
Provides : mail-reader
如此它才能被邮件客户端使用。

2.2 Requires :
此域定义软件包所需的功能,可重复多行。其描述格式为:
Requires : 功能1 [比较符1 [序列号1:]版本号1[-释出号1]] [,功能2 [比较符2 [序列号2:]版本号2[-释出号2]]] ...

其中: * []所括为可选项;
* 比较符可使用<(小于),>(大于),=(等于),>=(大于等于)或<=(小于等于);
* 序列号不选时,RPM默认为0;
* 功能之间的逗号可选,也可使用空格进行分隔。
例子:Requires: aaa, bbb >= 3.0, ccc < 2:5.0-1
注: 本例定义生成的包在安装时需要系统有如下功能:
(1) aaa(系统中已安装aaa包,或者已安装软件包中有软件包提供aaa虚包);
(2) bbb包已安装且版本要求大于等于3.0;
(3) ccc包已安装且版本要求小于序列号为2,版本号为5.0且释出号为1。
RPM在进行版本比较时,执行比较的顺序是; 先版本号,再释出号,最后比较序列号。通过比较,确定哪个版本较新,哪个版本较老。

2.3 Conflicts :
此域定义有哪些功能与本软件包相冲突(不能共存)。此域亦可在描述文件中书写多次。其描述格式形同Requires域,为:
Conflicts : 功能1 [比较符1 [序列号1:]版本号1[-释出号1]] [,功能2 [比较符2 [序列号2:]版本号2[-释出号2]]] ...

其中: * []所括为可选项;
* 比较符可使用<(小于),>(大于),=(等于),>=(大于等于)或<=(小于等于);
* 序列号不选时,RPM默认为0;
* 功能之间的逗号可选,也可使用空格进行分隔。
举个例子:
Conflicts : xxx=1:2.0 yyy>=3.0
注: 本例阐明生成的包冲突的功能有:
(1) 当系统中xxx包版本等于序列号为1且版本号为2.0时;(2) 当系统中yyy包版本大于等于3.0时。
*** 依赖关系的自动实现 ***
一般情况下,当RPM建立一个软件包时,它要执行/usr/lib/rpm目录下的两个小程序。一个是find-requires,用于查找软件包所需的共享库,这些库将以虚包的形式加入到该软件包所需的功能(Requires)之中。另一个是find-provides,它用于查找软件包所提供的共享库,这些库将以虚包的形式加入到该软件包所提供的功能(Provides)之中。这两个程序都是SHELL程序,代码量虽小,但确实帮了软件包制作者一个大忙--不必劳心费神地自己写这样的依赖关系了,因为程序均自动完成了。
下面三个域用于指示RPM是否执行这两个程序。

2.4 Autoreq :
此域用于指示RPM是否自动查找软件所需的共享库。仅当域值为no或0时,RPM不执行find-requires程序,否则均执行该程序。

2.5 Autoprov :
此域用于指示RPM是否自动查找软件提供的共享库。仅当域值为no或0时,RPM不执行find-provides程序,否则均执行该程序。

2.6 Autoreqprov :
此域用于指示RPM是否自动查找软件所需的共享库与其提供的共享库。仅当域值为no
或0时,RPM不执行find-requires与find-provides两个程序。此域相当于同时设定Autoreq
与Autoprov域值为指定之值。
注: 上述三个域在描述文件中,它们之间因为顺序的不同而结果会有所不同,一般以最后一个为准。如:
Autoreq : yes
Autoreqprov : no
Autoprov : yes

注: 本例虽然第一行允许执行find-requires,但第二行又不允许find-requires与find-provides两个程序运行,而第三行允许find-provides运行,所以依照执行顺序,结果为不允许执行find-requires,而允许执行find-provides。
又如:
Autoreq : no
Autoreqprov : yes
Autoprov : no

注: 本例的结果为允许执行find-requires,而不允许执行find-provides。

3. 系统相关
RPM制作软件包时,可以为其指定适用的CPU体系或操作系统,也可为其指定不适用的CPU体系或操作系统,这样,当RPM发现当前的CPU体系或操作系统与软件包要求的不兼容时,将中止软件包的制作。RPM默认的当前CPU体系由宏%_arch定义,一般为i386。RPM默认的当前操作系统由宏% _os定义,一般为linux。读者可以通过查看/usr/lib/rpm/macros宏定义文件得到。
下面四个域说明软件包的适用范围:

3.1 Excludearch :
此域定义软件包不适用的体系。RPM可选的体系名请参见/usr/lib/rpm/rpmrc文件中的arch_canon项目。
软件包不适用于某个体系,可能有两方面的原因。一是该软件还没有移植到所定义的体系上;二是该软件含有特定的机器码(汇编语言),它与别的体系不兼容。
此域描述格式为:
Excludearch : 体系1 [体系2] ...

注: []所括为可选项,各体系之间以空格分隔。
如果当前体系在此域值之中,则RPM制作软件包时将报错退出,请看下面的例子。
在lze-6.0-2.spec文件头部分加入一行:
Excludearch : i386
再运行建包命令rpm -bb(<<精通RPM之七--制作篇(下)>>将讲到):
# rpm -bb lze-6.0-2.spec
Architecture is excluded: i386
#

由上看出,RPM提示了“体系不适用: i386”的错误。

3.2 Exclusivearch :
此域定义软件包适用的体系。其描述格式与Excludearch类似:
Exclusivearch : 体系1 [体系2] ...

注: []所括为可选项,各体系之间以空格分隔。
假如在lze-6.0-2.spec文件头加入一行:
Exclusivearch : i386 sparc
再运行建包命令将会怎么样:
# rpm -bb lze-6.0-2.spec
Executing: %prep
预处理脚本程序(prep)开始执行
Executing: %build
编译连接脚本程序(build)开始执行
Executing: %install
安装脚本程序(install)开始执行
Processing files: lze
Finding Provides: (using /usr/lib/rpm/find-provides)...
Finding Requires: (using /usr/lib/rpm/find-requires)...
Provides: lze-edit
PreReq: /bin/sh
Requires: /bin/sh ld-linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1)
Wrote: /usr/src/dist/RPMS/i386/lze-6.0-2.i386.rpm
#

看,此次建包(lze-6.0-2.i386.rpm)成功了,因为当前的体系(i386)正好适用。

3.3 Excludeos :
此域定义软件包不适用的操作系统。RPM可选的操作系统请参考文件/usr/lib/rpm/rpmrc中的os_canon项目。
其描述格式为:
Excludeos : 操作系统1 [操作系统2] ...

注: []为可选项,操作系统之间以空格分隔。例如:
Excludeos : irix aix solaris
注: 如将此行加入到lze的描述文件中,则它会指示RPM不在irix,aix,solaris这三个操作系统上建立lze软件包。如果当前操作系统是三者之一,则RPM会报错并中止软件包的制作。
如:
# rpm -bb lze-6.0-2.spec
OS is excluded: Solaris
#

3.4 Exclusiveos :
此域定义软件包适用的操作系统。其描述格式为:
Exclusiveos : 操作系统1 [操作系统2] ...
注: []为可选项,操作系统之间以空格分隔。例如:
Exclusiveos : linux solaris

4. 目录相关
4.1 Prefix :
此域定义可重定位的目录前缀,可在描述文件中书写多次。其描述格式为:
Prefix : 目录前缀1 [目录前缀2] ...

注: []为可选项,各目录前缀之间均以空格分隔。例如:
Prefix : /usr /etc
它也可写作:
Prefix : /usr
Prefix : /etc
RPM利用可重定位的目录前缀,实现了软件包的重定位安装,使软件中的文件不必固定在某个绝对位置,这种做法很好。LZE软件包描术文件lze-6.0- 2.spec中就定义了一个可重定位的前缀/usr(见第15行),这样,安装时就可将该包中在/usr目录下的文件重定位到用户指定的目录,如:
# rpm -i --prefix /tmp lze-6.0-2.i386.rpm
#
或者:
# rpm -i --relocate /usr=/tmp lze-6.0-2.i386.rpm
#
注: 此命令安装lze包,将其中含/usr重定位目录前缀的文件定位到/tmp目录。如包中
的/usr/bin/lze文件安装后,因重定位而成了/tmp/bin/lze。(RPM安装命令使用方法请参考<<精通RPM之二--安装篇>>)

4.2 Buildroot :
此域定义的是软件包所包含的文件共有的根目录,此根目录仅供RPM建立软件包时使用。即当RPM建立软件包时,将设定此目录为根(调用chroot函数),提取所需文件,生成软件包。
例如: 当Buildroot设定为/tmp时,对于LZE包描述文件中所包含的/usr/bin/lze文件,RPM实际打包的则是/tmp/usr/bin/lze,但对生成的包查询后可以发现:原文件名并未改变,还是/usr/bin/lze。
如此说来,这就很有意思了。一般用户通过设定Buildroot,也可以象超级用户(root)那样自由地建立各种各样的软件包了,即使包中有那些唯有超级用户才可以操作的目录或文件。安装这样的包与安装由超级用户建立的包,是没有什么分别的。
此域的描述格式很简单:
Buildroot : 目录
如,上例可定义为:
Buildroot : /tmp

5. 源码相关
下列四个域均是为制作源码包而设计的。源码包里有什么?用户可以通过查询包的文件列表得到,命令是“rpm -qpl 源码包文件”(请参阅<<精通RPM之五--查询篇>>有关内容)。一般情况下,源码包里有这么四类文件: 一是程序源码(SOURCE),二是源码补丁(PATCH),三是软件包描述文件,四是图标文件(ICON)。通过安装源码包,用户可以轻松地实现现场编译、连接和应用,同时更方便了软件开发者与软件包制作者:他们维护程序容易了,并且维护过后可以很快地生成执行代码包与源码包。这,也是所有人钟爱RPM 的重要原因之一。

5.1 Source :
此域定义RPM打包时要包含的程序源码文件。这些文件一般先用tar命令打包,然后再用gzip压缩。一个描述文件中可包含多个Source域,当有多个这样的域时,需要进行编号:第1个编为Source0(也可直接用Source),第2个编为Source1,第3个编为Source2等等。此域的描述格式为:
Source[编号] : 源码文件

注: []所括为可选项。具体用法如:
Source0 : lze-6.0-2.tar.gz
Source1 : lzeime-wb-6.0-2.tar.gz
Source2 : lzeime-py-6.0-2.tar.gz
Source3 : lze-lib-6.0-2.tar.gz
注: 此域域值可以采用URL(统一资源定位)的形式,如LZE描述文件第14行。采用这种形式,主要是给其它用户提供该源码的位置信息。在RPM制作源包时, 它提取的是最后的文件名lze-6.0-2.tar.gz,而不是http://zhsoft.myetang.com/lze-6.0- 2.tar.gz(URL前面的内容被RPM忽略了)。

5.2 NoSource :
在上例中,假如在打包时不想包含Source1与Source2定义的文件,那该怎么办?
办法之一是将其所在行删除掉;
办法之二是将其所在行注释掉(即所在行前面加#号);
办法之三就是定义Nosource域,此域可重复。其描述格式为:
NoSource : 源码域编号

本例可写作:
NoSource : 1
NoSource : 2
注: 其中的1与2为编号,表示Source1和Source2。
注意: 如果软件包描述文件中没有NoSource域,则RPM生成的源码包名字格式为"软件名-版本号-释出号.src.rpm"。如果使用了NoSource 域,则RPM生成的源码包名字格式为"软件名-版本号-释出号.nosrc.rpm"(单从名字就可看出源码包包含的文件不完整)。

5.3 Patch :
Patch的本义是补丁,用在这里指的是源程序的补丁,它是用diff命令比较新老源程序所产生的输出(命令为“diff -Nur 旧文件 新文件 >补丁文件”),而系统中的patch命令又可利用此输出将老版本的源程序升级为新版本。
此域定义RPM制作源码包时所要包含的补丁文件,该文件的命名建议用"软件名-版本号.补丁功能.patch"的格式。一个软件包描述文件中可有多个 Patch域,当有多个这样的域时,也需要象Source域那样进行编号(注:第1个域编为Patch0,也可省略0,用Patch)。
此域的描述格式为:
Patch[编号] : 源码补丁文件

注: []所括为可选项。具体用法如:
Patch0 : blather-4.5-bugfix.patch
Patch1 : blather-4.5-config.patch
Patch2 : blather-4.5-somethingelse.patch
注: 此域的域值也可以象Source域一样,采用URL的形式,RPM仅提取其中的文件名供其使用。

5.4 NoPatch :
此域的功能类似NoSource,其定义的编号对应的补丁文件RPM不作打包处理。此域在描述文件中可重复出现。如上例,若不想让源码包包含Patch0与Patch2域所指示的补丁文件,则可在描述文件写上这么两行:
NoPatch : 0
NoPatch : 2
注意: 如果软件包描述文件中没有NoPatch域,则RPM生成的源码包名字格式为"软件名-版本号-释出号.src.rpm"。如果使用了NoPatch域, 则RPM生成的源码包名字格式为"软件名-版本号-释出号.nosrc.rpm"(单从名字就可看出源码包包含的文件不完整)。

三、功能段
见第19-86(即文件头以下的部分)。
何谓功能段?可以这么说,功能段是描述软件包的重要数据和操作指令的段落,它包括段名与段内容两部分。没有功能段,RPM便制作不出任何包裹文件。功能段的段名都是以百分号(%)开始的,占用一行。功能段的段内容范围是这样界定的:它从该功能段段名下一行开始到下一个功能段段名的前一行或到描述文件结束。如LZE描述文件,%description段是从第19行到第28行(%prep段从第29行开始),第19行为段名,第20-28行为段内容。而% prep段是从第29行到第32行(第33行%build段开始),其段名在第29行,段内容在第30-32行。另外要注意的是,各个功能段的位置是自由的,可放在文件头以下的任何位置,不必拘泥某一固定位置。
必选的功能段
描述文件中,必选的功能段有:

1. %description
本段是描述段,段的内容是对软件包进行较为详细的介绍,不象文件头的Summary域仅用一句话说明。介绍的文本形式自由,可任意换行,不受限制。具体请参见LZE描述文件第20-27行。
本段段名描述格式是:
%description [子包选项]

其中,子包选项的格式为:[-n] 子包名
注: []所括为可选项。

三种形式的描述段段名:
(1) 段名格式为“%description”时:
本功能段描述的内容是关于父包的。父包也可叫作主软件包,它用软件名来命令,其名字格式是:软件名-版本号-释出号.体系.rpm。如:lze-6.0-2.i386.rpm。
(2) 段名格式为“%description 子包名”时:
本功能段描述的内容是关于子包的。子包选项中没有-n选项时,子包是用软件名加子包名的形式命名,格式为: 软件名-子包名-版本号-释出号.体系.rpm。如分成两个子包的LZE软件:lze-bin-6.0-2.i386.rpm(执行程序包),lze- config-6.0-2.i386.rpm(配置文件包)。
(3) 段名格式为“%description -n 子包名”时:
本功能段描述的内容也是关于子包的。当子包选项中有-n选项时,子包直接采用子包名的形式命名。它不包含软件名,命名格式为: 子包名-版本号-释出号.体系.rpm。如分成两个子包的LZE软件: bin-6.0-2.i386.rpm(执行程序包),config-6.0-2.i386.rpm(配置文件包)。注意:这种类型的子包内容通常是可被其它软件包共用的函数库,如果专用,则尽量不要采用这样形式来定义子包。

2. %files
本段是文件段,它定义的是软件包需要包含哪些文件。本段通常放在描述文件尾部,以便于添加文件名,便于编辑。
本段段名描述格式为:
%files [子包选项] [-f 文件名]

注: []所括为可选项。
当没有任何选项时,本段内容定义的是父包要打包的文件列表;
当有子包选项时,本段内容定义的则是子包要打包的文件列表;
当选择-f选项时,RPM除了从文件段读取打包文件列表外,还将从指定的文件中读取要打包的文件列表。指定的文件中,一个文件名占用一行。此选项方便了软件包制作者,他们可以通过程序自动产生有关软件的文件列表,并将其写入到一个特定的文件中,这样制作软件包时,只需引用一下这个文件,RPM就会自动从这个文件中读取文件名并将其加入包中。如果没有此选项,软件包制作者只能在文件段里,将要打包的文件名一个一个写进去,有点麻烦。

文件段的内容格式为:
[修饰符1 [修饰符2] ...] 文件名
其中:修饰符是可选的,一个文件可以有多个修饰符,文件名必须以/开头(绝对路径形式)。
修饰符有以下几类:

(1) 文件相关
* %doc :
此修饰符设定文件类型为说明文档(参见LZE描述文件第72,73行);
* %config :
此修饰符设定文件类型为配置文件(参见LZE描述文件第70,71行);
* %config(missingok) :
此修饰符设定文件类型为配置文件,且此文件可丢失。即使丢失了,RPM在卸载软件包时并不认为这是个错误,并不报错。
此修饰符通常用于那些软件包安装后建立的符号连接文件,如/etc/rc.d/rc2.d/S55named等。此类文件在软件包卸载后可能需要删除,所以丢失了也不要紧。
* %config(noreplace) :
此修饰符设定文件类型为配置文件,且如果安装时系统中有同名的文件,则软件包中的这个文件将换个名字安装,其文件名后缀加个.rpmnew。(如果不用此修饰符,则安装时RPM若发现有同名文件,则RPM会将系统中的这个文件换个名字,其后缀加上.rpmorig,而软件包中的文件则还用原来的名字。)在软件包卸载时,系统中的同名文件被RPM换个名字保存起来,其后缀加上了.rpmsave。
如描述文件的文件段中定义了这么一行:
%config(noreplace) /etc/hello
则制成的包在安装时,若系统中已有此文件/etc/hello,则RPM会提示:
warning: /etc/hello created as /etc/hello.rpmnew
这表明包中的/etc/hello文件被创建为/etc/hello.rpmnew文件了。
如果卸载这个软件包,则系统中的/etc/hello将会改名为/etc/hello.rpmsave。
* %ghost :
此修饰符所修饰的文件,其内容不被包含到软件包中。这样的文件一般是日志文件(log file)一类的文件,其文件属性(文件名,属主,属组等)很重要,但是文件内容并不重要。用此修饰符后,RPM仅将其文件属性加入包中。
* %attr :
此修饰符设定文件的属性信息,使用格式为:
%attr(权限,属主,属组)
注: 权限常用数字形式(八进制),属主和属组可以是数字,也可以是字符串。如果文件的权限,属主和属组想使用系统默认值,则可用减号(-)表示它。
如下例采用两个修饰符,定义/etc/funkey.def文件的权限为755,属主默认,属组为root,类型为配置文件:
%attr(755,-,root) %config /etc/funkey.def
* %verify :
此修饰符设定文件需要校验的那些属性。这些属性有wner(属主),group(属组),mode(权限),md5(MD5检查和),size(大小),maj(主设备号),min(从设备号),symlink(符号连接),mtime(最后修改时间)。
此修饰符使用格式为:
%verify([not] owner group mode md5 size maj min symlink mtime)
注: not可选。当选用not时,表明需要校验除选定属性以外的那些属性。
如下例指示RPM校验/dev/ttyS0文件时,要校验其权限,MD5检查和,大小,主设备号,从设备号,符号连接和最后修改时间共七项属性信息:
%verify(mode md5 size maj min symlink mtime) /dev/ttyS0
这也可以采用not选项来实现,因为除去属主owner和属组group两项属性,剩下的就是需要校验的属性了:
%verify(not owner group) /dev/ttyS0

(2) 目录相关
* %docdir :

此修饰符定义说明文档前缀,这样,后面所有含指定文件名作为前缀的文件,RPM打包时会将其类型统一设定为说明文档。
例如某描述文件的文件段中有这么三行:
/root/readme
%docdir /root
/root/mydoc.txt

此例指明/root为说明文档的前缀,因为/root/mydoc.txt在%docdir的下一行,所以RPM打包时会设定此文件的类型为说明文档。而/root/readme文件则不做此设定,因为它在%docdir定义之前。
通过此修饰符,用户可以很方便地设定说明文档一类的文件,因为它们通常固定在某个目录下面,有着共同的前缀。
* %dir :
RPM在制作软件包时,如果要打包的文件是个目录,那么RPM会将该目录下面的所有文件包含到软件包中。(注意:如果要打包的文件是个符号连接,此符号连接又指向一个目录,则RPM并不会将其视作目录,只会把它当为普通文件处理。)如果仅想将这个目录名包含到软件包中,制作者用此修饰符修饰一下这个目录名就行了。
如: /etc是个系统目录,其下有多个文件,如果想将其均加入包中,描述文件的文件段里可写上这么一行:
/etc
如果仅想包含此目录,则可用:
%dir /etc


(3) 另类修饰符
此类只有一个%defattr。说它是另类修饰符,是由于它设定的是默认的文件属性,而非特定的某个文件。它一般放在文件段内容的第一行。
其使用格式为:
%defattr(权限,属主,属组)

其中: 权限,属主和属组都可以使用减号(-)。使用减号的属性将由系统设定。
例如: %defattr(022,zzz,zhsoft) 设定其后的所有文件权限为022,属主为zzz,属组为zhsoft;又如: %defattr(-,zzz,-) 则是设定其后的所有文件属主为zzz,权限与属组由系统设置。
可选的功能段
描述文件中,可选功能段的内容都是些脚本程序。(LZE描述文件中多个脚本程序中仅含一个echo命令)
可选的功能段的描述格式为:
功能段名 [子包选项]

注: 子包选项为"[-n] 子包名"。当无子包选项时,段内容描述的是父包的脚本程序。当有子包选项时,段内容则是描述子包的脚本程序。

可选的功能段可分为如下三类:
1. 建包用功能段:
RPM通过源程序来建立一个软件包时,要执行预处理,编译,安装和清理四项操作,分别对应于%prep,%build,%install和%clean四个段。
下面按其执行顺序逐段进行说明:
1.1 %prep :
此为预处理段,其内容为预处理脚本程序。该程序完成以下任务:
* 建立软件编译用目录;
* 将源程序解压缩;
* 通过打补丁,升级源程序;
* 执行其它一些操作,使源程序随时可进行编译。
在此脚本程序中,可使用如下两个宏命令:
1.1.1 %setup
这个宏利用系统中的gzip与tar等命令,来解压源程序包。RPM会自动探测源程序包是否压缩,如果压缩,它会用gzip将其解压缩,否则直接用tar命令展开包中文件。其使用格式为:
%setup [-n name] [-c] [-D] [-T] [-b N] [-a N]

注: []所括为可选项。
(1) 当没有任何选项时:
这个宏用来解压默认的源程序包(由文件头Source或Source0域指定)。注意:源程序包中的文件应用"软件名-版本号"作为其上层目录,这样% setup宏就可以正常工作。如果不以"软件名-版本号"作为其上层目录,则%setup宏工作时有一个指令"cd 软件名-版本号"(转目录)会因为系统中没有此目录而出错退出(除非在此宏上面加上建立此目录的命令)。如LZE软件源程序所在的目录为lze-6.0, 我需要用命令"tar cvzf lze-6.0-2.src.tgz lze-6.0"将源程序打包并压缩,这样的包就可以被%setup宏正确使用了。
下面是%setup宏命令所执行的一系列命令: (指令前面为行号)
1 cd /usr/src/dist/BUILD
2 echo "预处理脚本程序(prep)开始执行"
3 cd /usr/src/dist/BUILD
4 rm -rf lze-6.0
5 /bin/gzip -dc /usr/src/dist/SOURCES/lze-6.0-2.src.tgz | tar -xvvf -
6 STATUS=$?
7 if [ $STATUS -ne 0 ]; then
8exit $STATUS
9 fi
10 cd lze-6.0
11 [ `/usr/bin/id -u` = '0' ] && /bin/chown -Rhf root .
12 [ `/usr/bin/id -u` = '0' ] && /bin/chgrp -Rhf root .
13 /bin/chmod -Rf a+rX,g-w,o-w .
14 exit 1

看,第10行就有一个转到lze-6.0目录的命令,如果没有这个目录,程序就会出错退出了。也许你要问:这些指令你是怎么知道的?其实这很简单,只要在%setup宏下面加上一句"exit 1"命令,让预处理脚本程序非正常退出即可。这样RPM所执行的预处理脚本程序作为临时文件在其退出时并未删除,只要看一下这个文件(在/var/tmp目录下以rpm-tmp开头)就知道%setup宏命令做什么了。

(2) -n name :
上面已经谈到,源程序包中的文件应采用"软件名-版本号"作为上层目录。如果用了别的什么目录(如name),%setup宏无法正常工作,那该怎么办? 没关系,可以用-n选项,引用一下这个目录(name)就行了。假如我的LZE源程序包中的文件是以lze为上层目录,那么我就可以用"%setup -n lze"宏命令来解压缩该包。

(3) -c :
此选项的作用是创建上层目录("软件名-版本号"目录)并转到这个目录。对于LZE软件,其效果相当于在上例的第4行与第5行之间加上这么两行命令:
mkdir -p lze-6.0
cd lze-6.0
它适用的情况是:有的源程序包是在源程序所在目录下打的包,所以其中的文件都没有上层目录。这样的话,要想正确解压,必须创建上层目录。

(4) -D :
本选项的作用是在解压源程序包之前不要删除软件的上层目录(软件名-版本号)。在上例中,其效果是不执行第4行的命令(rm -rf lze-6.0)。

(5) -T :
本选项的作用是不解压默认的源程序包(由文件头的Source或Source0域所定义)。在上例中,其效果是不执行第5-9行的命令:第5行是解压源程序包(用gzip -dc将包的内容解压缩到管道中,再由tar -xvvf -从管道中读取数据并展开),第6-9行是检查解压命令的返回值,非0时执行非正常退出。

(6) -b N :
本选项指示RPM在转到上层目录前解压第N个源程序包(由文件头SourceN域定义)。这适用于含上层目录的源程序包。注意:如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或Source0域定义),一个是-b选项指定的包(由SourceN域定义)。这样,当N等于0时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。
下面的宏命令仅解压第1个源程序包,然后转到上层目录:
%setup -b 1 -T

(7) -a N :本选项指示RPM在转到上层目录后再解压第N个源程序包(由文件头SourceN域定义)。这适用于不含上层目录的源程序包。使用本选项时,一般加上- c选项,以创建上层目录并转到此目录。注意:如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或 Source0域定义),一个是-a选项指定的包(由SourceN域定义)。这样,当N等于0时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。

下面的宏命令让RPM先转到上层目录,再仅解压第2个源程序包:
%setup -T -a 2
1.1.2 %patch
此宏利用系统中的patch命令,来给指定的源程序包打补丁,从而将程序升级。其使用格式为:
%patch [-P N] [-p N] [-b name] [-E]
注: []所括为可选项。
为了说明下列选项的作用,我们为LZE软件包描述文件中定义三个补丁文件:
Patch0 : lze-patch.zero
Patch1 : lze-patch.one
Patch2 : lze-patch.three

(1) 当没有任何选项时:
没有任何选项时,该宏使用的是默认的补丁文件(第0个补丁文件),即由文件头Patch或Patch0域所定义的文件(LZE包使用lze-patch.zero)。
该宏在执行时,扩展为以下指令:
echo "atch #0:"
patch -p0 -s < /usr/src/dist/SOURCES/lze-patch.zero
注: 第一行指令是利用echo命令向屏幕输出字符串“Patch #0:”。第二行指令则是利用patch命令读取补丁文件lze-patch.zero升级源程序。
patch命令用了两个选项有关patch命令用法,详见其用户手册)
* -p : 这个选项用于确定patch所要操作的文件。它针对补丁文件头部的文件名,删除名字中指定数目个斜杠(/)前面的所有字符,从而得到要操作的文件名。如补丁文件里有个文件名/usr/zzz/src/lze.c,则用-p0时patch操作的文件名不变,用-p1时则变为 usr/zzz/src/lze.c,用-p2时则变为zzz/src/lze.c,如用-p4则操作的文件名变为lze.c。
* -s : 这个选项指示patch在打补丁过程中不输出任何信息,即使有错误发生。

(2) -P N :
使用此选项以指示RPM使用第N个补丁文件(由文件头PatchN域定义)。如想让RPM使用LZE的第2个补丁文件Patch2(lze-patch.three)时,可使用"-P 2"来指定。

(3) -p N :
此选项与其参数是由%patch宏直接传给patch命令的。请参见上面patch命令所用的-p选项的介绍。

(4) -b name :
当有多个patch命令操作同一个文件时,patch会将原文件换名保存(其后缀变作.orig),如lze.c会变作lze.orig。如果想用别的名字作后缀,则可用-b设置一下,这样原文件会换名为"原文件名+后缀",如用-b ZZZ时,lze.c会换名保存为lze.cZZZ。
此选项在执行时,实际上是给patch命令传递了一个选项及参数,即--suffix name。

(5) -E :
此选项直接传给patch命令,其作用是:如果一个文件打完补丁后内容为空(字节数为0),则删除这个文件。

1.2 %build :
此为编译段,其内容为编译脚本程序。该程序完成源程序的编译和连接。一个最简单的例子就是程序中仅有一个make命令。这适用于大部分情况,因为多数软件均有自己的makefile,这样通过make命令就可实现编译与连接。如果没有makefile的话,需要软件包制作者自己在编译段书写上一系列的编译连接命令。

1.3 %install :
此为安装段,其内容是安装脚本程序。该程序将已编译连接好的执行程序或其它文件存放到指定目录下,这些程序或文件供RPM打包时使用。一个最简单的例子就是程序中仅用一个make install命令,从而完成安装。这也需要相应的软件有makefile维护文件。没有的话,软件包制作者也得自己写指令。

1.4 %clean :
此为清理段,其内容是清理脚本程序。此程序在RPM制作好软件包后才执行,它通常是删除那些编译连接时产生的临时文件或目录,完成缮后工作。

2. 管理用功能段:
此类段用于软件包自身的管理(安装,卸载和校验),包括%pre,%post,%preun,%postun,和%verifyscript五个功能段。
2.1 %pre :

该段内容为安装前脚本程序。它在软件包安装之前执行,通常是检测操作环境,建立有关目录,清理多余文件等等,为软件包的顺利安装做准备。本段很少使用。
其段名格式为: %pre [子包选项]

2.2 %post :
该段内容为安装后脚本程序。它在软件包安装完成之后执行,常用来建立符号连接,修改系统配置文件,运行ldconfig程序等,以利软件的正常运行。
其段名格式为: %post [子包选项]

2.3 %preun :
该段内容为卸载前脚本程序。它在软件包卸载之前执行,主要为卸载做准备。具体如,要卸载的软件包中某个程序当前正在运行时,此脚本程序必须杀掉它,否则无法正确卸载。
其段名格式为: %preun [子包选项]

2.4 %postun :
该段内容为卸载后脚本程序。它在软件包卸载后执行,完成卸载的缮后工作,如将系统配置文件inetd.conf改回原来的样子,重新运行一下ldconfig命令,将已卸载的共享库从缓冲文件ld.so.cache中删除等等。
其段名格式为: %postun [子包选项]

2.5 %verifyscript :
该段内容为校验脚本程序。RPM校验软件包时,除了执行标准的校验外,如果软件包制作者设定有此校验脚本程序,还将执行之。

其段名格式为: %verifyscript [子包选项]
下面是XFree86-libs-3.3.6-6.i386.rpm软件包中的校验脚本程序,它校验的是动态链接库目录/usr/X11R6/lib。校验时,在/etc/ld.so.cache文件中查找/usr/X11R6/lib,如果找不到,则显示"missing",找到则显示"found"。
# verifyscript
echo -n "Looking for /usr/X11R6/lib in /etc/ld.so.conf... "
if ! grep "^/usr/X11R6/lib$" /etc/ld.so.conf > /dev/null
then
echo "missing"
echo "/usr/X11R6/lib missing from /etc/ld.so.conf" >&2
else
echo "found"
fi

3. 交互用功能段:
这类功能段有%triggerin,%triggerun,%triggerpostun,它们的内容都是RPM用于软件包之间交互控制的脚本程序。这些脚本程序都是在系统满足指定的条件下才触发执行的:

1) %triggerin : 段内为安装时触发脚本程序,当其所在软件包与指定软件包仅有一方已安装时,安装另一方将触发此程序执行;

2) %triggerun : 段内为卸载时触发脚本程序,当其所在软件包与指定软件包都已安装时,卸载二者中的任一个将触发此程序执行;

3) %triggerpostun : 段内为卸载后触发脚本程序,只有指定软件包卸载后才触发此程序执行。

3.1 段名格式
它们的段名描述格式均为:
交互段名 [子包选项] [-p 解释程序] -- 触发条件1 [,触发条件2] ...

注: []所括为可选项。子包选项见前面介绍,不赘述。

3.1.1 -p选项:
此选项用于指定一个解释程序,来解释执行交互功能段的脚本程序。默认情况下,RPM使
用/bin/sh来执行脚本(此类脚本用SHELL语言编写,也叫SHELL程序)。有的RPM包则是使用/usr/bin/perl
来执行脚本(此类脚本是用PERL这种解释性语言写的),这就需要用-p选项来指定解释程序为
/usr/bin/perl,如:
%triggerin -- sendmail
ln -sf /usr/bin/sendmail /etc/mymailer/mailer
%triggerin -- vmail
ln -sf /usr/bin/vmail /etc/mymailer/mailer

注: 此例中定义package子软件包安装时触发脚本程序:当触发条件(fileutils>3.0,perl<1.2)满足时,用/usr/bin/perl执行脚本,即用print命令输出字符串"I'm in my trigger!"。

3.1.2 触发条件:
交互功能段的触发条件格式是:
功能名 [比较符 版本号]

其中:比较符与版本号可选。仅有一个功能名时,表明该功能存在时触发程序执行。比较符可用大于(>),等于(=),小于(<),大于等于(>=)和小于等于(<=)。
如触发条件bash,又如触发条件fileutils>3.0,这种使用均合法。
交互功能段最少有一个触发条件。当有多个触发条件时,这些条件间均以逗号(,)分隔,它们之间是"或"的关系,即只要其中有一个条件系统满足,RPM就将执行触发脚本程序。如上面介绍-p选项时举的例子:例子中有两个触发条件fileutils>3.0和perl<1.2,在安装软件包时,只要有一个条件满足,RPM就会执行触发脚本,即输出"I'm in my trigger!"。

3.2 交互用功能段的使用
为什么要使用交互用功能段?下面的例子很能说明问题。
假定mymailer软件包需要/etc/mymailer/mailer这个符号连接文件指向当前使用的邮件发送代理程序。如果sendmail包安装了,那么这个符号连接文件应指向/usr/bin/sendmail程序。如果vmail包安装了,那么它应当指向/usr/bin/vmail程序。如果这两个软件包都安装了(实际上,sendmail与vmail彼此是冲突的),那么我们也无需考虑符号连接指向哪个文件了。当然,如果这两个包都未安装,那么/etc/mymailer/mailer符号连接文件也没有理由存在了。

上述要求,我们通过为mymailer软件包编写触发脚本程序来实现,这些脚本程序在下列事件发生时,将改变/etc/mymailer/mailer符号连接的内容:
1) sendmail已安装;
2) vmail已安装;
3) sendmail卸载时;
4) vmail卸载时。

前两个事件触发的脚本程序可以这样写:
%triggerin -- sendmail
ln -sf /usr/bin/sendmail /etc/mymailer/mailer
%triggerin -- vmail
ln -sf /usr/bin/vmail /etc/mymailer/mailer

这是两个安装时被sendmail或vmail所触发脚本程序。它们将在下列情况下执行:
1) 在mymailer包已安装的情况下,安装或升级sendmail包;
2) 在mymailer包已安装的情况下,安装或升级vmail包;
3) 在sendmail包已安装的情况下,安装或升级mymailer包;
4) 在vmail包已安装的情况下,安装或升级mymailer包。
后两个事件触发的脚本程序可以这么写:
%triggerun -- sendmail
[ $2 = 0 ] || exit 0
if [ -f /usr/bin/vmail ]
then
ln -sf /usr/bin/vmail /etc/mymailer/mailer
else
rm -f /etc/mymailer/mailer
fi
%triggerun -- vmail
[ $2 = 0 ] || exit 0
if [ -f /usr/bin/sendmail ]
then
ln -sf /usr/bin/sendmail /etc/mymailer/mailer
else
rm -f /etc/mymailer/mailer
fi

这两个脚本程序在下列情况下触发执行:
1) 在sendmail包已安装的情况下,卸载mymailer包;
2) 在vmail包已安装的情况下,卸载mymailer包;
3) 在mymailer包已安装的情况下,卸载sendmail包;
4) 在mymailer包已安装的情况下,卸载vmail包。
为了确保在mymailer包卸载后符号连接文件/etc/mymailer/mailer也被删除,可以在
mymailer软件包描述文件的%postun功能段内,加上删除该文件的命令:
%postun
[ $1 = 0 ] && rm -f /etc/mymailer/mailer

注: %postun段内为卸载后执行脚本程序,在mymailer包卸载后执行。
由上看出,当一个软件包与另一个软件包存在密切关系时,我们可以通过交互用功能段实现某些文件的管理,这不仅扩展了RPM软件包管理的功能,又有助于软件包的正常运行。

4. 其它功能段
其它功能段只有一个,即%changelog。这个段的内容是软件维护记录,它记录每次软件维护的时间,维护人及其EMAIL,维护的项目等。
%changelog段内容格式为:
* 星期 月份 日子 年份 维护内容
注: 每个维护记录均以*开头,星期,月份均须为英文缩写。维护内容多时可分行编写,
每行开头最好以减号(-)开头。可以采用类似LZE方式的维护记录写作格式见LZE描述文件第80-85行)
* 星期 月份 日子 年份 维护人 EMAIL
- 维护内容1
- 维护内容2
- ...... (其它维护内容)
(责任编辑 尤北 lvye@staff.ccidnet.com



另外,上面还缺两个链接 升级篇,卸载篇
http://www0.ccidnet.com/tech/foc ... ?specname=serialize
http://www0.ccidnet.com/tech/guide/2001/11/29/58_3815.html
http://www0.ccidnet.com/tech/guide/2001/11/30/58_3831.html
回复 支持 反对

使用道具 举报

发表于 2005-4-19 16:56:08 | 显示全部楼层
TODO:
还是不知道哪里定义了变量。

如何写自己的宏?

还需要找 rpm 的手册页,以及其他随机文档,还有 fedora extras, freshrpms 这些网站提供的各种 rpm 构建工具,还有仓库建设的工具。 上面提到的那些自动生成 spec 的工具也要研究一下,不过既然都需要手动修改,那么就提高不了多少效率。rpmlint 辅助工具有人研究过吗?autopackage 如果能做 rpm 就好了...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表