prevcontentnext


プラグインのコンパイル

この章ではGimpで使えるプラグインのコンパイル方法を説明します。

 

コンパイル

 

プラグインは自分自身では実行できないプログラムです。Gimpによって起動させられる必要があるのです。ほとんどの場合、プラグインはソースコードで配布されています。(マシン語で直接書かれていなければ)全てのプログラムはソースコードを持っています。ソースコードはCやC++というような人間が理解できる言語で書かれています。

コンピュータはCやC++を理解しないので、コンピュータが理解して実行できるマシン語にコードを変換する必要があります。この変換がコンパイルと呼ばれるものです。

コンパイルする前に、コンパイラをインストールしておかなければいけません。makeldのようなプログラムも必要です。これらのツールは全ての主要Linuxディストリビューションでは標準搭載されていますが、インストールされていないかもしれません。コンパイルに必要な開発パッケージのインストール方法についての情報は、Linuxディストリビューションのマニュアルを調べて下さい。

Solaris環境で作業していて、Solarisをインストールした時にDevelopment system supportのインストールを選んでいれば、コンパイルに必要なものをすでにほとんど持っています。あと必要なものはコンパイラです。無償のGCC(GNU C- compiler)を入手することができます。SolarisのためのGCCをダウンロードする場所はhttp://www.sunfreeware.com/を見て下さい。

異なるコンパイル方法

コンパイルの一般的な方法は四つあります。Gimptoolと、Makeと、Configureと、CCです。この章はそれぞれのタイプのコンパイルの基本をカバーしていますが、特別コンパイラフラグやデバッギングのような追加的なものはカバーしていません。

たとえあなたがプログラマやハッカーではないとしても、プラグインのコンパイルに挑戦して欲しいです。UNIXプログラマの友達がいたとしても、この章を読んで最善を尽くすことは良い考えであると思います。以下の説明を読んで最善を尽くしたにも係わらず行き詰まってしまったのなら、最終手段として、友達を呼びましょう。

Gimptool

GimptoolはGimpに統合されているプログラムです。これはプラグインのコンパイルを容易にするよう設計されているため、Gimptoolを使うことはGimpのプラグインをコンパイルする最も簡単な方法です。しかし、作り上げるプラグインは一つ以上のソースファイルを持つことはできません。これはつまり、一つの.cファイルで構成されるプラグインをビルドしてコンパイルするためだけにgimp-toolを使うことができるという意味です。複数の.cファイルを変更することはできません(.hで終わるヘッダーファイルのことではない)。Gimptoolについて深く知るには付録Bの gimp-tool Manページプラグインのコンパイルにgimp-toolを使うを見て下さい。

Make,やConfigureやCcでコンパイルする

コンパイルには三つの方法があります。

1. Makeは一般にMakefileと呼ばれる特殊ファイルを実行するプログラムです。このファイルを実行することで、コンパイラの助けを借りてプログラムをコンパイルします。

2. ConfigureMakefile生成するプログラムです。これを行った後、コンパイルするためにMakeを実行する必要があります。

3. 最も基本的であるが、最も難しい方法、それが補助プログラムの助けを借りずにコードをコンパイルするためにコンパイラを使うことです。


ソースコードの入手とインストール方法

 

ほとんどの場合、ソースコードの入手とダウンロードは、プラグイン登録所(plug-in registry)かGimp.org FTPサイトに行くでしょう。他のソースの情報は、GimpニュースとGimp開発者やGimpユーザーのメーリングリストです。

ソースコードの展開

ソースコードをダウンロードしたら、これを展開しなければなりません。大抵、コードはxxx.c.gzxxx.tgzxxx.tar.gzで終わっています。

xxx.c.gzの解凍:

gunzip xxx.c.gz

xxx.tgzxxx.tar.gzアーカイブの展開:

cat xxx.tgz | gunzip | tar xvf -

ソースの展開の前に、これを新しいディレクトリに移動しておきます。それからプラグインを展開して作成します。例えば、Xtermウィンドウで以下のコマンドを入力します。

 
 

