或許你曾經有過重新編譯 (compile) 一些 debian package 的需要,例如你使用的 Debian 系統還是 stable,而某 package 只有在 unstable 中才有,又或是你需要修改一下某個 package 編譯時的參數,使得它更符合你的要求?
注意: 本文內容將會不斷更新完善,最新版本已放上知識庫,要獲得最新版本請到那裡參考。
當你在使用Ubuntu/Debian的正式發行版本,但想使用在開發版本中的新加入的軟體或者想使用在開發版本中有關軟體的新版本,又或者想微調某些軟體的編譯設定。當然backports.org有不少由Debian開發版本backport回到正式發行版本的套件,而Ubuntu亦有提供edgy-backports軟體庫,但如果他們沒有提供你需要的軟體或不符合你的要求,那你就需要重新編譯dpkg套件。
首先自然需要先取得有關dpkg套件的源碼包。和RPM不同的套件源碼一般都有三個檔案:
取得目標dpkg套件源碼的三個檔案,最簡單自然是用apt-get source命令下載。首先你需要確定 /etc/apt/sources.list 有沒有「deb-src」一行:
deb http://ftp.hk.debian.org/debian/ sarge main contrib non-free
deb-src http://ftp.hk.debian.org/debian/ sid main contrib non-free
如果你是想由開發版本中backport一個套件回來,自然要使用開發版本的軟體庫,以Debian為例,自然是使用 sid。設定好後,在系統管理員身份下用「apt-get update」更新軟體庫資料。然後就可以用「apt-get source 套件名」 取得目標dpkg套件源碼。這個指令會幫你幫別目標套件真正源碼名稱 (如套件 libapache2-mod-cband 的源碼包是 mod-cband ) ,下載套件源碼的三個檔案,並自動拆開源碼。為方便管理,建議建立目錄 ~/projects/dpkg並在裡面才進行apt-get source:
mkdir -p ~/projects/dpkg
cd ~/projects/dpkg
apt-get source libapache2-mod-cband
完成後,你會在當前目錄找到到套件源碼的三個檔案和以套件源碼名稱和版本編號組成的目錄 (例如mod-cband-0.9.7.5) ,目錄裡面就是套件的源碼。
$ ls
mod-cband-0.9.7.5
mod-cband_0.9.7.5-1.diff.gz
mod-cband_0.9.7.5-1.dsc
mod-cband_0.9.7.5.orig.tar.gz
當然你亦可以自動下載orig.tar.gz、dsc和diff.gz三個檔案。下載後,可以用「dpkg-source -x dsc檔」把原始碼拆開:
$ dpkg-source -x mod-cband_0.9.7.5-1.dsc
dpkg-source: extracting mod-cband in mod-cband-0.9.7.5
執行後,你會在當前目錄找到到套件源碼的三個檔案和以套件源碼名稱和版本編號組成的目錄 (例如mod-cband-0.9.7.5) ,目錄裡面就是套件的源碼。
習慣上你首先要改動版本編號,記錄這次重編的目的。當然你可以略過這個步驟,但有機會做成往後升級的混亂,所以也建議花點時間做做這個簡單的工作。
版本編號和更動說明是記錄在套件源碼下 debian/changelog 中。你可以用文字編輯器直接修改這個檔案,但我們一般會先用命令「debchange -i 更動說明」加入版本更動的框架,例如:
debchange -i Backport to sarge
執行後用文字編輯器編輯debian/changelog,你會見到類似以下內容:
mod-cband (0.9.7.5-2) unstable; urgency=low
* Backport to sarge
– Fred Random <fred [at] example [dot] org> Tue, 3 Apr 2007 17:56:19 +0800
mod-cband (0.9.7.5-1) unstable; urgency=low
粗體為debchange新加的內容。這表示這個例子中原本你下載的套件版本編號是0.9.7.5-1,debchange會順勢把建立編號 (build number)加一,變成 0.9.7.5-2 。為讓人一看就知重編後的套是backport,亦方便以後有更新時可以蓋過個版本,我們會把建立號減一,加上「.1sarge1」,令版本編號變成 0.9.7.5-0.1sarge1 。sarge後的 1 表示這個版本被重編的次數。如果在重編後發覺有問題,需要再新編,請將這個數目加一。改動後的debian/changelog 會變成如下:
mod-cband (0.9.7.5-0.1sarge1) unstable; urgency=low
* Backport to sarge
— Fred Random <fred [at] example [dot] org> Tue, 3 Apr 2007 17:56:19 +0800
mod-cband (0.9.7.5-1) unstable; urgency=low
接著你需要安裝編譯時所需開發套件,這些套件的名單在 debian/control 的的 Build-Depends 一行中:
$ egrep ‘^Build-Depends:’ debian/control
Build-Depends: debhelper (>= 4.0.0), autotools-dev, apache2-threaded-dev | apache2-prefork-dev, po-debconf
這顯示你需要安裝debhelper、autotools-dev、apache2-threaded-dev和po-debconf等四個套件才 可以重編mod-cband,而debhelper必定要4.0.0或以上,apache2-threaded-dev可以用apache2- prefork-dev取替。
最簡單的方法是在系統管理員身份下打「apt-get build-deb 套件」,這命令自然會幫你下 載並安裝有關套件所需開發套件。不過很多情況下不會那麼順利,在backport過程中,會遇到在正式發行本中未有所需開發套件,套件名稱改變了或版本不 符合等問題,而apt-get build-deb遇到些情況會停下來。這時候你需要自行找出在正式發行本中對應的套件 (如 apache2.2-common 對應 apache2-common 或 apache-common) ,自行手動用 apt-get 下載並安裝,和更動debian/control 的需求。最差的情況下,你有機會需要重編幾個開發套件。
接著你需要套件的相依性,即檔案 debian/control 中的 Depends 一行中:
$ egrep ‘^Depends:’ debian/control
Depends: ${misc: Depends}, ${shlibs: Depends}, apache2.2-common
這顯示你需要安裝apache2.2-common套件才可以安裝mod-cband。
你需要檢查一下你現時的發行版本是否有Depends列出的套件和版本是否符合。例如:
$ apt-cache show apache2.2-common
W: Unable to locate package apache2.2-common
E: No packages found
這表示你現時的發行版本並沒有apache2.2-common這個套件。這時候你需要自行找出在正式發行本中對應的套件 (如 apache2.2-common 對應 apache2-common 或 apache-common) ,例如:
$ apt-cache search apache common
apache - versatile, high-performance HTTP server
apache-common - support files for all Apache webservers
apache-perl - versatile, high-performance HTTP server with Perl support
apache-ssl - versatile, high-performance HTTP server with SSL support
apache2-common - next generation, scalable, extendable web server
axyl-lucene - The Axyl Luceneserver
cl-modlisp - Common Lisp interface to the Apache mod-lisp module
apache2.2-common可能對應apache2-common 或 apache-common。你需要更動debian/control 的需求,把Depend一行改成:
Depends: ${misc: Depends}, ${shlibs: Depends}, apache2-common但最差的情況下,你有機會需要重編幾個相依的套件。
現在你可以用debuild重編套件。因為包封套件時需要製做一個系統管理員的環境,我們需要fakeroot的協助。請打:
debuild -rfakeroot
現在你的目錄一般會多了最少五個檔案:
$ ls
libapache2-mod-cband_0.9.7.5-0.1sarge1_i386.deb
mod-cband-0.9.7.5
mod-cband_0.9.7.5-0.1sarge1.diff.gz
mod-cband_0.9.7.5-0.1sarge1.dsc
mod-cband_0.9.7.5-0.1sarge1_i386.build
mod-cband_0.9.7.5-0.1sarge1_i386.changes
mod-cband_0.9.7.5-1.diff.gz
mod-cband_0.9.7.5-1.dsc
mod-cband_0.9.7.5.orig.tar.gz
libapache2-mod-cband_0.9.7.5-0.1sarge1_i386.deb 就是重編出來的套件。
現在你可以安裝新套件了:
# dpkg -i *.deb
回應
backport.org should be backports.org
backport.org should be backports.org
thanks for point out the
thanks for point out the typo