devscripts 系列: mk-build-deps

devscripts 是給 Debian developer 用的一些好用工具的集合,今天要介紹的是 mk-build-deps

Debian distribution 中包含了許多預先編譯好的 deb 檔,通常我們只要 apt-get install 安裝即可,但是當我們需要修改編譯參數或是製作新版本的套件時,就會需要 apt-get source 取得 source package 自行編譯。要製作 deb 時會要求先安裝一些相依套件,通常是 libfoo-dev 等,此時可以用 apt-get build-dep 自動安裝相依套件。

麻煩的地方是,透過 apt-get build-dep 安裝的套件並不是因為跟任何套件有相依性才被安裝的,相等於直接 apt-get install,因此不會在你編譯完不需要的時候自動移除。如果時常要編一些東西的話,常常系統上會裝滿了許多 libxxx-dev 難以整理。有一個技巧就是利用 equivs 製作 metapackage ,把編譯需要的套件都包含進去,以後不需要了只要移除這個 metapackage 就可以把所有相依套件移除乾淨。

mk-build-deps 就是把這個技巧自動化的工具,使用範例如下:

% mk-build-deps network-manager-gnome
dh_testdir
dh_testroot
dh_clean -k
dh_testdir
dh_testroot
dh_install
dh_installdocs
dh_installchangelogs
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
dpkg-deb: building package `network-manager-applet-build-deps' in
            `../network-manager-applet-build-deps_0.6.6-2_all.deb'.

The package has been created.
Attention, the package has been created in the current directory,
not in ".." as indicated by the message above!

% dpkg -f network-manager-applet-build-deps_0.6.6-2_all.deb depends
autotools-dev, cdbs, debhelper (>= 5.0.0), docbook-to-man, intltool,
libdbus-glib-1-dev (>= 0.60), libgconf2-dev, libglade2-dev, libglib2.0-dev
(>= 2.10), libgnome-keyring-dev, libgnome2-dev, libgnomeui-dev,
libgtk2.0-dev, libiw-dev (>= 27+28pre9), libnm-util-dev (>= 0.6.6),
libnotify-dev (>= 0.3.0), network-manager-dev (>= 0.6.6), pkg-config

而 Frank Lichtenheld 更整理了一個 apt repository 可以直接安裝已經製作好的 build-dep 套件!只要加入以下到 sources.list 即可:

    deb http://sourcedeps.debian.net/ sid main contrib non-free

Display VCS info in prompts

通常 VCS (Version Control System) 都會在工作目錄底下藏一些特殊目錄用來儲存資訊,如 .svn .git .hg 等,因此我們可以在 shell prompt 上動一些手腳,當我們進到 VCS 工作目錄時,自動顯示相關的訊息在 prompt 上。

而 zsh-beta 4.3.6-dev-0+20080921-1 內建了由 Frank Terbeck 開發的 vcs_info 子系統,可以自動偵測 bzr, cdv, CVS, darcs, git, hg, mtn, p4, svk, svn, tla 等多種 VCS,並設定相關的環境變數可以顯示在 prompt 上。

zsh prompt

我的 prompt 設定如下

autoload -Uz vcs_info && vcs_info
zstyle ':vcs_info:*' actionformats \
'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats       \
'%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r'
precmd () { vcs_info }
EXITCODE="%(?..%?%1v )"
JOBS="%(1j.%j .)"
local BLUE="%{^[[1;34m%}"
local RED="%{^[[1;31m%}"
local GREEN="%{^[[1;32m%}"
local CYAN="%{^[[1;36m%}"
local YELLOW="%{^[[1;33m%}"
local NO_COLOUR="%{^[[0m%}"
PROMPT="${RED}${EXITCODE}${CYAN}${JOBS}${YELLOW}%* ${RED}%n${BLUE}@%m:${GREEN}%40<...<%B%~%b%<<"'${vcs_info_msg_0_}'"
${YELLOW}%# ${NO_COLOUR}"

詳細的設定請參閱 zshcontrib(3) GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS

跟螢幕玩 SM

這個 SM 是之前發現的小工具,全名是 screen message,不要想歪囉 😉

sm 是用來在螢幕上顯示顯示一段文字,並盡可能的塞滿整個螢幕,可以事先在 command line 指定好前景背景顏色與字型,還有旋轉方向。預設不加任何參數的話,會使用白底黑字與 Sans 字型,顯示一個笑臉如下:

