2015年5月9日 星期六

在 Ubuntu 14.04 上面使用 sbuild 來建立 Debian unstable 的編譯環境

首先是安裝所需要的套件

$ sudo apt-get install sbuild ubuntu-dev-tools lintian piuparts

接著是產生給 sbuild 使用的公私鑰(需要去做其它的操作來產生足夠的系統亂數,例如去瀏覽網頁)

$ sudo sbuild-update --keygen
Generating archive key.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 186 more bytes)

接下來將自己加入 sbuild 群組

$ sudo sbuild-adduser $LOGNAME
正將 `sylee' 使用者新增至 `sbuild' 群組 ...
正在將使用者“sylee”加入到“sbuild”群組中
完成。

# Setup tasks for sudo users:

# BUILD
# HOME directory in chroot, user:sbuild, 0770 perms, from
# passwd/group copying to chroot, filtered
# Maybe source 50sbuild, or move into common location.

Next, copy the example sbuildrc file to the home directory of each user and
set the variables for your system:

  cp /usr/share/doc/sbuild/examples/example.sbuildrc /home/sylee/.sbuildrc

Now try a build:

  cd /path/to/source
  sbuild-update -ud 
  (or "sbuild-apt  apt-get -f install"
       first if the chroot is broken)
  sbuild -d  _

然後登出 X Window System 再重新登入來使 sbuild 群組權限生效,如果不想重新登出登入的話,可以使用下面指令直接取得 sbuild 的群組權限。

$ newgrp sbuild

複製 sbuild 的設定範本到家目錄底下

$ cp /usr/share/doc/sbuild/examples/example.sbuildrc $HOME/.sbuildrc

開始建立 Debian unstable 的編譯環境

$ mk-sbuild --arch amd64 --distro debian unstable
[...中略]

Done building sid-amd64.

 To CHANGE the golden image: sudo schroot -c source:sid-amd64 -u root
 To ENTER an image snapshot: schroot -c sid-amd64
 To BUILD within a snapshot: sbuild -A -d sid-amd64 PACKAGE*.dsc

接下來就可以使用 sbuild -A -d sid-amd64 PACKAGE*.dsc 來編譯 Debian binary package 了。

$ sbuild -A -d sid-amd64 x11-touchscreen-calibrator_0.2-2.dsc

另外可以修改 ~/.sbuildrc 在編譯完成時,自動加上 lintian 以及 piuparts 的檢查。

$run_lintian = 1;
$lintian_opts = ['-EviIL', '+pedantic', '--profile', 'debian'];

$run_piuparts = 1;
$piuparts_opts = ['-D', 'debian', '--schroot=chroot:sid-amd64'];

參考資料:https://wiki.debian.org/sbuild

2015-11-04 補充:

在使用 $run_lintian 跟 $lintian_opts 時,要特別注意是否要在 sbuild 加上 -s 或是 --source 的參數,這樣才會去檢查 source package,不然就只會檢查 binary package 而已。

$ sbuild -s -A -d sid-amd64 x11-touchscreen-calibrator_0.2-2.dsc

另外 SimpleSbuild - Ubuntu Wiki 也提供一些加速編譯過程的方法,像是使用記憶體來做檔案系統,或是使用 apt-cacher-ng 來儲存可重覆使用的 deb 檔案。

2015-12-10 補充:

編譯過程中可能會有無法預期的問題發生,導致 sbuild 所使用的 schroot 無法正常結束,這種時候可能會需要參考 man schroot-faq 裡面的 "How do I manually cleaning up a broken session?" 來手動清除壞掉的東西。

2017-12-05 補充:

可以在執行 mk-sbuild 時,指定一個比較近的 mirror 來使用,例如為 Ubuntu xenial 建立 schroot 環境時就可以:

$ mk-sbuild --arch amd64 --distro ubuntu --debootstrap-mirror=http://mirror01.idc.hinet.net/ubuntu xenial