プラグインのソースがxxx.cで終わっているなら、ファイルは既に解凍されています。ファイルのダウンロードにNetscapeを使っているなら、これで保存することができます。しかし思い出して下さい、Netscapeはダウンロードしたアーカイブを解凍しようとする時があり、時々これに失敗してしまうのです。

この場合は、Moreのようなファイルビューアーでソースファイルxxx.cをチェックして下さい(例えば、more xxx.c)。もしファイルを読むことができなければ、それは解凍されていません。修正するには、こう入力します。

mv xxx.c xxx.c.gz && gunzip xxx.c.gz.

コードのコンパイル

 

コードのコンパイルにはGNUツールを使用します。GNUツールがインストールされていないシステムを使っているのなら、二つのオプションがあります。GNUツールをダウンロードしてインストールするか(この本の範囲を超える)、システムのツールを使うかです。

GNUツールとシステムツールの間にはそれほど大きな違いはありません。GNUツールのいくつかはgで名前が始まるという事実から見分けることができます。例えば、GNUのコンパイラはgccと呼ばれており、システム自身のコンパイラはccと呼ばれています。とくに違いはないと考えますが、全てをカバーできないくらい大量のUNIXシステムがあるので、確実に言い切ることはできません。

プラグインのコンパイル方法を見付ける

プラグインのソースをダウンロードして展開したら、そのコンパイル方法を見つける必要があります。プラグインは大抵複数のファイルと一緒になっています。READMEINSTALLファイルが入っていることがよくあります。こういったファイルを見付けたら、必ず読んで下さい。

ほとんどの場合、それらのファイルの一つでコンパイルとインストールの方法についての情報が見付かります。Cコードファイル先頭を見ることもできます。そこに情報がなければ、ここの例を順を追ってついてきて下さい。

READMEファイルはプラグインをコンパイルするために追加ライブラリが必要であるかどうかを教えてくれるはずです。例えば、プラグインのコンパイルにlibtifのライブラリとヘッダーファイルが必要であるとか。これらのライブラリやヘッダーファイルを持っていなければ、プラグインの作成は失敗します。

それらのライブラリや他に必要なプログラムがあるかどうかを知るために、ソース配布のインストールのセクションを読んで下さい。

ライブラリのコンパイルはプラグインのコンパイルとはちょっと違いますが、始まりは基本的に同じです。

ダウンロードしたプラグインが一つのファイルであったり、展開した直後にMakefile(MakefileMakefile.classicMAKEFILE,などとも呼ばれているかもしれません)やconfigureファイルがなければ、その時は直接GimptoolGCCでコンパイルするか、Makefileやconfigureスクリプトを作る必要があります。

Makefileがあれば、プラグインのコンパイルにmakeが使えます。その前に、システムに適合しているかどうかMakefileをチェックして下さい。configureスクリプトがあれば、Makefileを生成するためにconfigureスクリプトを使います。

プラグインのコンパイルにgimp-toolを使う

これは、一つのソースプラグインをコンパイルする最も簡単な方法です。

gimptool --build plugin.c

plugin.cのところはプラグインソースファイルの名前です。これで十中八九プラグインを作成できるでしょう。

しかし、作成プロセスが失敗して以下のようなメッセージが現れたら、プラグインのコンパイルにGCCを使うを読んで直接GCCでコンパイルして下さい。

 
 

コンパイルが済んだら、おそらくプラグインをインストールしたいでしょう。Gimptoolを呼び出すことでこれを行います。

gimptool --install plugin.c

これはプラグインのコンパイルと個人用.gimpディレクトリへのインストールの両方を行います。あなたがシステム管理者でありシステムの全てのユーザーのためにプラグインをインストールしたいのなら、Gimptoolを次のように使います。

gimptool --install-admin plugin.c

これはコンパイルをしてシステム共用のGimpディレクトリにプラグインをコンパイルし、インストールします。

プラグインのコンパイルにGCCを使う

最初の挑戦

ファイルの名前がplugin.cであれば、コンパイルはこうなります。

gcc -o plug-in plugin.c.

