Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library mkmf

library mkmf

要約

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

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

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

使い方

架空の拡張ライブラリ 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 にインストールします。

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

Kernel$$CFLAGS [added by mkmf]

拡張ライブラリをコンパイルするときの C コンパイラのオプションや、 ヘッダファイルのディレクトリを指定する文字列です。

Kernel#dir_config の検査が成功すると、 この変数の値に " -Idir" が追加されます。

Kernel$$LDFLAGS [added by mkmf]

拡張ライブラリをリンクするときのリンカのオプション、 ライブラリファイルのディレクトリを指定する文字列です。

Kernel#find_library または Kernel#dir_config の検査が成功すると、$LDFLAGS の値に "-Ldir" を追加します。

Kernel$$archdir [added by mkmf]

マシン固有のライブラリを置くディレクトリです。 通常は "/usr/local/lib/ruby/バージョン/arch" です。

Kernel$$defs [added by mkmf]

拡張ライブラリをコンパイルするときのマクロ定義を指定する配列です。

この変数の値は、例えば

["-DHAVE_FUNC", "-DHAVE_HEADER_H"]

のような形式の配列です。

Kernel#have_func または Kernel#have_header を呼び出すと、その検査結果が $defs に追加されます。

Kernel#create_header はこの変数の値を参照してヘッダファイルを生成します。

Kernel$$hdrdir [added by mkmf]

Ruby のヘッダファイル ruby.h が存在するディレクトリです。 通常は $archdir と同じで、"/usr/local/lib/ruby/バージョン/arch" です。

Kernel$$libdir [added by mkmf]

Ruby のライブラリを置くディレクトリです。 通常は "/usr/local/lib/ruby/バージョン" です。

Kernel$$libs [added by mkmf]

拡張ライブラリをリンクするときに 一緒にリンクされるライブラリを指定する文字列です。

この変数の値は、例えば

"-lfoo -lbar"

のような形式の文字列です。

Kernel#have_library または Kernel#find_library を呼び出すと、その検査結果が 間に空白をはさみつつ $libs に連結されます。

Kernel$$sitearchdir [added by mkmf]

サイト固有でかつマシン固有のライブラリを置くディレクトリです。 通常は "/usr/local/lib/ruby/site_ruby/バージョン/arch" です。

Kernel$$sitelibdir [added by mkmf]

サイト固有のライブラリを置くディレクトリです。 通常は "/usr/local/lib/ruby/site_ruby/バージョン" です。

Kernel$$srcdir [added by mkmf]

Ruby インタプリタを make したときのソースディレクトリです。

Kernel$$topdir [added by mkmf]

拡張ライブラリを make するためのヘッダファイル、 ライブラリ等が存在するディレクトリです。 通常は $archdir と同じで、"/usr/local/lib/ruby/バージョン/arch" です。

Kernel#append_library(libs, lib) [added by mkmf]

ライブラリのリスト libs の先頭にライブラリ lib を追加し、 その結果を返します。

引数 libs とこのメソッドの戻り値は リンカに渡す引数形式の文字列です。 すなわち、UNIX 系 OS では

"-lfoo -lbar"

であり、MS Windows などでは

"foo.lib bar.lib"

です。 第 2 引数 lib は、この例での "foo" や "bar" にあたります。

Kernel#arg_config(config[, default]) [added by mkmf]

configure オプション --config の値を返します。 オプションが指定されていないときは第 2 引数 default を返します。

例えば extconf.rb で arg_config メソッドを使う場合、

$ ruby extconf.rb --foo --bar=baz

と実行したとき、arg_config("--foo") の値は true、 arg_config("--bar") の値は "baz" です。

Kernel#check_sizeof(type, headers = nil, &b) [added by mkmf]

Returns the size of the given +type+. You may optionally specify additional +headers+ to search in for the +type+.

If found, a macro is passed as a preprocessor constant to the compiler using the type name, in uppercase, prepended with 'SIZEOF_', followed by the type name, followed by '=X' where 'X' is the actual size.

For example, if check_sizeof('mystruct') returned 12, then the SIZEOF_MYSTRUCT=12 preprocessor macro would be passed to the compiler.

Kernel#checking_for [added by mkmf]
Kernel#create_header [added by mkmf]
Kernel#create_makefile(target[, srcdir]) [added by mkmf]

Kernel#have_library などの各種検査の結果を元に、 拡張ライブラリ TARGET.so をビルドするための Makefile を生成します。

