2013年3月13日 星期三

Debian 重新編譯套件 (Rebuilding Debian packages)

雖然 Debian 有很方便的 APT 套件管理工具,讓我們省去了許多自行下載、編譯(compile)、安裝程式碼的過程,但總難免會遇到需要修改程式碼的問題,這時就得下載套件原始碼(source code),接著再根據套件相依性安裝其他套件,最後修改程式碼後進行編譯、安裝,但是問題往往不會如此順利與單純......。

一般透過 APT 所安裝的套件,大多都有經過 Debian 開發者的維護與修補(patch),多多少少會與原本套件的原始碼不同,所以下載其他來源(如官方網站)的套件原始碼進行編譯時,有可能會遇到一些光怪陸離、不知如何解決的問題,例如你可能會遇到你所下載的套件原始碼並沒有針對 Debian 環境的修補,而導致無法順利安裝。

累了嗎?也許你可以有更好的選擇!

如果你所需要的套件是能夠透過 apt-get 就能夠安裝的話,同樣地,你也能夠透過 apt-get source 取得這些已經經過 Debian 維護與修補的套件原始碼!這樣有甚麽好處呢?
  1. 不用再辛苦的除錯、修補 (可減少重複前人作過的事)
  2. 確保一定能夠在 Debian 上運作
  3. 節省時間、保留精力
接著以重新編譯 vim 為例,學習如何重新編譯套件。
重新編譯套件之前,需要三個基本的套件 build-essential, devscripts, fakeroot ,可使用以下指令進行安裝:
apt-get install build-essential devscripts fakeroot

接著使用 apt-get source (套件名稱) 指令下載 vim 的套件原始碼(建議使用一個新的資料夾存放原始碼):
mkdir myvim
cd myvim
apt-get source vim

下載完之後,一般會有三個檔案(*.debian.tar.gz, *.dsc, *.orig.tar.gz)及一個資料夾出現,以 .orig.tar.gz 結尾的壓縮檔案是未經任何更動的套件原始碼,以 .debian.tar.gz 結尾的壓縮檔案則內含 Debian 的修補檔、編譯指令等等, .dsc 結尾的檔案則是記載要編譯此套件需滿足的相依性,而最後的資料夾則是含有 Debian 修補檔的套件原始碼。以 vim 為例就是以下三個檔案及一個資料夾:
vim-7.3.547  
vim_7.3.547-7.debian.tar.gz  
vim_7.3.547-7.dsc  
vim_7.3.547.orig.tar.gz

接著可以進入含有修補檔的資料夾中一探究竟:
cd vim-7.3.547

這個資料夾中經過 Debian 維護的修補檔,會存放在 debian 資料夾下的 patches 資料夾內 (debian/patches),修補檔進行修補的順序則是依照 debian/patches/series 檔案內的順序,編譯的指令則是放在 debian 資料夾下的 rules 檔案裡,而原始程式碼則另外存放在 src 資料夾中,整體資料夾結構會如下所示:
vim-7.3.547/
             debian/
                   patches/
                   series
                   rules
             src/
如果只是想修改編譯時的參數,只要依照需求修改 debian/rules 即可。
若有更動到 src 資料夾下的檔案就還需使用以下指令提交修補檔(因為這些程式碼都有經過版本控制)!
dpkg-source --commit

提交時,會詢問修補檔要用甚麽檔名,此處可依需求輸入,例如 hellomyvim.patch 。
Enter the desired patch name:     hellomyvim.patch

提交成功後會出現如下的訊息:
dpkg-source: info: local changes have been recorded in a new patch: ...(略)

編譯之前,需先滿足編譯套件時的相依性,可使用 apt-get build-dep (套件名稱),將需要的套件一併安裝起來。
apt-get build-dep vim

再來使用執行以下指令進行編譯即可:
fakeroot debian/rules clean
fakeroot debian/rules binary

若無任何錯誤訊息,編譯之後,在上一層的資料夾中會出現一個 .deb 檔,使用 dpkg -i 進行安裝即可!
cd ..
dpkg -i vim-7.3.547_<your_arch>.deb

參考資料
http://wiki.debian.org/BuildingTutorial

沒有留言: