Почему скрипт конфигурации Ruby не обнаруживает мои исполняемые файлы и заголовочные файлы?

Почему скрипт конфигурации Ruby не обнаруживает мои исполняемые файлы и заголовочные файлы?

Я пытаюсь скомпилировать 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.

Вот мои рассуждения:

  1. Я получаю тот же результат, что и вы, на совершенно разных системах (даже Cygwin/Windows 7), как с указанным вами репозиторием git, так и сисходники Ruby 1.9

  2. Причина, которую вы видите 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='     
    
  3. Причина, которую вы видите, result: noзаключается в том, что, как вы можете видеть в приведенном выше фрагменте, ac_cv_prog_DOTбыла установлена ​​пустая строка, а следующие строки в конфигурации просто отражают это отсутствующее значение:

    + DOT=
    + test -n ''
    + printf '%s\n' 'configure:6438: result: no'
    + printf '%s\n' no
    no
    
  4. Причина, по которой была установлена ​​пустая строка (и это суть вопроса), заключается в том, что 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 в пустую строку"

  5. Я полагаю, что эта ошибка была допущена потому, что в исходном определении этой строки использовался другой макрос, AC_CHECK_TOOL, который принимает только два аргумента.

    От регистрация на svn.ruby-lang.org 11 ноября 2010 г.

    AC_CHECK_TOOL становится AC_CHECK_PROG на

  6. Возможно, это уже давно не работает, и некоторые комментарии 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 в пустую строку.

Интересно узнать, что думают другие об этом анализе.

Связанный контент