Introspectionに対応したライブラリーの作り方を紹介します。ライブラリーはCで実装します。Introspectionに対応するとうれしいことを説明します。Introspectionに対応していると、各種スクリプト言語の拡張機能を1つずつ作る必要がありません。実際にどのようになるかみてみましょう。この記事では次のAPIを提供するCのライブラリー「Sample」を作ります。このライブラリーはGTK-Docの使い方を説明したときに作ったものです。詳細はリンク先を参照してください。Introspectionに対応すると、次のPythonスクリプトでこのAPIを使うことができます。Hello!Rubyスクリプトから使う場合はこうなります。Hello!どちらの場合も、「Greeterクラスを定義、Greeterクラスにはgreetメソッドを定義」ということを指定していません。「Sampleライブラリーを使う」と指定しているだけです。SampleライブラリーのAPIは2つの関数しか提供していませんが、通常、ライブラリーのAPIはもっと多くの関数を提供しています。Introspectionに対応していると、それらの関数をどのように使うかを1つずつ定義しなくてもスクリプトから使えます。Introspectionに対応する方法を説明します。ビルドシステムにはAutotoolsを使用していることを前提としています。Introspectionに対応するためには次の2つのファイルを編集します。configure.ac共有ライブラリーを生成するディレクトリーのMakefile.amconfigure.acの変更点は1行です。AC_CONFIG_FILES([GOBJECT_INTROSPECTION_REQUIRE()を追加しているだけです。Introspectionが必須」という意味です。最低でもこの環境はサポートしたいと考えている環境に合わせればよいです。wheezyのgobject-introspectionのバージョンです。wheezyは最低でもサポートしたいという意味になります。AM_INIT_AUTOMAKE()にforeignを指定していない場合は-Wno-portabilityを指定してください。AC_PROG_CC-Wno-portabilityはポータブルではないことに対する警告を抑制します。make独自の機能を使っているからです。共有ライブラリーを生成するディレクトリーのMakefile.amの変更点はそこそこあります。該当するMakefile.amを確認しましょう。今回は次のようなディレクトリー構成になります。greeter.h共有ライブラリーlibsample.soの元になるlibsample.laをsample/以下に生成するので、該当するMakefile.amはsample/Makefile.amになります。sample/Makefile.amを編集して次のファイルを生成するようにします。sample/Sample-1.0.girsample/Sample-1.0.typelibこの2つのうち、スクリプトから読み込んでいるのが.typelibの方です。.typelibは.girから生成します。.girはライブラリーから生成します。Makefile.amはこのようになります。Introspection固有の記述です。Introspectionが提供するMakefileがルールを提供するので、Makefile.amではマクロを定義するだけです。cleanで削除するため。Introspectionが提供するMakefileを取り込む。make依存の書き方をふんだんに使っている。生成する.girのリスト。後の方でこのマクロに.girを追加していく。.girを生成するg-ir-scannerに渡すコマンドライン引数。ここで指定した引数がすべての.gir生成で使われる。.typelibを生成するg-ir-compilerに渡すコマンドライン引数。ここで指定した引数がすべての.typelib生成で使われる。Introspectionが見つかったときだけ実行されるブロック。Sample-1.0.girの依存関係を指定。「Sample_1_0_gir」をプレフィックスとしてパラメーターを指定する。Sample-1.0.girが依存するpkg-configのパッケージ名を指定。gobject-2.0は指定しなくてもよい。Sample-1.0.girが提供するpkg-configのパッケージ名を指定。Introspectionのパッケージ名を指定。GObject-2.0でも指定する。