
Я пытаюсь скомпилировать 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
получить вывод отладки оболочки:+ 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
, который принимает только два аргумента.От регистрация на svn.ruby-lang.org 11 ноября 2010 г.
Возможно, это уже давно не работает, и некоторые комментарии 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 в пустую строку.
Интересно узнать, что думают другие об этом анализе.