2012-04-19 14 views
17

Varios desarrolladores desaconsejan el uso del PKG_CHECK_MODULES (por ejemplo, en this answer), pero no hay una explicación clara y exhaustiva de sus motivos hasta donde he buscado. Entonces, pregunto:PKG_CHECK_MODULES considerados dañinos?

  • ¿Por qué PKG_CHECK_MODULES sería perjudicial?
  • ¿Cuáles son las alternativas?

Yo, por ejemplo, lo usé por primera vez en la actualidad. Me pareció inestimable útil, especialmente para tratar con conjuntos de bibliotecas muy intrincados, como GTK +, donde tengo todas estas dependencias:

-I/usr/lib/i386-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 
-I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 
-I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 
-I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 
-I/usr/include/freetype2 -I/usr/include/libpng12 

-lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 
-lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 
-lgthread-2.0 -lrt -lglib-2.0 
+1

Aunque las razones se basan en la alternativa a 'pkg-config' que William Pursell suele proponer, la realidad es que hay plataformas enteras como GTK que funcionan de forma 'incorrecta' y que requeriría todas esas bibliotecas para cambiar el directorio donde se instalan. Esto causaría una rotura masiva de los sistemas de compilación de las aplicaciones existentes. Como no creo que el camino "equivocado" en realidad cause ningún daño, no vale la pena cambiarlo. – ptomato

+1

Además, 'pkg-config' le permite mantener versiones incompatibles de bibliotecas (como GTK 2 y GTK 3) instaladas en paralelo. Aunque estoy seguro de que William Pursell ha pensado en esto y con gusto le explicará cómo hacerlo a su manera ;-) – ptomato

+0

@ptomato No, soy estrictamente una persona sin gui y nunca he tratado directamente con gtk. Pero creo que debería ser completamente posible hacer cosas como "LDFLAGS = -L $ (pkg-config --libs-only-L gtk + -2.0) CPPFLAGS = $ (pkg-config --cflags gtk + -2.0) LIBS = $ (pkg-config --libs-only-l gtk + -2.0) ", y esas opciones se pueden colocar en un config.site. Para que quede claro, no tengo objeciones a pkg-config, pero no me gusta PKG_CHECK_MODULES por las razones que se detallan en mi respuesta. –

Respuesta

19

Durante años, he usado PKG_CHECK_MODULES y nos pareció ser muy útil. Había visto a personas quejarse de que usar PKG_CHECK_MODULES causaba "sutiles errores de construcción" en varias plataformas, pero nunca encontré una razón particularmente convincente para dejar de usarlo. Sin embargo, creo que es responsabilidad del mantenedor responder a las quejas de los usuarios cuando corresponda, por lo que siempre fue un problema problemático. Sin embargo, mi queja principal con PKG_CHECK_MODULES es que causa fallas donde no debería. Si un usuario instala libfoo en /p/a/t/h e invoca un script configure con LDFLAGS=-L/p/a/t/h, se justifica que el usuario espere que configury encuentre libfoo. Pero, el usuario también debe establecer PKG_CONFIG_PATH para que la secuencia de comandos configure pueda encontrar foo.pc para que la configury tenga éxito, y la OMI que está rota. Sería posible invocar AC_CHECK_LIB y solo invocar PKG_CHECK_MODULES si la biblioteca no se encuentra a través del mecanismo estándar para evitar ese problema. Otro problema es que es completamente posible que PKG_CHECK_MODULES encuentre un archivo .pc en el que la información es inexacta, lo que hace que la compilación falle. En ese caso, es necesario invocar AC_CHECK_LIB después de PKG_CHECK_MODULES.

En resumen, para utilizar PKG_CHECK_MODULES correctamente, es necesario invocar AC_CHECK_LIBS primero y luego invoque condicionalmente PKG_CHECK_MODULES, y luego invocar AC_CHECK_LIBS de nuevo para validar la información que se encuentra por PKG_CHECK_MODULES. Todo este trabajo adicional por parte del mantenedor solo para facilitarles a los usuarios la instalación de sus bibliotecas en una ubicación no estándar es, IMO, absurdo. El usuario debe configurar su cadena de herramientas para encontrar bibliotecas a través de los mecanismos estándar.

- EDITAR -

