要想制作RPM格式的軟件包,需使用如下命令格式:
rpmbuild -bX [制作選項1制作選項2...]描述文件1描述文件2...
注:-bX可用-tX替換,效果有所不同:使用-b時,需要在命令行上指定軟件包描述文件;而使用-t時,在命令行上需要指定的不是軟件包描述文件,而是含有此描述文件的TAR格式的包裹文件(必須用gzip壓縮),RPM在準備制作軟件包時,會自動從此包裹文件中提取描述文件,根據(jù)其中的建包指令,生成RPM格式的軟件包。注意:此描述文件必須以.spec為后綴,其中必須有Source域,并且此域定義的源程序包必須存放在當前目錄下,否則的話,RPM將報錯退出。
注意,-bX與-tX當中的X,取不同的值時,RPM將執(zhí)行不同的操作:(下面各個例子均對LZE的描述文件lze-6.0-2.spec進行操作,有的則通過管道技術,用nl命令給輸出加上行號,以便解釋)
1)X=p時,指示RPM執(zhí)行描述文件中的預處理段(%prep)的腳本程序。該腳本程序一般用來解壓源程序包,并且為源程序打補丁,升級源程序。
#rpmbuild -bp lze-6.0-2.spec2>&1|nl
1Executing:%prep
2+umask022
3+cd/usr/src/dist/BUILD
4+echo‘預處理腳本程序(prep)開始執(zhí)行‘
5預處理腳本程序(prep)開始執(zhí)行
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開始執(zhí)行預處理段的腳本程序。例中行號后那些以加號(+)開始的行均為預處理段腳本程序的指令,其它內容則為指令執(zhí)行所輸出的結果。從預處理段腳本程序所執(zhí)行的指令,我們就可以看出RPM正在做什么:
第2行:設置文件創(chuàng)建掩碼;
第3行:轉到RPM默認的編譯目錄;
第4行:回顯字符串,這才是用戶所寫的預處理段腳本程序的開始,第2,3行均是RPM增加的指令;
第6-27行:為%setup所擴展出來的指令及其執(zhí)行結果,其中可以看到RPM用gzip命令解壓LZE的源程序包(第8行),而后用tar命令展開源程序包(第9行)。
第28行:正常退出,返回值為0。
2)X=l時,指示RPM檢查文件段(%files),看其中的文件是否存在。如果不存在,則RPM會報錯退出。
#rpmbuild -bl -vv lze-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對文件段的所有文件逐一進行檢查,找到的文件顯示其權限,屬主和屬組信息,結果發(fā)現(xiàn)/usr/doc/lze-6.0-2.LICENSE文件不存在,于是報出錯誤(File not found)(見第5行)。RPM在檢查過文件后,還顯示出描述文件要求LZE提供的功能(Provides)和所需的功能(Requires)。
3)當X=c時,指示RPM依次執(zhí)行預處理段(%prep),編譯段(%build)的腳本程序。編譯段的腳本程序用來編譯連接軟件的源程序,生成可執(zhí)行程序,通常一個make命令足夠。因為一個有良好習慣的程序員會把Makefile(程序維護文件)寫好,以便其它程序員編譯該軟件。如果某個軟件沒有維護文件的話,用戶要么自己寫個Makefile,要么在編譯段里寫上軟件編譯與連接的各項命令。
4)當X=i時,指示RPM依次執(zhí)行預處理段(%prep),編譯段(%build)和安裝段(%install)的腳本程序。安裝段的腳本程序的任務是將編譯連接好的執(zhí)行程序拷貝到適當?shù)哪夸?如/bin,/usr/bin等公共執(zhí)行目錄),以便打包或執(zhí)行。它通常執(zhí)行的指令是make install。
5)當X=b時,指示RPM依次執(zhí)行預處理段(%prep),編譯段(%build),安裝段(%install)的腳本程序,之后根據(jù)文件段(%files)的文件列表,將文件打包,生成RPM執(zhí)行程序包,最后執(zhí)行清理段(%clean)。
#rpmbuild -bb lze-6.0-2.spec2>&1|nl
1Executing:%prep
2+umask022
3+cd/usr/src/dist/BUILD
4+echo‘預處理腳本程序(prep)開始執(zhí)行‘
5預處理腳本程序(prep)開始執(zhí)行
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)開始執(zhí)行‘
35編譯連接腳本程序(build)開始執(zhí)行
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)開始執(zhí)行‘
49安裝腳本程序(install)開始執(zhí)行
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)開始執(zhí)行‘
66建包結束后清理腳本程序(clean)開始執(zhí)行
67+exit0
#
注:本例中,各行解釋如下:
第1行:顯示RPM開始執(zhí)行預處理段(%prep);
第2-29行:為預處理段(%prep)腳本程序執(zhí)行的命令與結果,命令前有加號(+),結果前面則沒有。預處理完成了LZE源程序包的解壓縮(gzip-dc)與包的展開(tar-xvvf),從而為源程序的編譯打下了基礎;
第30行:RPM表示開始執(zhí)行編譯段(%build);
第31-43行:為編譯段(%build)腳本程序執(zhí)行的命令與結果。腳本程序執(zhí)行的make維護命令,該命令執(zhí)行了cc編譯程序,以編譯與連接LZE軟件;
第44行:RPM表示開始執(zhí)行安裝段(%install);
第45-53行:為安裝段(%install)腳本程序執(zhí)行的命令與結果。本段程序執(zhí)行了makeinstall命令,將LZE的執(zhí)行程序等文件拷貝到系統(tǒng)目錄下;
第54行:RPM顯示:開始處理LZE的文件(為%files文件段的內容);
第55-59行:RPM利用/usr/lib/rpm/find-provides程序查找LZE提供的功能,又利用/usr/lib/rpm/find-requires查找LZE所依賴的功能,以設定LZE的依賴關系;
第60行:制作完成LZE執(zhí)行程序包,文件名為lze-6.0-2.i386.rpm,在/usr/src/dist/RPMS/i386目錄下;
第61行:RPM顯示:開始執(zhí)行清理段(%clean)腳本程序,本段程序用于清理臨時文件;
第62-67行:為清理段(%clean)腳本程序執(zhí)行的命令與結果。
從上我們可以清楚看出RPM制作軟件包的工作流程:預處理段,編譯段,安裝段,軟件包制作,清理段。
6)當X=s時,指示RPM建立源碼包。RPM源碼包的內容包括軟件包描述文件(SPEC),軟件源程序,軟件補丁程序,圖標文件等幾項。建立源碼包不需要執(zhí)行軟件包描述文件中的各個功能段,僅需將所需文件包含到包中即可。
#rpmbuild -bs lze-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
#
注:本例中,使用rpmbuild -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依次執(zhí)行預處理段(%prep),編譯段(%build),安裝段(%install)腳本程序,之后先生成RPM源碼包,再根據(jù)文件段(%files)的文件列表,將文件打包,生成RPM執(zhí)行程序包,最后執(zhí)行清理段(%clean)腳本程序,清除中間文件。此命令執(zhí)行的結果相當于先執(zhí)行rpmbuild -bs命令生成源碼包,再執(zhí)行rpmbuild -bb命令生成執(zhí)行碼包。
選項列表
選項詳解
通用選項的解釋見<<精通RPM之二——安裝篇>>,本文不再贅述。
1.——short-circuit:單步執(zhí)行
此選項的目的在于單步執(zhí)行功能段,僅適用命令為RPM-bc(或-tc)和-bi(或-ti)時。當用rpm-bc——short-circuit命令時,RPM將不再執(zhí)行預處理段(%prep)的腳本程序,直接執(zhí)行編譯段(%build)的腳本程序。當用rpmbuild -bi --short-circuit命令時,RPM將不再執(zhí)行預處理段(%prep)和編譯段(%build)的腳本程序,僅執(zhí)行安裝段(%install)的腳本程序。
為什么要使用這個選項?其原因可能是源程序包中的文件有問題,導致RPM在編譯或安裝過程中出現(xiàn)了這樣或那樣的錯誤,如不能單步執(zhí)行,則無法排除這些錯誤。單步執(zhí)行后,用戶可以進入源程序所在的目錄,查看源程序,修改錯誤,然后再用tar命令生成一個正確的源程序包,覆蓋掉原包即可。這樣,RPM再制作時就不會有問題了。
2.——timecheck:設置時間檢查值
該選項的用法是:——timecheck<secs>
注:<secs>為檢查的時間段,單位是秒,如——timecheck600設置檢查的時間段為600秒,即10分鐘。
設置時間檢查值的目的,在于檢驗打包文件是否是指定時間段內產生的新文件,如果不是,則RPM會產生警告信息,提醒用戶某個文件不是新文件,而是老文件,可能是某種錯誤導致的。這種錯誤,可能是由于makefile(維護文件)或描述文件中的安裝段腳本程序書寫不正確,從而使某個程序不能正確安裝到指定目錄,因而RPM打包時總是引用老的程序文件。如下面的例子:
#rpmbuild -bl --timecheck600 lze-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發(fā)出警告信息:“warning:TIMECHECKfailure:/usr/bin/lze”,這說明文件/usr/bin/lze時間檢查出現(xiàn)錯誤,這是個老文件。經(jīng)查,是makefile的問題,里面少了一句“cplze/usr/bin”。修正后,再次編譯連接程序,再進行時間檢查就沒有這個問題了。
3.——buildroot:設定建包用根目錄
該選項的用法是:
——buildroot<dir>
注:<dir>為用戶指定的建包用的根目錄。
此選項相當于在軟件包描述文件的文件頭加上一行:
Buildroot:<dir>
只不過在命令行上設定比較自由罷了。
通過設定建包用根目錄,一般用戶也可以建立那些只有超級用戶(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)開始執(zhí)行"
#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
注:腳本程序中,使用建包用根目錄的環(huán)境變量RPM_BUILD_ROOT,相繼在建包用根目錄下創(chuàng)建若干子目錄(usr/bin,etc,usr/doc/lze-6.0),然后拷貝程序或文件到相應的子目錄中,從而完成完裝。 5)選用——buildroot選項,執(zhí)行RPM建包命令:
$cd/usr/zzz/rpm/SPECS
$rpmbuild -bb --buildroot/usr/zzz/tmplze-6.0-2.spec
Executing:%prep
+umask022
+cd/usr/zzz/rpm/BUILD
+echo‘預處理腳本程序(prep)開始執(zhí)行‘
預處理腳本程序(prep)開始執(zhí)行
+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)開始執(zhí)行‘
編譯連接腳本程序(build)開始執(zhí)行
+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)開始執(zhí)行‘
安裝腳本程序(install)開始執(zhí)行
+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)開始執(zhí)行‘
建包結束后清理腳本程序(clean)開始執(zhí)行
+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
$
現(xiàn)在我們可以說,普通用戶也可以自由地建立各種形式的RPM軟件包了!
4.——target:設定目標平臺
該選項的用法為:——target體系-平臺-操作系統(tǒng)
注:RPM制作出來的軟件包默認的體系為i386,平臺為pc,操作系統(tǒng)為linux。如果用戶想加以改變,就需要使用此選項來確定一下,如下例:
#rpmbuild -bb --targeti686-pc-solaris——quietlze-6.0-2.spec
創(chuàng)建目標平臺:i686-pc-solaris
正在創(chuàng)建目標:i686-pc-solaris
#
本例設定生成的RPM包適用的目標平臺為:i686-pc-solaris(即體系為i686,平臺為pc,操作系統(tǒng)為solaris)。注意:必須在/usr/src/dist/RPMS目錄下創(chuàng)建一個i686的子目錄,沒有指定體系的子目錄,RPM將無法生成軟件包。我們可以查詢一下生成的軟件包,看其適用的體系與操作系統(tǒng)是什么:
#rpmbuild -qp --qf"archis%{arch}\nosis%{os}\n"/usr/src/dist/RPMS/i686/lze-6.0-2.i686.rpm
archisi686
osissolaris
#
從輸出上可以看到,其體系與操作系統(tǒng)正是我們所設定的。
5.——quiet:盡量減少信息輸出
此選項的目的,是讓RPM減少信息的輸出。使用此選項后,如果沒有錯誤發(fā)生,RPM就不會輸出多余的信息,這時的RPM也顯得比較“安靜”(quiet)了。
$rpmbuild -bl --quiet lze-6.0-2.spec
$
6.——clean:執(zhí)行文件清理
如果軟件包描述文件的清理段(%clean)沒有刪除臨時文件的命令,那么RPM建包結束后那些臨時文件還是存在的,占用了一定的空間。如果想讓RPM自動刪除那些臨時文件,可以在建包時使用——clean選項。此選項執(zhí)行一條命令,即:
rm-rf軟件名-版本號
用它來刪除"軟件名-版本號"目錄及該目錄下的所有文件。這個"軟件名-版本號"目錄,也即RPM默認的存放解壓后的源程序的目錄。
#rpmbuild -bl --clean lze-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開始執(zhí)行自己的文件清理操作。
7.——rmsource:刪除源程序及描述文件
此選項用于指示RPM在建包后刪除軟件源程序和包描述文件,軟件源程序由包描述文件中的Source域定義。此選項也可單獨使用,如:
#rpmbuild --rmsource lze-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:軟件包內置數(shù)字簽名
此選項用于在軟件包內添加PGP數(shù)字簽名,通過數(shù)字簽名,用戶可以校驗軟件包是否原裝,是否修改過。要使用PGP數(shù)字簽名,必須先安裝好PGP應用程序及產生自己的密鑰對。(有關數(shù)字簽名的內容,詳見<<精通RPM之八——簽名篇>>)
使用此選項建包時,RPM會要求輸入密碼,驗證正確后開始執(zhí)行建包的系列操作,在建包前會產生數(shù)字簽名,以便寫入包中。請看下例:(省略不少輸出,......表示)
#rpmbuild -bb --sign lze-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之下的幾行就是產生數(shù)字簽名時輸出的東西。
其它建包相關的命令
其它建包相關的命令有兩個,它們都是針對RPM格式的源碼包進行操作的,執(zhí)行時先安裝源碼包,然后再根據(jù)軟件包描述文件進行下一步的工作。 1.重編譯命令:
用法為:rpm——recompileRPM源碼包1RPM源碼包2...
如:
rpmbuild --recompile lze-6.0-2.src.rpm
此命令執(zhí)行時,首先安裝此源碼包,然后依次執(zhí)行源碼包內軟件包描述文件的預處理段(%prep),編譯段(%build),安裝段(%install)的腳本程序。此命令相當于以下兩條命令:
1)rpm -i lze-6.0-2.src.rpm
2)rpmbuild -bi lze-6.0-2.spec
2.重建立命令:
用法為:rpm——rebuildRPM源碼包1RPM源碼包2...
如:
rpmbuild --rebuild lze-6.0-2.src.rpm
重編譯命令執(zhí)行后并不建立新的RPM軟件包,而此重建立命令執(zhí)行后則會制作出一個新的RPM軟件包。重建立命令執(zhí)行時,首先安裝RPM源碼包,然后依次執(zhí)行源碼包內軟件包描述文件的預處理段(%prep),編譯段(%build),安裝段(%install),清理段(%clean)的腳本程序,生成一個新的RPM執(zhí)行包,最后刪除源程序包,描述文件及其它臨時文件。此命令相當于以下兩條命令:
1)rpmbuild -i lze-6.0-2.src.rpm
2)rpmbuild -bb --clean——resourcelze-6.0-2.spec