Por que o script de configuração do Ruby não detecta meus executáveis ​​e arquivos de cabeçalho?

Por que o script de configuração do Ruby não detecta meus executáveis ​​e arquivos de cabeçalho?

Estou tentando compilar Ruby e realmente entender o que está acontecendo ao fazê-lo. Eu usei e escrevi Makefilesantes, mas não autoconfos configure.inarquivos, então talvez o resultado que estou obtendo seja intencional:

$ 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

No entanto, todos estes estão pelo menos instalados:

$ 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

Sei que pode haver causas diferentes para cada uma delas, maspor que eles não são detectados pelo configurescript?

Estou executando o Ubuntu 11.10 com os patches mais recentes.

$ 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

Tentei em outro host. De 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

O que? Eles foram encontrados, mas ainda não foram?

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

Script de teste divertido - Talvez precise estar em algum tipo de caminho padrão?

configure:15175: checking for daemon
configure:15175: result: no

Acontece que isso não está verificando um executável, mas uma função C usandoAC_CHECK_FUNCS.

Responder1

Não sei quase nada sobre Ruby. No entanto, eu sei bastante sobre sistemas de construção. Vou me arriscar aqui e sugerirvocê encontrou um bug genuíno no sistema de compilação Ruby.

Aqui está meu raciocínio:

  1. Obtenho o mesmo resultado que você, em sistemas completamente diferentes (até mesmo Cygwin/Windows 7), ambos com o repositório git que você especifica e oestoque de fontes Ruby 1.9

  2. A razão pela qual você vê found: /usr/bin/dotisso configure.log é porque ele realmente o encontrou no caminho. Isso é fácil de ver no configurescript gerado, especialmente se você modificar sua primeira linha para #!/bin/sh -xobter a saída de depuração do 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='     
    
  3. A razão pela qual você vê result: noé porque, como você pode ver no trecho acima, ac_cv_prog_DOTfoi definido como uma string vazia, e as linhas a seguir no configure simplesmente refletem esse valor ausente:

    + DOT=
    + test -n ''
    + printf '%s\n' 'configure:6438: result: no'
    + printf '%s\n' no
    no
    
  4. O motivo pelo qual foi definido como string vazia é (e este é o cerne da questão) que configure.inespecificou a string vazia na linha 371:

    AC_CHECK_PROG(DOT, dot)
    AC_CHECK_PROG(DOXYGEN, doxygen)
    

    Acredito que seja uma invocação com erros da macro AC_CHECK_PROG, que oDocumentos do GNU Autoconfespecifique levatrêsargumentos obrigatórios, não dois:

    ― 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.
    

    Não há valor padrão. Deixá-lo desativado significa efetivamente "se você encontrar um ponto, defina DOT como uma string vazia"

  5. Acredito que a razão pela qual esse erro foi cometido foi porque a definição original dessa linha usava uma macro diferente, AC_CHECK_TOOLque leva apenas dois argumentos.

    De check-in em svn.ruby-lang.org em 11 de novembro de 2010

    AC_CHECK_TOOL torna-se AC_CHECK_PROG em

  6. É possível que isso tenha sido interrompido por um tempo, e alguns comentários do ChangeLog parecem indicar que eles estão tendo problemas com o DOXYGEN, por exemplo:

    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)
    

Finalmente, é possível que eu tenha entendido tudo errado. Mas tenho certeza de que configureestá encontrando essas ferramentas, e foi instruído a definir as variáveis ​​Makefile correspondentes para uma string vazia.

Curioso para saber o que os outros pensam desta análise.

informação relacionada