亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: duanjigang
打印 上一主題 下一主題

Linux平臺(tái)軟件管理系統(tǒng)設(shè)計(jì)與規(guī)劃-進(jìn)階篇(2)-rpm生成:rpmbuild 和 spec文件剖析 [復(fù)制鏈接]

論壇徽章:
1
白銀圣斗士
日期:2015-11-23 08:33:04
11 [報(bào)告]
發(fā)表于 2012-12-17 14:30 |只看該作者
還有人奉獻(xiàn)!加油!

論壇徽章:
0
12 [報(bào)告]
發(fā)表于 2012-12-17 23:51 |只看該作者
回復(fù) 6# duanjigang
相關(guān)的部分為:
%build_src_dir/scripts/config \
        --set-str CONFIG_LOCALVERSION %release_num-%build_flavor \
        --enable  CONFIG_SUSE_KERNEL \
%if 0%{?__debug_package:1}
        --enable  CONFIG_DEBUG_INFO \
        --disable  CONFIG_DEBUG_INFO_REDUCED
%else
        --disable CONFIG_DEBUG_INFO
%endif

該spec是內(nèi)核編譯的spec,具體請見附件
kernel-defaule.spec.tar.gz (661.89 KB, 下載次數(shù): 50)

   

論壇徽章:
0
13 [報(bào)告]
發(fā)表于 2012-12-18 09:26 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 09:37 編輯
lofeng410 發(fā)表于 2012-12-17 23:51
回復(fù) 6# duanjigang
相關(guān)的部分為:
%build_src_dir/scripts/config \


這個(gè)表達(dá)式的寫法我沒看懂,但是意思應(yīng)該很明確,就是判斷 rpmbuild 時(shí) 是否打開了 __debug_package 宏
如果打開的話,在config 時(shí)就支持debug子包,否則就不支持。
這個(gè)配置在:
/usr/lib/rpm/macros

中有

  1. #       Template for debug information sub-package.
  2. %debug_package \
  3. %ifnarch noarch\
  4. %global __debug_package 1\
  5. %package debug\
  6. Summary: Debug information for package %{name}\
  7. Group: Development/Debug\
  8. AutoReqProv: 0\
  9. %description debug\
  10. This package provides debug information for package %{name}.\
  11. Debug information is useful when developing applications that use this\
  12. package or when debugging this package.\
  13. %files debug -f debugfiles.list\
  14. %defattr(-,root,root)\
  15. %endif\
  16. %{nil}
復(fù)制代碼
如果是非 noarch 平臺(tái),則定義 __debug_package 為1,并且在產(chǎn)生子包 xxx-debug.

論壇徽章:
0
14 [報(bào)告]
發(fā)表于 2012-12-18 09:45 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 09:59 編輯

平臺(tái)架構(gòu)和OS相關(guān)的TAGS:


excludearch :
說明該RPM不能在該平臺(tái)上 build,因?yàn)樵撥浖未移植到該平臺(tái)或者在該平臺(tái)運(yùn)行不穩(wěn)定。一般寫法是

  1. ExcludeArch: sparc alpha
復(fù)制代碼
可以exclude 一個(gè)或者多個(gè) arch.

  1. # rpm -ba cdplayer-1.0.spec
  2. Arch mismatch!
  3. cdplayer-1.0.spec doesn't build on this architecture
  4. #
復(fù)制代碼
exclusivearch
  與上面的 excludearch 相反,指明該包只能在某個(gè)平臺(tái)上build,支持一到多個(gè)arch.
比如:

  1. ExclusiveArch: sparc alpha
復(fù)制代碼
ExcludeOS 和 exclusiveos 也是類似的,只不過針對的是OS
例子如下:

  1. ExcludeOS: linux irix
  2. ExclusiveOS: linux
復(fù)制代碼
目錄相關(guān)的TAGS:

