2012-04-19 14 views
17

Vari sviluppatori scoraggiano l'utilizzo di PKG_CHECK_MODULES (ad esempio, in this answer) ma non c'è una spiegazione chiara e completa delle loro ragioni per quanto ho cercato. Quindi, chiedo:PKG_CHECK_MODULES considerato dannoso?

  • Perché PKG_CHECK_MODULES essere dannoso?
  • Quali sono le alternative?

Io, per esempio, l'ho usato per la prima volta oggi. Ho trovato invaluably utile, specialmente per trattare con i set di biblioteca piuttosto complicati, come GTK +, dove sono tutte queste dipendenze:

-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

Sebbene le ragioni siano sane dietro l'alternativa a 'pkg-config' che William Pursell di solito propone, la realtà è che ci sono intere piattaforme come GTK che funzionano in modo 'errato' e correggerle richiederebbe tutte quelle librerie per cambiare la directory in cui si installano. Ciò causerebbe una massiccia rottura dei sistemi di compilazione delle applicazioni esistenti. Dal momento che non penso che il modo "sbagliato" causi effettivamente danni, non vale la pena cambiarlo. – ptomato

+1

Inoltre, 'pkg-config' consente di mantenere versioni incompatibili di librerie (come GTK 2 e GTK 3) installate in parallelo. Anche se sono sicuro che William Pursell ci abbia pensato e sarà felice di spiegare come farlo a modo suo ;-) – ptomato

+0

@ptomato No, sono una persona non-gui e non ho mai trattato direttamente con gtk. Ma credo che sia del tutto possibile fare cose come "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) "e queste opzioni possono essere inserite in un config.site. Per essere chiari, non ho obiezioni a pkg-config, ma non mi piace PKG_CHECK_MODULES per i motivi delineati nella mia risposta. –

risposta

19

Per anni, ho usato PKG_CHECK_MODULES e l'ho trovato per essere molto utile. Avevo visto persone lamentarsi del fatto che l'uso di PKG_CHECK_MODULES causava "errori di compilazione sottili" su varie piattaforme, ma non ho mai trovato una ragione particolarmente convincente per smettere di usarlo. Tuttavia, ritengo che sia l'obbligo del maintainer di rispondere ai reclami degli utenti, ove appropriato, quindi è sempre stato un problema problematico. Tuttavia, il mio reclamo principale con PKG_CHECK_MODULES è che causa i guasti dove non dovrebbe. Se un utente installa libfoo in /p/a/t/h e invoca uno script configure con LDFLAGS=-L/p/a/t/h, l'utente è giustificato aspettandosi che la configurazione trovi libfoo. Tuttavia, l'utente deve impostare anche PKG_CONFIG_PATH in modo che lo script configure possa trovare foo.pc in modo che la configurazione abbia esito positivo e che l'IMO sia danneggiato. Sarebbe possibile invocare AC_CHECK_LIB e quindi invocare solo PKG_CHECK_MODULES se la libreria non viene trovata tramite il meccanismo standard per evitare tale problema. Un altro problema è che è completamente possibile per PKG_CHECK_MODULES trovare un file .pc in cui le informazioni siano imprecise, causando il fallimento della compilazione. In tal caso, è necessario invocare AC_CHECK_LIB dopo il PKG_CHECK_MODULES.

In breve, utilizzare PKG_CHECK_MODULES correttamente, è necessario invocare AC_CHECK_LIBS prima, poi condizionatamente invocano PKG_CHECK_MODULES, e quindi richiamare AC_CHECK_LIBS nuovamente per convalidare le informazioni trovate da PKG_CHECK_MODULES. Tutto questo lavoro aggiuntivo da parte del manutentore solo per rendere più facile agli utenti l'installazione delle loro librerie in posizioni non standard è, IMO, assurdo. L'utente deve impostare la propria catena di strumenti per trovare le librerie attraverso i meccanismi standard.

