制作篇(下)
要想制作RPM格式的软件包,需使用如下命令格式:
注:-bX可用-tX替换,效果有所不同:使用-b时,需要在命令行上指定软件包描述文件;而使用-t时,在命令行上需要指定的不是软件包描述文件,而是含有此描述文件的TAR格式的包裹文件(必须用gzip压缩),RPM在准备制作软件包时,会自动从此包裹文件中提取描述文件,根据其中的建包指令,生成RPM格式的软件包。注意:此描述文件必须以.spec为后缀,其中必须有Source域,并且此域定义的源程序包必须存放在当前目录下,否则的话,RPM将报错退出。
注意,-bX与-tX当中的X,取不同的值时,RPM将执行不同的操作:(下面各个例子均对LZE的描述文件lze-6.0-2.spec进行操作,有的则通过管道技术,用nl命令给输出加上行号,以便解释)
1)X=p时,指示RPM执行描述文件中的预处理段(%prep)的脚本程序。该脚本程序一般用来解压源程序包,并且为源程序打补丁,升级源程序。
注:本例中第1行显示的"Executing:%prep"表明RPM开始执行预处理段的脚本程序。例中行号后那些以加号(+)开始的行均为预处理段脚本程序的指令,其它内容则为指令执行所输出的结果。从预处理段脚本程序所执行的指令,我们就可以看出RPM正在做什么:
第2行:设置文件创建掩码;
第3行:转到RPM默认的编译目录;
第4行:回显字符串,这才是用户所写的预处理段脚本程序的开始,第2,3行均是RPM增加的指令;
第6-27行:为%setup所扩展出来的指令及其执行结果,其中可以看到RPM用gzip命令解压LZE的源程序包(第8行),而后用tar命令展开源程序包(第9行)。
第28行:正常退出,返回值为0。
2)X=l时,指示RPM检查文件段(%files),看其中的文件是否存在。如果不存在,则RPM会报错退出。
注:本例命令中使用了通用选项-vv,以输出RPM检查时的调试信息(以行号和D:开始的行)。
由上看出,RPM对文件段的所有文件逐一进行检查,找到的文件显示其权限,属主和属组信息,结果发现/usr/doc/lze-6.0-2.LICENSE文件不存在,于是报出错误(File not found)(见第5行)。RPM在检查过文件后,还显示出描述文件要求LZE提供的功能(Provides)和所需的功能(Requires)。
3)当X=c时,指示RPM依次执行预处理段(%prep),编译段(%build)的脚本程序。编译段的脚本程序用来编译连接软件的源程序,生成可执行程序,通常一个make命令足够。因为一个有良好习惯的程序员会把Makefile(程序维护文件)写好,以便其它程序员编译该软件。如果某个软件没有维护文件的话,用户要么自己写个Makefile,要么在编译段里写上软件编译与连接的各项命令。
4)当X=i时,指示RPM依次执行预处理段(%prep),编译段(%build)和安装段(%install)的脚本程序。安装段的脚本程序的任务是将编译连接好的执行程序拷贝到适当的目录(如/bin,/usr/bin等公共执行目录),以便打包或执行。它通常执行的指令是make install。
5)当X=b时,指示RPM依次执行预处理段(%prep),编译段(%build),安装段(%install)的脚本程序,之后根据文件段(%files)的文件列表,将文件打包,生成RPM执行程序包,最后执行清理段(%clean)。
注:本例中,各行解释如下:
第1行:显示RPM开始执行预处理段(%prep);
第2-29行:为预处理段(%prep)脚本程序执行的命令与结果,命令前有加号(+),结果前面则没有。预处理完成了LZE源程序包的解压缩(gzip-dc)与包的展开(tar-xvvf),从而为源程序的编译打下了基础;
第30行:RPM表示开始执行编译段(%build);
第31-43行:为编译段(%build)脚本程序执行的命令与结果。脚本程序执行的make维护命令,该命令执行了cc编译程序,以编译与连接LZE软件;
第44行:RPM表示开始执行安装段(%install);
第45-53行:为安装段(%install)脚本程序执行的命令与结果。本段程序执行了makeinstall命令,将LZE的执行程序等文件拷贝到系统目录下;
第54行:RPM显示:开始处理LZE的文件(为%files文件段的内容);
第55-59行:RPM利用/usr/lib/rpm/find-provides程序查找LZE提供的功能,又利用/usr/lib/rpm/find-requires查找LZE所依赖的功能,以设定LZE的依赖关系;
第60行:制作完成LZE执行程序包,文件名为lze-6.0-2.i386.rpm,在/usr/src/dist/RPMS/i386目录下;
第61行:RPM显示:开始执行清理段(%clean)脚本程序,本段程序用于清理临时文件;
第62-67行:为清理段(%clean)脚本程序执行的命令与结果。
从上我们可以清楚看出RPM制作软件包的工作流程:预处理段,编译段,安装段,软件包制作,清理段。
6)当X=s时,指示RPM建立源码包。RPM源码包的内容包括软件包描述文件(SPEC),软件源程序,软件补丁程序,图标文件等几项。建立源码包不需要执行软件包描述文件中的各个功能段,仅需将所需文件包含到包中即可。
注:本例中,使用rpm-bs命令生成了LZE源码包lze-6.0-2.src.rpm(在RPM标准源码目录/usr/src/dist/SRPMS下),然后用rpm -qplv命令查询源码包中所含的文件信息,从中可以看到LZE源码包中有两个文件:一个是软件包描述文件lze-6.0-2.spec,一个是LZE源代码包lze-6.0-2.src.tgz(TAR打包再用gzip压缩),此文件由描述文件中的Source域确定。
7)当X=a时,指示RPM依次执行预处理段(%prep),编译段(%build),安装段(%install)脚本程序,之后先生成RPM源码包,再根据文件段(%files)的文件列表,将文件打包,生成RPM执行程序包,最后执行清理段(%clean)脚本程序,清除中间文件。此命令执行的结果相当于先执行rpm-bs命令生成源码包,再执行rpm-bb命令生成执行码包。
选项列表
选项详解
通用选项的解释见<<精通RPM之二--安装篇>>,本文不再赘述。
1.--short-circuit:单步执行
此选项的目的在于单步执行功能段,仅适用命令为RPM-bc(或-tc)和-bi(或-ti)时。当用rpm-bc--short-circuit命令时,RPM将不再执行预处理段(%prep)的脚本程序,直接执行编译段(%build)的脚本程序。当用rpm-bi--short-circuit命令时,RPM将不再执行预处理段(%prep)和编译段(%build)的脚本程序,仅执行安装段(%install)的脚本程序。
为什么要使用这个选项?其原因可能是源程序包中的文件有问题,导致RPM在编译或安装过程中出现了这样或那样的错误,如不能单步执行,则无法排除这些错误。单步执行后,用户可以进入源程序所在的目录,查看源程序,修改错误,然后再用tar命令生成一个正确的源程序包,覆盖掉原包即可。这样,RPM再制作时就不会有问题了。
2.--timecheck:设置时间检查值
该选项的用法是:--timecheck
注: 为检查的时间段,单位是秒,如--timecheck600设置检查的时间段为600秒,即10分钟。
设置时间检查值的目的,在于检验打包文件是否是指定时间段内产生的新文件,如果不是,则RPM会产生警告信息,提醒用户某个文件不是新文件,而是老文件,可能是某种错误导致的。这种错误,可能是由于makefile(维护文件)或描述文件中的安装段脚本程序书写不正确,从而使某个程序不能正确安装到指定目录,因而RPM打包时总是引用老的程序文件。如下面的例子:
注:本例中利用RPM检查文件列表,看哪个文件是在10分钟以前产生的老文件,结果RPM发出警告信息:“warning:TIMECHECKfailure:/usr/bin/lze”,这说明文件/usr/bin/lze时间检查出现错误,这是个老文件。经查,是makefile的问题,里面少了一句“cplze/usr/bin”。修正后,再次编译连接程序,再进行时间检查就没有这个问题了。
3.--buildroot:设定建包用根目录
该选项的用法是:
注:
为用户指定的建包用的根目录。
此选项相当于在软件包描述文件的文件头加上一行:
只不过在命令行上设定比较自由罢了。
通过设定建包用根目录,一般用户也可以建立那些只有超级用户(root)才能建立的RPM包了。下面以普通用户zzz建立LZE软件包为例,说明一下这种形式的包的建立过程。
1)在用户zzz的HOME目录(/usr/zzz)下,建立RPM建包所用的目录:
2)拷贝描述文件lze-6.0-2.spec到rpm/SPECS目录,拷贝源程序包lze-6.0-2.src.tgz到rpm/SOURCES目录。
3)建立.rpmmacros文件,编辑它:
在此文件中增加一行:
用于确定RPM建包用的顶层目录为/usr/zzz/rpm。
4)转到描述文件目录,编辑修改lze-6.0-2.spec安装段的脚本程序:
用于确定RPM建包用的顶层目录为/usr/zzz/rpm。
安装段脚本程序修改为:(原make命令被注释掉)
注:脚本程序中,使用建包用根目录的环境变量RPM_BUILD_ROOT,相继在建包用根目录下创建若干子目录(usr/bin,etc,usr/doc/lze-6.0),然后拷贝程序或文件到相应的子目录中,从而完成完装。 5)选用--buildroot选项,执行RPM建包命令:
注:RPM建包成功后,生成了/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm包裹文件,
通过RPM的查询命令,我们就可以知道该包与由超级用户建成的包内容毫无二致:
现在我们可以说,普通用户也可以自由地建立各种形式的RPM软件包了!
4.--target:设定目标平台
该选项的用法为:--target体系-平台-操作系统
注:RPM制作出来的软件包默认的体系为i386,平台为pc,操作系统为linux。如果用户想加以改变,就需要使用此选项来确定一下,如下例:
本例设定生成的RPM包适用的目标平台为:i686-pc-solaris(即体系为i686,平台为pc,操作系统为solaris)。注意:必须在/usr/src/dist/RPMS目录下创建一个i686的子目录,没有指定体系的子目录,RPM将无法生成软件包。我们可以查询一下生成的软件包,看其适用的体系与操作系统是什么:
从输出上可以看到,其体系与操作系统正是我们所设定的。
5.--quiet:尽量减少信息输出
此选项的目的,是让RPM减少信息的输出。使用此选项后,如果没有错误发生,RPM就不会输出多余的信息,这时的RPM也显得比较“安静”(quiet)了。
6.--clean:执行文件清理
如果软件包描述文件的清理段(%clean)没有删除临时文件的命令,那么RPM建包结束后那些临时文件还是存在的,占用了一定的空间。如果想让RPM自动删除那些临时文件,可以在建包时使用--clean选项。此选项执行一条命令,即:
rm-rf软件名-版本号
用它来删除"软件名-版本号"目录及该目录下的所有文件。这个"软件名-版本号"目录,也即RPM默认的存放解压后的源程序的目录。
注:例中的“Executing:--clean”表示RPM开始执行自己的文件清理操作。
7.--rmsource:删除源程序及描述文件
此选项用于指示RPM在建包后删除软件源程序和包描述文件,软件源程序由包描述文件中的Source域定义。此选项也可单独使用,如:
8.--sign:软件包内置数字签名
此选项用于在软件包内添加PGP数字签名,通过数字签名,用户可以校验软件包是否原装,是否修改过。要使用PGP数字签名,必须先安装好PGP应用程序及产生自己的密钥对。(有关数字签名的内容,详见<<精通RPM之八--签名篇>>)
使用此选项建包时,RPM会要求输入密码,验证正确后开始执行建包的系列操作,在建包前会产生数字签名,以便写入包中。请看下例:(省略不少输出,......表示)
注:例中要求输入密码,输入mypass后校验成功,之后RPM开始建包操作。(实际上,mypass在屏幕上并不显示出来)例中的Generatingsignature之下的几行就是产生数字签名时输出的东西。
其它建包相关的命令
其它建包相关的命令有两个,它们都是针对RPM格式的源码包进行操作的,执行时先安装源码包,然后再根据软件包描述文件进行下一步的工作。 1.重编译命令:
用法为:rpm--recompileRPM源码包1RPM源码包2...
如:
此命令执行时,首先安装此源码包,然后依次执行源码包内软件包描述文件的预处理段(%prep),编译段(%build),安装段(%install)的脚本程序。此命令相当于以下两条命令:
2.重建立命令:
用法为:rpm--rebuildRPM源码包1RPM源码包2...
如:
重编译命令执行后并不建立新的RPM软件包,而此重建立命令执行后则会制作出一个新的RPM软件包。重建立命令执行时,首先安装RPM源码包,然后依次执行源码包内软件包描述文件的预处理段(%prep),编译段(%build),安装段(%install),清理段(%clean)的脚本程序,生成一个新的RPM执行包,最后删除源程序包,描述文件及其它临时文件。此命令相当于以下两条命令:
要想制作RPM格式的软件包,需使用如下命令格式:
rpm-bX[制作选项1制作选项2...]描述文件1描述文件2... |
注:-bX可用-tX替换,效果有所不同:使用-b时,需要在命令行上指定软件包描述文件;而使用-t时,在命令行上需要指定的不是软件包描述文件,而是含有此描述文件的TAR格式的包裹文件(必须用gzip压缩),RPM在准备制作软件包时,会自动从此包裹文件中提取描述文件,根据其中的建包指令,生成RPM格式的软件包。注意:此描述文件必须以.spec为后缀,其中必须有Source域,并且此域定义的源程序包必须存放在当前目录下,否则的话,RPM将报错退出。
注意,-bX与-tX当中的X,取不同的值时,RPM将执行不同的操作:(下面各个例子均对LZE的描述文件lze-6.0-2.spec进行操作,有的则通过管道技术,用nl命令给输出加上行号,以便解释)
1)X=p时,指示RPM执行描述文件中的预处理段(%prep)的脚本程序。该脚本程序一般用来解压源程序包,并且为源程序打补丁,升级源程序。
#rpm-bplze-6.0-2.spec2>&1|nl 1Executing:%prep 2+umask022 3+cd/usr/src/dist/BUILD 4+echo'预处理脚本程序(prep)开始执行' 5预处理脚本程序(prep)开始执行 6+cd/usr/src/dist/BUILD 7+rm-rflze-6.0 8+/bin/gzip-dc/usr/src/dist/SOURCES/lze-6.0-2.src.tgz 9+tar-xvvf- 10drwxr-xr-xroot/root02001-11-0216:02lze-6.0/ 11-rw-------root/root2462262001-11-0216:00lze-6.0/lze.c 12-rw-------root/root982492001-11-0216:00lze-6.0/lzeime.wb.c 13-rw-------root/root3399022001-11-0216:00lze-6.0/lzeime.py.c 14-rw-r--r--root/root12832001-11-0216:00lze-6.0/funkey.def 15-rwxr--r--root/root2502001-11-0216:00lze-6.0/inputme.def 16-rw-r--r--root/root8132742001-11-0216:00lze-6.0/wbzc.dat 17-rw-------root/root4742001-11-0216:02lze-6.0/makefile 18+STATUS=0 19+'['0-ne0']' 20+cdlze-6.0 21++/usr/bin/id-u 22+'['0=0']' 23+/bin/chown-Rhfroot. 24++/usr/bin/id-u 25+'['0=0']' 26+/bin/chgrp-Rhfroot. 27+/bin/chmod-Rfa+rX,g-w,o-w. 28+exit0 # |
注:本例中第1行显示的"Executing:%prep"表明RPM开始执行预处理段的脚本程序。例中行号后那些以加号(+)开始的行均为预处理段脚本程序的指令,其它内容则为指令执行所输出的结果。从预处理段脚本程序所执行的指令,我们就可以看出RPM正在做什么:
第2行:设置文件创建掩码;
第3行:转到RPM默认的编译目录;
第4行:回显字符串,这才是用户所写的预处理段脚本程序的开始,第2,3行均是RPM增加的指令;
第6-27行:为%setup所扩展出来的指令及其执行结果,其中可以看到RPM用gzip命令解压LZE的源程序包(第8行),而后用tar命令展开源程序包(第9行)。
第28行:正常退出,返回值为0。
2)X=l时,指示RPM检查文件段(%files),看其中的文件是否存在。如果不存在,则RPM会报错退出。
#rpm-bl-vvlze-6.0-2.spec|nl 1Processingfiles:lze 2D:File0:0100644root.root/etc/funkey.def 3D:File1:0100644root.root/etc/inputme.def 4D:File2:0100644root.root/usr/doc/lze-6.0-2/README 5Filenotfound:/usr/doc/lze-6.0-2/LICENSE 6D:File3:0100555root.root/usr/bin/lze 7D:File4:0100511root.root/usr/bin/lzeime.py 8D:File5:0100511root.root/usr/bin/lzeime.wb 9D:File6:0100644root.root/etc/wbzc.dat 10Provides:lze-edit 11PreReq:/bin/sh 12Requires:/bin/sh # |
注:本例命令中使用了通用选项-vv,以输出RPM检查时的调试信息(以行号和D:开始的行)。
由上看出,RPM对文件段的所有文件逐一进行检查,找到的文件显示其权限,属主和属组信息,结果发现/usr/doc/lze-6.0-2.LICENSE文件不存在,于是报出错误(File not found)(见第5行)。RPM在检查过文件后,还显示出描述文件要求LZE提供的功能(Provides)和所需的功能(Requires)。
3)当X=c时,指示RPM依次执行预处理段(%prep),编译段(%build)的脚本程序。编译段的脚本程序用来编译连接软件的源程序,生成可执行程序,通常一个make命令足够。因为一个有良好习惯的程序员会把Makefile(程序维护文件)写好,以便其它程序员编译该软件。如果某个软件没有维护文件的话,用户要么自己写个Makefile,要么在编译段里写上软件编译与连接的各项命令。
4)当X=i时,指示RPM依次执行预处理段(%prep),编译段(%build)和安装段(%install)的脚本程序。安装段的脚本程序的任务是将编译连接好的执行程序拷贝到适当的目录(如/bin,/usr/bin等公共执行目录),以便打包或执行。它通常执行的指令是make install。
5)当X=b时,指示RPM依次执行预处理段(%prep),编译段(%build),安装段(%install)的脚本程序,之后根据文件段(%files)的文件列表,将文件打包,生成RPM执行程序包,最后执行清理段(%clean)。
#rpm-bblze-6.0-2.spec2>&1|nl 1Executing:%prep 2+umask022 3+cd/usr/src/dist/BUILD 4+echo'预处理脚本程序(prep)开始执行' 5预处理脚本程序(prep)开始执行 6+cd/usr/src/dist/BUILD 7+rm-rflze-6.0 8+tar-xvvf- 9+/bin/gzip-dc/usr/src/dist/SOURCES/lze-6.0-2.src.tgz 10drwxr-xr-xroot/root02001-11-0217:04lze-6.0/ 11-rw-------root/root2462262001-11-0216:00lze-6.0/lze.c 12-rw-------root/root982492001-11-0216:00lze-6.0/lzeime.wb.c 13-rw-------root/root3399022001-11-0216:00lze-6.0/lzeime.py.c 14-rw-r--r--root/root12832001-11-0216:00lze-6.0/funkey.def 15-rwxr--r--root/root2502001-11-0216:00lze-6.0/inputme.def 16-rw-r--r--root/root8132742001-11-0216:00lze-6.0/wbzc.dat 17-rw-------root/root4742001-11-0216:02lze-6.0/makefile 18-rw-r--r--root/root12552001-11-0217:04lze-6.0/getinputme.c 19+STATUS=0 20+'['0-ne0']' 21+cdlze-6.0 22++/usr/bin/id-u 23+'['0=0']' 24+/bin/chown-Rhfroot. 25++/usr/bin/id-u 26+'['0=0']' 27+/bin/chgrp-Rhfroot. 28+/bin/chmod-Rfa+rX,g-w,o-w. 29+exit0 30Executing:%build 31+umask022 32+cd/usr/src/dist/BUILD 33+cdlze-6.0 34+echo'编译连接脚本程序(build)开始执行' 35编译连接脚本程序(build)开始执行 36+make 37cc-fwritable-strings-DUSE_AS_LZE-DFOR_LINUX-s-I/usr/zzz/src/include-DFOR_LZE_INPUTME-olze/usr/zzz/src/li- 38bsrc/mycurses.clze.cgetinputme.c/usr/zzz/src/my.a 39cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.wbgetinputme.clzeime.wb.c/usr/zzz/src/my.a 40lzeime.wb.c:Infunction`do_service': 41lzeime.wb.c:1409:warning:passingarg5of`bsearch'fromincompatiblepointertype 42cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.pygetinputme.clzeime.py.c/usr/zzz/src/my.a 43+exit0 44Executing:%install 45+umask022 46+cd/usr/src/dist/BUILD 47+cdlze-6.0 48+echo'安装脚本程序(install)开始执行' 49安装脚本程序(install)开始执行 50+makeinstall 51installing... 52done 53+exit0 54Processingfiles:lze 55FindingProvides:(using/usr/lib/rpm/find-provides)... 56FindingRequires:(using/usr/lib/rpm/find-requires)... 57Provides:lze-edit 58PreReq:/bin/sh 59Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1) 60Wrote:/usr/src/dist/RPMS/i386/lze-6.0-2.i386.rpm 61Executing:%clean 62+umask022 63+cd/usr/src/dist/BUILD 64+cdlze-6.0 65+echo'建包结束后清理脚本程序(clean)开始执行' 66建包结束后清理脚本程序(clean)开始执行 67+exit0 # |
注:本例中,各行解释如下:
第1行:显示RPM开始执行预处理段(%prep);
第2-29行:为预处理段(%prep)脚本程序执行的命令与结果,命令前有加号(+),结果前面则没有。预处理完成了LZE源程序包的解压缩(gzip-dc)与包的展开(tar-xvvf),从而为源程序的编译打下了基础;
第30行:RPM表示开始执行编译段(%build);
第31-43行:为编译段(%build)脚本程序执行的命令与结果。脚本程序执行的make维护命令,该命令执行了cc编译程序,以编译与连接LZE软件;
第44行:RPM表示开始执行安装段(%install);
第45-53行:为安装段(%install)脚本程序执行的命令与结果。本段程序执行了makeinstall命令,将LZE的执行程序等文件拷贝到系统目录下;
第54行:RPM显示:开始处理LZE的文件(为%files文件段的内容);
第55-59行:RPM利用/usr/lib/rpm/find-provides程序查找LZE提供的功能,又利用/usr/lib/rpm/find-requires查找LZE所依赖的功能,以设定LZE的依赖关系;
第60行:制作完成LZE执行程序包,文件名为lze-6.0-2.i386.rpm,在/usr/src/dist/RPMS/i386目录下;
第61行:RPM显示:开始执行清理段(%clean)脚本程序,本段程序用于清理临时文件;
第62-67行:为清理段(%clean)脚本程序执行的命令与结果。
从上我们可以清楚看出RPM制作软件包的工作流程:预处理段,编译段,安装段,软件包制作,清理段。
6)当X=s时,指示RPM建立源码包。RPM源码包的内容包括软件包描述文件(SPEC),软件源程序,软件补丁程序,图标文件等几项。建立源码包不需要执行软件包描述文件中的各个功能段,仅需将所需文件包含到包中即可。
#rpm-bslze-6.0-2.spec Wrote:/usr/src/dist/SRPMS/lze-6.0-2.src.rpm #rpm-qplv/usr/src/dist/SRPMS/lze-6.0-2.src.rpm -rw-------rootroot206711月215:44lze-6.0-2.spec -rw-r--r--rootroot53870611月217:05lze-6.0-2.src.tgz # |
注:本例中,使用rpm-bs命令生成了LZE源码包lze-6.0-2.src.rpm(在RPM标准源码目录/usr/src/dist/SRPMS下),然后用rpm -qplv命令查询源码包中所含的文件信息,从中可以看到LZE源码包中有两个文件:一个是软件包描述文件lze-6.0-2.spec,一个是LZE源代码包lze-6.0-2.src.tgz(TAR打包再用gzip压缩),此文件由描述文件中的Source域确定。
7)当X=a时,指示RPM依次执行预处理段(%prep),编译段(%build),安装段(%install)脚本程序,之后先生成RPM源码包,再根据文件段(%files)的文件列表,将文件打包,生成RPM执行程序包,最后执行清理段(%clean)脚本程序,清除中间文件。此命令执行的结果相当于先执行rpm-bs命令生成源码包,再执行rpm-bb命令生成执行码包。
选项列表
![](http://www.linuxfans.org/nuke/image/jtrpm7c-01.gif)
选项详解
通用选项的解释见<<精通RPM之二--安装篇>>,本文不再赘述。
1.--short-circuit:单步执行
此选项的目的在于单步执行功能段,仅适用命令为RPM-bc(或-tc)和-bi(或-ti)时。当用rpm-bc--short-circuit命令时,RPM将不再执行预处理段(%prep)的脚本程序,直接执行编译段(%build)的脚本程序。当用rpm-bi--short-circuit命令时,RPM将不再执行预处理段(%prep)和编译段(%build)的脚本程序,仅执行安装段(%install)的脚本程序。
为什么要使用这个选项?其原因可能是源程序包中的文件有问题,导致RPM在编译或安装过程中出现了这样或那样的错误,如不能单步执行,则无法排除这些错误。单步执行后,用户可以进入源程序所在的目录,查看源程序,修改错误,然后再用tar命令生成一个正确的源程序包,覆盖掉原包即可。这样,RPM再制作时就不会有问题了。
2.--timecheck:设置时间检查值
该选项的用法是:--timecheck
注: 为检查的时间段,单位是秒,如--timecheck600设置检查的时间段为600秒,即10分钟。
设置时间检查值的目的,在于检验打包文件是否是指定时间段内产生的新文件,如果不是,则RPM会产生警告信息,提醒用户某个文件不是新文件,而是老文件,可能是某种错误导致的。这种错误,可能是由于makefile(维护文件)或描述文件中的安装段脚本程序书写不正确,从而使某个程序不能正确安装到指定目录,因而RPM打包时总是引用老的程序文件。如下面的例子:
#rpm-bl--timecheck600lze-6.0-2.spec Processingfiles:lze warning:TIMECHECKfailure:/usr/bin/lze FindingProvides:(using/usr/lib/rpm/find-provides)... FindingRequires:(using/usr/lib/rpm/find-requires)... Provides:lze-edit PreReq:/bin/sh Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1) # |
注:本例中利用RPM检查文件列表,看哪个文件是在10分钟以前产生的老文件,结果RPM发出警告信息:“warning:TIMECHECKfailure:/usr/bin/lze”,这说明文件/usr/bin/lze时间检查出现错误,这是个老文件。经查,是makefile的问题,里面少了一句“cplze/usr/bin”。修正后,再次编译连接程序,再进行时间检查就没有这个问题了。
3.--buildroot:设定建包用根目录
该选项的用法是:
--buildroot
|
注:
此选项相当于在软件包描述文件的文件头加上一行:
Buildroot:
|
只不过在命令行上设定比较自由罢了。
通过设定建包用根目录,一般用户也可以建立那些只有超级用户(root)才能建立的RPM包了。下面以普通用户zzz建立LZE软件包为例,说明一下这种形式的包的建立过程。
1)在用户zzz的HOME目录(/usr/zzz)下,建立RPM建包所用的目录:
$cd/usr/zzz $mkdir-prpm/{BUILD,RPMS/i386,SOURCES,SPECS,SRPMS} $ |
2)拷贝描述文件lze-6.0-2.spec到rpm/SPECS目录,拷贝源程序包lze-6.0-2.src.tgz到rpm/SOURCES目录。
$cd/usr/zzz $cp/root/lze-6.0-2.specrpm/SPECS $cp/root/lze-6.0-2.src.tgzrpm/SOURCES $ |
3)建立.rpmmacros文件,编辑它:
$cd/usr/zzz $vi.rpmmacros |
%_topdir/usr/zzz/rpm |
用于确定RPM建包用的顶层目录为/usr/zzz/rpm。
4)转到描述文件目录,编辑修改lze-6.0-2.spec安装段的脚本程序:
$cd/usr/zzz/rpm/SPECS $vilze-6.0-2.spec $ |
用于确定RPM建包用的顶层目录为/usr/zzz/rpm。
安装段脚本程序修改为:(原make命令被注释掉)
%install echo"安装脚本程序(install)开始执行" #makeinstall mkdir-p$RPM_BUILD_ROOT/usr/bin mkdir-p$RPM_BUILD_ROOT/etc mkdir-p$RPM_BUILD_ROOT/usr/doc/lze-6.0 cplzelzeime.wblzeime.py$RPM_BUILD_ROOT/usr/bin cpinputme.deffunkey.defwbzc.dat$RPM_BUILD_ROOT/etc cp/usr/doc/lze-6.0/*$RPM_BUILD_ROOT/usr/doc/lze-6.0 |
注:脚本程序中,使用建包用根目录的环境变量RPM_BUILD_ROOT,相继在建包用根目录下创建若干子目录(usr/bin,etc,usr/doc/lze-6.0),然后拷贝程序或文件到相应的子目录中,从而完成完装。 5)选用--buildroot选项,执行RPM建包命令:
$cd/usr/zzz/rpm/SPECS $rpm-bb--buildroot/usr/zzz/tmplze-6.0-2.spec Executing:%prep +umask022 +cd/usr/zzz/rpm/BUILD +echo'预处理脚本程序(prep)开始执行' 预处理脚本程序(prep)开始执行 +cd/usr/zzz/rpm/BUILD +rm-rflze-6.0 +/bin/gzip-dc/usr/zzz/rpm/SOURCES/lze-6.0-2.src.tgz +tar-xvvf- drwxr-xr-xroot/root02001-11-0217:04lze-6.0/ -rw-------root/root2462262001-11-0216:00lze-6.0/lze.c -rw-------root/root982492001-11-0216:00lze-6.0/lzeime.wb.c -rw-------root/root3399022001-11-0216:00lze-6.0/lzeime.py.c -rw-r--r--root/root12832001-11-0216:00lze-6.0/funkey.def -rwxr--r--root/root2502001-11-0216:00lze-6.0/inputme.def -rw-r--r--root/root8132742001-11-0216:00lze-6.0/wbzc.dat -rw-------root/root4742001-11-0216:02lze-6.0/makefile -rw-r--r--root/root12552001-11-0217:04lze-6.0/getinputme.c +STATUS=0 +'['0-ne0']' +cdlze-6.0 ++/usr/bin/id-u +'['500=0']' ++/usr/bin/id-u +'['500=0']' +/bin/chmod-Rfa+rX,g-w,o-w. +exit0 Executing:%build +umask022 +cd/usr/zzz/rpm/BUILD +cdlze-6.0 +echo'编译连接脚本程序(build)开始执行' 编译连接脚本程序(build)开始执行 +make cc-fwritable-strings-DUSE_AS_LZE-DFOR_LINUX-s-I/usr/zzz/src/include-DFOR_LZE_INPUTME-olze/usr/zzz/src/libsrc/mycurses.clze.cgetinputme.c/usr/zzz/src/my.a cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.wbgetinputme.clzeime.wb.c/usr/zzz/src/my.a lzeime.wb.c:Infunction`do_service': lzeime.wb.c:1409:warning:passingarg5of`bsearch'fromincompatiblepointertype cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.pygetinputme.clzeime.py.c/usr/zzz/src/my.a +exit0 Executing:%install +umask022 +cd/usr/zzz/rpm/BUILD +cdlze-6.0 +echo'安装脚本程序(install)开始执行' 安装脚本程序(install)开始执行 +mkdir-p/usr/zzz/tmp/usr/bin +mkdir-p/usr/zzz/tmp/etc +mkdir-p/usr/zzz/tmp/usr/doc/lze-6.0 +cplzelzeime.wblzeime.py/usr/zzz/tmp/usr/bin +cpinputme.deffunkey.defwbzc.dat/usr/zzz/tmp/etc +cp/usr/doc/lze-6.0/LICENSE/usr/doc/lze-6.0/README/usr/zzz/tmp/usr/doc/lze-6.0 +exit0 Processingfiles:lze FindingProvides:(using/usr/lib/rpm/find-provides)... FindingRequires:(using/usr/lib/rpm/find-requires)... Provides:lze-edit PreReq:/bin/sh Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1) Wrote:/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm Executing:%clean +umask022 +cd/usr/zzz/rpm/BUILD +cdlze-6.0 +echo'建包结束后清理脚本程序(clean)开始执行' 建包结束后清理脚本程序(clean)开始执行 +exit0 $ |
通过RPM的查询命令,我们就可以知道该包与由超级用户建成的包内容毫无二致:
$rpm-qplv/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm -rw-r--r--rootroot128311月609:24/etc/funkey.def -rwxr-xr-xrootroot25011月609:24/etc/inputme.def -rw-r--r--rootroot81327411月609:24/etc/wbzc.dat -rwxr-xr-xrootroot40863211月609:24/usr/bin/lze -rwxr-xr-xrootroot8292011月609:24/usr/bin/lzeime.py -rwxr-xr-xrootroot3856811月609:24/usr/bin/lzeime.wb -rw-r--r--rootroot121511月609:24/usr/doc/lze-6.0/LICENSE -rw-r--r--rootroot369011月609:24/usr/doc/lze-6.0/README $ |
现在我们可以说,普通用户也可以自由地建立各种形式的RPM软件包了!
4.--target:设定目标平台
该选项的用法为:--target体系-平台-操作系统
注:RPM制作出来的软件包默认的体系为i386,平台为pc,操作系统为linux。如果用户想加以改变,就需要使用此选项来确定一下,如下例:
#rpm-bb--targeti686-pc-solaris--quietlze-6.0-2.spec 创建目标平台:i686-pc-solaris 正在创建目标:i686-pc-solaris # |
本例设定生成的RPM包适用的目标平台为:i686-pc-solaris(即体系为i686,平台为pc,操作系统为solaris)。注意:必须在/usr/src/dist/RPMS目录下创建一个i686的子目录,没有指定体系的子目录,RPM将无法生成软件包。我们可以查询一下生成的软件包,看其适用的体系与操作系统是什么:
#rpm-qp--qf"archis%{arch}nosis%{os}n"/usr/src/dist/RPMS/i686/lze-6.0-2.i686.rpm archisi686 osissolaris # |
从输出上可以看到,其体系与操作系统正是我们所设定的。
5.--quiet:尽量减少信息输出
此选项的目的,是让RPM减少信息的输出。使用此选项后,如果没有错误发生,RPM就不会输出多余的信息,这时的RPM也显得比较“安静”(quiet)了。
$rpm-bl--quietlze-6.0-2.spec $ |
6.--clean:执行文件清理
如果软件包描述文件的清理段(%clean)没有删除临时文件的命令,那么RPM建包结束后那些临时文件还是存在的,占用了一定的空间。如果想让RPM自动删除那些临时文件,可以在建包时使用--clean选项。此选项执行一条命令,即:
rm-rf软件名-版本号
用它来删除"软件名-版本号"目录及该目录下的所有文件。这个"软件名-版本号"目录,也即RPM默认的存放解压后的源程序的目录。
#rpm-bl--cleanlze-6.0-2.spec Processingfiles:lze FindingProvides:(using/usr/lib/rpm/find-provides)... FindingRequires:(using/usr/lib/rpm/find-requires)... Provides:lze-edit PreReq:/bin/sh Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1) Executing:--clean +umask022 +cd/usr/src/dist/BUILD +rm-rflze-6.0 +exit0 |
注:例中的“Executing:--clean”表示RPM开始执行自己的文件清理操作。
7.--rmsource:删除源程序及描述文件
此选项用于指示RPM在建包后删除软件源程序和包描述文件,软件源程序由包描述文件中的Source域定义。此选项也可单独使用,如:
#rpm--rmsourcelze-6.0-2.spec #lslze-6.0-2.spec../SOURCES/lze-6.0-2.src.tgz ls:lze-6.0-2.spec:文件或目录不存在 ls:../SOURCES/lze-6.0-2.src.tgz:文件或目录不存在 # |
8.--sign:软件包内置数字签名
此选项用于在软件包内添加PGP数字签名,通过数字签名,用户可以校验软件包是否原装,是否修改过。要使用PGP数字签名,必须先安装好PGP应用程序及产生自己的密钥对。(有关数字签名的内容,详见<<精通RPM之八--签名篇>>)
使用此选项建包时,RPM会要求输入密码,验证正确后开始执行建包的系列操作,在建包前会产生数字签名,以便写入包中。请看下例:(省略不少输出,......表示)
#rpm-bb--signlze-6.0-2.spec Enterpassphrase:mypass Passphraseisgood. Executing:%prep ...... Executing:%build ...... Executing:%install ...... Processingfiles:lze ...... Requires:/bin/shld-linux.so.2libc.so.6 Generatingsignature:1002 GeneratingsignatureusingPGP. PrettyGoodPrivacy(tm)Version6.5.8 (c)1999NetworkAssociatesInc. UsestheRSAREF(tm)Toolkit,whichiscopyrightRSADataSecurity,Inc. ExportofthissoftwaremayberestrictedbytheU.S.government. Wrote:/root/test/RPMS/i386/lze-6.0-2.i386.rpm Executing:%clean ...... # |
注:例中要求输入密码,输入mypass后校验成功,之后RPM开始建包操作。(实际上,mypass在屏幕上并不显示出来)例中的Generatingsignature之下的几行就是产生数字签名时输出的东西。
其它建包相关的命令
其它建包相关的命令有两个,它们都是针对RPM格式的源码包进行操作的,执行时先安装源码包,然后再根据软件包描述文件进行下一步的工作。 1.重编译命令:
用法为:rpm--recompileRPM源码包1RPM源码包2...
如:
rpm--recompilelze-6.0-2.src.rpm |
此命令执行时,首先安装此源码包,然后依次执行源码包内软件包描述文件的预处理段(%prep),编译段(%build),安装段(%install)的脚本程序。此命令相当于以下两条命令:
1)rpm-ilze-6.0-2.src.rpm 2)rpm-bilze-6.0-2.spec |
2.重建立命令:
用法为:rpm--rebuildRPM源码包1RPM源码包2...
如:
rpm--rebuildlze-6.0-2.src.rpm |
重编译命令执行后并不建立新的RPM软件包,而此重建立命令执行后则会制作出一个新的RPM软件包。重建立命令执行时,首先安装RPM源码包,然后依次执行源码包内软件包描述文件的预处理段(%prep),编译段(%build),安装段(%install),清理段(%clean)的脚本程序,生成一个新的RPM执行包,最后删除源程序包,描述文件及其它临时文件。此命令相当于以下两条命令:
1)rpm-ilze-6.0-2.src.rpm 2)rpm-bb--clean--resourcelze-6.0-2.spec |