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

  免費注冊 查看新帖 |

Chinaunix

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

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

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

論壇徽章:
0
12 [報告]
發(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 [報告]
發(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 \


這個表達式的寫法我沒看懂,但是意思應(yīng)該很明確,就是判斷 rpmbuild 時 是否打開了 __debug_package 宏
如果打開的話,在config 時就支持debug子包,否則就不支持。
這個配置在:
/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 平臺,則定義 __debug_package 為1,并且在產(chǎn)生子包 xxx-debug.

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

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


excludearch :
說明該RPM不能在該平臺上 build,因為該軟件還未移植到該平臺或者在該平臺運行不穩(wěn)定。一般寫法是

  1. ExcludeArch: sparc alpha
復(fù)制代碼
可以exclude 一個或者多個 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 相反,指明該包只能在某個平臺上build,支持一到多個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 安裝時可以通過 --prefix=xx 來改變默認安裝位置。
比如你的 spec 中 prefix 指定為: prefix: /opt
而你的 %files 中文件路徑為 “/opt/blather/foonly”這樣的,那么,如果你在安裝時指定prefix 為

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


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

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

論壇徽章:
0
15 [報告]
發(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ù)制代碼
這幾個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 [報告]
發(fā)表于 2012-12-18 10:14 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 20:05 編輯

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

spec 中的腳本,也稱為 hook 腳本,因為他們就想 netfilter 中的 hook 函數(shù),就像 yum 的 plugin,在一個流程的不同點去執(zhí)行,控制流程的行為,豐富流程的功能。

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

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

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

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

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

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

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

  1. %build
  2. ./configure  --with-ssl=openssl
  3. make
復(fù)制代碼
%install 是包build過程中安裝到buid_root時執(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 這個hook點腳本是rpm build完成后執(zhí)行的腳本,大多數(shù)內(nèi)容是直接刪除build 目錄:

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

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

初次安裝那么容易了。

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

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

軟件卸載時將其刪除。

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

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

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

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

典型的范例。

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

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

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

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


然后看下 rpm 升級時 rpm 命令的流程。

RPM升級流程

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

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

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

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

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

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




關(guān)于以上這個順序,一定要牢記和理解,因為,如果理解不對的話,在 rpm 升級時很可能就造成很大的差錯。

舉一個最常見的例子,好多人不知道老版本的rpm的文件在升級時會被自動刪除掉,就認為需要人為來刪除這些文件。

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

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

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

但是如果是升級呢?

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

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

還是卸載操作,如下:

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

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

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

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


hook點的命令默認是用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 [報告]
發(fā)表于 2012-12-18 20:17 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 20:17 編輯

RPM的校驗時腳本-%verifyscript

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

  1. %verifyscript
  2. echo "verify by duanjigang now"
復(fù)制代碼
然后編譯生成包后進行 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 [報告]
發(fā)表于 2012-12-18 20:20 |只看該作者
本帖最后由 duanjigang 于 2012-12-18 20:24 編輯

RPM 安裝/卸載時的 trigger 腳本

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

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

這樣描述:

安裝A包時安裝了幾個觸發(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包被安裝時,如果B包已經(jīng)安裝,該觸發(fā)器對應(yīng)的腳本會執(zhí)行。
(2): B %triggerun 當(dāng)A包被安裝時,如果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)你的包安裝時,如果ruby這個包已經(jīng)存在,就會打印信息。
trigger 和 hook在軟件升級時的執(zhí)行順序
印信息。
假設(shè)以前安裝的老版本RPM是n,新版本的包是N。
1) 執(zhí)行 N 的pre 腳本
2): 拷貝N的文件列表
3): 執(zhí)行N的 post 腳本
4): 檢查所有其它RPM的triggerin 觸發(fā)器,如果有被N的安裝觸發(fā)的,就會執(zhí)行對應(yīng)的腳本。
5): 執(zhí)行N的所有 triggerin 觸發(fā)器。
6): 執(zhí)行n的所有triggerun觸發(fā)器
7): 檢查所有其它RPM的triggerin 觸發(fā)器,如果有被N的卸載觸發(fā)的,就會執(zhí)行對應(yīng)的腳本。
: 執(zhí)行 n 的 preun 腳本。
9): 刪除 n 的所有未被 N 覆蓋的文件。
10):執(zhí)行 n 的postun 腳本。

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


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

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


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

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

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP