製作DEB包的方法

轉載請註明原文出處:http://blog.csdn.net/roddick621

由於個人水平有限,難免有很多不適當的地方,有什麼翻譯錯誤的,請多多指教^_^

原文地址

Chapter 1. Getting started The Right Way

這一章沒做記錄

Chapter 2. First steps

2.1 創建debian包的工作流

  •     獲取源碼,源碼通常都是一個壓縮包 (package-version.tar.gz)
  •     把debian打包所需要的信息寫到debian目錄中,然後把這份修改過的源碼以3.0(quilt格式)打包
  •     製作debian的二進制包,通常是以.deb爲後綴。(package_version-revision_arch.deb)
    注意:在deb包中,包名和版本又下劃線來分割,與還是源碼包的時候不一樣。package_version-revision_arch.deb中對應的值可以用以下的值來進行替換。package==>源碼包名, version==>源碼包的版本, revision==>Debian revision, arch==>包的適用架構。

2.2 選擇你的程序

    如果你想製作一個包,首先你要決定你要製作一個什麼軟件的包。首先,你要確定你這個包有沒有人已經製作好。如果有人已經製作好了,直接安裝就好了。如果你找到的是一個已經沒有人維護,但是還可以用的包,你可以接過來繼續維護。
    如果你需要製作一個全新的包,並希望它出現在Debian中,請按照以下步驟進行:
  • 你要確定你的軟件有價值的,並且可用的。
  • 你要確定這個包還沒有人在做。
  • 你的軟件必須要有license
  • 軟件包不應該對Debian系統的安全造成威脅。

2.3 獲取源碼

     你可以直接獲取已經做成tar包的源碼,或者可以從VCS系統中獲取(svn ,git, cvs),然後用tar把源碼壓縮成一個包(壓縮的時候可以加上--exclude-vcs,就可以忽略版本控制的文件)。接着你應該仔細的閱讀以下里面的一些說明文件,起碼要知道應該怎麼去編譯和安裝。
     開始打包時,源代碼目錄應該是絕對乾淨的(原始)的,或者直接使用剛剛解壓包得到的。

2.4 簡單的編譯

    一個簡單的程序通常包含一個Makefile,你可以調用make去對它進行編譯和make install進行安裝。有些還包含了make check,用來檢查剛剛編譯出來的文件有沒有問題。

2.5 主流的編譯方法

    通常是使用autotools(autoconf, automake ,libtool和gettext)工具來支持多平臺。工具的具體方法這裏不作介紹了。

2.6 軟件包的名稱和版本

    軟件的包名只能夠包含小寫字母(a-z),阿拉伯數字(1-9),還有加號(+),減號(-),還有點(.)。而且長度不能小於2,推薦長度是小於30個字符。
    包的版本號只能夠包含字母數字(a-zA-Z1-9),還有加號(+),減號(-),還有點(.),波浪號(~)。
    如果上游的源碼版本號不是用普通的版本號(2.30.32),而是用(11Apr29)的,或者一些CVS系統生成的隨機字符的話,應該要把這些字符從版本號中刪除,但可以把它記錄在debian/changelog中。
    deb包的版本號對比可以用dpkg的命令來進行對比:
dpkg --compare-versions vers1 op vers2
    版本對比的規則如下:
  • 字符串從頭到位進行比較
  • 字母要比數字要大
  • 數字會作爲整數進行比較
  • 字母的比較是根據ASCII的順序進行比較
  • 特殊的字符加號(+),減號(-),還有點(.),波浪號(~)規則如下:0.0 < 0.5 < 0.10 < 0.99 < 1 < 1.0~rc1 < 1.0 < 1.0+b1 < 1.0+nmu1 < 1.1 < 2.0

2.7.設置dh_make

    設置兩個環境變量:$DEBEMAIL和$DEBFULLNAME 

    分別用於給打包程序識別你的Email和名字。

    你可以在~/.bashrc中設置好,並且把它export出來。


2.8初始化非自己的包

    很多時候一些源碼都是直接從網上下載下來的,如果你想通過這些源碼生成一個新的的deb包,你可以使用dh_make來初始化這些源碼,具體操作如下。

$ cd ~/gentoo
$ wget http://example.org/gentoo-0.9.12.tar.gz
$ tar -xvzf gentoo-0.9.12.tar.gz
$ cd gentoo-0.9.12
$ dh_make -f ../gentoo-0.9.12.tar.gz

    這裏會提示你選擇生成包的類型,根據自己的需要選擇就行了。這裏選擇的是s。然後觀察上一級目錄,會生成一個新的文件,名字爲:

    gentoo_0.9.12.orig.tar.gz

    觀察這個包,有兩個特點,名字和版本號之間是以下劃線_來分隔的,還有就是在.tar前面加入了.orig

    你還應該注意到在源碼目錄的debian文件夾下有很多臨時文件,他們的作用會在第四和第五章進行解析。你也應該知道,打包過程不可能完全自動化,你應該修改源碼以適應Debian。然後,你就可以適當的方法去創建一個deb包,檢測和上傳軟件包。這些步驟在後面都會解析。

    如果你在修改過程中不小心刪除或者破壞了某些模版文件,你應該是用dh_make --addmissing來將其還原。

    升級軟件包的過程可能會比較複雜,如果是剛開始學,應該用一個新的包。

   

2.3.初始化本地的包

    如果有一個包是你自己管理的,或者是隻有你自己去使用的話,你可以使用不同於上面的方法去初始化這個包,具體的命令如下:

$ cd ~/mypackage-1.0
$ dh_make --native
    跟上面不同的地方就是,這個命令只是不會生成一個tar包。剩下的幾乎都是一樣的。

Chapter 3. Modifying the source

3.1-3.2主要是講解如何修改修改源碼的,因爲這部分主要是利用quilt來修改源碼的bug,對於打包來說意義不大,所以就不詳細說了。

3.3.把軟件安裝到目標路徑

    很多第三方的軟件會默認安裝到目錄/usr/local下。

    但是在Debian,這是由系統管理員保留給私人使用的,所以必須使用/usr/bin來代替/usr/local/bin,服從FHS

    通常是使用make來編譯,make install來安裝程序到目標目錄。Debian爲了提供個pre-build的可安裝的包,修改了編譯包的機制,使其可以安裝到一個臨時目錄而不是最終的目錄。

    對於普通的程序安裝有兩個差異,一個是Debian的包管理,另外一個是可以透明的通過debhelper的db_auto_configure和db_auto_install來解決安裝的問題。不過它需要滿足一下兩個條件:1.Makefile滿足GNU並且支持變量$DESTDIR。2.源的存放必須準從FHS

    很多程序都遵從GNU的約定,所以他們使用autoconf很輕易地打成包。大概有90%的機會,debhelper可以在一個沒有修改過的源碼裏面正常工作,所以打包並沒有想象中的那麼難。

    如果你想去修改Makefile,你應該小心地支持$DESTDIR。雖然這個值木有添加,默認爲空,但是會在安裝的時候都加入到每個文件的目錄名前面。這個打包腳本會把$DESTDIR設置爲一個臨時目錄。

    如果從一個源碼包中生成一個二進制的包,dh_auto_install會把臨時目錄設爲debian/package。當別人安裝你的包的時候,在debian/package中的所有文件都會被安裝到別人的機器上面。唯一不同的地方就是dpkg會把文件安裝到根目錄下而不是你的工作目錄。

    記住,即使你的程序可以安裝在debian/package,但是它安裝在root目錄下還是要能夠正確運行的。所以你不能夠在代碼裏面把路徑寫死。

    當你修改完代碼後,應該用調用dqulit來生成補丁,並把新補丁增加到debian/patches目錄中。

3.4.不一樣的庫名稱

    這是一個常見的問題。相同的庫在不同的平臺下面會不盡相同,所以Makefile裏面如果指定錯了庫名,只需要修改一下就可以了。


Chapter 4. Required files under the debian directory

    在源文件下有一個新的子目錄叫debian的,這裏包含了一系列的文件,這些文件可以供我們根據我們的需要進行修改,然後控制包的的一些行爲。裏面最重要的文件主要是control,changelog,copyright和rule,他們是每一個包都需要的。

4.1.control

    這裏包含的信息是給dpkg , dselect, apt-get, apt-cache, aptitude等包管理工具去控制包的。它們會在第五章裏面進行定義  。下面是一個由dh_make創建的一個control文件。

  Source: gentoo        
  Section: unknown      
  Priority: extra  
  Maintainer: Josip Rodin <[email protected]>
  Build-Depends: debhelper (>=9)                      
  Standards-Version: 3.9.4      
  Homepage: <insert the upstream URL, if relevant>      
 
  Package: gentoo        
 Architecture: any      
 Depends: ${shlibs:Depends}, ${misc:Depends}           
 Description: <insert up to 60 chars description>       
  <insert long description, indented with spaces>       

    1-7行是源碼包的控制信息,9-13行是二進制包的控制信息(也就是聲稱之後的安裝包了),每個域的說明都已經在上面解析了,不過不是很詳細,詳細的請查看原文檔。

  1. 源碼包的包名
  2. 是該源碼包要進入發行版的那個分類中,例如:main,non-free,contrib,admin,devel,doc,libs,mail.net,x11,還有很多沒有例舉出來
  3. 告訴用戶這個安裝包的重要性 ,optional與required,important,standard能並存, extra 與non-extra不能並存
  4. 管理員的名字和Email。這裏一定要有一個合法的Email地址,因爲因爲一旦有bug,bug管理系統就會給你發送郵件通知你。這裏要避免使用逗號,&號和句號。
  5. 生成安裝包所需要依賴的包,你可以增加多一行Build-Depends-Indep來指定更多的依賴文件。例如gcc和make這些工作,已經被隱含的包含在essential的包裏面了。如果你還需要其他包的話,可以把它們添加到這行。如果是依賴多個包,用分號把他們隔開。對於所有需要用dh命令來打包的包來說,都需要加上debhelper (>-9)去滿足Debian Policy的clean需求。如果生成的二進制包是有Arahitecure:any的,所以來的包基本上都是寫在Build-Depeds裏面的,很少寫在Build-Depends-Indep。如果是生成的二進制包有Architecure:all的話,在Build-Depends中只記錄爲了滿足Debian Policy requirement的clean目標的依賴,其他的依賴都可以寫到Build-Depends-Indep中。如果你不知道應該用那個,則應該使用Build-Depends以保證安全。
  6. Debian Policy Manual的版本號
  7. 你的軟件的主頁

  8. 二進制包的名字,通常和源碼包保持一致
  9. 描述你的包是爲了那個架構而打生成的。 any:與架構有關,普遍是跟編譯的語言有關 。 all:與架構無關,大多這樣的包是包含了文檔,圖片還有一些由解析性的語言編寫的腳本。如果我們的程序是用C語言寫的話,我們可以不用管這個字段,應該dpkg-gencontrol會根據實際情況來填寫一個正確的值。
  10. debian包管理系統最強大的功能之一。每個軟件包都可以和其他軟件包有各種不同的關係。除了Depends之後,其他關聯的還有Recommands,Suggests,Pre-Depends,Breaks,Conflicts,Provides和Replaces.包管理工具通常都是用相同的方法去處理這些關係的,如果不是的話,它會進行解析的。
  11. Depends ==> 此軟件包僅當它依賴的軟件包均已安裝後纔可以安裝,此處寫明你的程序所必須的軟件包。 Recommends ==》不是嚴格要求的,不過你的程序通常都會用到。apt-get和aptitude在安裝的時候會提示把這些依賴一起安裝,但是dpkg則不會。 Suggests ==》不是一定需要的,但是有的話能使你的程序更加完美。aptitude會提示,dpkg和apt-get則不會提示。 Pre-Depends==》比Depends搶,軟件包在預依賴的軟件包已經安裝並且正確配置後纔可以安裝,所以使用此項時應該十分謹慎。 Conflicts==》僅當所有衝突的軟件包都已經被刪除後纔可以安裝。 Breaks==》當安裝完這個包,就會破壞列表中的包。它通常是指定同一個軟件的舊版本。通常是高級包管理工具用來更具列表中的軟件。 Provides==》一些包可以從virtual-package-names-list.txt.gz後去多個可選的虛擬名字,如果你的虛擬包包含一個函數,你就應該使用它(?不懂)  Replaces==》當你的程序要替換其他軟件包的某些文件,或是完整地替換另一個軟件包(與Conflicts一起用)。列出軟件包中的某些文件會被你的軟件包所覆蓋。  以上所有的域都有相同的語法,當依賴的包只需要二選一的時候,可以通過管道符|來隔開兩個包。這裏還可以限制每個依賴包的版本,可以使用<<,<=,=,>=,>>來表示大於,大於等於,等於,小於等於,小於。例子:libbbar1 (=1.3.4)。 最後需要了解的是類似${shlibs:Depends} 這樣的用法,${shlibs:Depends}是負責計算出你你ELF文件和動態庫所依賴的所有文件。
  12. 簡短的描述
  13. 這個包的詳細描述,不過需要注意的是,每一行的第一列都需要爲空,並且不能有空行,但是你可以輸入一點去模擬這是一個空行。

前端軟件例如aptitude在排列包或者選取默認包的時候,會用到Section和Priority。一旦你把包傳上去Debian後,這個包的維護人員就可以修改這兩個值,在這種情況下,你會收到郵件的通知。

在Depends字段中,你還需要知道的就是${shlibs:Depends} , ${perl:Depends} ,  ${misc:Depends}

  • dh_shlibdeps(1) 會用來找出二進制包所依賴的動態庫,它會爲每個二進制包生成一個列表,列表中包含了該包所以來的文件和動態庫。這是用來取代${shlibs:Depends}的
  • dh_perl(1) 這個是用來找出perl或者perlapi的依賴文件的。它是用來取代${perl:Depends}的
  • 一些debhelper命令會導致生成的包增加一些依賴,所有這名都會未二進制包生成一個依賴列表。這是用來取代${misc:Depends}的
  • dh_gencontrol(1)是爲每個二進制包生成DEBIAN/control的。它用於取代${shlibs:Depends}, ${perl:Depends}, ${misc:Depends}等等


4.2.copyright

    這個文件主要包含的是軟件的版權信息和許可證信息。dh_make會自動幫你生成一個模板。你可以使用dh_make --copyright gpl2去生成一個基於GPL-2的模板。


4.3.changlog

    這是一個必要的文件。它是用於被dpkg和其他程序來獲取軟件的版本號,修訂號,發佈狀態和urgency。對於你來說,這個文件同樣重要,因爲它可以記錄下你所做的更改。它可以幫助其他用戶知道你的包更新了什麼東西。他會保存在/usr/share/doc/<pkgname>/changlog.Debian.gz。

  gentoo (0.9.12-1) unstable; urgency=low       (包含了包名,版本號,修訂號和urgency。這裏的名字必須和源碼包的名字相同。發佈狀態應該爲unstable,爲了防止包在未完全開發好的情況下上傳,可以把發佈狀態設置爲UNRELEASED)

   * Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>      (3-5行是修改的記錄)

  -- Josip Rodin <[email protected]>  Mon, 22 Mar 2010 00:37:31 +0100


4.4.rules

    現在我們去看dpkg-buildpackage會用來控制生成包的文件rules。這個文件實際上是一個Makefile文件,但是和源碼的Makefile不是同一個。在debian裏,這個文件與其他文件不同,它被設置爲可執行文件。

4.4.1.Target of the rules file 

    每一個rule文件都像其他Makefile那樣,包含了一些規則,這些規則主要是定義了一個目標和如何生成這個目標。規則的格式和Makefile的一樣,目標在一行的開頭,然後接下來的行在行頭用TAB鍵填充,然後寫入生成目標的方法。空行或者行頭用#註釋的行會被忽略。

    你想調用那個目標,你就把目標加作爲命令行的參數就可以了。

rules的格式與普通的Makefile文件一致,有需要了解的可以直接去找關於Makefile的文章。

    下面的是對Makefile目標的一些簡單的描述:

    clean(必選):刪除編譯過程中生成的文件和一些沒用的文件

    build(必選):從源碼編譯生成目標程序和格式化的文檔

    build-arch(必選):從源碼編譯出跟平臺相關的程序

    build-indep(必選):從源碼編譯出跟平臺無關的程序

    install(可選):安裝debian目錄下的所有二進制包。如果定義了,binary*這類的目標將會依賴它。

    binary(必選):生成所有二進制包(binary-arch和binary-indep的有效組合)

    binary-arch(必選):在父目錄生成一個跟平臺相關的二進制包

    binary-indep(必選):在父目錄生成一個跟平臺無關的二進制包

    get-orig-source(可選):從網上獲取最新版本的源碼包


4.4.2 Default rules file

    dh_make會生成一個簡單的但是很有用的rules文件

#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1  把這行打開可以讓每一個dh命令的輸出都打印出來,或者通過export DH_OPTIONS=-v參數

%:
        dh $@

    12-13行是使用模式規則去調用一些隱含的規則。百分號意味着是“所有規則”,他是通過指定目標名來條用dh命令。dh命令是一個包裝好的腳本,它可以根據參數來調用一系列適當的dh_*命令。

    debian/rules clean調用dh clean, 它會依次執行以下的命令:

dh_testdir
dh_auto_clean
dh_clean

    debian/rules build調用dh build,它會依次執行以下的命令:

dh_testdir
dh_auto_configure
dh_auto_build
dh_auto_test

    fakeroot debian/rules binary調用fakeroot dh binary,它會依次執行以下的命令:

dh_testroot
dh_prep
dh_installdirs
dh_auto_install
dh_install
dh_installdocs
dh_installchangelogs
dh_installexamples
dh_installman
dh_installcatalogs
dh_installcron
dh_installdebconf
dh_installemacsen
dh_installifupdown
dh_installinfo
dh_installinit
dh_installmenu
dh_installmime
dh_installmodules
dh_installlogcheck
dh_installlogrotate
dh_installpam
dh_installppp
dh_installudev
dh_installwm
dh_installxfonts
dh_bugfiles
dh_lintian
dh_gconf
dh_icons
dh_perl
dh_usrlocal
dh_link
dh_compress
dh_fixperms
dh_strip
dh_makeshlibs
dh_shlibdeps
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb

    fakeroot debian/rules binary-arch調用fakeroot dh binary-arch,它執行的命令的順序和fakeroot dh binary一樣,但是每個命令都添加了參數-a

    fakeroot debian/rules binary-indep調用fakeroot dh binary-indep,它執行命令的順序基本上和fakeroot db binary一樣,但是不包含dh_strip, dh_makeshlibs和dh_shlibdeps,並且每條命令都添加了參數-i

    dh_*命令大部分都可以直接從它的名字知道它的作用,但是在一個基於Makefile的典型打包環境之,還是有幾個是值得注意一下的,特意在這裏給出了簡單的解析,

    dh_auto_chean通常會調用make distclean假如Makefile中存在distclean這個目標。

    dh_auto_configure通常會調用./configure +參數 當文件configure存在的時候。

    dh_auto_build通常會執行make來執行Makefile的第一個目標。

    dh_auto_test通常會執行make test加入Makefile中有test這個目標。

    dh_auto_install通常會執行make install假如Makefile中有install這個目標。

所有需要用到fakeroot的目標都會包含dh_testroot,它是用來把自己僞裝成爲一個root用戶。

最重要的一點就是又dh_make生成的rules中的內容只是一些建議,它對於大部分包來說是可以用的,但是對於一些複雜的包來說,就需要你自己去定製了。

雖然install不是必須的,但是也是支持的,fakeroot dh install 的行爲跟fakeroot dh binary有點類似,但是它會在執行完dh_fixperms後就停止執行了。


4.4.3.Customization of rules file

    有很多方法來定製使用dh命令創建新的的rules文件。

    dh $@命令可以根據以下的方法來自定義:

  •      增加對dh_python2命令的支持(推薦):

         ----在Build-Depends中包含python

         ----使用dh $@ --with python2

         ----使用python的框架去處理Python的模塊

  •     增加對dh_pysupport命令的支持(不推薦):

         ----在Build-Depends中包含python-support

         ----使用dh $@ --with pysupport

         ----使用python-support的框架去處理Python的模塊

  •     增加對dh_pycentral命令的支持(不推薦):

         ----在Build-Depends中包含python-central

         ----使用dh $@ --with python-central

         ----這會使dh_pysupport命令無效

         ----使用python-central的框架去處理Python的模塊

  •     增加對dh_installtex命令的支持:

         ----在Build-Depends中包含tex-common

         ----使用dh $@ --with tex

         ----註冊類型爲1的字體,斷句樣式和TeX的格式

  •     增加對dh_quilt_patch和dh_quilt_unpatch命令的支持:

         ----在Build-Depends中包含quilt

         ----使用dh $@ --with quilt

         ----這是quilt 1.0格式的包打補丁,3.0格式的不需要,補丁文件放在debian/patches中

  •     增加對dh_dkms命令的支持:

         ----在Build-Depends中包含dkms

         ----使用dh $@ --with dkms

         ----這是使用內核模塊去處理DKMS

  •     增加對dh_autotools-dev_updateconfig和dh_autotools-dev_restoreconfig命令的支持:

         ----在Build-Depends中包含autotools-dev

         ----使用dh $@ --with autotools-dev

         ----更新和恢復config.sub和config.guess

  •     增加對dh_autoreconf和dh_autoreconf_clean命令的支持:

         ----在Build-Depends中包含dh-autoreconf

         ----使用dh $@ --with autoreconf

         ----在編譯之後更新和還原GNU Build System文件

  •     增加對dh_girepository命令的支持:

         ----在Build-Depends中包含gobject-introspection

         ----使用dh $@ --with gir

  •     增加對bash completion特性的支持:

         ----在Build-Depends中包含bash-completion

         ----使用dh $@ --with bash-completion

         ----這是通過配置文件debian/package.bash-completion來安裝bash completions


    很多被dh命令調用的dh_*命令都可以通過debian文件夾內的相應的配置文件來定製的。

    你可能需要通過帶參數的dh命令來調用dh_*命令,或者調用額外的命令,或者直接跳過他們。在這樣的情況下,你可以在rules文件下生成一個新的目標override_dh_foo來改變dh_foo命令。

    請注意dh_auto_*命令會因爲要考慮到各種各樣的條件,所以傾向於做比上面討論過的操作更多的操作。但是如果用override_dh_*去簡化它的話,並非一個好的注意。

    這裏需要注意的是,dh_auto_*命令總是希望能做得更多,所以它需要考慮到各種各樣的條件。但是用override_dh_*來簡化它並不是一個好的做法(除了override_dh_auto_clean),因爲它可能會忽略了debhelper的一些好的功能。
    例如,如果你想使用autotools把系統的配置數據的保存目錄從/etc改成/etc/gentoo的話,你可以把dh_auto_configure中傳給./configure命令的參數--sysconfig=/etc重寫了。
override_dh_auto_configure:
        dh_auto_configure -- --sysconfig=/etc/gentoo
在--後面的參數是會追加到默認的參數後面,用來覆蓋默認的參數的。如果要保留原有參數,只是重寫sysconfig參數,則使用dh_auto_config會比直接調用configure命令會好。
如果源碼中的Makefile需要你在make的時候指定build作爲目標纔可以編譯的話,你可以用下面的方法重寫:
override_dh_auto_build:
        dh_auto_build -- build
這裏可以保證$(MAKE)除了只是增加了build作爲參數外,其他參數都是用dh_auto_build的默認參數。
如果在源碼中指定清理操作,不是用clean或者distclean,需要指定packageclean目標纔可以清理源碼,你可以使用下面的方法:
override_dh_auto_clean:
        $(MAKE) packageclean
如果你的Makefile中包含了test這個目標,但是在打包的過程中不想執行這個目標的話,可以使用一個空的override_dh_auto_test來實現:
override_dh_auto_test:
如果源碼有一個與衆不同的changlog文件FIXES,dh_installchangelogs默認情況下是不會安裝它的。dh_installchangelogs命令需要在參數中指定FIXES纔可以。
override_dh_installchangelogs:
        dh_installchangelogs FIXES

如果你需要使用新的dh命令,應該的使用4.4.1中明確提到的目標名字作爲目標,而不是自己新增加的,因爲新增加的可能會造成額外的影響,但是我們可能很難去發現。如果可以的話,應該儘量把目標限制在override_dh_*的目標中,並且保證它們是完全獨立的。



Chapter 5. Other files under the debian directory 

    如果需要控制打包過程中debhelper的行爲,你應該通過在debian的目錄下放置一些可選的配置文件來實現。這一章會介紹裏面的每個文件的作用和格式。
    dh_make命令會在debian文件夾內生成一些模板的配置文件,大多數的後綴名是.ex的。有一部分是用二進制報的名字做爲前綴的。
    一些被debhelper用的配置文件或許沒有被db_make生成,在這種情況下,你需要手動生成一個並且編輯它。

如果你需要debian目錄中的所有文件都打到包裏面,就應該做到下面的幾條:
  • 如果有.ex或者.EX後綴的文件,刪除他們的後綴(即重命名去掉後綴)
  • 用二進制的包名取代配置文件中的“package”
  • 根據你的需要修改模塊文件
  • 刪除你不需要的配置文件
  • 根據需修改control文件
  • 根據需要修改rules文件
所有的debhelper配置文件如果沒有以"package"爲前綴的,例如install,它是爲第一個二進制包所用的。如果這次打包過程中會生成超過一個包,則它們的配置文件一定要以包名作爲前綴,例如:package-1.install,  package-2.install。

5.1.README。Debian

    記錄你的包與官方包之間額外的細節的或者不同之處的文件。
    
gentoo for Debian
-----------------
<possible notes regarding this package - if none, delete this file>
 -- Josip Rodin <[email protected]>, Wed, 11 Nov 1998 21:02:14 +0100

    如果沒有東西需要記錄,可以刪除。

5.2.compat

     定義debhelper相容性的等級,你可以設置它爲9級。
echo 9 > debian/compat