-oフラグは最終出力(プラグイン)がplug-inの名前になることをコンパイラに伝えています。Cコンパイラ(GCC)がincludelibraryファイルのための標準的なディレクトリを検索するように設定されており、それらのファイルが標準的なディレクトリにあるのなら、プラグインはきれいにコンパイルされます。しかし、このようなことは極めて珍しく、恐らくGimpライブラリとインクルードファイルを指定する必要があるでしょう。

以下の例は先程説明した方法でwaterselect.cファイルをコンパイルした時に現れるものを表示しています。

 
 

ライブラリ

これは作成しようとした実行ファイルに必要なライブラリがリンクされなかった時に発生します。ライブラリ関数の集合です。例えば、ウィンドウスクロールバーを作成する関数です。コンパイラは実行した時にプラグインを使用するために利用可能な関数をチェックします。

それ以外の方法

それでは、これをコンパイルしてみましょう。

gcc -o plug-in plugin.c -L/usr/local/lib -lgtk
-lgimp

現在プラグインはシステムできれいにコンパイルします。Sun Solarisシステムで動かしているなら、ライブラリについて考え始める前に以下を追加して下さい。

-I/usr/local/include

インクルードファイル

エラーメッセージが伝える足りないインクルード(ヘッダーファイル)は次のようです。

waterselect.c:39: gtk/gtk.h: No such file or directory

このメッセージはgtk.hという名前のファイルが足りないことを伝えているのですが、いつもこうであるというわけではありません。もっと正確な答えは、コンパイラ(より正確にはプリプロセッサコンパイラ)が検索に設定されたディレクトリでこれを見つけられないということです。

ファイルを検索するための場所を追加するには、以下を追加します。

-I/where/to/search

ファイルが/usr/local/include/gtkにあり、エラーが"can't find gtk/gth.h,"だったので、コンパイル行は次のようになります。

gcc -o plug-in plugin.c -L/usr/local/lib \
-lgimp -lgtk -I/usr/local/include

追加した-I/usr/local/includeはコンパイラにインクルードファイル(この場合は、gtk/gtk.h)のためにこのディレクトリを検索するように伝えています。これを追加したのでコンパイラはファイルを見付けます。

gtk/gtk.h

はここにある:

/usr/local/include

その結果:

/usr/local/include/gtk/gtk.h

これがファイルが置いてある場所です。

-L フラグとリンクライブラリの見つけ方

-Lフラグも同じように働きます。これらコンパイラにライブラリ(この場合、ライブラリとはlibgimp.solibgtk.so)を検索するための場所を伝えます。-lgimpは簡略形なので、libgimp.soと書く必要はありません。

どのライブラリを追加してどのディレクトリをインクルードするのか決めるには、コードの中身を見て下さい(一般にファイルの始めの方にあります)。これはwaterselect.cファイルからの例です。

 
 

このコードはコンパイラがコードをコンパイルする時に五つのファイルをインクルードすることを伝えています。最初の三つは普通の標準Cのインクルードファイルであり、その他は特別なGimpとGTKのファイルです。

-I フラグ

標準Cヘッダーファイルはコンパイラが検索する標準インクルードディレクトリにあります。しかし、gtk.hgimp.hファイルが標準ディレクトリになければ、コンパイラに(-I flag)を伝えて下さい。

もし、-I flag/usr/local/includeなら、コンパイラはそこからgtk.hファイルを取得しようとします。

/usr/local/include/gtk/gtk.h

ソースコード行はリンクするライブラリ(この場合は、libgimplibgtk)についてのヒントも与えてくれます。標準Cライブラリと数学ライブラリはほとんどのシステムにおいてデフォルトでリンクされます。

ライブラリとインクルードフラグの取得にGimptoolを使う方法

コマンドgimptool --libsでGimptoolを呼び出すと、次のように返ってきます(サイトによって違いがある)。

 
 

これはGimpのコンパイルに使用するライブラリと-Lフラグの全てをあなたに与えます。TIFFライブラリとGimptoolライブラリを必要とするプラグインをコンパイルするなら、これは非常に便利です。gccを次のように呼び出すことができます。

