[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ A ] [ 下一頁 ]
在程式的來源程式碼目錄中有一個名叫“debian”的新子目錄。在這個子目錄中有很多 我們需要檔案,透過修改這些檔案可以訂製套裝軟體的行為。其中最為重要的 是“control”、“changelog”、“copyright”和“rules”,它們對於所有的套裝軟體都 是必需的。
在這個檔案中包裝檔含了很多變數,dpkg
、dselect
和其它套裝軟體管理
工具透過它們來管理套裝軟體。
dh_make為我們建立的control檔案如下所示:
1 Source: gentoo 2 Section: unknown 3 Priority: optional 4 Maintainer: Josip Rodin <joy-mg@debian.org> 5 Build-Depends: debhelper (>> 3.0.0) 6 Standards-Version: 3.5.2 7 8 Package: gentoo 9 Architecture: any 10 Depends: ${shlibs:Depends} 11 Description: <insert up to 60 chars description> 12 <insert long description, indented message spaces>
(我為它增加了行號。)
1-6行是來源程式形式套裝軟體的控制資訊。
第1行是來源程式包裝檔的名字。
第2行是來源程式包裝檔在發行版中所屬部分。
你也許已經注意到了,Debian被分成許多不同的部分:包裝檔括main(自由軟 件)、non-free(非自由軟體)和contrib(基於非自由軟體的自由軟體)。在這些部 分中,還有子分類,這些子分類以簡短的方式說明了套裝軟體的用途。比 如“admin”是只有系統管理員才能使用的程式,“base”是基本的工具,“devel”是 給程式員使用的工具,“doc”是文件,“libs”是函式庫,“mail”是信件閱讀工具 和背景作業程式,“net”是網路應用程式和背景作業程式,“x11”是不屬於以上各個部分 的X11程式,還有更多這裡就不一一敘述了。
我們把它改成x11。(“main/”是預設的前綴,因此我們可以忽略它。)
第3行描述了在使用者安裝系統時此套裝軟體的重要程度。參考政策手冊中相對的指導 可以知道應當把它設定成什麼。“optional”的優先等級對於新套裝軟體通常是合適的。
所屬部分和優先等級對dselect
等前端軟體是有用的,它們在排序和選擇缺
省的套裝軟體時會用到這些變數。當你把套裝軟體上傳到Debian以後,這兩個字串的
值可以被文件維護員修改,在這種情況下,你會收到一封知會電子信件。
因為這是一個普通層級的套裝軟體,並且它不和其它任何套裝軟體衝突,我們讓它保 留原來的“optional”。
第四行是維護者的姓名和電子信件位址。一定要保證這個字串包裝檔含有一個合法的 電子信件“To: ”字串,因為在你把套裝軟體上傳以後,bug追蹤系統將會使用這個 位址來傳遞知會bug資訊的電子信件給你。不要使用逗號、“&”符號和括號。
第五行包裝檔括了要建立你的套裝軟體需要的套裝軟體列表。包裝檔括gcc和make在內的一些軟
件包裝檔是不需要列出來的,關於此內容的詳細資訊可以參考軟體
包裝檔build-essential
。如果在建構你的套裝軟體時需要一些非標準的編譯
器或是是其它的工具,你就需要把它們加到“Build-Depends”這一行上。多個項目
之間用逗號隔開;要了解關於這個項目的語法的更多資訊,請閱讀關於二進位文
件倚賴性的解釋。
你還可以在這裡加入Build-Depends-Indep、Build-Conflicts和其它一些字 段。Debian的套裝軟體自動建構系統將會使用這些資料為其它的電腦平台建立二 進制套裝軟體。可以參考政策手冊中關於build-dependencies的部分和程式員參考 手冊,裡面包裝檔含有關於其它平台(體系結構)以及如何把軟體移植到上面的更多信 息。
要想知道你的軟體在編譯的時候需要用到哪一個套裝軟體,可以透過下面的方法:
strace -f -o /tmp/log ./configure # or make instead of ./configure, if the package doesn't use autoconf for x in `dpkg -S $(grep open /tmp/log|\ perl -pe 's!.* open\(\"([^\"]*).*!$1!' |\ grep "^/"| sort | uniq|\ grep -v "^\(/tmp\|/dev\|/proc\)" ) 2>/dev/null|\ cut -f1 -d":"| sort | uniq`; \ do \ echo -n "$x (>=" `dpkg -s $x|grep ^Version|cut -f2 -d":"` "), "; \ done
要準確地找到建立/usr/bin/foo
所需要的套裝軟體,執行:
objdump -p /usr/bin/foo | grep NEEDED
而要列出每一個庫,如libfoo.so.6
,執行:
dpkg -S libfoo.so.6
現在你已經安裝了“Build-deps”一項列出的每一個-dev套裝軟體。如果你使
用ldd
來完成這個工作,它會把並非直接使用的庫也報告出來,導致過
多的建構依賴。
Gentoo還需要軟體
包裝檔xlibs-dev
、libgtk1.2-dev
和libglib1.2-dev
才
能夠建構,因此我們把它們加到debhelper
的後面。
第6行是這個套裝軟體遵循的Debian政策標準的版本,也就是你在製作這個套裝軟體時讀 的政策手冊的那個版本。
第8行是二進位套裝軟體的名字。它通常和來源檔案套裝軟體有一樣的名字,但實際上並 不一定得是這樣。
第9行描述了可以使用這個二進位套裝軟體的CPU類型。我們讓它保持原來的“any”值,
因為dpkg-gencontrol(1)
會在為任何一種機器編譯這
個套裝軟體時自動為這個字串填寫合適的值。
如果你的套裝軟體是體系結構無關的(比如一個shell或Perl腳本,或是是文件),就 把這個字串修改成“all”,另外在稍後還要仔細看一下“rules”檔案, 第 4.4 節中關於 用“binary-indep”規則來代替“binary-arch”規則的內容。
第10行顯示了Debian套裝軟體系統的一個強大功能。套裝軟體可以透過多種不同的方 式和其它的套裝軟體相關連。除了Depends:之外,還有其它的關聯字串,它們 是Recommends:、Suggests:、Pre-Depends:、Conflicts:、Provides:和Replaces:。
在管理這些套裝軟體的關聯時,所有的套裝軟體管理工具通常的行為都是一樣的;如
果不是這樣的話,它將會給出解釋。(參考dpkg(8)
、dselect(8)
、apt(8)
和aptitude(1)
等。)
下面給出每一種套裝軟體依存性的含義:
Depends:
除非把此套裝軟體所倚賴的所有其它套裝軟體安裝好,否則套裝軟體將不會被安裝。你 可以在除非提供了一個其它的套裝軟體,否則你的套裝軟體絕對不能執行(或是會導致 嚴重的breakage)時使用這種關聯。
Recommends:
dselect或是是aptitude等前端工具在安裝你的套裝軟體的時候,它們會問你是否將 與該套裝軟體以推薦的方式相關聯的套裝軟體一起安裝;dselect甚至會堅持這樣做。 而dpkg和apt-get會忽略這個字串。這個字串可以被用於那些並不是嚴格需要卻經 常會和你的套裝軟體一起使用的套裝軟體。
Suggests:
在一個使用者安裝你的軟體時,所有的前端工具都會詢問他是否要安裝被建議的軟 件包裝檔。dpkg和apt-get不會這樣做。這個字串可以被用於那些可以和你的程式非常 好地一起工作但並不是必需的套裝軟體。
Pre-Depends:
它的要求比Depends:更強。除非它需要的套裝軟體已經安裝並且正確配 制好,它才會被安裝。使用這個標籤是非常sparingly的, 要使用它一定要先在debian-devel信件列表上討論完才可以。讀一遍這句話:絕 對不要使用它。 :-)
Conflicts:
除非與這個套裝軟體衝突的套裝軟體都已經被刪除了,否則它不會被安裝。如果一個 套裝軟體存在時你的程式不能被執行或是會出現嚴重的錯誤,就使用這個標籤。
Provides:
當多個套裝軟體提供同一個功能時,可以定義一些虛擬的套裝軟體名稱。你可以 在/usr/share/doc/debian-policy/virtual-package-names-list.txt.gz檔案中 找到一個完整的虛擬套裝軟體列表。當你的套裝軟體提供一個已經存在的虛擬套裝軟體 所需要的功能時,可以使用這個字串。
Replaces:
當你的套裝軟體會取代一些其它套裝軟體的檔案或是是整個套裝軟體(與Confilicts:聯 用)時,可以使用這個字串。這裡提到的套裝軟體中的檔案將會被你的套裝軟體中的文 件覆寫。
所有這些字串使用統一的語法格式:用逗號分隔的一系列套裝軟體名稱。這裡的軟 件包裝檔名稱可以是用豎線符號“|”分開的一系列可相互取代(alternative)的 套裝軟體名稱。
對於每一個套裝軟體的特定版本的要求也可以在這個字串中限制。只要在套裝軟體的 名稱後寫上括號並在括號中寫明版本列表並在每一個版本號前注明目前套裝軟體和 它的關係就可以了。這裡提到的關係可以是:<<、<=、=、>=和>>,它們分別表示先 於、先於或等於、等於、晚於和晚於或等於。例如,
Depends: foo (>= 1.2), libbar1 (= 1.3.4) Conflicts: baz Recommends: libbaz4 (>> 4.0.7) Suggests: quux Replaces: quux (<< 5), quux-foo (<= 7.6)
最後一個你需要知道的功能是${shlibs:Depends}。在你的套裝軟體被建立並且安裝
到臨時目錄中以後,dh_shlibdeps(1)
將會掃瞄其中
的二進位檔案和程式庫檔案,偵測它們對共享庫的倚賴性,以及這些共享庫所在的軟
件包裝檔,如libc6、xlib6g等。它將會把結果列表傳遞給dh_gencontrol(1)
,後者將會把這些資訊填寫到正確的位置
上,你就不用為它操心了。
說了這麼多,我們現在可以繼續了,讓Depends:這一行保持原狀,並在它後面插 入一行,在這一行中些上Suggests: file,因為gentoo可以使用這個 程式/套裝軟體提供的一些功能。
第11行是一個簡短的描述。大多數人的螢幕都是80列寬的,所以描述文字不能超 過大概60個英文字元長。我把它改成“fully GUI configurable X file manager using GTK+”。
第12行是一個比較長的描述。在這裡可以寫關於這個套裝軟體的詳細情況的一段話。 每行的第1列應該是空白的。兩行之間不能有空白行,如果真的想留一個空白行, 可以透過寫一個單獨的小數點符號實作。還有,在長描述之後,不能有超過一行 的空白。
最後,我們給出一個修改好的control檔案:
1 Source: gentoo 2 Section: x11 3 Priority: optional 4 Maintainer: Josip Rodin <joy-mg@debian.org> 5 Build-Depends: debhelper (>> 3.0.0), xlibs-dev, libgtk1.2-dev, libglib1.2-dev 6 Standards-Version: 3.5.2 7 8 Package: gentoo 9 Architecture: any 10 Depends: ${shlibs:Depends} 11 Suggests: file 12 Description: fully GUI configurable X file manager using GTK+ 13 gentoo is a file manager for Linux written from scratch in pure C. It 14 uses the GTK+ toolkit for all of its interface needs. gentoo provides 15 100% GUI configurability; no need to edit config files by hand and re- 16 start the program. gentoo supports identifying the type of various 17 files (using extension, regular expressions, or the 'file' command), 18 and can display files of different types message different colors and icons. 19 . 20 gentoo borrows some of its look and feel from the classic Amiga file 21 manager "Directory OPUS" (written by Jonathan Potter).
(我為它增加了行號。)
這個檔案中包裝檔含著關於套裝軟體的來自於上游的資源、版權和授權資訊。它的格式 在政策中並未規定,關於它的內容是(12.5 “Copyright information”).
dh_make將會建立一個預設的,其內容如下:
1 This package was debianized by Josip Rodin <joy-mg@debian.org> on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from <fill in ftp site> 5 6 Upstream Author(s): <put author(s) name and email here> 7 8 Copyright: 9 10 <Must follow here>
(我為它增加了行號。)
在這個檔案中需要增加的重要資訊是你獲得套裝軟體的位置以及它原有的版權提示 和授權條款。如果它的授權條款不是通用的自由軟體授權條款 如GNU的GPL或LGPL、BSD或是Artistic條款,你就必需把它的條款包裝檔含在這個文 件中。而當它使用上述自由軟體授權條款時,你可以直接引 用/usr/share/common-licenses/目錄中的相應檔案,它們已經存在於Debian系統 中了。
簡而言之,下面是gentoo的copyright檔案:
1 This package was debianized by Josip Rodin <joy-mg@debian.org> on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from: ftp://ftp.obsession.se/gentoo/ 5 6 Upstream author: Emil Brink <emil@obsession.se> 7 8 This software is copyright (c) 1998-99 by Emil Brink, Obsession 9 Development. 10 11 You are free to distribute this software under the terms of 12 the GNU General Public License. 13 On Debian systems, the complete text of the GNU General Public 14 License can be found in the file `/usr/share/common-licenses/GPL'.
(我為它增加了行號。)
這是一個必需的檔案,它的格式已經在政策檔案的4.4節“debian/changelog”中說 明了。dpkg和其它需要獲取你的套裝軟體的版本號、修訂號、發行版和緊急度的程 序會需要使用這個格式。
對你而言,它也是非常重要的,因為它可以讓你寫下所有你所做的所有變更。這 可以幫助下載了你的套裝軟體的人們了解套裝軟體中是否有它們應該知道的問題。在 二進位版本的套裝軟體中,它會被保存 在“/usr/share/doc/gentoo/changelog.Debian.gz”檔案中。
dh_make建立了一個預設的,如下所示:
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 5 -- Josip Rodin <joy-mg@debian.org> Wed, 11 Nov 1998 21:02:14 +0100 6
(我為它增加了行號。)
第1行是套裝軟體的名稱、版本、發行版和緊急度。這裡的名稱必需和來源程式碼包裝檔的名 稱相同,發行版應當是“unstable”(或是“experimental”),urgency應當改成任何 比“low”高一些層級的內容。:-)
第3到5行是一個很長的項目,在這裡你可以寫下你對這個版本的軟體說做的修
改(不包裝檔括上游修改──有專門的由作者建立的檔案來記錄它們,稍後你將會把它安
裝到/usr/share/doc/gentoo/changlog.gz)。新的內容必需插入在最上方的星
號(“*”)前。你可以用dch(1)
來做或是用一個純文字編 輯器手動修改。
最後,你的檔案應該是下面的樣子:
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 * This is my first Debian package. 5 * Adjusted the Makefile to fix $DESTDIR problems. 6 7 -- Josip Rodin <joy-mg@debian.org> Wed, 11 Nov 1998 21:02:14 +0100 8
(我為它增加了行號。)
在後面的更新更新套裝軟體, 第 9 章中你可以找到更多關於更新changelog的內容。
現在我們需要來看看dpkg-buildpackage(1)
用來建立
套裝軟體的精確規則了。這個實際上是另一個Makefile腳本,但同上游來源程式碼中的
那個不同。與debian/目錄中的其它檔案不同的是這個檔案有可執行標記。
就像其它的Makefile一樣,每個“rules”檔案都有一些用來指導如何處理來源程式碼的 規則。每個規則都由目標、檔案名稱或是是需要執行的操作的名 稱(如“build:”、“install:”)組成。當你要執行一個規則時可以在命令行參數上 加入參數(比如“./debian/rules build”或是“make -f rules install”)。在目 標名稱之後,你可以寫這個規則對程式檔案的倚賴性。之後,可以有任意數目 的命令,這些命令要用<tab>符號縮排。新的規則以位於第一列上目標宣告 開始。空白行和以“#”(井字號)開始的行將會被作為註解忽略掉。
現在你可能已經聽糊塗了,但只要看一下dh_make為我們建立的預設的“rules”文 件你就能明白了。另外你也應該讀一下info中的“make”項目來獲得更多的資訊。
有一個關於dh_make所建立的rules檔案的重要問題是你應該知道的:它只是一個 建議版本。對於一些簡單的套裝軟體它可以工作,但對於稍為複雜一些的,應當敢 於增加或是刪減其內容使其符合你的需求。唯一你不能修改的就是規則的名稱, 因為政策手冊中提到的所有工具都將使用它們。
這裡是dh_make為我們產生的預設的debian/rules檔案:
1 #!/usr/bin/make -f 2 # -*- makefile -*- 3 # Sample debian/rules that uses debhelper. 4 # This file was originally written by Joey Hess and Craig Small. 5 # As a special exception, when this file is copied by dh-make into a 6 # dh-make output file, you may use that output file without restriction. 7 # This special exception was added by Craig Small in version 0.37 of dh-make. 8 # Uncomment this to turn on verbose mode. 9 #export DH_VERBOSE=1 10 configure: configure-stamp 11 configure-stamp: 12 dh_testdir 13 # Add here commands to configure the package. 14 touch configure-stamp 15 build: build-stamp 16 build-stamp: configure-stamp 17 dh_testdir 18 # Add here commands to compile the package. 19 $(MAKE) 20 #docbook-to-man debian/testpack.sgml > testpack.1 21 touch $@ 22 clean: 23 dh_testdir 24 dh_testroot 25 rm -f build-stamp configure-stamp 26 # Add here commands to clean up after the build process. 27 $(MAKE) clean 28 dh_clean 29 install: build 30 dh_testdir 31 dh_testroot 32 dh_clean -k 33 dh_installdirs 34 # Add here commands to install the package into debian/testpack. 35 $(MAKE) DESTDIR=$(CURDIR)/debian/testpack install 36 # Build architecture-independent files here. 37 binary-indep: build install 38 # We have nothing to do by default. 39 # Build architecture-dependent files here. 40 binary-arch: build install 41 dh_testdir 42 dh_testroot 43 dh_installchangelogs 44 dh_installdocs 45 dh_installexamples 46 # dh_install 47 # dh_installmenu 48 # dh_installdebconf 49 # dh_installlogrotate 50 # dh_installemacsen 51 # dh_installpam 52 # dh_installmime 53 # dh_python 54 # dh_installinit 55 # dh_installcron 56 # dh_installinfo 57 dh_installman 58 dh_link 59 dh_strip 60 dh_compress 61 dh_fixperms 62 # dh_perl 63 # dh_makeshlibs 64 dh_installdeb 65 dh_shlibdeps 66 dh_gencontrol 67 dh_md5sums 68 dh_builddeb 69 binary: binary-indep binary-arch 70 .PHONY: build clean binary-indep binary-arch binary install configure
(我為它增加了行號。在實際的 debian/rules
檔案中,行首的空白是
定位字元TAB。)
對於第1行你一定很熟悉,因為它和shell及Perl腳本很象。它告訴作業系統這個 檔案應當交給/usr/bin/make來處理。
第6到9行上提到的DH_*變數應當被簡短明確的說明。要想知道關於DH_COMPAT的更
多資訊,可以閱讀debhelper(1)
手冊中關於“Debhelper compatibility
levels”一節。
第11到16行是一個支援DEB_BUILD_OPTIONS的骨架,它的描述可以在政策文件的 第10.1節“Binaries”中找到。簡單的說,它們控制著在建構二進位檔案的時候是 否要加入除錯符號,是否要在安裝的時候進行裁減。再重覆一下,這只是一個骨 架,一個你應當做這件事的提示。你需要找出上游的建立系統是如何處理除錯符 號和install-strip的,然後自己實作它們。
一般情況下,你可以透過CFLAGS變數來讓gcc在編譯的時候使用“-g”選項──如果這 是你的套裝軟體的情況,你可以把CFLAGS="$(CFLAGS)"附加到$(MAKE)調 用的後面來propagete這個變數(看下面)。還有另外一種方法,如果你 的套裝軟體使用了autoconf腳本,你可以把透過給./configure執行加上前 綴來把它傳遞給建立規則。
關於裁減的問題,一般情況下程式自己的安裝設定都不會進行裁減,而且通常也
不會包裝檔含一個選項讓
你來做這件事情。幸運的是,你有dh_strip(1)
,而且當你設定了DEB_BUILD_OPTIONS=nostrip時,他會安靜地退出。
第18到26行描述了“build”(和“build-stamp”)規則,它們執行應用程式自己
的Makefile來編譯它。如果你的套裝軟體使用GNU組態工具來建構,請一定要閱
讀/usr/share/doc/autotools-dev/README.Debian.gz
。稍後在manpage.1.ex, manpage.sgml.ex, 第 5.8
節中我們會討 論docbook-to-man的例子。
第28到36行的“clean”規則會清除所有不需要的二進位檔案和自動產生的東西,在 每次建立套裝軟體的時候都會首先執行。這個規則必須在所有的時候都能正常工 作(即便來源程式碼目錄已經是清理被清理好的),所以請使用強制選項(比 如對於rm是“-f”),或是透過在命令的名字前加上“-”讓make忽略傳回值(失敗)。
“install”規則從第38行開始,它指導了安裝程序。它通常去執行軟體自己 的Makefile中的“install”規則,但會把套裝軟體安裝 在$(CURDIR)/debian/gentoo目錄中──這就是為什麼我們要 在gentoo的Makefile中指定$(DESTDIR)作為安裝的跟目錄。
就像註解中說明的那樣,第48行上的“binary-indep”規則是用來建立體系結構無 關的套裝軟體的。因為這裡我們並沒有這樣的套裝軟體,所以什麼都不用做了。
在52-79行上是下一筆規則“binary-arch”,在這裡我們執行了好幾個debhelper軟 件包裝檔中的小工具,它們將會在你的套裝軟體上執行不同的操作來使其符合政策。
如果你的套裝軟體是“Architecture: all”的,那麼你需要在“binary-indep”中包裝檔含 所有的命令,而讓“binary-arch”保持空白。
debhelper程式都是以dh_開始的,剩下的部分描述了這個工具具體的作用。其實 它們的名字都已經說的很清楚了,但這裡我們還是給出一些額外的解釋:
dh_testdir(1)
檢查你是不是在正確的目錄中(比如來源程式碼目錄的最上層);
dh_testroot(1)
檢查你是否擁有在“binary-arch”、“binary-indep”和“clean”時需要用到的root權限;
dh_installman(1)
把手冊頁檔案複製到正確的目標目錄中你不需要告訴它究竟相對於最高層來源程式碼目錄的那個位置是哪裡;
dh_strip(1)
從可執行檔案和程式庫檔案中裁減掉偵錯資訊,使它們更小一些;
dh_compress(1)
用gzip(1)
壓縮所有大於4
kB的手冊頁和文件;
dh_installdeb(1)
把與套裝軟體相關的所有檔案(例如維護腳本)複製到debian/gentoo/DEBIAN
目錄中;
dh_shlibdeps(1)
計算程式庫檔案和可執行檔案對共享庫的倚賴性;
dh_gencontrol(1)
在控制檔案插入一個已經格式化(fine-tuned)好的debian/gentoo/DEBIAN
檔案;
dh_md5sums(1)
為套裝軟體中的所有檔案產生MD5校驗碼。
要想了解更完整的的關於這些dh_*腳本究竟會做什麼的資訊以及它們其它的選項, 請閱讀它們相對的手冊。還有一些可能是非常有用的dh_*腳本檔案在這裡沒有提 及。如果你需要使用它們,情閱讀debhelper的文件。
在binary-arch一節中,你必須要註解掉或是刪除掉你不需要的功能執行。對 於gentoo,我把關於examples、cron、init、man和info的行註解掉了,因 為gentoo根本不需要它們。而且在第68行上,我把“ChangeLog”換成了“FIXES”, 因為那是上游的changelog檔案的真實名字。
最後的兩行(和其它這裡未曾解釋的地方)是需要的,在make的手冊和Debian政策 檔案都是可以找到。現在知道它們的作用並不重要。
[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ A ] [ 下一頁 ]
Debian新維護人員手冊
version 1.2.3, 2005年4月3日.joy-mg@debian.org
lilingv@gmail.com
ycheng@slat.org