prefix:
主要為了構(gòu)建 “relocatable ”包而用,也就是你在rpm 安裝時(shí)可以通過 --prefix=xx 來改變默認(rèn)安裝位置。
比如你的 spec 中 prefix 指定為: prefix: /opt
而你的 %files 中文件路徑為 “/opt/blather/foonly”這樣的,那么,如果你在安裝時(shí)指定prefix 為

  1. --prefix=/tmp/123
復(fù)制代碼
則對應(yīng)的包blather 會(huì)安裝到 /tmp/123/blather 目錄下。


buildroot 主要是包在編譯生成RPM時(shí)用到,可以參考開始的文章內(nèi)容:

  1. BuildRoot: /tmp/cdplayer
復(fù)制代碼

論壇徽章:
0
15 [報(bào)告]
發(fā)表于 2012-12-18 10:11 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 10:12 編輯

其它的TAG 再大致列舉下:

源碼和patche相關(guān)的:

  1. source
  2. nosource
  3. patch
  4. nopatch
復(fù)制代碼
這幾個(gè)Tag,具體的意思可以參考spec文件的語法和例子spec文件。
比如openssl.spec文件中的例子:

  1. Source: openssl-fips-%{version}-usa.tar.bz2
  2. Source1: hobble-openssl
  3. Source2: Makefile.certificate
  4. Source3: ca-bundle.crt
  5. Source4: https://rhn.redhat.com/help/RHNS-CA-CERT
  6. Source5: https://rhn.redhat.com/help/RHNS-CA-CERT.asc
  7. Source6: make-dummy-cert
  8. Source8: openssl-thread-test.c
  9. Source9: opensslconf-new.h
  10. Source10: opensslconf-new-warning.h
  11. Source11: README.FIPS

  12. Patch0: openssl-fips-0.9.8e-redhat.patch
  13. Patch1: openssl-0.9.8a-defaults.patch
  14. Patch2: openssl-0.9.8a-link-krb5.patch
  15. Patch3: openssl-0.9.8b-soversion.patch
  16. Patch4: openssl-0.9.8a-enginesdir.patch
  17. Patch5: openssl-0.9.8a-no-rpath.patch
  18. %{SOURCE1} > /dev/null
  19. %patch0 -p1 -b .redhat
  20. %patch1 -p1 -b .defaults
  21. # Fix link line for libssl (bug #111154).
  22. %patch2 -p1 -b .krb5
  23. %patch3 -p1 -b .soversion
  24. %patch4 -p1 -b .enginesdir
  25. %patch5 -p1 -b .no-rpath


  26. %patch32 -p1 -b .ia64
  27. #patch33 is applied after make test
  28. %patch34 -p1 -b .x509
  29. %patch35 -p1 -b .version-add-engines
  30. %patch38 -p1 -b .cipher-change
  31. %patch39 -p1 -b .ipv6-apps
復(fù)制代碼

論壇徽章:
0
16 [報(bào)告]
發(fā)表于 2012-12-18 10:14 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 20:05 編輯

tag的說明就到此結(jié)束,下來看看spec中的
scripts 腳本

spec 中的腳本,也稱為 hook 腳本,因?yàn)樗麄兙拖?netfilter 中的 hook 函數(shù),就像 yum 的 plugin,在一個(gè)流程的不同點(diǎn)去執(zhí)行,控制流程的行為,豐富流程的功能。

spec 中的腳本可以分為三大類,根據(jù)執(zhí)行的場景劃分:

(1): build 時(shí)腳本:在 RPM 的編譯過程中執(zhí)行
(2): 安裝/卸載時(shí)腳本:在RPM的安裝/升級(jí)/卸載時(shí)執(zhí)行
(3): 校驗(yàn)時(shí)腳本: 在 RPM 命令校驗(yàn)已安裝 RPM 時(shí)執(zhí)行。
(4): 另外,還會(huì)再補(bǔ)充下 觸發(fā)器(Trigger)腳本

