私はRubyをコンパイルしようとしていますが、これを行うときに何が起こるのかを本当に理解しようとしています。Makefiles
以前に使用して作成したことがありますが、ファイルではないため、意図autoconf
的configure.in
に得られた結果かもしれません。
$ git clone https://github.com/ruby/ruby.git
...
$ cd ruby
$ git clean -fdx
$ autoconf
$ ./configure
...
checking for dot... no
checking for doxygen... no
checking for pkg-config... no
...
checking direct.h usability... no
checking direct.h presence... no
checking for direct.h... no
...
checking for daemon... (cached) no
ただし、少なくともすべてがインストールされています。
$ dot -V
dot - graphviz version 2.26.3 (20100126.1600)
$ doxygen --version
1.7.4
$ pkg-config --version
0.26
$ sudo updatedb
$ locate /direct.h
/usr/src/linux-headers-3.0.0-16-generic/include/config/pci/direct.h
/usr/src/linux-headers-3.0.0-17-generic/include/config/pci/direct.h
$ daemon --version
daemon-0.6.4
問題ごとに原因が異なる可能性があることを知っていますが、スクリプトがなぜこれを検出しないのですかconfigure
?
最新のパッチが適用されたUbuntu 11.10を実行しています。
$ uname -a
Linux username 3.0.0-17-generic #30-Ubuntu SMP Thu Mar 8 20:45:39 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
別のホストを試しました。からconfig.log
:
configure:6408: checking for dot
configure:6424: found /usr/bin/dot
configure:6438: result: no
configure:6445: checking for doxygen
configure:6461: found /usr/bin/doxygen
configure:6475: result: no
configure:6483: checking for pkg-config
configure:6504: found /usr/bin/pkg-config
configure:6530: result: no
何?見つけましたが、まだ行っていませんか?
configure:11880: checking direct.h usability
configure:11880: gcc -c -O3 -ggdb conftest.c >&5
conftest.c:135:20: fatal error: direct.h: No such file or directory
compilation terminated.
configure:11880: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
...
| #endif
| #include <direct.h>
configure:11880: result: no
configure:11880: checking direct.h presence
configure:11880: gcc -E conftest.c
conftest.c:102:20: fatal error: direct.h: No such file or directory
compilation terminated.
configure:11880: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
| /* end confdefs.h. */
| #include <direct.h>
configure:11880: result: no
configure:11880: checking for direct.h
configure:11880: result: no
ファンキーなテストスクリプト - 一種のデフォルトパスにあるべきですか?
configure:15175: checking for daemon
configure:15175: result: no
これは実行可能ファイルをチェックするのではなく、使用されたC関数をチェックすることがわかりました。AC_CHECK_FUNCS。
答え1
私はルビーについて知ることはほとんどありません。しかし、私はビルドシステムについてかなりの量を知っています。私はここに提案をするために最善を尽くしますRubyビルドシステムで実際のバグを見つけました。。
これが私の推論です。
私はあなたが指定したgitリポジトリを使って、まったく異なるシステム(Cygwin / Windows 7を含む)であなたと同じ結果を得ました。ストック Ruby 1.9 ソースコード
実際に道で発見したので
found: /usr/bin/dot
あなたのものを見ることができます。configure.log
これは生成されたスクリプトで簡単に確認できます。特に、シェルのデバッグ出力を取得するconfigure
ために最初の行を変更する場合は特にそうです。#!/bin/sh -x
+ test -z /bin + for ac_exec_ext in ''\'''\''' '$ac_executable_extensions' + test -f /bin/dot + test -x /bin/dot + ac_cv_prog_DOT= + printf '%s\n' 'configure:6424: found /bin/dot' + break 2 + IFS='
これが表示されるのは、
result: no
上記のコードスニペットに示すように、空の文字列ac_cv_prog_DOT
に設定され、構成の次の行がその欠落値を反映しているためです。+ DOT= + test -n '' + printf '%s\n' 'configure:6438: result: no' + printf '%s\n' no no
configure.in
空の文字列に設定する理由は、空の文字列が行371で指定されているためです(これが問題の中心です)。AC_CHECK_PROG(DOT, dot) AC_CHECK_PROG(DOXYGEN, doxygen)
私はこれがAC_CHECK_PROGマクロの間違った呼び出しだと思います。GNU Autoconf ドキュメント撮影枚数指定サム2つ以外の必須パラメータ:
― Macro: AC_CHECK_PROG (variable, prog-to-check-for, value-if-found, [value-if-not-found], [path = ‘$PATH’], [reject]) Check whether program prog-to-check-for exists in path. If it is found, set variable to value-if-found, otherwise to value-if-not-found, if given. Always pass over reject (an absolute file name) even if it is the first found in the search path; in that case, set variable using the absolute file name of the prog-to-check-for found that is not reject. If variable was already set, do nothing. Calls AC_SUBST for variable. The result of this test can be overridden by setting the variable variable or the cache variable ac_cv_prog_variable.
デフォルトはありません。これを維持するということは、実際に「ポイントが見つかった場合は、DOTを空の文字列に設定する」ことを意味します。
私はこのエラーが発生する理由は、行の元の定義が2
AC_CHECK_TOOL
つの引数だけを必要とする別のマクロを使用したためだと思います。これはしばらく中断された可能性があり、一部のChangeLogコメントは次のような
DOXYGEN
問題があることを示しているようです。Fri Mar 26 19:55:41 2010 Akinori MUSHA <[email protected]> * Makefile.in (DOXYGEN): Define a missing variable DOXYGEN. Build has been failing when doxygen(1) is found by configure but the variable is not defined by the system and make(1) does not allow an empty command. ("@$(DOXYGEN)" was the cause)
結局私が間違っている可能性があります。しかし、configure
ツールが見つかり、対応するMakefile変数を空の文字列に設定するように指示されたと確信しています。
この分析について他の人の考えを聞きたいです。