¿Por qué el script de configuración de Ruby no detecta mis ejecutables y archivos de encabezado?

¿Por qué el script de configuración de Ruby no detecta mis ejecutables y archivos de encabezado?

Estoy tratando de compilar Ruby y realmente entiendo lo que sucede mientras lo hago. He usado y escrito Makefilesantes, pero no autoconflos configure.inarchivos, 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:

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

  2. La razón por la que ves found: /usr/bin/doten tu configure.log es porque genuinamente lo encontró en el camino. Esto es fácil de ver en el configurescript generado, especialmente si modifica su primera línea para #!/bin/sh -xobtener 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='     
    
  3. La razón que ve result: noes porque, como puede ver el fragmento de arriba, ac_cv_prog_DOTse 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
    
  4. La razón por la que se estableció una cadena vacía es (y este es el quid de la cuestión) que configure.inespecificaba 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".

  5. 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_TOOLque solo requiere dos argumentos.

    De registrarse en svn.ruby-lang.org el 11 de noviembre de 2010

    AC_CHECK_TOOL se convierte en AC_CHECK_PROG el

  6. 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 configurese 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.

información relacionada