Para aclarar, no estoy sugiriendo que un paquete que utiliza una biblioteca que fomenta el uso de PKG_CHECK_MODULES debe evitar su uso en su configury. Más bien, recomiendo que las bibliotecas no motiven su uso y dejen de distribuir archivos .pc. El problema que está tratando de ser resuelto por los archivos .pc se aborda mejor en un nivel superior. Las autotools son no un sistema de gestión de paquetes, y este es un problema que debe abordarse mediante una herramienta de gestión de paquetes.

+5

Una de las cosas buenas del .pc es que le proporciona los CFLAGS que necesita la biblioteca, como -mms-bitfield. También las librerías necesarias para la compilación estática, los módulos en conflicto y varios detalles de tiempo de ejecución, como la ubicación para la instalación del módulo, etc. Por lo tanto, su sugerencia de confiar "en un mecanismo estándar" no parece cubrir estos casos. No se trata solo de encontrar una lib y un símbolo. Aunque estoy de acuerdo en que añadir más controles de tiempo de enlace podría ser útil en algunos casos, eso también haría que el tiempo de configuración sea más lento. Confiando en un min. de la corrección de sys es similar a confiar en un resultado almacenado en caché – elmarco

+3

Todo eso para decir que volver al mecanismo estándar que propone no es viable, confiar en un sistema correcto con PKG_CONFIG_LIBDIR me hace trivial la compilación cruzada para varios sistemas sin cualquier dolor. – elmarco

+1

@elmarco Puede usar pkg-config para rellenar CFLAGS, CPPFLAGS, LDFLAGS y LIBS sin usar PKG_CHECK_MODULES, para que pueda obtener todos los beneficios de pkg-config sin depender de PKG_CHECK_MODULES. (Vea mi comentario a la pregunta) –

5

Hay una entrada en el blog aquí donde entra en un poco de detalle en el lado malo de PKG_CHECK_MODULES:

http://tirania.org/blog/archive/2012/Oct-20.html

o esta pregunta StackOverflow:

Using the pkg-config macro PKG_CHECK_MODULES failing

En esencia, forúnculos hasta: Causa errores muy inútiles si alguien intenta ejecutar autoconf y no tiene instalado pkg-config. He aquí un ejemplo de un error llegué hoy funcionando autoconf && ./configure:

./configure: line 5283: syntax error near unexpected token `FFMPEG,' 
./configure: line 5283: ` PKG_CHECK_MODULES(FFMPEG, libavutil libavformat libavcodec libswscale, HAVE_FFMPEG=yes)' 

Para un usuario/desarrollador tratando de compilar un paquete, esto no grita "es necesario instalar pkg-config".

Si (como sugiere el artículo) que acaba de llamar pkg-config directamente, se obtienen errores más votos, por ejemplo .:

AC_SUBST(MONO_LIBS) 
AC_SUBST(MONO_CFLAGS) 
if pkg-config --atleast-version=2.10 mono; then 
    MONO_CFLAGS=`pkg-config --cflags mono` 
    MONO_LIBS=`pkg-config --libs mono` 
else 
    AC_MSG_ERROR(Get your mono from www.go-mono.com) 
fi 

Otras personas no sugieren el uso de pkg-config en absoluto; eso es un problema aparte.

+0

No estoy seguro de por qué tener 'pkg-config' o no afectaría a cómo'./Configure', un script '/ bin/sh', debería comportarse. ¿'/ Bin/sh' gana la capacidad de interpretar cosas como' PKG_CHECK_MODULES' cuando pkg-config está instalado? –

+0

@ sid-kap Es la etapa 'autoconf' donde las cosas van mal: si pkg-config no está instalado, la macro PKG_CHECK_MODULES no se expande (porque esa macro la proporciona pkg-config). autoconf devuelve éxito, pero genera un script de configuración no válido. El problema no es tanto que esto falle, sino que la configuración en ejecución falla con un mensaje de error realmente inútil que no hace pensar al usuario final "ah, necesito instalar pkg-config y volver a ejecutar autoconf". – JosephH

+0

Normalmente, es responsabilidad del responsable del mantenimiento ejecutar 'auto (re) conf' para generar los scripts 'configure'. Si pkg-config es necesario, entonces debe mencionarse en las instrucciones previas a la compilación (o ponerlo en 'autogen.sh' como una verificación). – Rufflewind

Cuestiones relacionadas