5.3conffiles

    最令人氣憤的東西莫過於當你花費了大量時間去修改一個程序,但是你的改變只是爲了一個小小的升級。Debian可以解決這個問題,它通過把需要保存的配置文件保存到conffiles。當你升級一個包,你會被提示時候保留舊的配置文件。
    dh_install(1)會自動把/etc目錄下面的文件添加到conffiles,所以你不需要手動去指定它們。對於大多數的包來說,只要在/etc目錄下面的文件才需要添加到conffiles文件中,所以 這個文件可以不需要。
    如果你的程序使用的配置文件被它自己重寫過,最好的還是不要把它加入到conffiles中,因爲dpkg一定會提示用戶去驗證一下被修改了那些東西。
    如果你打的包所用的/etc下的配置文件是會被每個人戶都修改的,這裏會有兩個比較流行的方法,既不需要把它們加到conffiles,也不需要用到dpkg。
  •     由維護腳本,把存在/var目錄下的文件做一個軟連接到/etc目錄下。
  •     由維護腳本在/etc目錄下生成一個文件。
    更多關於維護腳本的信息,可以看5.19節。

5.4package.cron.*

    如果你的包需要需要定期執行一下操作的話,你可以用下面說到的文件去設置它。 你可以設置每小時,每天,每日,每週,每月或者你喜歡的任何時候。   
  •     package.cron.hourly : 會安裝到/etc/cron.hourly/package,每個小時運行一次
  •     package.cron.daily : 會安裝到/etc/cron.daily/package,每日運行一次
  •     package.cron.weekly : 會安裝到/etc/cron.weekly/package,每週運行一次
  •     package.cron.monthly : 會安裝到/etc/cron.monthly/package,每月運行一次
  •     package.cron.d : 會安裝到/etc/cron.d/package, 會據該文件內設置的週期來運行
    除了package.cron.d要根據crontab的根式來寫意外,大部分這些文件都是shell腳本。

5.5.dirs

    這個文件具體指明瞭一些我們需要的,但是在安裝的過程中(又dh_auto_install調用make install DESTDIR=...)沒有生成的文件夾。這意味着Makefile中沒有滿足我們的需要,出現了一些問題。
    在install文件中列出的文件,不需要先創建文件所存在的目錄(系統會自動創建)。
    最好的方法就是你先安裝一下這個包,如果是有問題了,在使用dirs這個文件。
    如果你遇上了錯誤,最好是第一部就直接運行安裝。在dirs文件內的目錄名前面沒有斜槓符號的(即不是絕對路徑)

5.6.package.doc-base

    如果你的軟件包中除了用戶手冊和info page意外,還有一些文檔的話,你應該使用doc-base文件把這個文件註冊到系統中,讓用戶可以用dhelp(1),dwww(1)或dcocentral(1)這些命令來找到它。
    這通常包含HTML, PS和PDF文件,放置在/usr/share/doc/packagename/中。
下面是gentoo包的gentoo.doc-base文件:
Document: gentoo
Title: Gentoo Manual
Author: Emil Brink
Abstract: This manual describes what Gentoo is, and how it can be used.
Section: File Management
Format: HTML
Index: /usr/share/doc/gentoo/html/index.html
Files: /usr/share/doc/gentoo/html/*.html
關於這個文件格式的更多信息,可以查看/usr/share/doc/doc-base/doc-base.html/index.html。


5.7.docs

    這個文件制定了我們使用dh_installdocs(1)安裝到臨時目錄的文件名    
    默認情況下它會把代碼目錄頂層所有名爲BUGS、README*、TODO等的文件都加入到其中。

5.8.emacsen-*

    如果你的軟件包提供可以在安裝時編譯爲字節碼的Emacs文件,你可以使用這些文件設置。
    它們會被dh_installemacsen(1)安裝到臨時目錄。
    如果你不需要這些,就刪除它們。

5.9.package.examples

    dh_installexamples(1)會將列出的文件和目錄作爲示例文件安裝。

5.10.package.init 和 package.default

    如果你的程序是一個需要在開機就啓動的daemon,你顯然唔使我一開始的建議,不是嗎?
    package.init這個文件會會安裝爲/etc/init.d/package,用於啓動和停止daemon進程。它相當於dh_make命令提供的init.d.ex文件。你可以重命名和編輯它,在編輯的時候應該確保它包含了一個LSB的兼容的頭。它會被dh_installinit安裝到臨時目錄。
    package.default這個文件會安裝爲/etc/default/package,這個文件是被init腳本設置默認值的。這個文件通常用於禁用守護進程,或者設置默認的參數或者超時時間。如果你的init腳本有一定的可配置特性, 你可以在這裏進行配置,而不是在它自己的init腳本設置。
    如果是源碼包中已經提供了一個init腳本,你可以自己選擇使不使用它。如果你不想使用源碼提供的init文件,那麼你必須自己重寫一個了。即使源碼包中提供的看起來沒什麼問題,並且已經安裝到了合適的地方,但是你依舊需要去創建rc的軟連接(在/etc/rcX.d中,控制開機啓動)。創建軟連接你可以通過重寫dh_installinit來實現:
override_dh_installinit:
        dh_installinit --onlyscripts

5.11.install

    如果在執行make install的時候,有一些文件不被安裝到包的臨時目錄中,但是你又是需要這些文件的話,你應該把這些需要加進去的文件的文件名寫入到install文件中。他會被dh_install(1)命令所安裝。不過你首先要確定你要安裝的文件是不是應該又這個腳本去控制,例如文檔文件應該又doc文件去控制,而不應該寫到這個文件中。 
    在這個文件中,一個文件對應一行,格式爲源文件(相對於最頂層的編譯目錄),然後空格,最後加上安裝目錄(相對於安裝的目錄)。加入src/bar這個文件需要安裝,那麼install文件裏面應該這樣寫:
src/bar usr/bin
    這意味着當這個包被安裝完之後,bar會在/usr/bin/bar中。
    只有安裝的相對目錄沒有變化的情況下,寫在install纔會寫入文件名。這樣的格式通常用於把一個很大的包拆分爲幾個小包,然後把它的配置文件改成package-1.install, package-2.install等。

5.12.package.info

    如果你的軟件包含info package,你應該把它寫入到package.info文件中。

5.13.package.links

    包維護人員需要在創建包的目錄中增加連接的話,你應該把這個連接的完整路徑和目標路徑寫入到package.links文件中,然後讓dh_link(1)命令去安裝到真正的目錄中。

5.14.{package.,source}/lintinan-overrides

    如果Debian的策略允許lintian報告一個錯誤的診斷情況時,你可以用package.lintian-overriades或者source/lintian-overrides去把這些錯誤通知給禁止了。更多的信息請看/usr/share/doc/lintian/lintian.html/index.html,並且不要濫用這個工功能。

5.15.manpage.*

    你的程序應該有手冊頁,如果沒有,你應該生成它。dh_make命令會生成一些手冊文件的模板。最後應該刪掉一些沒有用的模塊。
    5.15.1.manpage.1.ex
        這個文件是用nroff寫的。
    5.15.2.manpage.sgml.ex
        這個文件是用SGML寫的。
    5.15.3.manpage.xml.ex
        這個文件是用XML寫的

5.16.package.manpages

    如果你的包包含手冊頁,你應該把他列在package.manpages文件中,並使用dh_install命令去安裝它。
    把docs/gentoo.1作爲gentoo包的手冊頁安裝到系統中,應該創建gentoo.manpages並寫入
docs/gentoo.1

5.17.menu

    X Windows系統用戶通常有窗口管理器,並且帶有可定製的菜單用於啓動程序。如果它們安裝了Debian的menu包,整個系統中所有已安裝軟件的一系列菜單將會被自動創建。
    這裏有一個又dm_make創建的默認文件:
?package(gentoo):needs=X11|text|vc|wm \
        section=Applications/see-menu-manual\
        title=gentoo command=/usr/bin/gentoo
冒號後的第一個域是needs,它指定了程序需要何種界面。修改此處爲列出的選項之一,例如X11或text。
下一個域是section,它指定了菜單和子菜單應該出現在什麼地方。
title域是程序的名稱,它可以用大寫字母開頭,只需保證它不是很長。
最後的command域是運行此程序時使用的命令。

你還可以添加其他的域,例如longtitle, icon, hints等等,詳細信息可以看dh_installmenu(1), menufile(5), update-menus(1)。

5.18.NEWS

dh_installchangelogs(1)命令會安裝這個文件。

5.19.{pre,post}{inst,rm}

    postinst,preinst,postrm和prerm文件被稱爲維護腳本。這些腳本被放置在包裏面的控制區內,並且被dpkg用來控制安裝,升級和刪除。
    作爲一個新手,你應該避免手動地去修改這些維護者腳本,更多的信息你可以查看這裏,還有應該仔細看一看dm_make生成的一些例子。
    但是如果你堅持去做,你應該保證他們不單止可以安裝,升級,還需要刪除和徹底清除。
    升級到一個新的版本應該是安靜的和不需要交互的(即用戶不知道程序已經通過升級來修復了部分Bug,並且爲用戶提供了新的特性)。
    當一個包升級的時候需要交互(例如配置文件分佈在不同的home目錄並且有完全不同的結構),你可以考慮作到最差的情況下應該提供返回一個安全的狀態(例如禁用服務),並提供適當的文件所需的策略去解決問題( README.Debian和NEWS.Debian )。 不要讓用戶通過維護腳本調用debconf來打擾用戶去升級軟件。

5.20.package.symbols

    講動態庫打成一個包對於初學者來說並不容易,因爲應該儘量避免。因此,如果你的包包含了動態庫,你應該有debian/package.symbols文件。
    這個文件主要是用來管理動態庫之間的兼容性的。
    

5.21.TODO

    dh_installdocs命令會安裝它。

5.22.watch

    用於uscan的manpage。

5.23.source/format

    在debian/source/format中只包含一行,寫明瞭此源碼包的格式(查看dpkg-source(1))獲得完整列表。在squeeze後,它應該是以下兩者之一:
  • 3.0 (native) - Debian native 軟件
  • 3.0 (quilt) - 其他所有軟件
    全新的3.0 (quilt)源代碼格式將所有修改都用quilt補丁系列記錄到debian/patches。這些修改會在解壓源代碼包時自動應用。 Debian修改保存於debian.tar.gz歸檔文件,其中包含了整個debian目錄。這個新格式直接直接添加例如PNG圖標等的二進制文件。
    dpkg-source解壓3.0 (quilt) 格式的源碼包時會自動應用所有列於debian/patches/series的補丁,你可以使用--skip-patches選項避免在解壓後自動應用補丁。

5.24.soruce/local-options

    如果你希望使用版本控制系統(VCS)時,你可以創建一個分支(例如叫做upstream)來跟蹤上游代碼,和另一個分支(對於Git而言典型的是master分支)來跟蹤你的Debian軟件包。對於後者,用場會將未應用補丁的上游源碼和你的debian/*文件放在一起以便容易合併上游的新代碼。
    創建完包以後,這裏的源碼正常來說都是已經被打了補丁的了。在你把源碼提交到master分支之前,你必須手動的調用dquilt pop -a命令來去掉已經打上了的補丁。你可以在這個可選的文件debian/source/local-options中寫入unapply-patches,讓它自動完成去除補丁的操作。這個文件的作用只會改變打二進制包,而不會影響到打源碼包。這個文件可能也應該包含abort-on-upstream-changes(詳情情況dpkg-source(1))。
unapply-patches
abort-on-upstream-changes

5.25.source/options

    在打包的時候,在源碼樹上會自動生成一些很大的,但是沒有用的補丁文件。你可以通過自定義一些模塊(例如dh_autoreconf)的行爲來解決這個問題。
    你可以提供給命令dpkg-source的選項--extend-diff-ignore提供一個Perl正則表達式作爲參數,就可以忽略那些在創建源碼包時候自動創建的文件了。
   解決自動生成文件這個問題,通過的做法就是在源碼包中增加source/options文件,裏面例如命令dpkg-source的參數。下面的展示的就是忽略config.sbu, config.guess和Makefile,不爲這三個文件做補丁文件。
extend-diff-ignore= "(^|/)
(config\.sub | config\.guess | Makefile)$"

5.26.patches

在1.0版本,在debian目錄中有一個很大的,包含了包的維護文件文件的壓縮包diff.gz,它會被用於被源碼包打補丁。這樣的方法既不方便理解,也不方便使用。

在最新的3.0 (quilt)源碼格式中,debian/patches/*目錄中存放着用於被quilt調用的補丁文件。這些補丁文件和其他數據文件都被包含在debian目錄下,都會被打包成一個debian.tar.gz的文件。自從dpkg-source命令可以處理quilt格式的補丁後,在build-Depends中就可以不用加入quilt這個依賴了。

quilt命令的使用可以參考quilt(1)。它會在deibna/patches目錄下,以堆的方式用-p1補丁文件的格式記錄源碼的修改。而且在debian目錄外的源碼樹不會受到任何影響。補丁的順序記錄在deiban/patces/series文件中。你可以很容易apply(=push), un-apply(=pop),或者更新補丁。

Chapter 6. Building the package

我們現在已經準備好了去編譯一個新的包了

6.1.完整的(重)編譯

    爲了可以完整的編譯一個新的包,你要確保你已經安裝了:
  •     build-essential包
  •     control文件中Build-Depends中所指定的包
  •     control文件中Build-Depends-indep中所指定的包
    確保了滿足上面的東西之後,你可以在源碼的目錄下執行以下的命令來打包:
dpkg-buildpackage
  •     它會做所有執行以下的操作並且爲你生成二進制包和源碼包。
  •     清理源碼(debian/rules clean)
  •     建立源碼包(dpkg-source -b)
  •     編譯程序(debian/rules build)
  •     編譯二進制包(fakeroot deiban/rules binary)
  •     用gpg簽署.dsc文件
  •     使用dpkg-genchanges和gpg生成並簽署上傳用的.change文件
在打包的過程中唯一需要輸入的就是GPG密鑰。如果你創建的包只是爲了給你自己用的話,你可以用下面的命令跳過GPG在.dsc和.changes文件裏面的GPG簽名
dpkg-buildpackage -us -uc

對於一個非原生的包,例如gentoo,你會在父目錄下看到下列的文件:
  • gentoo_0.9.12.orig.tar.gz
    這是官方的源碼。只是根據debian的標準來重命名了。這是又dh_make -f ../gentoo-0.9.12.tar.gz生成的。
  • gentoo_0.9.12-1.dsc
    這是一個從control文件生成的源代碼概要,可用於dpkg-source(1)程序。這個文件是使用GPG簽署過的,以便別人可以確信它確實是你提供的。
  • gentoo_0.9.12-1.debian.tar.gz
    這個壓縮包包含了debian文件夾,每一樣新增到源碼的東西都會被作爲一個quilt的補丁保存在debian/patches中。
    如果某人希望重新生成你的軟件包,他們可以很容易地利用上面的三個文件來生成。過程很簡單:只要三個文件複製到別處,並運行dpkg-source -x gentoo_0.9.12-1.dsc.
  • gentoo_0.9.12-1_i386.deb
    這是完整的二進制文件包,你可以用dpkg命令去安裝它。
  • gentoo_0.9.12-1_i386.changes
    這個文件記錄了當前修訂版所有的修改。它是被Debian FTP archive maintenance 程序用於安裝二進制包和源碼包。這個文件有一部分內容是從changelog和.dsc文件中生成的。 這個文件是使用GPG簽署的,以便別人可以確信它是你提供的。
    如果你繼續維護這個包的話,新增加的功能或者修改夠應該增加到這個文件中來。用於下載了你的包,通過這個文件就可以很快的看清楚有什麼新增和改變了。
    
    在.dsc和.changes文件中的長數字是SHA1/SHA256的校驗碼。任何一個人下載你的包,他們都可以用sha1sum或者sha256sum來校驗一下,如果是兩個校驗碼不相同,則損壞或已被篡改。

對於一個自己做的包,例如Mypackage,你會在編譯完成後在父母路看到一下的包:

  • mypackage_1.0.tar.gz

    由dpkg-source生成的源碼包。(它的後綴不是orig.tar.gz)

  • mypackage_1.0.dsc

    這是源碼內容的摘要。(這裏沒有Debian的修訂號)

  • mypackage_1.0_i386.deb

    這是完整編譯後的二進制安裝包(這裏沒有Debian的修訂號)

  • mypackage_1.0_i386.changes

    這個文件記錄了當前修訂版所有的修改。


6.2.Autobuilder

    Debian在很多不同架構的計算機通過運行buildd守護進程來提供很多包含autobuilder netword功能的端口。即使你不需要你自己來做這些,但是你應該清楚它會對你的包做了什麼操作。下面我們大概的看看他是怎麼給多種架構重建你的包的。

    對於 Architecture: any 的包,你應該保證用於重新打包的系統有安裝以下的程序:

  •     build-essential安裝包
  •     在Build-Depends中列出的包

    然後你可以在源代碼目錄裏以下命令:

dpkg-buildpackage -B

它會自動編譯出依賴依賴框架的二進制包,它主要做的是:

  •     清理源碼樹 (debian/rules clean)
  •     構建程序 (debian/rules build)
  •     構建平臺依賴的二進制包 (fakeroot debian/rules binary-arch)
  •     用gpg編譯源文件.dsc
  •     使用dpkg-genchanges和gpg生成和上傳.change文件

    這就是爲什麼你的軟件包在其他平臺上可用的原因了。

    雖然當平常我們打包的時候是需要安裝Build-Depends-Indep裏所指定的軟件,但是在autobuilder裏面是不會要求去安裝的,因爲它只會構建基於架構的二進制包。正常打包與autobuilding之間的區別就是要你應該在debian/control文件中的Build-DependsBuild-Depends-Indep記錄下那些依賴的包


6.3.debuild命令

    你以後可以通過debuild命令來自動調用dpkg-buildpackage命令來打包。

    你可以在debuild的配置文件/etc/devscripts.conf或者~/.devscripts文件中自定義debuild行爲,推薦至少應該包含以下的條目:

DEBSIGN_KEYID=Your_GPG_keyID
DEBUILD_LINTIAN_OPTS=-i -I --show-overrides

    有了這些,安裝包就會被用你的GPG Key ID簽名,並且會用lintian命令去檢查它的細節。

    清理源碼並且重新生成一個包是很簡單的,你只要執行

$ debuild

    如果你的包只是給自己用,你可以跳過.dsc文件中的和.changes文件的簽名,命令如下:

$ debuild -us -uc

    你可以誒用一下命令清理源碼樹:

$ debuild clean

6.4.pbuilder package

    要在一個乾淨的環境(chroot)去驗證包的依賴,pbuilder是非常有用的。


6.5.git-buildpackage 命令以及相近的命令


6.6.快速重建

    當需要構建一個很大的包的時候,當你只是調整debian/rules文件後,你肯定不想從頭開始編譯。出於測試的目的,你可以不重新編譯源碼而生成一個.deb包:

$ fakeroot debian/rules binary

    或者運行一下的命令看它是否執行
    
$ fakeroot debian/rules build
    一旦完成了調試,記住按照前面說的正常過程重新構建你的軟件包。你可坑無法正常上傳此種方法構建的.deb包。


Chapter 7. 檢查軟件包中的錯誤 

    在你包軟件包上傳到公開的倉庫之前,你必須要先測試這個軟件包會不會有錯。這裏會介紹一些技術用來檢查軟件包是否有錯。
    一個很好的方法就是不是打包的機器上安裝這個包。你必須密切關注任何的警告或者錯誤輸出。

7.1 可疑的修改

    如果你創建完一個非本地的軟件包後,在debian/patches目錄中發現一個類似debian-changes-*這樣的自動生成的補丁文件,可能是你不小心改變上游軟件的了一些文件或者構建的腳本修改了文件。如果是你的錯誤,就把問題解決掉。如果是構建腳本導致的,通過定製rules文件或者source/options文件來解決根本的問題。

7.2 驗證包的安裝

    你必須測試你的包能夠正常安裝。 debi命令可以幫助你去測試安裝所有生成的二進制包。
sudo debi gentoo_0.9.12-1_i386.changes
    避免在不同的操作系統中安裝會有問題,你從Debian的倉庫下載Contents-i386,來保證的捏包與現有的安裝包沒有文件名的衝突。apt-file命令可以很方便的完成這個任務。如果真的有衝突,就需要纔去行動去避免真正的問題。重命名文件,把文件移動到一個被多個包依賴的包中, 與其他軟件包的維護者協調,或者在debian/control長度Confilcts字段中進行說明。

7.3 驗證包的維護腳本

    所有的維護腳本(preinst, prerm, postinst和postrm) 很難是完全正確的,除非他們是通過debhelper來生成的。如果你是一個新手的話,就不要使用它們了。
    如果一個包需要使用這些不是很重要的維護腳本,不僅僅需要測試install,還需要測試remove,purge和升級。在刪除或者完全刪除的時候,很多維護腳本都會在這個時候有bug出現。使用dpkg命令去測試他們。
sudo dpkg -r gentoo
sudo dpkg -P gentoo
sudo dpkg -i gentoo_version-revision_i386.deb
    整個測試過程應該按照以下序列:
  • 如果可能,安裝前一個版本的軟件包
  • 從前一個版本升級軟件包
  • 降級到前一個版本
  • 徹底刪除該軟件包
  • 全新安裝該軟件包
  • 卸載該軟件包
  • 再次安裝該軟件包
  • 徹底刪除該軟件包
    如果這是你的第一個軟件包,你應該使用其他版本號創建一個測試用的軟件包進行升級測試,這樣可以避免將來的問題。
    請牢記如果你的軟件包已經在以往的Debian中發佈,人們通常會將從最近發佈的Debian發佈的版本升級,所以也要測試從那個版本升級到最新的版本。
    雖然降級不是官方所要求支持的,但是支持的話會比較友好。

7.4 調用lintian

    使用lintian(1)來檢查你的.changes文件。lintian命令會運行很多測試腳本來檢查常見的打包錯誤。
lintian -i -I --show-overrides gentoo_0.9.12-1_i386.changes
    當然,需要把文件名替換成你生成的.change文件。lintian命令的輸出會使用下面的標示符號:
  • E : 錯誤; 肯定違法策略或者安裝包有錯
  • W: 警告; 可能違反策略或者安裝包有錯
  • I :  提示信息,輸出安裝包某方面的信息
  • N : 代表註釋,幫助你調試的詳細信息
  • O : 代表已覆蓋:一個被lintian-overrides文件覆蓋的信息,但由於使用--show-override選項而顯示
    當你看到有警告輸出,應該修改安裝包避免下次還會有提示,或查證一下這些錯誤輸出是否正確。如否是誤報的話,使用lintian-overrides文件去解決它。

7.5 debc命令

    你可以通過debc命令來列出二進制的debian包中的文件
debc package.changes

7.6 debdiff命令

    你可以使用debdiff(1)命令比較兩個Debian源代碼包的內容
debdiff old-package.dsc new-package.dsc
    你還可以使用debdiff(1)命令比較兩個Debian二進制包的文件列表
debdiff old-package.changes new-package.changes
這對於確定在源碼包中修改了什麼或者在升級時無意中的修改是非常有用的。

7.7 interdiff命令

    你可以使用interdiff(1)命令比較兩個diff.gz文件。這對已更新使用舊的1.0源代碼格式的軟件包時,檢查是否有意外的變更非常有用。
interdiff -z old-package.diff.gz new-package.diff.gz
     3.0格式的源碼會在patches/*目錄中把修改保存成多個patch文件。你也可以使用interdiff去查看每一個patch文件來跟蹤源碼的變化。

7.8 mc命令

    很多文件檢查操作可以通過類似mc(1)的文件管理器來完成,它可以幫助你直接查看*.deb文件的內容,除此之外還可以用於*.udeb, *.debian.tar.gz, *.diff.gz和*.orig.tar.gz文件。
    在你的二進制包和源碼包中,查找出那些不需要的文件或者長度爲0的文件。通常這些文件都是不會被清理掉的,所以你就要通過定義rules文件來解決這個問題。

Chapter 8. Updating the package

當你發佈了一個軟件包,你需要儘快的更新它。

8.1 新的debian的版本
如果有一個bug的報告是針對你的包的,而且這個報告中已經描述了是怎麼一個問題,你就需要去解決這個問題了。這裏介紹了需要怎麼去做一個新的修正版的包。
  • 如果需要將它記錄到新的補丁中,這樣做:
  1. dquilt new bugname.patch設置補丁的名字
  2. dquilt add bugg-file說明修改了哪些文件
  3. 修正軟件包代碼中的上游bug
  4. 把dquilt refresh的輸出記錄到bugname.patch中
  5. dquilt header -e把它添加到描述
  • 如果是更新一個已存在的補丁,這樣做:
  1. dquilt pop foo.patch 重新調用foo.patch
  2. 修正舊的foo.patch中的問題
  3. dquilt refresh去更新foo.patch
  4. dquilt header -e去更新它的描述
  5. while dquilt push; do dquilt refresh; done; 在刪除fuzz的時候適用請求調用所有補丁。
  • 在Debian changelong文件的頂部添加一個條目。例如可以適用dch -i或者dch -v version-revision來指定版本,然後用你喜歡的編譯器插入信息
  • 在changlog的條目, 在Closes: $654321後加入一個關於這個bug的簡短描述和解決情況。這樣做的話,當你的包被合併到debian的倉庫的時候,bug的報告將會被自動關閉。
  • 重複上述操作來修復更多的Bug,並在需要的時候用dch更新Deiban changelog文件。
  • 重新構建你的包(6.1節)和檢查包的錯誤(第7章)
  • 一旦你對你的包已經比較滿意了,你應該把changelog中distribution的值由UNRELEASED改爲unstable或者experimental。
  • 上傳你的包。
這裏會遇到一個棘手的問題,在你把一個包改成experiment之前你已經上傳了一個包到官方的的倉庫,版本是1.0.1-1。爲了可以平滑的升級上去,一個好的建議就是在changelog裏面增加一個包含版本信息未1.0.1-1~rc的條目。你應該把本地多條的changelog條目整理到一條,然後再加入到官方的包中。

8.2 檢查新上游版本
    當你打算爲Debian倉庫打一個上游軟件的新的發行版時,你必須首先檢查新的發行版。
    首先閱讀一下上游軟件的changelog, NEWS和其他有關該新發行版文檔
    然後你可以查看兩個版本之間的差別,看看有沒有什麼是可疑的。
diff  -urN foo-oldversion foo-newversion
在missing, aclocal.m4, config.guess, config.h.in, config.sub. configure, depcomp, install-sh, ltmain.sh和Makefile.in這些可以忽略,你可以在比較之前就把這些文件給刪掉。

8.3 新上游版本
    
8.4 更新打包風格

Chapter 9. Uploading the package



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章