ワナビーエンジニアのブログ

なんでもいいから文化的な生活を送りたい

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_ACRUBY_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)。 変数宣言とその説明。 cflagscppflagscxxflagsという変数を宣言している。 ./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力あげないと続きが辛そうです。

つづく