第 2 引数 srcdir は make 変数 srcdir の値を指定します。 この変数には、ソースコードがあるディレクトリ名を指定します。 この引数を省略した場合は、extconf.rb があるディレクトリが使われます。

extconf.rb は普通このメソッドの呼び出しで終ります。

Kernel#dir_config(target[, default]) [added by mkmf]
Kernel#dir_config(target[, idefault, ldefault]) [added by mkmf]

configure オプション --with-TARGET-dir, --with-TARGET-include, --with-TARGET-lib をユーザが extconf.rb に指定できるようにします。

--with-TARGET-dir オプションは システム標準ではない、 ヘッダファイルやライブラリがあるディレクトリをまとめて指定するために使います。 ユーザが extconf.rb に --with-TARGET-dir=PATH を指定したときは $CFLAGS に "-IPATH/include" を、 $LDFLAGS に "-LPATH/lib" を、 それぞれ追加します。

--with-TARGET-include オプションは システム標準ではないヘッダファイルのディレクトリを指定するために使います。 ユーザが extconf.rb に --with-TARGET-include=PATH を指定したときは $CFLAGS に PATH を追加します。

--with-TARGET-lib オプションは システム標準ではないライブラリのディレクトリを指定するために使います。 ユーザが extconf.rb に --with-TARGET-lib=PATH を指定したときは $CFLAGS に PATH を追加します。

以上 3 つの configure オプションがいずれも指定されていないときは、 デフォルト値として引数 default、idefault、ldefault の値が使われます。 第 2 引数のみ与えた場合は "-Idefault/include" と "-Ldefault/lib" をそれぞれ追加し、 第 3 引数も与えた場合は "-Iidefault" と "-Lldefault" をそれぞれ追加します。

Kernel#egrep_cpp(pat, src[, opt]) [added by mkmf]

C プログラムのソースコード src をプリプロセスし、 その結果が正規表現 pat にマッチするかどうかを判定します。

CPP $CFLAGS opt | egrep pat

を実行し、その結果が正常かどうかを true または false で返します。

第 1 引数 pat には「egrep の」正規表現を文字列で指定します。 Ruby の正規表現ではありません。

第 2 引数 src には C 言語のソースコードを文字列で記述します。

このメソッドはヘッダファイルに関数などの宣言があるかどうか 検査するために使用します。

Kernel#enable_config(config[, default]) [added by mkmf]

Kernel#arg_config と同じですが、 --enable-config オプション、 または--disable-config オプションの値だけを参照します。

Kernel#find_header(header, *paths) [added by mkmf]

Instructs mkmf to search for the given +header+ in any of the +paths+ provided, and returns whether or not it was found in those paths.

If the header is found then the path it was found on is added to the list of included directories that are sent to the compiler (via the -I switch).

Kernel#find_library(lib, func, *pathes) [added by mkmf]

関数 func が定義されたライブラリ lib を探します。 最初はパスを指定せずに探し、 それに失敗したら pathes[0] を指定して探し、 それにも失敗したら pathes[1] を指定して探し…… というように、リンク可能なライブラリを探索します。

上記の探索でライブラリ lib を発見できた場合は lib を $libs に追加し、 見つかったパスを $LDFLAGS に追加して true を返します。 指定されたすべてのパスを検査してもライブラリ lib が見つからないときは、 変数を変更せず false を返します。

pathes を指定しないときは Kernel#have_library と同じ動作です。

Kernel#have_func(func[, header]) [added by mkmf]

関数 func がシステムに存在するかどうかを検査します。

関数 func が存在すれば $defs に "-DHAVE_func" (func は大文字に変換されます) を追加して true を返します。 関数 func が見つからないときはグローバル変数を変更せず false を返します。

第 2 引数 header には、 関数 func を使用するのに必要なヘッダファイル名を指定します。 これは関数の型をチェックするためではなく、 関数が実際にはマクロで定義されている場合などのために使用します。

Kernel#have_header(header) [added by mkmf]

ヘッダファイル header がシステムに存在するかどうか調べます。

ヘッダファイル header が存在すれば グローバル変数 $defs に "-DHAVE_header" を追加して true を返します。 ヘッダファイル header が存在しないときは $defs は変更せず false を返します。 なお、-DAHVE_header の header には、 実際には header.upcase.tr('-.', '_') が使われます。

Kernel#have_library(lib[, func]) [added by mkmf]

