methods=Kernel/i.try_link.mkmf,Kernel/i.try_cpp.mkmf,Kernel/i.egrep_cpp.mkmf,Kernel/i.try_run.mkmf,Kernel/i.install_rb.mkmf,Kernel/i.append_library.mkmf,Kernel/i.have_macro.mkmf,Kernel/i.have_library.mkmf,Kernel/i.find_library.mkmf,Kernel/i.find_header.mkmf,Kernel/i.have_func.mkmf,Kernel/i.have_header.mkmf,Kernel/i.have_struct_member.mkmf,Kernel/i.have_type.mkmf,Kernel/i.have_var.mkmf,Kernel/i.check_sizeof.mkmf,Kernel/i.arg_config.mkmf,Kernel/i.with_config.mkmf,Kernel/i.enable_config.mkmf,Kernel/i.create_header.mkmf,Kernel/i.dir_config.mkmf,Kernel/i.create_makefile.mkmf,Kernel/i.pkg_config.mkmf,Kernel/i.what_type=3f.mkmf,Kernel/i.checking_for.mkmf,Kernel/i.try_compile.mkmf,Kernel/i.try_static_assert.mkmf,Kernel/c.CONFIG.mkmf,Kernel/c.CFLAGS.mkmf,Kernel/c.LINK.mkmf,Kernel/c.CPP.mkmf,Kernel/v.srcdir.mkmf,Kernel/v.libdir.mkmf,Kernel/v.archdir.mkmf,Kernel/v.sitelibdir.mkmf,Kernel/v.sitearchdir.mkmf,Kernel/v.hdrdir.mkmf,Kernel/v.topdir.mkmf,Kernel/v.defs.mkmf,Kernel/v.libs.mkmf,Kernel/v.CFLAGS.mkmf,Kernel/v.LDFLAGS.mkmf
sublibraries=
requires=
classes=
is_sublibrary=false

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 関数の詳細については
[[m:Kernel#dir_config]] を参照してください。

=== configure オプション

configure オプションとは Ruby インタプリタのコンパイル時に指定された
configure スクリプトのオプション、
または extconf.rb 実行時のオプションのことです。
extconf.rb の作成者は任意のオプションを定義できます。
[[m: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 にインストールします。
