動機
Ubuntu 14.04.1 LTSにおいてGraphvizで生成するPDFの中でSVGを扱いたい。
Pandoc+beamer+GraphvizでAWSの図を描くを実施した際に悩んだ点。
SVGをシェイプとして使おうとすると、OS X Lionではうまくいっていたものが、Ubuntuでは普通にapt-get
でインストールしたバージョンだと以下のエラーになる。
これを回避したい。
$ cat k.dot
digraph {
a [image="elb.svg"]
}
$ dot -Tpdf k.dot > /dev/null
Warning: No loadimage plugin for "svg:cairo"
エラーの原因
Graphvizが扱えるファイル形式はdot -P | dot -Tpdf -o list.pdf
で得られる.
この結果と、うまくいっている環境(OSX Lion)との比較から、Ubuntu向けのGraphvizのパッケージでは、 rsvgというライブラリと連携動作するようなコンパイルオプションが指定されていないために、SVG→PDF変換の経路がなく、失敗しているとわかる。
対策
Ubuntuではppaという仕組みによって有志ビルドのようなものが管理されているそうだが(今回初めて知った)、2014.9.2時点ではGraphvizのrsvgオプションを有効にしたppaは存在しないようだ。
そこでパッケージのソースを取得してビルドすることにした。
その方法は Ubuntu 14.04 で vim パッケージをリビルドするを参考にさせていただいた。
以下、各自のUbuntu環境の状態によって違いはあると思う。
オプションを有効にするのに伴い、当該ライブラリへの依存が生じるので、ライブラリはインストールしておく必要がある。
なお、もしここで行った変更を再配布するのであれば、依存関係をパッケージ構成記述としてどこかに追記する必要があるのだと思われるが、ここでは完全に私家版ビルドなので、その点は考慮していない。
$ sudo apt-get librsvg2-dev
$ sudo apt-get build-dep graphviz
$ sudo apt-get install dpkg-dev
$ apt-get source graphviz
$ sudo apt-get install devscripts
$ cd graphviz-2.36.0
rsvg
を有効にするconfigure
フラグを有効にし、プラグインをインストールするように、書き換えを行う。ついでにGDKプラグインも有効にする(これはあまり意味はない)。
書き換えた結果を以下に示す。
$ diff debian/rules{.org,}
73c73
< --without-rsvg \
---
> --with-rsvg \
$ diff debian/libgvc6.install{.org,}
7a8,9
> usr/lib/graphviz/libgvplugin_rsvg.so.*
> usr/lib/graphviz/libgvplugin_gdk.so.*
書き換えたらビルドを行う。
最後のsudoについては自己責任なので注意されたい。
$ debchange -i
# CHANGELOGを入力すること
$ debuild -us -uc
$ cd ..
$ sudo dpkg -i *.deb
これでdot -Tpdf k.dot > /dev/null
してもエラーにならない環境になった。