Subscribe to RSS Subscribe to Comments Blog of Roy Chan

Blog of Roy Chan

如何重新編譯dpkg套件

當你在使用Ubuntu/Debian的正式發行版本,但想使用在開發版本中的新加入的軟體或者想使用在開發版本中有關軟體的新版本,又或者想微調某些軟體的編譯設定。當然backport.org有不少由Debian開發版本backport回到正式發行版本的套件,而Ubuntu亦有提供edgy-backports軟體庫,但如果他們沒有提供你需要的軟體或不符合你的要求,那你就需要重新編譯dpkg套件。

注意本文都最完整和最新版本改放上OSWikiHK,請到那裡參考。

取得源碼

首先自然需要先取得有關dpkg套件的源碼包。和RPM不同的套件源碼一般都有三個檔案:

  • 源程式碼包 (*.orig.tar.gz) - 這是有關軟體原身的源程式碼包 (例如: mod-cband_0.9.7.5.orig.tar.gz) 。原則上是完全沒有被改動過(除了檔案名稱被改至符合dpkg的規格外),和在開發者網站取得的一模一樣。
  • 套件描述 (*.dsc) - 有對有關軟體的簡單描述 (例如: mod-cband_0.9.7.5-1.dsc) 。包括套件名稱、版本、維護者、可編譯平台、編譯時需要的套件和 orig.tar.gz 及 diff.gz 檔的 hash 值。為確保套件沒有被任何人更動過,所有由官方提供的dsc都已用維護者的數位簽名簽著過。
  • 補丁檔 (*.diff.gz) (非必有) - 維護者對改動 (例如: mod-cband_0.9.7.5-1.diff.gz) 。包括加入control、changelog等檔案。如果開發者一早已debian化整個源程式碼,可能不會有diff.gz檔的出現。

使用 apt-get source

取得目標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@example.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@example.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的協助。請打:

<

pre>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

相關頁面


Share It: [del.icio.us] [Technorati] [Google Bookmark] [Yahoo MyWeb] [Furl]


No comments yet. Be the first.

Leave a reply

  • :-)
  • :-D
  • :lol:
  • ;-)
  • :-P
  • :-(
  • :'(
  • :'-(
  • >:-(
  • :-O
  • :annoy:
  • :appeal:
  • :asleep:
  • Zzz...
  • :-Q
  • 8-)
  • B-)
  • :clap:
  • :enjoy:
  • :blush:
  • :shy:
  • :*
  • :inlove:
  • :inlove2:
  • :inlove3:
  • :love:
  • :allure:
  • 8D~~~
  • :amative:
  • :chatter:
  • :bored:
  • bored2:
  • X-O~~~
  • :-'|
  • 8-S
  • #_#
  • :dontknow:
  • :embarrased:
  • :excite:
  • :faint:
  • :fuzzy:
  • :plan:
  • :conceal:
  • :regret:
  • :punched:
  • :silent:
  • :-X
  • :tease:
  • :vent:
  • :win:
  • :work:
  • :good:
  • :shit:
  • :bomb:

Based on Fluidity© 1998-2007 Roy Hiu-yeung Chan