build 時(shí)腳本:
    作為開發(fā)人員可能都知道。源代碼編譯成二進(jìn)制包,基本上分為以下不可缺少的四步:

  1.     1): 解壓縮源碼
  2.     2): 編譯源碼
  3.     3): 安裝二進(jìn)制程序/軟件
  4.     4):清除編譯環(huán)境
復(fù)制代碼
對應(yīng)于這四個(gè)不同的點(diǎn),SPEC 提供了四個(gè)腳本hook點(diǎn),每個(gè)hook點(diǎn)的聲明:

  1. %hook_name #比如 %pre, %build, %install, %clean
  2. hook點(diǎn)的腳本內(nèi)容
復(fù)制代碼
每個(gè)hook點(diǎn)的腳本都會(huì)最終被存儲(chǔ)到一個(gè)腳本文件中去解釋,因此,在這些hook點(diǎn),你就當(dāng)是在寫你的腳本文件。

在 %pre 這個(gè)hook點(diǎn)一般做的事情都是編譯前環(huán)境準(zhǔn)備,大致有:

  1.    (1):創(chuàng)建工作的頂級(jí)目錄
  2.    (2): 把源代碼解壓縮到 build 目錄。
  3.    (3): 如果有patch定義的話,patch所有代碼。
  4.    (4): 其它事情,為代碼build做好準(zhǔn)備。
復(fù)制代碼
%build hook點(diǎn)的腳本一般就是configure和build源碼,比如 wget 的SPEC中的 %build 段是這么寫的:

  1. %build
  2. ./configure  --with-ssl=openssl
  3. make
復(fù)制代碼
%install 是包build過程中安裝到buid_root時(shí)執(zhí)行的腳本。
最常見的執(zhí)行腳本就是:

  1. %install
  2. make install prefix=$RPM_BUILD_ROOT/usr

  3. mkdir -p $RPM_BUILD_ROOT/usr/xxoo
  4. install binname $RPM_BUILD_ROOT/usr/xxoo/bin
復(fù)制代碼
等。

%clean 這個(gè)hook點(diǎn)腳本是rpm build完成后執(zhí)行的腳本,大多數(shù)內(nèi)容是直接刪除build 目錄:

  1. %clean
  2. [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
復(fù)制代碼
RPM 的 安裝/升級(jí)/卸載 hook 腳本

在一個(gè)機(jī)器上第一次安裝一個(gè)RPM,那是很容易而且簡單的事情,但是,一旦目標(biāo)機(jī)器已經(jīng)安裝了某個(gè)包,軟件升級(jí)和卸載就不像

初次安裝那么容易了。

我們很容易能想到的事情有:

第一:軟件自帶的默認(rèn)配置文件,你可能在使用一段時(shí)間后,已經(jīng)做了很多修改,當(dāng)然不希望升級(jí)時(shí)默認(rèn)的配置將其覆蓋或者

軟件卸載時(shí)將其刪除。

第二:軟件產(chǎn)生的數(shù)據(jù)和日志文件,有時(shí)我們希望都保留下來或者刪除日志,保留數(shù)據(jù)等等。

要完成這些任務(wù),僅僅靠RPM的文件安裝功能是不能做到的,必須得在一些執(zhí)行點(diǎn)執(zhí)行某些命令來配合完成。

因此,RPM提供了四個(gè)安裝/卸載時(shí)執(zhí)行的hook函數(shù)可以潛入在RPM中,兩個(gè)給安裝用,兩個(gè)給卸載用。

這種在一些列操作流程中注入hook操作點(diǎn)的方法,在軟件中已經(jīng)很常見了,比如 yum 的 branch插件,netfilter的hook模塊等,都是

典型的范例。

%pre 段的命令會(huì)在 rpm 安裝前執(zhí)行

%post 段的命令會(huì)在 rpm 安裝后執(zhí)行。

%preun 段的命令會(huì)在 rpm 卸載前執(zhí)行。

%postun 段的命令會(huì)在 rpm 卸載后執(zhí)行。


然后看下 rpm 升級(jí)時(shí) rpm 命令的流程。

RPM升級(jí)流程

(1): 執(zhí)行 新版rpm 的 pre 段命令

(2): 安裝新版RPM的文件列表

(3): 執(zhí)行新版RPM的post 段命令

(4): 執(zhí)行老版本rpm 的 preun 段命令

(5): 刪除老版本RPM中沒有被新版本RPM覆蓋的文件(也就是說不再被新版本RPM使用的文件),這個(gè)過程是自動(dòng)的。

(6): 執(zhí)行老版本RPM的 postun 段命令。




關(guān)于以上這個(gè)順序,一定要牢記和理解,因?yàn),如果理解不對的話,?rpm 升級(jí)時(shí)很可能就造成很大的差錯(cuò)。

