要想制作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命令生成执行码包。
选项列表
选项详解
通用选项的解释见>,本文不再赘述。
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建包成功后,生成了/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm包裹文件,
通过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-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
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)
选项详解
通用选项的解释见>,本文不再赘述。
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建包成功后,生成了/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm包裹文件,
通过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-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