fr ja en zh ja ja ja ja ja ja ja ja en ja en ja ja ja ja ja en ja en ja fa ja en ja ja en ja ja en ja ja ja ja ja ru ja ja es ja ja en ja ja ja en ja en ja en pt ja en en ja ja en
このライブラリは通常、extconf.rb という名前の ruby スクリプトから require されます。この extconf.rb を実行して Makefile を作成するのが慣習です。
このライブラリでは 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
$ ruby extconf.rb $ make $ make site-install
foo.so の extconf.rb では dir_config('bar') を実行しているので、ユーザは以下のようにコマンドラインオプション --with-bar-dir などを使って、ヘッダファイルのパスやライブラリのパスを指定できます。
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 には以下のターゲットが定義されています。
拡張ライブラリを作成します。
作成した拡張ライブラリ、オブジェクトファイルなどを削除します。
clean ターゲットが削除するファイルに加えて、 Makefile, extconf.h, core, ruby なども削除します。
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