承襲上篇《dsw2dot.pl - extract and draw project dependencies》,又手癢寫了 pkginfo2dot.pl,將 freebsd 裡已安裝的 packages,彼此之間的 dependencies 畫出來。這個 script 的 usage 如下:

Usage: pkginfo2dot.pl [ <option> ... ] <dot-file> <pkg-glob> ...

Generate graphviz digraph script <dot-file> according to pkg_info(1) output
for package <pkg-glob>s..  If path of digraph script <dot-file> is a single
dash, will output to standard output.

Options:

  -h,--help               Show this help message.
  -n,--name <graph-name>  Set graph name to <graph-name>.  Default to first
                          <pkg-glob>.
  -v,--verbose            Show verbose progress messages.

Revision: r374 (2007-05-15)

可以一次吃多個 <pkg-glob>[1]。我們可以這麼下指令,把所有 packages 的相依性全畫出來:

SHELL> find /var/db/pkg -type d -maxdepth 1 -depth 1 \
       | xargs -n 1 basename \
       | sort \
       | xargs pkginfo2dot.pl --name "$HOST-packages" - \
       > "~/$HOST-packages.dot" \
       ;

然後就發現這樣圖太大了,dot 要花上 6 分鐘才跑的完:

SHELL> dot -Tsvg -Grankdir=RL -o "$HOST-packages.svg" "$HOST-packages.dot"

| Time | 6:04.13s (user: 360.412s, kernel: 0.337s, CPU utilisation: 99.0%)
| Mem  | average: 5+38151=38156 KB (max: 26948k)
| I/O  | input operations: 0, output operations: 34
| IPC  | socket in: 0, socket out: 0, signals: 0
| Swap | 0 swaps (major page faults: 0, minor page faults: 30986)
| Wait | 1 waits (involuntary context switches: 90835)

SHELL> dot -Tpng -Grankdir=RL -o "$HOST-packages.png" "$HOST-packages.dot"

| Time | 6:03.09s (user: 360.087s, kernel: 0.300s, CPU utilisation: 99.2%)
| Mem  | average: 5+38130=38136 KB (max: 26922k)
| I/O  | input operations: 0, output operations: 0
| IPC  | socket in: 0, socket out: 0, signals: 0
| Swap | 0 swaps (major page faults: 0, minor page faults: 31016)
| Wait | 1 waits (involuntary context switches: 90473)

然後產生出來的 svg 檔用 firefox 開,firefox 就會當掉。改產生 gif 檔會抱怨 malloc 失敗,真苦~

SHELL> dot -Tgif -Grankdir=RL -o "$HOST-packages.gif" "$HOST-packages.dot"
Error: gdImageCreate returned NULL. Malloc problem?

  1. 目前還沒有 glob 的功能。