sm

按一下 ESC 就可以把畫面清空,按任意鍵後可以開始輸入,如果打字夠快的話,說不定能來一段即興的高橋流演說?

sm

Xorg 1.5 XInput Hotplug

之前寫過 Xorg 1.4 XInput Hotplug,提到 xorg, evdev 可以利用 hal 自動偵測硬體載入 driver 與設定參數,而即將 release 的 Xorg 1.5 又新增了一些可以在 hal policy 裡設定的參數:

  • input.x11_driver 可以設定這個 device 要使用的 driver,對應到 xorg.conf 的 Driver 選項
  • input.x11_options.<option name> 則可以設定任意可以用 xorg.conf 裡的 Option 設定的選項 (除了 Option Device,因為 hal 已經知道是甚麼 device)

如今我的 /etc/hal/fdi/policy/10-x11-input.fdi 長這樣:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
    <device>
        <match key="info.capabilities" contains="input.mouse">
            <merge key="input.x11_driver" type="string">mouse</merge>
            <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
                string="Linux">
                <merge key="input.x11_driver" type="string">evdev</merge>
            </match>
        </match>
    
    <match key="info.capabilities" contains="input.keys">
        <merge key="input.x11_options.XkbRules" type="string">base</merge>
        <!-- If we're using Linux, we use evdev by default (falling back to
        keyboard otherwise). -->
        <merge key="input.x11_driver" type="string">keyboard</merge>
        <merge key="input.x11_options.XkbModel" type="string">pc105</merge>
        <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
            string="Linux">
            <merge key="input.x11_driver" type="string">evdev</merge>
            <merge key="input.x11_options.XkbModel" type="string">evdev</merge>
        </match>
        <merge key="input.x11_options.XkbVariant" type="string" />
        <merge key="input.x11_options.XkbLayout" type="string">dvorak</merge>
        <merge key="input.x11_options.XkbOptions" type="string">ctrl:nocaps</merge>
    </match>
    <match key="info.capabilities" contains="input.touchpad">
        <merge key="input.x11_driver" type="string">synaptics</merge>
        <merge key="input.x11_options.Protocol" type="string">auto-dev</merge>
        <merge key="input.x11_options.SHMConfig" type="string">on</merge>
        <merge key="input.x11_options.LeftEdge" type="string">1100</merge>
        <merge key="input.x11_options.RightEdge" type="string">5800</merge>
        <merge key="input.x11_options.TopEdge" type="string">1600</merge>
        <merge key="input.x11_options.BottomEdge" type="string">4200</merge>
        <merge key="input.x11_options.HorizEdgeScroll" type="string">on</merge>
    </match>
    </device>
</deviceinfo>

我的 /etc/X11/xorg.conf 只剩下必要的:

Section "Device"
    Identifier  "i915gm"
    Driver      "intel"
EndSection
    
Section "Screen"
    Identifier  "Default Screen"
    Device      "i915gm"
    DefaultDepth    24
    SubSection "Display"
        Modes       "1280x768"
        Virtual     1280 1792
    EndSubSection
EndSection

X 啟動的 log 如下:

(II) config/hal: Adding input device SynPS/2 Synaptics TouchPad
(II) LoadModule: "synaptics"
    
(II) Loading /usr/lib/xorg/modules/input//synaptics_drv.so
(II) Module synaptics: vendor="X.Org Foundation"
        compiled for 1.4.99.906, module version = 0.15.0
        Module class: X.Org XInput Driver
        ABI class: X.Org XInput driver, version 2.1
(II) Synaptics touchpad driver version 0.15.0
(**) Option "Device" "/dev/input/event8"
(**) Option "SHMConfig" "on"
(**) Option "LeftEdge" "1100"
(**) Option "RightEdge" "5800"
(**) Option "TopEdge" "1600"
(**) Option "BottomEdge" "4200"
(**) Option "HorizEdgeScroll" "on"
(--) SynPS/2 Synaptics TouchPad touchpad found
(**) SynPS/2 Synaptics TouchPad: always reports core events
(II) XINPUT: Adding extended input device "SynPS/2 Synaptics TouchPad" (type: MOUSE)
(--) SynPS/2 Synaptics TouchPad touchpad found

未來各 distro 可以提供預設的 fdi 檔,常見的 input device 都可以隨插即用 🙂