2012-04-19 23 views
17

Różni programiści zniechęcają do korzystania z PKG_CHECK_MODULES (na przykład w this answer), ale nie ma jednoznacznego, wyczerpującego wyjaśnienia ich przyczyn w zakresie, w jakim szukałem. Tak więc, pytam:PKG_CHECK_MODULES za szkodliwe?

  • Dlaczego PKG_CHECK_MODULES byłby szkodliwy?
  • Jakie są alternatywy?

Ja, po raz pierwszy użyłem tego po raz pierwszy dzisiaj. I okazało się, że nieocenioną przydatna, szczególnie dla zbiorów bibliotecznych do czynienia z dość skomplikowanych, takich jak GTK +, gdzie mam wszystkie te zależności:

-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

Chociaż powody są uzasadnione alternatywą dla 'pkg-config', którą zazwyczaj proponuje William Pursell, rzeczywistość jest taka, że ​​istnieją całe platformy, takie jak GTK, które działają" w niewłaściwy "sposób, a ich poprawienie wymagałoby wszystkich tych bibliotek. aby zmienić katalog, w którym się instalują. Spowodowałoby to masowe zerwanie systemów kompilacji istniejących aplikacji. Ponieważ nie uważam, że "niewłaściwy" sposób rzeczywiście wyrządza jakąkolwiek krzywdę, nie warto się zmieniać. – ptomato

+1

Ponadto, 'pkg-config' umożliwia również równoległe instalowanie niekompatybilnych wersji bibliotek (takich jak GTK 2 i GTK 3). Chociaż jestem pewien, że William Pursell pomyślał o tym i z przyjemnością wytłumaczy, jak to zrobić w ten sposób ;-) – ptomato

+0

@ptomato Nie, jestem osobą stricte non-gui i nigdy nie kontaktowałem się bezpośrednio z gtk. Ale uważam, że powinno być całkiem możliwe wykonywanie takich rzeczy jak "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) ", a te opcje można umieścić w config.site. Dla jasności nie mam zastrzeżeń do pkg-config, ale nie lubię PKG_CHECK_MODULES z powodów opisanych w mojej odpowiedzi. –

Odpowiedz

19

Przez wiele lat używałem PKG_CHECK_MODULES i okazał się być bardzo przydatne. Widziałem ludzi narzekających, że używanie PKG_CHECK_MODULES powodowało "subtelne błędy kompilacji" na różnych platformach, ale nigdy nie odkryłem, że jest to szczególnie przekonujący powód, aby przestać go używać. Uważam jednak, że obowiązkiem opiekuna jest reagowanie w razie potrzeby na skargi użytkowników, co zawsze było kłopotliwym problemem. Jednak moja główna skarga z PKG_CHECK_MODULES polega na tym, że powoduje awarie tam, gdzie nie powinny. Jeśli użytkownik zainstaluje libfoo w /p/a/t/h i wywoła skrypt configure z LDFLAGS=-L/p/a/t/h, użytkownik jest uzasadniony oczekiwaniem, że konfiguracja znajdzie libfoo. Ale użytkownik musi również ustawić PKG_CONFIG_PATH, aby skrypt configure mógł znaleźć foo.pc, aby konfiguracja się powiodła, a IMO, który jest uszkodzony. Byłoby możliwe wywołanie AC_CHECK_LIB, a następnie wywołanie tylko PKG_CHECK_MODULES, jeśli biblioteka nie zostanie znaleziona przez standardowy mechanizm, aby uniknąć tego problemu. Inną kwestią jest to, że jest całkowicie możliwe, aby PKG_CHECK_MODULES znalazł plik, w którym informacja jest niedokładna, powodując niepowodzenie kompilacji. W takim przypadku konieczne jest wywołanie AC_CHECK_LIB po PKG_CHECK_MODULES.

W skrócie, aby korzystać PKG_CHECK_MODULES prawidłowo, konieczne jest, aby powołać AC_CHECK_LIBS, potem warunkowo wywołać PKG_CHECK_MODULES, a następnie powołać AC_CHECK_LIBS ponownie, aby potwierdzić informacje znalezione przez PKG_CHECK_MODULES. Cała ta dodatkowa praca opiekuna właśnie po to, by ułatwić użytkownikom instalowanie ich bibliotek w niestandardowej lokalizacji, jest, IMO, absurdem. Użytkownik powinien skonfigurować łańcuch narzędzi, aby znaleźć biblioteki za pomocą standardowych mechanizmów.

- EDIT -

Aby wyjaśnić, ja nie sugeruję, że pakiet, który wykorzystuje bibliotekę, która zachęca do korzystania z PKG_CHECK_MODULES powinny unikać go w swoim configury. Zalecam raczej, aby biblioteki nie zachęcały do ​​korzystania z nich i przestały rozpowszechniać pliki .pc. Problem, który próbują rozwiązać pliki .pc, jest lepiej rozwiązywany na wyższym poziomie. Autotools to , a nie system zarządzania pakietami. Jest to problem, który należy rozwiązać za pomocą narzędzia do zarządzania pakietami.

+5

Zgrabną rzeczą na temat .pc jest to, że daje CFLAGS, czego potrzebuje biblioteka, na przykład -mms-bitfield. Również biblioteki wymagane do kompilacji statycznej, moduły powodujące konflikty oraz różne szczegóły dotyczące czasu wykonywania, takie jak lokalizacja instalacji modułu itp. Zatem twoja sugestia, aby polegać na "na standardowym mechanizmie" nie wydaje się obejmować tych przypadków. Nie chodzi tylko o znalezienie lib i symbolu. Chociaż zgadzam się, że dodanie w niektórych przypadkach dodatkowych sprawdzeń czasu połączenia może być pomocne, co również spowolniłoby nieco czas konfiguracji. Poleganie na min. poprawności sys jest podobna do polegania na jakimś zbuforowanym wyniku. – elmarco

+3

Wszystko, co powiem, że powrót do standardowego mechanizmu, który proponujesz, jest nieopłacalny, poleganie na poprawnym systemie z PKG_CONFIG_LIBDIR sprawia, że ​​trywialne jest dla mnie przekompilowanie dla różnych systemów bez jakikolwiek ból. – elmarco

+1

@elmarco Możesz użyć pkg-config do zapełnienia CFLAGS, CPPFLAGS, LDFLAGS i LIBS bez użycia PKG_CHECK_MODULES, dzięki czemu możesz uzyskać wszystkie zalety pkg-config bez polegania na PKG_CHECK_MODULES. (Zobacz mój komentarz do pytania) –

5

Jest blogu tutaj, że idzie do trochę szczegółów na złej stronie PKG_CHECK_MODULES:

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

lub niniejszego stackoverflow pytania:

Using the pkg-config macro PKG_CHECK_MODULES failing

Zasadniczo sprowadza do: Powoduje bardzo niepomyślne błędy, jeśli ktoś próbuje uruchomić autoconf i nie ma zainstalowanej pkg-config. Oto przykład błędu dostałam dzisiaj uruchomiony 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)' 

użytkownikowi/programista po prostu staramy się skompilować pakiet, nie krzyczeć „trzeba zainstalować pkg-config”.

Jeśli (jak sugeruje artykuł) po prostu zadzwonić pkg-config bezpośrednio, można uzyskać bardziej pomocne błędy, np .:

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 

Inni ludzie nie proponuję w ogóle za pomocą pkg-config; to oddzielny problem.

+0

Nie rozumiem, dlaczego posiadanie 'pkg-config' nie wpłynęłoby na zachowanie'./Configure', skryptu '/ bin/sh'. Czy '/ bin/sh' zyskuje możliwość interpretowania rzeczy takich jak' PKG_CHECK_MODULES' przy instalacji pkg-config? –

+0

@ sid-kap Jest to etap "autoconf", w którym coś pójdzie nie tak - jeśli pkg-config nie jest zainstalowane, makro PKG_CHECK_MODULES nie zostanie rozwinięte (ponieważ to makro jest dostarczane przez pkg-config). autoconf zwraca sukces, ale generuje niepoprawny skrypt configure. Problem nie polega na tym, że to się nie powiedzie, ale to, że działająca konfiguracja kończy się niepowodzeniem z naprawdę niepomyślnym komunikatem o błędzie, który nie powoduje, że użytkownik końcowy myśli "ah, potrzebuję zainstalować pkg-config i ponownie uruchomić autoconf". – JosephH

+0

Zazwyczaj obowiązkiem opiekuna jest uruchomienie 'auto (re) conf' w celu wygenerowania skryptów' configure'. Jeśli pkg-config jest niezbędna, to należy o tym wspomnieć w instrukcjach pre-build (lub wpisać w 'autogen.sh' jako kontrolę). – Rufflewind