ライブラリ lib がシステムに存在し、 関数 func が定義されているかどうかをチェックします。 チェックが成功すれば $libs に lib を追加し true を返します。 チェックが失敗したら false を返します。

第 2 引数 func を省略した場合、関数の存在までは検査せず、 ライブラリが存在するかどうかだけをチェックします。

第 2 引数 func が nil または空文字列 ("") のときは、 何も検査をせず、無条件で lib を追加します。

Kernel#have_macro(macro, headers = nil, opt = "", &b) [added by mkmf]

Returns whether or not +macro+ is defined either in the common header files or within any +headers+ you provide.

Any options you pass to +opt+ are passed along to the compiler.

Kernel#have_struct_member(type, member, headers = nil, &b) [added by mkmf]

Returns whether or not the struct of type +type+ contains +member+. If it does not, or the struct type can't be found, then false is returned. You may optionally specify additional +headers+ in which to look for the struct (in addition to the common header files).

If found, a macro is passed as a preprocessor constant to the compiler using the member name, in uppercase, prepended with 'HAVE_ST_'.

For example, if have_struct_member('foo', 'bar') returned true, then the HAVE_ST_BAR preprocessor macro would be passed to the compiler.

Kernel#have_type(type, headers = nil, opt = "", &b) [added by mkmf]

Returns whether or not the static type +type+ is defined. You may optionally pass additional +headers+ to check against in addition to the common header files.

You may also pass additional flags to +opt+ which are then passed along to the compiler.

If found, a macro is passed as a preprocessor constant to the compiler using the type name, in uppercase, prepended with 'HAVE_TYPE_'.

For example, if have_type('foo') returned true, then the HAVE_TYPE_FOO preprocessor macro would be passed to the compiler.

Kernel#have_var(var, headers = nil, &b) [added by mkmf]

Returns whether or not the variable +var+ can be found in the common header files, or within any +headers+ that you provide. If found, a macro is passed as a preprocessor constant to the compiler using the variable name, in uppercase, prepended with 'HAVE_'.

For example, if have_var('foo') returned true, then the HAVE_FOO preprocessor macro would be passed to the compiler.

Kernel#install_rb(mfile, dest, srcdir = '.') [added by mkmf]

ディレクトリ srcdir/lib 配下の Ruby スクリプト (*.rb ファイル) を dest にインストールするための Makefile 規則を mfile に出力します。 mfile は IO クラスのインスタンスです。

srcdir/lib のディレクトリ構造はそのまま dest 配下に反映されます。

Kernel#pkg_config(pkg) [added by mkmf]
Kernel#try_compile [added by mkmf]
Kernel#try_cpp(src[, opt]) [added by mkmf]

C プログラムのソースコード src をプリプロセスします。 問題なくプリプロセスできたら true を返します。 プリプロセスに失敗したら false を返します。

第 1 引数 src は文字列で渡します。

第 2 引数 opt と $CFLAGS の値を プリプロセッサにコマンドライン引数として渡します。

このメソッドはヘッダファイルの存在チェックなどに使用します。

例:

if try_cpp("#include <stdio.h>")
  $stderr.puts "stdio.h exists"
end
Kernel#try_link(src[, opt]) [added by mkmf]

C プログラムのソースコード src をコンパイル、リンクします。 問題なくリンクできたら true を返します。 コンパイルとリンクに失敗したら false を返します。

第 2 引数 opt が指定されたときは、リンカにコマンド引数として渡します。 また、このメソッドは $CFLAGS$LDFLAGS の値も コンパイラまたはリンカに渡します。

例:

if try_link("int main() { sin(0.0); }", '-lm')
  $stderr.puts "sin() exists"
end
Kernel#try_run [added by mkmf]
Kernel#try_static_assert [added by mkmf]
Kernel#what_type? [added by mkmf]
Kernel#with_config(config[, default]) [added by mkmf]

Kernel#arg_config と同じですが、 --with-config オプションの値だけを参照します。

Kernel::CFLAGS [added by mkmf]

C コンパイラに渡されるコマンドラインオプションです。 この値は Makefile にも反映されます。

Kernel::CONFIG [added by mkmf]

Config::MAKEFILE_CONFIG と同じです。

Kernel::CPP [added by mkmf]

プリプロセッサを起動するときのコマンドラインのフォーマットです。 Kernel#try_cpp などが使用します。

Kernel::LINK [added by mkmf]

リンカを起動するときのコマンドラインのフォーマットです。 Kernel#try_link などが使用します。

Classes

Sublibraries