そろそろあちこちから紅葉の便りが届くようになり、行楽にも最適の時期になってきました。紅葉を求めてドライブでも、と言いたいところですが、筆者は筋金入りの方向オンチで、地図を確認しつつ移動していてもいつの間にか反対の方向に向っていたりして、初めての目的地に素直に辿りつけることはまずありません。
自分の方向オンチの原因を考えるに、地図のような絶対的な東西南北の感覚が欠如していて、自分や目に付く目標物を中心とした前後左右という相対的な感覚のみに頼っているせいのように思います。鳥瞰的な視点が必要なのはコンピュータシステムのトラブル時でも同じで、エラーログの迷路で迷子になった時には、システム全体の中での今の位置はどこか、といった視点に切り替えて眺めた方が、解決のヒントを得られることが多いでしょう。
さて、前回までに英語技術文書を読むいくつかのテクニックを紹介してきました。今回はそれらの応用編として、筆者がソフトウェアをパッケージ化する際に、どのような文書をどのように読んだかの実例を紹介してみます。今回紹介するのはGIMP 2.4 をビルドした際の事例です
GIMP 2.4のパッケージ化
GIMP はGNU Image Manipulation Programの略で、Adobe Photoshopによく似た高性能な画像データ処理用のソフトウェアです。GIMPは過去10年以上に渡って開発が続けられているソフトウェアで、OSSの世界にさまざまな影響を与えてきました。
たとえば、GNOME デスクトップ環境が採用しているGTK ウィジェットは、元々はGIMPが利用するために開発されたウィジェットですし(G imp T ool K it)、プリントアウト用のプラグインとして開発されたGimp-printは、現在ではGutenprint と改名して、インクジェットを中心にさまざまなプリンタに対応した高性能のプリンタドライバとしてCUPS等のプリンタシステムのバックエンドに広く採用されています。
他のディストリビューション同様、Plamo Linux でもGIMPはバイナリパッケージとして提供しています。先に公開したPlamo-4.22 ではGIMP 2.2.15を採用していましたが、つい先日、新しいシリーズとなるGIMP 2.4 が公開されたので、さっそくパッケージ化を試みました。
ソースコードの展開とドキュメントの確認
ソースコードをダウンロードして展開すると、gimp-2.4.0/ 以下に下記のようなファイルが展開されました。
AUTHORS Makefile.in authors.dtd cursors/ gimpthumb.pc.in libgimpbase/ menus/ po-tips/
COPYING NEWS authors.xml data/ gimptool-2.0.in libgimpcolor/ missing* py-compile*
ChangeLog NEWS.pre-2-0 authors.xsl depcomp* gimptool-win32.c.in libgimpconfig/ mkinstalldirs* regexrepl/
ChangeLog.pre-1-0 NEWS.pre-2-2 compile* desktop/ gimpui.pc.in libgimpmath/ modules/ themes/
ChangeLog.pre-1-2 README config.guess* devel-docs/ gtk-doc.make libgimpmodule/ plug-ins/ tools/
ChangeLog.pre-2-0 README.i18n config.h.in docs/ install-sh* libgimpthumb/ po/
HACKING README.win32 config.h.win32 etc/ intltool-extract.in libgimpwidgets/ po-libgimp/
INSTALL acinclude.m4 config.sub* gimp-zip.in* intltool-merge.in ltmain.sh po-plug-ins/
LICENSE aclocal.m4 configure* gimp.pc.in intltool-update.in m4macros/ po-python/
Makefile.am app/ configure.in gimpdefs.msc libgimp/ makefile.msc po-script-fu/
ざっと展開されたファイル類を眺めると、configureスクリプト が用意されており、コンパイルに必要な設定はこのスクリプトがやってくれることがわかります。よく知っているソフトウェアならば、この時点で ./configure を実行して必要なライブラリやソフトウェアが揃っているかを確認するだけで済ますこともありますが、今回はGIMPのバージョンが大きく更新されていますので、まずは用意されているドキュメント類を確認することにしました。
多くのソフトウェアではバージョン番号を x.y.z のような形式で管理しており、x がメジャー番号 、y がマイナー番号 、z がリリース番号 やパッチ番号 と呼ばれます。どの程度の変更でバージョン番号のどの部分を更新するかはそのソフトウェアの開発者に任されていますが、GIMPのような大規模なソフトウェアでは、マイナー番号の更新でもかなり大規模な変更が行われていることが予想できます。
READMEファイル
最近のソフトウェアでは、ドキュメントの類は大文字のファイル名 になっているので、読むべきファイルに迷うことは少ないでしょう。今回もまず最初にREADMEファイル に目を通しました。
The GNU Image Manipulation Program Version 2.4
----------------------------------------------
GIMP 2.4 replaces earlier GIMP 2.x versions. It is advised that you
uninstall them before installing GIMP 2.4. If you want to keep your
older GIMP 2.x installation in parallel to GIMP 2.4, you have to
choose a separate prefix which is not in your default library search
...
文書の位置付けや著者のスタイルなどを把握するために最初の数パラグラフはじっくりと読んだ方がいいので、この READMEファイルも最初のセクションは丁寧に目を通してみました。しかしながら、そこに書かれていたのはバージョンアップの際に古いバージョンをアンインストールすることを勧める内容で、それほど重要な情報とは思えませんでした。残りの部分を眺めると、Web ResoucesやMailing Lists等の見出しが並んでおり、これらはGIMPに関する情報源を列挙している程度だなと判断して、見出しだけを眺めてこのファイルは読み終えました。
NEWSファイル
次は、新しいバージョンということで、変更点がまとめてあるであろうNEWSファイル を開きましたが、このファイルには "This is the stable branch of GIMP." の1行があるだけでした。たぶん、過去の履歴は NEWS.pre-2-2等のファイルに記載されているのでしょうが、今回はそれら古い機能を調べる必要もないので、それらのファイルは無視しました。
configureスクリプトを構成するGNU Autoconf/Automake では、動作のためにAUTHORS,COPYING,ChangeLog,INSTALL,NEWS,README という6つのドキュメントファイルを要求するので、ソフトウェアによっては、このNEWSファイルのように形式的なファイルだけを用意したり、汎用的なドキュメントを使い回したりする例も見られます。
INSTALLファイル
次に開いたのはINSTALLファイル です。ソフトウェアによっては、configureスクリプトの一般的な使い方を記したファイルを使い回していることもありますが、GIMP 2.4ではきちんとこのソフトウェア用の情報が書かれていました。
Installation instructions for GIMP 2.4
--------------------------------------
There are some basic steps to building and installing GIMP.
GIMP 2.4 replaces earlier GIMP 2.x versions. It is advised that you
uninstall them before installing GIMP 2.4. If you want to keep your
older GIMP 2.x installation in parallel to GIMP 2.4, you have to
...
この文書も最初に過去のバージョンを削除するべきことが書かれています。READMEだけでなく、INSTALLでも同じことを述べているのはそれけハマりやすい点なのだな、と考えて、旧バージョンのアンインストールの必要性を心に留めつつ読み進めると、* (アスタリスク)で強調された部分が目につきました。
******************************************************************
* Unless you are experienced with building software from source, *
* you should not attempt to build all these libraries yourself! *
....
このような部分は著者がとくに注意を喚起したいと思って書いているので、じっくりと読んでみましたが、一般ユーザは、よほど手慣れた人以外は自分でライブラリを作らず、ディストリビュータ製のライブラリを使うべきだ、といった内容でした。
この先は箇条書きになっていることに気づきましたので、各項目の先頭行をつまみ読み で読み進めていきました。
1. You need to have installed a recent version of pkg-config available
...
2. You need to have installed GTK+ version 2.10.13 or newer. GIMP
...
3. We require PangoFT2, a Pango backend that uses FreeType2. Make
...
ざっと見、GIMP 2.4が要求するソフトウェアの列挙のようです。これらソフトウェアのバージョンはconfigureスクリプトを動かせば自動的にチェックしてくれるはずなので、いろんなソフトウェアが必要なんだな、程度の認識で読み飛していきました。
この先には
Generic instructions for configuring and compiling auto-configured
packages are included below. Here is an illustration of commands that
...
% tar xvfz gimp-2.4.x.tar.gz # unpack the sources
% cd gimp-2.4.x # change to the toplevel directory
% ./configure # run the `configure' script
...
といった実際の手順を記した部分がありましたが、これも一般的な手順なので詳しく読む必要はないだろうと判断して先に進みます。
The `configure' script examines your system, and adapts GIMP to run on
it. The script has many options, some of which are described in the
...
このあたりからconfigureスクリプトの実際の操作方法を記しているようなので、少し読むペースを落して丁寧に読むことにしました。
--enable-shared and --disable-shared. This option affects whether
shared libraries will be built or not. Shared libraries provide
...
これらはconfigureを実行する際に指定可能なオプションの列挙で、./configure --help を実行すれば同等の情報は表示されるはずですが、何か見慣れないオプション指定でもないかとそれぞれの項目の見出しを中心に眺めていきました。
ディストリビュータという立場上、過去の経験から、何が一般的なオプションで何がこのソフトウェアに独自のオプションかの区別は、ほぼ指定する引数で判断がつくので、一般的な引数の部分はとばして、他では見たことのない引数の部分のみを読んで行きました。たとえば次のような引数は他のソフトウェアでは見た記憶がありません。
--enable-binreloc. When compiled for Linux with this option enabled,
GIMP will be binary relocatable. Plug-ins and data files will
...
説明の中にLinuxという単語があるので丁寧に読んでみたところ、Linux上でGIMPをコンパイルする際にこのオプションを指定すると、GIMPがリロケータブルになる、という機能のようです。どういう用途に使う機能かはわかりませんが、とりあえずは指定しなくても大丈夫そうだなと判断して先に進みます。
--with-sendmail=[PATH]. This option is used to tell GIMP where to find
...
うーむ…、最近のGIMPはsendmailも必要になっているのか、…と感心し(あきれ)つつ、読み進めていきます。
いわゆる software bloat(ソフトウェア肥大)の例として、「バークレーで開発されたあらゆるソフトウェアはメールの読み書きができるようになるまで肥大する」 という話を思い出してニヤリとしました。
The `make' command builds several things:
- A bunch of public libraries in the directories starting with 'libgimp'.
- The plug-in programs in the 'plug-ins' directory.
...
このあたりからmake を実行した時の動作の説明になっているようなので、列挙されている項目をざっと見てみましたが、ディレクトリ構造の簡単な説明程度のようなので、あまり気に止めず先に進みます。
When ./configure fails
======================
'configure' uses pkg-config, a tool that replaces the old foo-config
...
このあたりからはconfigureスクリプトがエラーになった際の対応方法が書かれているようです。最初に pkg-config が無かった際の入手先があり、次にGTK+ が見つからなかった際の対処方法などが書かれています。この部分は、実際にconfigureを走らせて、解決できないエラーが発生した際にでも詳しく読めばいいだろうと判断して、ざっと最後まで眺めて INSTALLファイルは読み終えました。
configure スクリプトの実行
こういった感じで README, NEWS, INSTALL の3つのドキュメントを5分程度で読み終えてから、./configure を実行し、必要なライブラリが揃っているかを調べてみました。
kojima@xeon:~/Gimp/gimp-2.4.0$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
...
checking for FONTCONFIG... yes
checking for PANGOFT2... no
configure: error: Test for PangoFT2 failed.
*** We require Pango with the optional support for FreeType2 compiled in.
*** See the file 'INSTALL' for more help.
おっと、PANGOFT2が見つからない 、と言われてエラーになってしまいました。エラーメッセージにも表示されているように INSTALLファイルを改めて開いてみます。先にざっと眺めた際に必要なライブラリ類については前半の方にまとめてあったのを思いだし、該当箇所を調べてみました。
3. We require PangoFT2, a Pango backend that uses FreeType2. Make
sure you have FreeType2 and fontconfig installed before you
compile Pango. FreeType2 can be downloaded from
...
FreeType2ライブラリに対応したPango(PangoFT2)ライブラリ が必要だとのことですが、今の環境には両者ともデフォルトで入っていたはずです。このような場合は、configureのログ(config.log) を見て、エラーになっている箇所を調べるのが手っ取り早いでしょう。
config.logを開き、エラーになった PANGOFT2をキーワードとして検索すると、次のような箇所が見つかりました。
configure:28420: checking for PANGOFT2
configure:28428: $PKG_CONFIG --exists --print-errors "pangoft2 >= 1.12.2"
Requested 'pangoft2 >= 1.12.2' but version of Pango FT2 is 1.10.2
configure:28431: $? = 1
...
configure:28481: error: Test for PangoFT2 failed.
*** We require Pango with the optional support for FreeType2 compiled in.
*** See the file 'INSTALL' for more help.
この結果を見ると、GIMP 2.4が必要とするのはpangoft2のバージョン 1.12.2以上だけど、手元の環境には 1.10.2 という古いバージョンしかないためにエラーになっていたことが分かります。pangoのバージョンの問題であることを認識した上で改めて INSTALL ファイルの該当箇所を見てみると、確かに
wants Pango (>= 1.12.2). Sources for these can be grabbed from
ftp://ftp.gtk.org/.
などとありました。どうやらpangoの新しいバージョンを作成することが先なようです。そこでGIMP 2.4のコンパイルは一時棚上げにして、pangoの新しいバージョンの作成に取りかかりました。
その後の展開
pangoをパッケージ化してインストールした後、GIMP 2.4のconfigureスクリプトで再度チェックすると、今度はpygtk のバージョンが古いと言われました。そのためpygtkをビルドしようとするとpygtkが使っているpygobject が古いと言われて…、となかなか大変でしたが、何とか必要なソフトウェアを揃えてGIMP2.4パッケージを作成することができました。
今回の例を見るだけでは、READMEやINSTALLファイルを読むことよりもconfigureスクリプトを実行して必要なソフトウェアやバージョンを調べることの方が重要に見えるかも知れません。しかし、事前にREADMEやINSTALLファイルを眺めることでハマりやすいポイント(古いバージョンはアンインストールする、必須のライブラリとそのバージョン等) をチェックしておいたおかげで、configureスクリプトがエラー停止した際も問題箇所を簡単に絞り込めたように思います。
たとえて言うならば、configureスクリプトはGPS携帯のようなもの で、現在地は詳しくわかるものの、全体の中での位置を把握するのが難しいのに対し、READMEやINSTALLファイルは全体の見取り図のようなもの で、あらかじめ予想されるトラブルや注意点などを大まかに教えてくれますが、実際にトラブルが発生した個々のポイントまでは扱えません。
問題の迷路で迷子にならないためには、具体的な現象に注目した微視的な視点だけではなく、全体の構図をとらえた鳥瞰的な視点を持つことが重要です。その意味でも、READMEやINSTALLといった文書とconfigureスクリプトといったツールはうまく組み合わせて使うことが大事です。