
Estoy tratando de compilar Ruby y realmente entiendo lo que sucede mientras lo hago. He usado y escrito Makefiles
antes, pero no autoconf
los configure.in
archivos, por lo que tal vez el resultado que obtengo sea por diseño:
$ 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
Sin embargo, al menos todos estos están 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
Me doy cuenta de que puede haber diferentes causas para cada uno de estos, pero¿Por qué el script no los detecta configure
?
Estoy ejecutando Ubuntu 11.10 con los parches más recientes.
$ 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
Probado en otro 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
¿Qué? ¿Fueron encontrados, pero todavía no van?
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 prueba original: ¿tal vez deba estar en una ruta predeterminada de algún tipo?
configure:15175: checking for daemon
configure:15175: result: no
Resulta que esto no es buscar un ejecutable, sino una función C usandoAC_CHECK_FUNCS.
Respuesta1
No sé casi nada sobre Ruby. Sin embargo, sé bastante sobre sistemas de construcción. Voy a arriesgarme mucho y sugeriréHas encontrado un error auténtico en el sistema de compilación de Ruby..
Aquí está mi razonamiento:
Obtengo el mismo resultado que tú, en sistemas completamente diferentes (incluso Cygwin/Windows 7), tanto con el repositorio de git que especificas como con elfuentes de stock Ruby 1.9
La razón por la que ves
found: /usr/bin/dot
en tuconfigure.log
es porque genuinamente lo encontró en el camino. Esto es fácil de ver en elconfigure
script generado, especialmente si modifica su primera línea para#!/bin/sh -x
obtener el resultado de depuración del 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='
La razón que ve
result: no
es porque, como puede ver el fragmento de arriba,ac_cv_prog_DOT
se configuró como una cadena vacía y las siguientes líneas en configure simplemente reflejan ese valor faltante:+ DOT= + test -n '' + printf '%s\n' 'configure:6438: result: no' + printf '%s\n' no no
La razón por la que se estableció una cadena vacía es (y este es el quid de la cuestión) que
configure.in
especificaba una cadena vacía en la línea 371:AC_CHECK_PROG(DOT, dot) AC_CHECK_PROG(DOXYGEN, doxygen)
Creo que se trata de una invocación errónea de la macro AC_CHECK_PROG, que elDocumentos de GNU Autoconfespecificar tomastresargumentos requeridos, no dos:
― 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.
No hay ningún valor predeterminado. Dejarlo desactivado significa efectivamente "si encuentra un punto, configure el PUNTO como una cadena vacía".
Creo que la razón por la que se cometió este error fue porque la definición original de esa línea usaba una macro diferente,
AC_CHECK_TOOL
que solo requiere dos argumentos.De registrarse en svn.ruby-lang.org el 11 de noviembre de 2010
Es posible que esto se haya solucionado por un tiempo y algunos comentarios de ChangeLog parecen indicar que han estado teniendo problemas con
DOXYGEN
, por ejemplo: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, es posible que todo esto esté mal. Pero estoy bastante seguro de que
configure
se trata de encontrar esas herramientas y se le ha indicado que establezca las variables Makefile correspondientes en una cadena vacía.
Curioso por escuchar lo que otros piensan de este análisis.