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

2

Estou tentando compilar o Ruby e realmente entender o que está acontecendo enquanto o faço. Eu usei e escrevi Makefiles antes, mas não autoconf configure.in arquivos, então talvez o resultado que estou obtendo seja por design:

$ 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 eles 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 um deles, mas por que eles não são detectados pelo script configure ?

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 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 do Funky - Talvez ele precise estar em um caminho padrão de algum tipo?

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

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

    
por l0b0 17.04.2012 / 17:41

1 resposta

1

Eu não sei quase nada sobre Ruby. Eu, no entanto, sei uma quantidade justa sobre a compilação sistemas. Eu vou sair em um membro aqui e sugerir que você encontrou um bug genuíno no sistema de compilação do Ruby .

Aqui está o meu raciocínio:

  1. Eu obtenho o mesmo resultado que você faz, completamente diferente sistemas (mesmo Cygwin / Windows 7), ambos com o reit git você especifica e as fontes estoque Ruby 1.9

  2. O motivo pelo qual você vê found: /usr/bin/dot no seu configure.log é porque realmente encontrou no caminho. isso é fácil de ver no script configure gerado, especialmente se você modificar seu primeira linha para #!/bin/sh -x para obter 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. O motivo pelo qual você vê result: no é porque, como você pode ver snippet acima, ac_cv_prog_DOT foi definido como string vazia e as seguintes linhas 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 que foi definido como string vazia é (e este é o ponto crucial da questão) que configure.in especificou cadeia vazia na linha 371:

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

    Acredito que seja uma invocação de bugs da macro AC_CHECK_PROG, que os documentos GNU Autoconf especific levam três

    ― 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 efetivamente significa "se você encontrar ponto, defina DOT para string vazia"

  5. Eu acredito que a razão pela qual esse erro foi cometido foi porque o definição original para essa linha usou uma macro diferente, AC_CHECK_TOOL , que leva apenas dois argumentos.

    Em como chegar a svn.ruby-lang.org em 11 de novembro de 2010

  6. Épossívelqueissotenhasidoquebradoporumtempo,ealgunsOscomentáriosdoChangeLogparecemindicarqueelesestãotendoproblemacomDOXYGEN,porexemplo:

    FriMar2619:55:412010AkinoriMUSHA<[email protected]>*Makefile.in(DOXYGEN):DefineamissingvariableDOXYGEN.Buildhasbeenfailingwhendoxygen(1)isfoundbyconfigurebutthevariableisnotdefinedbythesystemandmake(1)doesnotallowanemptycommand.("@$(DOXYGEN)" was the cause)
    

Finalmente, é possível que eu tenha tudo errado. Mas tenho certeza que configure está encontrando essas ferramentas, e foi instruído a defina as variáveis Makefile correspondentes para string vazia.

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

    
por 18.04.2012 / 10:49