gcc -o plug-in `gimptool --libs` -ltiff plugin.c

するとgccは全GimpライブラリにTIFFライブラリを追加してプラグインをコンパイルとリンクします。全てのインクルードフラグを含めたいのなら、Gimptoolをこのように呼び出します。

gimptool --cflags

これはGimpをコンパイルするために使うCFLAGSのリストを返します。

複数のソースフラグがあるとき

プラグインは一つ以上のCソースコードファイルを含むことができます。外部ファイルが(plugin.hという名前の)ヘッダーファイルであれば、これまで説明したようにしてプラグインをコンパイルすることができます。ヘッダーファイルは特別関数とそれらの関数の呼び出し方法を指定するファイルです。インクルードにはどのディレクトリをインクルードするのか、どのライブラリをリンクするのかを見付け出すためにファイル(もしくはヘッダーファイルだけ)を見て下さい。

プラグインが(pluginmain.c, pluginpart1.c, pluginpart2.c, など、のように)複数のファイルで成り立っていれば、それぞれ個別に分けてコンパイルし、それからまとめて実行プラグインにリンクします。

オブジェクトファイルはそれぞれ個別に作り上げなければいけません。それらのオブジェクトファイルがリンクされることで、最終的な実行プラグインが作られます。

最初の3行でオブジェクトファイルが作られています。コンパイラは-cフラグを加えることによりオブジェクトを作るよう指示しています。オブジェクトファイルが作られる時には、ライブラリについて心配する必要はありません。オブジェクトファイルが作成される時に使用する-Iフラグがどうなっているかだけ、インクルードファイルをコンパイラが確実に見付けるようにする必要があります。

最後の行でプラグインが作られています。ここではインクルードファイルについて心配する必要は無く、プラグインに必要なライブラリを確実にリンクしているかを確認する必要があるだけです。オブジェクトファイルが作られた時、ライブラリの記述関数コールはヘッダーファイルを含むことによってインクルードされます。後でライブラリがリンクされると予想するので、嬉しいことにプラグインオブジェクトファイルはそれらを使用します。ライブラリとディレクトリをインクルードするために、gimptool --cflagsgimptool --libsコマンドを使うこともできます。エラーや大量の入力を避けるためにGimptoolを使用することを推奨します。

最後の行でコンパイラは最終生成物が-o plug-inの追加によってplug-inとなることを伝えています。そしてオブジェクトファイルは最初の3行で作っています。大量のライブラリ関数がオブジェクトファイルで使われているので、-lgimp -lgimpuiを追加することによってプラグインへそれらの関数を提供するライブラリを追加して下さい。-L/usr/local/libを追加することによってライブラリを検索する場所をコンパイラに伝えて下さい。ディレクトリ/usr/lib/libはデフォルトで検索されます。

複数のパーツから成るプラグインを作成している時、それぞれのパーツを手作業でコンパイルすることははっきり言って使い方を間違っています。どこかおかしければ、全てのコマンドをもう一度入力しなければなりません。解決法はMakefileの作成です。Makefileはコンパイラの力を借りてプラグイン全体をコンパイルするために入力としてMakeコマンドを使う特殊形です。

Makefileの作り方と使い方

それでは、シンプルなMakefileの作り方を挙げてみます。これはMakefileの理解を助けるので、プラグインを作るMakefileの編集方法が分かります。一般的なMakefileの例は次のようなものです。

 
 

このMakefileは最初にオブジェクトファイルを作り、次にプラグインをリンクします。これを使うには、ヘッダーオブジェクトソースファイルを正しいものと交換します。どのライブラリをリンクして、ライブラリインクルードのためにどのディレクトリを検索するのかを変更することもできます。CFLAG -O2は実行プログラムの最適化を表しています。最後の行のタブに注意して下さい。タブを付け忘れるとこの様なエラーメッセージが返ってきます

Makefile:11: *** missing separator. Stop.

Makefileの例

これはLinuxでGuashプラグインを作った時のMakefileです。(Guashの配付物にはMakefileがありますが、ここでは練習として取り上げています)

 
 

重要なことは、あなたのシステムに合わせて変更することと、インクルードライブラリのディレクトリを追加しなければいけないかもしれないということです。メイクファイルは複数の異なる方法で書くことができ、ただ一つではなく沢山あるのだということを忘れないで下さい。

変数

Makefileを編集する時、これと同じにはならないかもしれませんが、コンパイルの方法についての基本的な指示と知識によって、きっと編集することができるはずです。最初の8行はそれ以降の10と11行で$(VARIABLE)と呼び出される変数です。特殊形$@変数は上の行の最初の単語を展開する内部変数です(つまり、この例ではGuashとなる)。

プラグインをコンパイルするために、makeと入力してMakeを呼び出すか、こうします:

make -f WhatYouCallYourMakefile.

Makeはオブジェクトファイルの作成と実行プログラムのリンクのためにgccを呼び出します。

よく発生するエラーは、プラグインをアーカイブからコンパイルするためにMakefileを使った時にMakeプログラムが依存関係についてのエラーを出すことです。そうなったら、作成ディレクトリの.depsディレクトリを削除して下さい(rm -rf .deps)。依存関係はMakefileでインクルードすることもできます。ファイルの最後で見付かります。これらを削除すればうまくいくはずです。

MakefileでGimptoolを使う方法

これは全てのライブラリとインクルードディレクトリを指定する代わりにGimptoolを使用して先程のMakefileを変更する方法です。

 
 

多少必要な入力は違いますが、Makefileの中へ必要なGimp関連のライブラリとインクルードを全て確実に入手できるはずです。プラグインにもっとライブラリやインクルードディレクトリが必要であれば、gimptoolコマンドの後に追加することができます。

INCDIR = `gimptool --cflags` -I/usr/opt/include

もしくはこのように:

LIBDIR = `gimptool --libs` -L/opt/lib -ltiff

ビルドプロセスを自動化するConfigure

プラグインについてくるconfigureスクリプトはMakefileを作り上げるプロセスを自動化する方法です。configureスクリプトはプラグインに必要なインクルードファイルとライブラリを見付けようとします。

SolarisやLinuxというような一般的なUNIXプラットホームなら、configureスクリプトを使うことは簡単です。プラグインを作るために、プラグインを展開したディレクトリで以下を入力して下さい

./configure && make

これでプラグインがコンパイルされて使えるようになるでしょう。configureスクリプトが置かれているディレクトリにいるかどうかを確認して下さい。場所が違っていれば、こんなメッセージが返ってきます

bash: ./configure: No such file or directory.

特定のファイルやライブラリを持っていなかったり、スクリプトが見付けられなかった場合には、インストールしたり、見付ける場所をスクリプトに教える必要があります。

インクルードファイルやライブラリを見付ける場所をスクリプトに教える方法を調べるために、このようにスクリプトを呼び出して下さい。

./configure --help

これはスクリプトに与えることができる複数行のフラグになります。スクリプトに含むことができる最も重要なフラグの抜粋です。

--libdir=DIR

--includedir=DIR

二つのフラグで、このようにインクルード/ライブラリのディレクトリを追加することができます。

--includedir=/your/includedir.

一つ以上のインクルードディレクトリを追加したければ、通常のシェルならこの方法でする必要があります。


Cシェルで動かしているなら、このようにする必要があります。

 
 

一つ以上のライブラリディレクトリを追加したければ、CFLAGSと同じようにLDFLAGSコマンドを入力して下さい。

とくに筆者たちのconfigureスクリプトが動いているものとは異なるUNIX方言を使っているなら、複数の問題に遭遇するかもしれません。問題に遭遇したら、まず最初にFLAGSでスクリプトに全てのライブラリとインクルードのディレクトリを追加したり、手作業で作成したMakefileに追加してみて下さい。それでもまだ問題が解決しなかったら、Gimpのメーリングリストにメールを書いてみましょう。

prevcontentnext


Frozenriver Digital Design
http://www.frozenriver.nu
Voice: +46 (0)31 474356
Fax: +46 (0)31 493833
support@frozenriver.com
Publisher Coriolis
http://www.coriolis.com