舉一個(gè)最常見的例子,好多人不知道老版本的rpm的文件在升級(jí)時(shí)會(huì)被自動(dòng)刪除掉,就認(rèn)為需要人為來刪除這些文件。

于是他會(huì)在rpm的 postun 中寫入腳本去 rm -fr /安裝目錄。

這樣會(huì)出現(xiàn)什么問題呢?

我們可以看到,卸載的話,是沒問題的,先 preun, 再postun.

但是如果是升級(jí)呢?

最后一步執(zhí)行的老版本的postun,這樣的話,新安裝的文件都會(huì)被干掉,導(dǎo)致不僅升級(jí)失敗,而且原來的文件也丟失了。

為了保證 rpm 的制作者或者開發(fā)人員能夠靈活的使用這四個(gè)hook,rpm 為 四個(gè)hook點(diǎn)的執(zhí)行命令提供了一個(gè)參數(shù),來區(qū)分是安裝,還是升級(jí)

還是卸載操作,如下:

(1): %pre 如果參數(shù)是1,說明是初次安裝,如果是2,說明是版本升級(jí)

(2): %post 參數(shù)1表示首次安裝,2表示升級(jí)

(3): %preun 和 %postun 的參數(shù)如果是1,表示是升級(jí)

(4): %preun 和 %postun 的參數(shù)是0,表示是卸載。


hook點(diǎn)的命令默認(rèn)是用shell解釋期來解釋執(zhí)行的,當(dāng)然你也可以自己定義解釋器,比如:

  1. %pre -p /usr/bin/perl
  2. if ( $ARGV[0] == 1 ) {
  3.   print "Preparing for initial install...\n"
  4. }
  5. elsif ( $ARGV[0] == 2 ) {
  6.   print "Preparing to upgrade software...\n"
  7. }
復(fù)制代碼

論壇徽章:
0
17 [報(bào)告]
發(fā)表于 2012-12-18 20:17 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 20:17 編輯

RPM的校驗(yàn)時(shí)腳本-%verifyscript

這個(gè)腳本一般會(huì)在rpm包校驗(yàn)時(shí)執(zhí)行,腳本行為完全根據(jù)包制作人的想法去走,因?yàn)閞pm本身會(huì)校驗(yàn)rpm的文件列表,因此,你可以在這里做任何蛋疼的事情。
而且,默認(rèn)情況下 %verifyscript 的打印內(nèi)容不會(huì)打印出來,除非你用 verbose 模式進(jìn)行校驗(yàn),比如,在 test-baby 的 spec 文件中寫:

  1. %verifyscript
  2. echo "verify by duanjigang now"
復(fù)制代碼
然后編譯生成包后進(jìn)行 verify,如下:

  1. rpm -qpVv RPMS/x86_64/test-baby-1.1-1.x86_64.rpm  
  2. Unsatisfied dependencies for test-baby-1.1-1.x86_64: baby-is-provided
  3. missing   d /usr/bin/test_baby
  4. verify by duanjigang now
