要約
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