library mkmf

要約

Ruby の拡張ライブラリのための Makefile を作成するライブラリです。

このライブラリは通常、extconf.rb という名前の ruby スクリプトから require されます。この extconf.rb を実行して Makefile を作成するのが慣習です。

extconf.rb の書きかたについては、 Ruby のアーカイブに含まれる doc/extension.rdoc (日本語版は doc/extension.ja.rdoc) も参照してください。

このライブラリでは extconf.rb を記述するのに有用なメソッドを定義しています。ヘッダファイルの存在チェック、ライブラリの存在チェックなど、システム間の差異を調べシステムに適した Makefile を生成するためにこれらのメソッドが必要となります。

使い方

架空の拡張ライブラリ foo.so を作成することを考えます。この拡張ライブラリを作成するためには、ヘッダファイル bar.h とライブラリ libbar.a の関数 baz() が必要だとします。このための extconf.rb は以下のように書きます。

require 'mkmf'

dir_config('bar')
if have_header('bar.h') and have_library('bar', 'baz')
  create_makefile('foo')
end

拡張ライブラリ foo.so を作成、インストールするには以下のようにします。

$ ruby extconf.rb
$ make
$ make site-install

foo.so の extconf.rb では dir_config('bar') を実行しているので、ユーザは以下のようにコマンドラインオプション --with-bar-dir などを使って、ヘッダファイルのパスやライブラリのパスを指定できます。

$ ruby extconf.rb --with-bar-include=/usr/local/include \
                  --with-bar-lib=/usr/local/lib

または

$ ruby extconf.rb --with-bar-dir=/usr/local

dir_config 関数の詳細については Kernel#dir_config を参照してください。

configure オプション

configure オプションとは Ruby インタプリタのコンパイル時に指定された configure スクリプトのオプション、または extconf.rb 実行時のオプションのことです。

extconf.rb の作成者は任意のオプションを定義できます。 Kernel#arg_config も参照してください。

また、以下のオプションがデフォルトで利用可能です。

--with-opt-include=DIR

ヘッダファイルを探索するディレクトリ DIR を追加します。

--with-opt-lib=DIR

ライブラリファイルを探索するディレクトリ DIR を追加します。

--with-opt-dir=DIR

ヘッダファイル、ライブラリファイルを探索するディレクトリ DIR/include、DIR/lib をそれぞれ追加します。

--with-TARGET-include=DIR

ヘッダファイルを探索するディレクトリ DIR を追加します。

extconf.rb の中で dir_config(TARGET) を実行していればこのオプションを指定できます。

--with-TARGET-lib=DIR

ライブラリを探索するディレクトリ DIR を追加します。

extconf.rb の中で dir_config(TARGET) を実行していればこのオプションを指定できます。

--with-TARGET-dir=DIR

ヘッダファイル、ライブラリファイルを探索するディレクトリ DIR/include、DIR/lib をそれぞれ追加します。

extconf.rb の中で dir_config(TARGET) を実行していればこのオプションを指定できます。

depend ファイル

カレントディレクトリに depend という名前のファイルがある場合、生成される Makefile の最後に depend ファイルの内容が追加されます。

depend ファイルはソースファイルの依存関係を記述するために使います。例えば拡張ライブラリのソースコード foo.c が foo.h をインクルードしている場合、 foo.h が更新されたときにも foo.c を再コンパイルしたいでしょう。このような依存関係を記述するには depend ファイルに以下の 1 行を書きます。

foo.o: foo.c foo.h

このように書くと、foo.o が foo.c と foo.h に依存していることを示します。つまり、foo.c か foo.h のどちらかが更新された場合に foo.o がリコンパイルされるようになります。

C コンパイラによっては、このような記述を自動生成できます。一般に、このためのオプションは「-M」です。「-M」オプションを持つ C コンパイラを使っている場合は、以下のコマンドを実行するだけで適切な depend が生成できます。

$ cc -M *.c > depend

gcc には、-M オプションを改善した -MM というオプションもあります。このオプションは、通常更新することのない stdio.h など、システムのヘッダファイルを依存関係に含めません。この -MM オプションでは、「#include <...>」の形式で参照されるヘッダファイルをシステムのヘッダファイルとみなしているようです。

gcc の -MM オプションを使う場合は、以下のコマンドを実行すれば適切な depend が生成できます。

$ gcc -MM *.c > depend

なお、depend ファイルを依存関係の記述以外に使うべきではありません。 mkmf.rb が depend ファイルを Makefile に連結するときに、その内容を加工する場合があるからです。

extconf.rb が生成する make ターゲット

extconf.rb が生成する Makefile には以下のターゲットが定義されています。

all

拡張ライブラリを作成します。

clean

作成した拡張ライブラリ、オブジェクトファイルなどを削除します。

distclean
realclean

clean ターゲットが削除するファイルに加えて、 Makefile, extconf.h, core, ruby なども削除します。

install
site-install

作成した拡張ライブラリを $sitearchdir にインストールします。カレントディレクトリにディレクトリ lib があればその配下の ruby スクリプト (*.rb ファイル) を、ディレクトリ階層を保ったまま $sitelibdir にインストールします。

追加・再定義されるメソッド

$CFLAGS $LDFLAGS $archdir $defs $hdrdir $libdir $libs $sitearchdir $sitelibdir $srcdir $topdir Kernel#arg_config Kernel#cc_command Kernel#check_signedness Kernel#check_sizeof Kernel#convertible_int Kernel#cpp_command Kernel#create_header Kernel#create_makefile Kernel#create_tmpsrc Kernel#depend_rules Kernel#dir_config Kernel#dummy_makefile Kernel#egrep_cpp Kernel#enable_config Kernel#find_executable Kernel#find_header Kernel#find_library Kernel#find_type Kernel#have_devel? Kernel#have_framework Kernel#have_func Kernel#have_header Kernel#have_library Kernel#have_macro Kernel#have_struct_member Kernel#have_type Kernel#have_var Kernel#install_files Kernel#install_rb Kernel#libpathflag Kernel#link_command Kernel#log_src Kernel#merge_libs Kernel#message Kernel#modified? Kernel#rm_f Kernel#rm_rf Kernel#try_compile Kernel#try_constant Kernel#try_cpp Kernel#try_do Kernel#try_func Kernel#try_link Kernel#try_run Kernel#try_static_assert Kernel#try_type Kernel#try_var Kernel#with_config Kernel#with_werror Kernel#xpopen Kernel#xsystem Kernel::CONFIG