復(fù)制代碼

論壇徽章:
0
18 [報(bào)告]
發(fā)表于 2012-12-18 20:20 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 20:24 編輯

RPM 安裝/卸載時(shí)的 trigger 腳本

trigger 腳本不同于 hook腳本之處在于,hook 腳本會(huì)在這些點(diǎn)無條件執(zhí)行,而trigger只有滿足定義的條件時(shí)才執(zhí)行指定腳本。

trigger這個(gè)機(jī)制,為被安裝包提供了更靈活的與其它rpm包交互或者通訊的方法。

這樣描述:

安裝A包時(shí)安裝了幾個(gè)觸發(fā)器trigger,并且安裝的trigger定義了對其它包B的檢測,一般的對B的檢測就是安裝,卸載等狀態(tài),

如果觸發(fā)器被觸發(fā),則執(zhí)行該trigger對應(yīng)的腳本。

A %triggerin script runs when the named package is installed.
%triggerun runs when the named package is uninstalled.
A %triggerpostun script runs after the named package is uninstalled.

(1): B %triggerin 當(dāng)A包被安裝時(shí),如果B包已經(jīng)安裝,該觸發(fā)器對應(yīng)的腳本會(huì)執(zhí)行。
(2): B %triggerun 當(dāng)A包被安裝時(shí),如果B包已經(jīng)被卸載,該觸發(fā)器對應(yīng)的腳本執(zhí)行。
(3): B %triggerpostun: A包安裝后,如果B包被卸載,卸載完成后該觸發(fā)器對應(yīng)的腳本執(zhí)行。


通過 --來指定被監(jiān)控的包,比如:
%triggerin -p /usr/bin/perl -- ruby
# print "ruby alreay installed"
當(dāng)你的包安裝時(shí),如果ruby這個(gè)包已經(jīng)存在,就會(huì)打印信息。
trigger 和 hook在軟件升級(jí)時(shí)的執(zhí)行順序
印信息。
假設(shè)以前安裝的老版本RPM是n,新版本的包是N。
1) 執(zhí)行 N 的pre 腳本
2): 拷貝N的文件列表
3): 執(zhí)行N的 post 腳本
4): 檢查所有其它RPM的triggerin 觸發(fā)器,如果有被N的安裝觸發(fā)的,就會(huì)執(zhí)行對應(yīng)的腳本。
5): 執(zhí)行N的所有 triggerin 觸發(fā)器。
6): 執(zhí)行n的所有triggerun觸發(fā)器
7): 檢查所有其它RPM的triggerin 觸發(fā)器,如果有被N的卸載觸發(fā)的,就會(huì)執(zhí)行對應(yīng)的腳本。
: 執(zhí)行 n 的 preun 腳本。
9): 刪除 n 的所有未被 N 覆蓋的文件。
10):執(zhí)行 n 的postun 腳本。

還有一點(diǎn)要記住,切記不要在rpm的hook或者trigger中編寫和用戶交互的腳本。rpm安裝本來就是為了批量自動(dòng)安裝的。
交互式腳本會(huì)讓rpm的安裝 hang 住。


#########################################################################
到此未知,RPM的SPEC中的另一大元素,SCRIPTS(腳本就算介紹完了)。

論壇徽章:
0
19 [報(bào)告]
發(fā)表于 2012-12-21 13:39 |只看該作者
回復(fù) 13# duanjigang


   %debug_package這是個(gè)系統(tǒng)內(nèi)置宏吧?如何使用這個(gè)宏呢?我在.rpmmacros中直接添加%debug_package,rpmbuild報(bào)錯(cuò),has empty body。

論壇徽章:
0
20 [報(bào)告]
發(fā)表于 2012-12-21 13:52 |只看該作者
為啥系統(tǒng)內(nèi)置宏直接%就可以了?而我們定義時(shí),要使用%define呢
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP