
Estou tentando compilar Ruby e realmente entender o que está acontecendo ao fazê-lo. Eu usei e escrevi Makefiles
antes, mas não autoconf
os configure.in
arquivos, 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 configure
script?
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:
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
A razão pela qual você vê
found: /usr/bin/dot
issoconfigure.log
é porque ele realmente o encontrou no caminho. Isso é fácil de ver noconfigure
script gerado, especialmente se você modificar sua primeira linha para#!/bin/sh -x
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='
A razão pela qual você vê
result: no
é porque, como você pode ver no trecho acima,ac_cv_prog_DOT
foi 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
O motivo pelo qual foi definido como string vazia é (e este é o cerne da questão) que
configure.in
especificou 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"
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_TOOL
que leva apenas dois argumentos.De check-in em svn.ruby-lang.org em 11 de novembro de 2010
É 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
configure
está 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.