Rubyのconfigure.in読んでみる(2)
前回に続いてconfigure.inを見ていきます。
①初期処理部分
AC_INIT() { AC_CONFIG_AUX_DIR(tool) AC_PREREQ(2.67) AC_DEFUN([RUBY_PREREQ_AC], [m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [$1]), [-1], AC_MSG_ERROR([Autoconf version ]$1[ or higher is required]$2))]) AC_DISABLE_OPTION_CHECKING AC_ARG_VAR([cflags], [additional CFLAGS]) AC_ARG_VAR([cppflags], [additional CPPFLAGS]) AC_ARG_VAR([cxxflags], [additional CXXFLAGS]) AC_DEFUN([RUBY_RM_RECURSIVE], [ m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [2.70]), [-1], [ # suppress error messages, rm: cannot remove 'conftest.dSYM', from # AC_EGREP_CPP with CFLAGS=-g on Darwin. # # TODO: remove this hack when AC_PREREQ() becomes 2.70 or later. AS_CASE([$build_os], [darwin*], [ rm() { rm_recursive='' for arg do AS_CASE("$arg", [--*], [], [-*r*], [break], [conftest.*], [if test -d "$arg"; then rm_recursive=-r; break; fi], []) done command rm $rm_recursive "[$]@" } ])])])
この部分の処理は短いですが、 configureの記述の意味をサッパリ知らないので全く読めません。 AC_ほげほげが新たに7つ、m4ほげほげというのも出てきました。 m4ほげほげはautoconfで利用する別のマクロセットみたいなので雰囲気で読んでいきます。(yak shavingが捗るので…) ドキュメントに書いてある説明をそれぞれ列挙します。
AC_CONFIG_AUC_DIR
AUXはauxiliary(援助者)の略。
configureを補助するスクリプトのあるディレクトリを指定する。
このスクリプト名はinstall-sh
で決め打ちであり、rubyのconfigureはtool/install-sh
を使用する。
ちなみにinstall.sh
でもいいけど、makeで使う名前と被るから廃れた。
It checks for install.sh also, but that name is obsolete because some make have a rule that creates install from it if there is no makefile.
ところでtool/install-sh
を見たところ通常は使われない物のようですが、これは今後調べます。
AC_PREREQ
autoconfの要求versionを指定する。
AC_PREREQ(2.6.7)
より、
rubyは2.67より新しいversionのautoconfを要求していることを表している。
AC_DEFUN
AC_DEFUN (name, [body])と書いてautoconfのマクロを定義する。
ここではRUBY_PREREQ_AC
とRUBY_RM_RECURSIVE
というマクロを定義しています。
AC_MSG_ERROR
AC_MSG_ERROR (error-description, [exit-status = ‘$?/1’])と書く。 内容はシンプルで、標準エラー出力にエラーメッセージを出す。
ドキュメントの最後に気になる一文が、
The error-description should start with a lower-case letter, and “cannot” is preferred to “can't”. 小文字から始めて、cannnotはcan'tのほうが好まれる。なんで????
はい。気になるけど置いておきましょう。
AC_DISABLE_OPTION_CHECKING
認識できない--with-package
や--enable-feature
などのオプションで出るwarningを無効にするらしい。
ところで、ググってたらコミットしたらしい方のブログをみつけた。 存じ上げませんでしたがRubyのメンテナされてる方ですね。
Just another Ruby porter, 2013-2-c
AC_ARG_VAR
AC_ARG_VAR (variable, description)。
変数宣言とその説明。
cflags
とcppflags
とcxxflags
という変数を宣言している。
./configure Foo=foo
のように実行時に代入される。
この変数は前回の結果をキャッシュする。
AS_CASE
これだけACじゃなくてAS。使い方は↓。
AC_DEFUN([my_case], [AS_CASE([$file_name], [*.c], [echo "C source code"])])
上記を見た感じ、$file_nameの拡張子が.cだっら第3引数を実行するようですね。
ASはなんの略なんだろう?
定義したマクロ
- RUBY_PREREQ_AC: autoconfのeversionが2.67未満だったらエラーメッセージを出す
- RUBY_RM_RECURSIVE: autoconfが2.70かつ環境がdarwinのときワーニングを消すマクロ
autoconfのversion
ちなみに現在私のautoconfのversionは2.6.9です。(aptでinstallした)
koooge@KOOOGE-PC:/home/koooge$ autoconf --version autoconf (GNU Autoconf) 2.69
まとめ
ここまでやっていることは3つでした。
- autoconfのversionのチェック
- cflags, cppflags, cxxflagsといった変数の用意
- 例外的な警告の非表示
ここはまだ行数が短いのでなんとかなりましたが(?)、一旦configure力あげないと続きが辛そうです。
つづく