- EDIT -

Per chiarire, non sto suggerendo che un pacchetto che utilizza una libreria che incoraggia l'uso di PKG_CHECK_MODULES dovrebbe evitare di utilizzare nel loro configury. Piuttosto, raccomando che le biblioteche non ne incoraggino l'uso e smettano di distribuire i file .pc. Il problema che si sta tentando di risolvere con i file .pc è meglio indirizzato a un livello superiore. Gli autotools sono non un sistema di gestione dei pacchetti e questo è un problema che dovrebbe essere risolto da uno strumento di gestione dei pacchetti.

+5

Una cosa interessante di .pc è che ti dà i CFLAG di cui ha bisogno la libreria, come -mms-bitfield. Anche le librerie richieste per la compilazione statica, i moduli in conflitto e vari dettagli di runtime, come la posizione per l'installazione dei moduli ecc. Quindi il tuo suggerimento di fare affidamento sul "meccanismo standard" non sembra riguardare questi casi. Non si tratta solo di trovare una lib e un simbolo. Anche se sono d'accordo sul fatto che l'aggiunta di ulteriori controlli del tempo di collegamento potrebbe essere utile in alcuni casi, il che rallenterebbe anche la configurazione del tempo. Basandosi su un min. La correttezza di Sys è simile a fare affidamento su qualche risultato memorizzato nella cache – elmarco

+3

Tutto ciò per dire che il meccanismo standard che proponi non è fattibile, basarsi su un sistema corretto con PKG_CONFIG_LIBDIR renderlo banale per me eseguire una cross-compilazione per vari sistemi senza nessun dolore. – elmarco

+1

@elmarco È possibile utilizzare pkg-config per popolare CFLAGS, CPPFLAGS, LDFLAGS e LIBS senza utilizzare PKG_CHECK_MODULES, in modo da ottenere tutti i vantaggi di pkg-config senza fare affidamento su PKG_CHECK_MODULES. (Vedi il mio commento alla domanda) –

5

C'è un post sul blog qui che entra in un po 'di dettagli sul lato cattivo di PKG_CHECK_MODULES:

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

o questa domanda StackOverflow:

Using the pkg-config macro PKG_CHECK_MODULES failing

Si riduce essenzialmente down to: causa errori molto inutili se qualcuno sta tentando di eseguire autoconf e non ha installato pkg-config. Ecco un esempio di un errore ho ricevuto oggi in esecuzione 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)' 

Per un utente/sviluppatore solo cercando di compilare un pacchetto, questo non urla "è necessario installare pkg-config".

Se (come suggerisce l'articolo) basta chiamare pkg-config direttamente, si ottiene di più utile errori, ad es .:

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 

Altre persone non suggeriscono di usare pkg-config a tutti; questo è un problema separato.

+0

Sono confuso sul motivo per cui avere 'pkg-config' o no influenzerebbe il modo in cui'./Configure', uno script '/ bin/sh', dovrebbe comportarsi. '/ Bin/sh' ha la capacità di interpretare cose come' PKG_CHECK_MODULES' quando pkg-config è installato? –

+0

@ sid-kap È lo stadio 'autoconf' in cui le cose vanno male - se pkg-config non è installato, la macro PKG_CHECK_MODULES non viene espansa (perché quella macro è fornita da pkg-config). autoconf restituisce successo, ma genera uno script di configurazione non valido. Il problema non è tanto che ciò non riesce, ma che l'esecuzione di configure fallisce con un messaggio di errore davvero inutile che non fa pensare all'utente finale "ah, ho bisogno di installare pkg-config e rieseguire autoconf". – JosephH

+0

Normalmente è responsabilità del manutentore eseguire 'auto (re) conf' per generare gli script' configure'. Se pkg-config è necessario, allora dovrebbe essere menzionato nelle istruzioni pre-compilazione (o messo in 'autogen.sh' come controllo). – Rufflewind

Problemi correlati