![为什么 Ruby 的配置脚本检测不到我的可执行文件和头文件?](https://linux22.com/image/22445/%E4%B8%BA%E4%BB%80%E4%B9%88%20Ruby%20%E7%9A%84%E9%85%8D%E7%BD%AE%E8%84%9A%E6%9C%AC%E6%A3%80%E6%B5%8B%E4%B8%8D%E5%88%B0%E6%88%91%E7%9A%84%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E5%92%8C%E5%A4%B4%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在尝试编译 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 几乎一无所知。不过,我确实对构建系统有相当多的了解。我会在这里竭尽全力提出建议你在 Ruby 构建系统中发现了一个真正的错误。
这是我的推理:
我在完全不同的系统(甚至 Cygwin/Windows 7)上得到了与您相同的结果,都使用您指定的 git 存储库和库存 Ruby 1.9 源代码
你之所以能看到
found: /usr/bin/dot
你的,configure.log
是因为它确实在路上找到了它。这在生成的脚本中很容易看到configure
,特别是如果您将其第一行修改为#!/bin/sh -x
获取 shell 调试输出:+ 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 文档指定拍摄次数三必需的参数,不是两个:
― 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 设置为空字符串”
我相信犯这个错误的原因是因为该行的原始定义使用了不同的宏,
AC_CHECK_TOOL
仅需要两个参数。从 2010 年 11 月 11 日签入 svn.ruby-lang.org
这可能已经被破坏了一段时间,并且一些 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 变量设置为空字符串。
很想听听其他人对这一分析的看法。