My code works, I don’t know why.

國王的耳朵是驢耳朵

[Debian套件打包] Pbuilder 中如何安裝自己打包的套件

| Comments

標題有點難下。直接講為什麼會有這樣的需求好了,在這邊介紹了使用pbuilder驗證單獨的套件。但是如果你要打包的套件需要先安裝另外一個自行先打包的套件就GG了。原因是因為pbuilder不知道去那邊找相依的套件以致於無法編譯你的套件。

舉例來說,假設你現在要打包一個套件是顯示圖片的程式,我們把他叫pkg_image。而這個pkg_image套件使用了lib_img這套函式庫開發。不巧的是lib_img並不在debian官方套件中,所以你必須要先打包lib_imglib_img-devlib_dbg這三個套件。接下來你要確定lib_img-dev套件安裝到你的系統中,你才能夠開始打包pkg_img

這樣的狀況在pbuilder會有前面講到的套件相依問題。後來在Debian文件的PbuilderTricks中找到解法,整理如下。

複習 & 事先準備

首先我們依照Ubuntu的文件PbuilderHowto中的建議,安裝下面的套件。這部份應該和前面有重複。

1
sudo apt-get install pbuilder debootstrap devscripts

其中devscripts提供打包debian套件所需要的script,如前面提到的debuild。而debootstrap則是可以讓你在系統中安裝並執行另外一個debian Linux。在使用時可以指定要裝debian的版本,至於debootstrap支援那些版本?你可以用下面的方式查詢: ls /usr/share/debootstrap/scripts

如果你準備打包並上傳到debian官方套件管理庫,那麼你還要安裝debian 的GPG key,指令如下:

1
sudo apt-get install debian-archive-keyring

接下來我們要建立一個待測Debian的基本image。我使用

1
2
3
4
sudo pbuilder create --distribution sid \
                     --mirror http://ftp.tw.debian.org/debian \
                     --debootstrapopts \ 
                     "--keyring=/usr/share/keyrings/debian-archive-keyring.gpg --variant=buildd"

這個指令表示

  • 我要針對下建立基於debian sid的base.tgz檔案: --distribution sid
  • 指定mirror site: --mirror http://ftp.tw.debian.org/debian
  • 傳遞下面的參數給debootstrap: --debootstrapopts
    • 使用debian archive的gpg key 來驗證下載的套件--keyring=/usr/share/keyrings/debian-archive-keyring.gpg
    • 除了基本的套件外,請幫我額外安裝編譯軟體需要的相關套件 (–variant=buildd)

修改pbuilder config檔案

建立了base.tgz後。還要更改pbuilder的設定以及加入hook。請編輯/etc/pbuilderrc,或是你執行的pbuilder身份home目錄下的~/.pbuilderrc。主要是描述你的local repository放在那邊,以及hook放在那邊。local repository就是你自己打包的套件要放的地方,以前面的例子,就是要放lib_imag.deb和lib_imag-dev.deb到該目錄。而hook可以比喻成/etc/rc.d內的東西,基本上就是在該目錄寫一些script,當pbuilder啟動後就會依順序呼叫。

/etc/pbuilder.c
1
2
3
4
OTHERMIRROR="deb [trusted=yes] file:///path/to/the/dir/deps ./"
BINDMOUNTS="/path/to/the/dir/deps"
HOOKDIR="/path/to/hook/dir"
EXTRAPACKAGES="apt-utils"

請確認內容中的每個路徑都存在,還有[trusted=yes]有被加入。沒加這個在pbuilder安裝自己local套件會因為安全條件不滿足而無法安裝。

寫完設定檔後,記得要告訴pbuilder你已經更新了設定。指令如下

/etc/pbuilder.c
1
sudo pbuilder --update --override-config --distribution sid

接下來就是在HOOKDIR指定的目錄中填寫hook的內容,debian trick網頁是使用D05deps,我也是照抄。

D05deps
1
2
3
#!/bin/sh
(cd /path/to/the/dir/deps; apt-ftparchive packages . > Packages)
apt-get update

這個hook就是切換到你存放自己打包deb套件的目錄,然後產生出apt看得懂的套件列表到Packages檔案,最後就是更新apt。所以每次該目錄有新的deb套件時,都可以確保pbuilder一定可以使用。

套用並測試

完全和前面一樣,pbuilder –build 一個dsc檔。以前面的例子,我們會依照下面的順序打包

  • pbuilder --build lib_img.dsc打包lib_imglib_img-devlib_img-dbg這三個套件。
  • lib_imglib_img-devlib_img-dbg搬到你給pbuilder吃的local repository目錄
  • pbuilder --build pkg_image.dsc,pbuilder會自動從local repository中找出並安裝相依套件。

參考資料

Comments