轉載請註明原文出處: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)
2.2 選擇你的程序
- 你要確定你的軟件有價值的,並且可用的。
- 你要確定這個包還沒有人在做。
- 你的軟件必須要有license
- 軟件包不應該對Debian系統的安全造成威脅。
2.3 獲取源碼
2.4 簡單的編譯
2.5 主流的編譯方法
2.6 軟件包的名稱和版本
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行是二進制包的控制信息(也就是聲稱之後的安裝包了),每個域的說明都已經在上面解析了,不過不是很詳細,詳細的請查看原文檔。
- 源碼包的包名
- 是該源碼包要進入發行版的那個分類中,例如:main,non-free,contrib,admin,devel,doc,libs,mail.net,x11,還有很多沒有例舉出來
- 告訴用戶這個安裝包的重要性 ,optional與required,important,standard能並存, extra 與non-extra不能並存
- 管理員的名字和Email。這裏一定要有一個合法的Email地址,因爲因爲一旦有bug,bug管理系統就會給你發送郵件通知你。這裏要避免使用逗號,&號和句號。
- 生成安裝包所需要依賴的包,你可以增加多一行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以保證安全。
- Debian Policy Manual的版本號
- 你的軟件的主頁
- 二進制包的名字,通常和源碼包保持一致
- 描述你的包是爲了那個架構而打生成的。 any:與架構有關,普遍是跟編譯的語言有關 。 all:與架構無關,大多這樣的包是包含了文檔,圖片還有一些由解析性的語言編寫的腳本。如果我們的程序是用C語言寫的話,我們可以不用管這個字段,應該dpkg-gencontrol會根據實際情況來填寫一個正確的值。
- debian包管理系統最強大的功能之一。每個軟件包都可以和其他軟件包有各種不同的關係。除了Depends之後,其他關聯的還有Recommands,Suggests,Pre-Depends,Breaks,Conflicts,Provides和Replaces.包管理工具通常都是用相同的方法去處理這些關係的,如果不是的話,它會進行解析的。
- 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文件和動態庫所依賴的所有文件。
- 簡短的描述
- 這個包的詳細描述,不過需要注意的是,每一行的第一列都需要爲空,並且不能有空行,但是你可以輸入一點去模擬這是一個空行。
前端軟件例如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_*去簡化它的話,並非一個好的注意。
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的默認參數。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
- 如果有.ex或者.EX後綴的文件,刪除他們的後綴(即重命名去掉後綴)
- 用二進制的包名取代配置文件中的“package”
- 根據你的需要修改模塊文件
- 刪除你不需要的配置文件
- 根據需修改control文件
- 根據需要修改rules文件
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
echo 9 > debian/compat
5.3conffiles
- 由維護腳本,把存在/var目錄下的文件做一個軟連接到/etc目錄下。
- 由維護腳本在/etc目錄下生成一個文件。
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, 會據該文件內設置的週期來運行
5.5.dirs
5.6.package.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
5.8.emacsen-*
5.9.package.examples
5.10.package.init 和 package.default
override_dh_installinit:
dh_installinit --onlyscripts
5.11.install
src/bar usr/bin
這意味着當這個包被安裝完之後,bar會在/usr/bin/bar中。5.12.package.info
5.13.package.links
5.14.{package.,source}/lintinan-overrides
5.15.manpage.*
5.16.package.manpages
docs/gentoo.1
5.17.menu
?package(gentoo):needs=X11|text|vc|wm \
section=Applications/see-menu-manual\
title=gentoo command=/usr/bin/gentoo
冒號後的第一個域是needs,它指定了程序需要何種界面。修改此處爲列出的選項之一,例如X11或text。5.18.NEWS
5.19.{pre,post}{inst,rm}
5.20.package.symbols
5.21.TODO
5.22.watch
5.23.source/format
- 3.0 (native) - Debian native 軟件
- 3.0 (quilt) - 其他所有軟件
5.24.soruce/local-options
unapply-patches
abort-on-upstream-changes
5.25.source/options
extend-diff-ignore= "(^|/)
(config\.sub | config\.guess | Makefile)$"
5.26.patches
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文件
dpkg-buildpackage -us -uc
- gentoo_0.9.12.orig.tar.gz
- gentoo_0.9.12-1.dsc
- gentoo_0.9.12-1.debian.tar.gz
- gentoo_0.9.12-1_i386.deb
- gentoo_0.9.12-1_i386.changes
對於一個自己做的包,例如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-Depends和Build-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 可疑的修改
7.2 驗證包的安裝
sudo debi gentoo_0.9.12-1_i386.changes
避免在不同的操作系統中安裝會有問題,你從Debian的倉庫下載Contents-i386,來保證的捏包與現有的安裝包沒有文件名的衝突。apt-file命令可以很方便的完成這個任務。如果真的有衝突,就需要纔去行動去避免真正的問題。重命名文件,把文件移動到一個被多個包依賴的包中, 與其他軟件包的維護者協調,或者在debian/control長度Confilcts字段中進行說明。7.3 驗證包的維護腳本
sudo dpkg -r gentoo
sudo dpkg -P gentoo
sudo dpkg -i gentoo_version-revision_i386.deb
整個測試過程應該按照以下序列:- 如果可能,安裝前一個版本的軟件包
- 從前一個版本升級軟件包
- 降級到前一個版本
- 徹底刪除該軟件包
- 全新安裝該軟件包
- 卸載該軟件包
- 再次安裝該軟件包
- 徹底刪除該軟件包
7.4 調用lintian
lintian -i -I --show-overrides gentoo_0.9.12-1_i386.changes
當然,需要把文件名替換成你生成的.change文件。lintian命令的輸出會使用下面的標示符號:- E : 錯誤; 肯定違法策略或者安裝包有錯
- W: 警告; 可能違反策略或者安裝包有錯
- I : 提示信息,輸出安裝包某方面的信息
- N : 代表註釋,幫助你調試的詳細信息
- O : 代表已覆蓋:一個被lintian-overrides文件覆蓋的信息,但由於使用--show-override選項而顯示
7.5 debc命令
debc package.changes
7.6 debdiff命令
debdiff old-package.dsc new-package.dsc
你還可以使用debdiff(1)命令比較兩個Debian二進制包的文件列表debdiff old-package.changes new-package.changes
這對於確定在源碼包中修改了什麼或者在升級時無意中的修改是非常有用的。7.7 interdiff命令
interdiff -z old-package.diff.gz new-package.diff.gz
7.8 mc命令
很多文件檢查操作可以通過類似mc(1)的文件管理器來完成,它可以幫助你直接查看*.deb文件的內容,除此之外還可以用於*.udeb, *.debian.tar.gz, *.diff.gz和*.orig.tar.gz文件。Chapter 8. Updating the package
- 如果需要將它記錄到新的補丁中,這樣做:
- dquilt new bugname.patch設置補丁的名字
- dquilt add bugg-file說明修改了哪些文件
- 修正軟件包代碼中的上游bug
- 把dquilt refresh的輸出記錄到bugname.patch中
- dquilt header -e把它添加到描述
- 如果是更新一個已存在的補丁,這樣做:
- dquilt pop foo.patch 重新調用foo.patch
- 修正舊的foo.patch中的問題
- dquilt refresh去更新foo.patch
- dquilt header -e去更新它的描述
- 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。
- 上傳你的包。
diff -urN foo-oldversion foo-newversion
在missing, aclocal.m4, config.guess, config.h.in, config.sub. configure, depcomp, install-sh, ltmain.sh和Makefile.in這些可以忽略,你可以在比較之前就把這些文件給刪掉。