Download: CoverStory_configure
Transkrypt
Download: CoverStory_configure
COVER STORY Configure Od kodu źródłowego do produktu finalnego: komunikaty błędów skryptu configure Perfekcyjna konfiguracja Nie ma lepszej okazji do oglądania niezwykłych komunikatów błędów niż kompilacja programu. Znany użytkownikom Linuksa skrypt configure, ma tutaj swój istotny wkład. Czy można w jakiś sposób uniknąć problemów związanych z uruchawww.PhotoCase.de mianiem kompilacji? ANDREA MÜLLER P rędzej czy później każdy użytkownik Linuksa doświadczy sytuacji, gdy nie znajdzie dla swojej dystrybucji gotowej biblioteki, potrzebnej do uruchomienia jakiegoś nowego, wspaniałego programu. Dla weterana Linuksa odpowiedź jest oczywista: należy samodzielnie skompilować kod źródłowy. Niestety, jeśli kompilator jest dla Ciebie wciąż nieznanym terytorium, Twoje wysiłki na pewno będą prowadzić do całej masy tajemniczych komunikatów błędów, a kompilacja zakończy się niepowodzeniem. Potwierdzi to tylko nieusprawiedliwioną opinię wielu osób, że do kompilacji programu w Linuksie niezbędne są umiejętności programistyczne. Oczywiście nie jest to prawdą. Proces kompilacji większości aplikacji jest w znacznej części zautomatyzowany. Czy chcesz więcej wiedzieć o tym procesie i o tym, co dokładnie się dzieje podczas wykonywania kolejnych poleceń: configure, make i make install? W tym artykule przyjrzymy się bliżej komunikatom błę- dów, które można napotkać uruchamiając skrypt configure. Większość błędów można łatwo rozwiązać, o ile posiada się odpowiednią wiedzę. Podstawowe wyposażenie Po pobraniu i rozpakowaniu kodu źródłowego aplikacji musisz rozejrzeć się w katalogu, w którym aplikacja została rozpakowana. Zanim zrobisz cokolwiek innego, przejrzyj najpierw pliki README i INSTALL. Dowiesz się z nich, czy przy kompilacji programu wystarczy ograniczyć się do klasycznych trzech kroków, czy też może któryś z plików należy najpierw poddać Listing 1: Komunikaty błędów związane z brakującymi pakietami programistycznymi Rysunek 1: Kategoria „Development” pakietów z narzędzia SuSE YaST zawiera pakiety potrzebne do uruchamiania kompilacji. 26 Lipiec 2004 www.linux-magazine.pl [andi@diabolos squaroid-0.60.3]./configure [...] checking for GTK – version >= 1.2.0... yes checking for imlib-config... no checking for gdk_imlib... not found configure: error: Cannot find gdk_imlib: I NEED IT! Configure COVER STORY edycji. Wielu programistów wykorzystuje plik INSTALL do informowania użytkowników np. o dodatkowych wymaganiach programu. Pierwsza próba uruchomienia skryptu powłoki ./configure może od razu zakończyć się następującym błędem: checking for gcc... no checking for cc... no checking for cc... no checking for cl... no configure: error: no acceptableU C compiler found in $PATH Skrypt sprawdza, czy wymagane do kompilacji pliki i programy rzeczywiście istnieją. Linie zaczynające się od checking pokazują, co jest sprawdzane. Rezultaty przedstawione są na końcu każdej linii, w tym przypadku jest to niepowodzenie (no). Innymi słowy, skrypt przerywa działanie komunikatem błędu, o ile nie uda mu się znaleźć szukanego programu lub pliku. W naszym przykładzie w systemie nie ma odpowiedniego kompilatora dostępnego w ścieżce dostępu $PATH. Polecenie echo $PATH wyświetla listę katalogów umieszczonych w ścieżce. Rysunek 2: Narzędzie urpmf w dystrybucji Mandrake przeszukuje bazę danych zawierającą listę pakietów należących do dystrybucji. Zmienne są w Linuksie wskazywane przez poprzedzający je znak dolara. Każda dystrybucja ma inny zestaw katalogów w ścieżce powłoki. W naszym przykładzie skrypt nie znalazł kompilatora języka C – aplikacji generującej plik wykonywalny na podstawie programu napisanego w języku programowania C. Linux standardowo wykorzystuje kompilator gcc. Niestety, obecnie wiele dystrybucji nie instaluje domyślnie kompilatora i narzędzi programistycznych. Tabela 1 pokazuje listę pakietów niezbędnych do przygotowania systemu do samodzielnej kompilacji programów. Obej- Tabela 1: Podstawowe pakiety i programy niezbędne do kompilacji programów Pakiet Zawiera gcc Kompilator języka C. gcc-c++ Kompilator języka C++. libstdc++-devel Pliki bibliotek niezbędne do kompilacji programów napisanych w C++. make Program do automatycznej kompilacji kodu źródłowego w oparciu o reguły zapisane w plikach Makefile. binutils Programy służące do manipulacji plikami binarnymi, m.in. narzędzie ar oraz strip (usuwający informacje diagnostyczne z programów i bibliotek). glibc-devel Pliki bibliotek niezbędne do kompilacji programów napisanych w C. gettext and gettext-devel Programy i pliki potrzebne do kompilacji oprogramowania wielojęzycznego. Niektóre dystrybucje nie zawierają pakietu gettext-devel. Wówczas pakiet gettext zawiera wszystkie wymagane pliki. XFree86-devel (libxfree86-devel w niektórych dystrybucjach) Pliki niezbędne do kompilacji programów dla X Window libpng-devel Pliki nagłówkowe i pliki biblioteki odpowiedzialnej za wyświetlanie obrazów w formacie PNG. Prawie każda graficzna aplikacja potrzebuje tej biblioteki. libjpeg-devel Pakiet niezbędny do kompilacji programów korzystających z biblioteki JPEG. zlib-devel Pakiet niezbędny do kompilacji programów korzystających z biblioteki zlib gtk-devel Pakiet niezbędny do kompilacji programów korzystających z biblioteki gtk gtk2-devel Pakiet niezbędny do kompilacji programów korzystających z biblioteki gtk2. Wymagane do kompilacji programów takich jak np. GIMP 2.0. kdelibs-devel (kdelibs3-devel dla KDE 3.x) Pakiet niezbędny do kompilacji programów dla KDE. qt3-devel (libqt3-devel w niektórych dystrybucjach) Biblioteka programistyczna dla QT. Dostarcza ona elementów GUI dla aplikacji GUI, podobnie jak GTK. Wymagana do kompilacji środowiska i aplikacji KDE. Niektóre dystrybucje (np. Debian) wykorzystują do identyfikacji pakietów programistycznych przyrostek dev. muje ona narzędzia, takie jak kompilator czy program make, oraz pakiety programistyczne wymagane do kompilacji aplikacji działających w trybie graficznym. Nie daj się zmylić opisom pakietów dla programistów. Sugerują one, że potrzebujesz ich wyłącznie przy pisaniu swoich własnych programów. To nieprawda – są one konieczne do kompilowania niektórych pakietów ze źródeł. Do zainstalowania pakietów programistycznych wykorzystaj menedżer pakietów Twojej dystrybucji (patrz Rysunek 1). Jeśli posiadasz SuSE Linux w wersji Personal Edition, musisz niestety pobrać większość z nich z serwera FTP SuSE, ponieważ podstawowa wersja SuSE domyślnie nie zawiera wielu pakietów programistycznych. Opisany powyżej podstawowy zestaw narzędzi usunie przyczynę większości komunikatów błędów. Jednak jeśli komunikaty błędów będą się powtarzać, trzeba zabawić się w detektywa. Szukajcie, a znajdziecie Listing 1 pokazuje najczęściej spotykany typ błędów pojawiających się przy uruchamianiu configure. W tym przykładzie skrypt konfiguracyjny informuje o braku gdk_imlib. W linii, w której napisane jest checking for imlib-config... no, zawarta jest informacja o tym, czego szuka configure – w tym przypadku jest to skrypt imlib-config. Musimy najpierw sprawdzić, czy programu tego rzeczywiście nie ma w systemie. Możesz w tym celu wpisać polecenie lo cate imlib-config, by sprawdzić, czy faktycznie brakuje imlib-config. Mogło się tak zdarzyć, że skrypt configure sprawdzał w złych miejscach. Alternatywnie użyj find. Działa ono dużo dłużej, gdyż nie przeszukuje bazy danych. Jeśli poszukiwanie zakończy się niepo- www.linux-magazine.pl Lipiec 2004 27 Configure COVER STORY Listing 2: Program configure nie może znaleźć biblioteki [andi@diabolos ogle-0.9.1]$./configure [...] checking for madvise... yes checking for DVDDiscID in -ldvdread... no checking for DVDOpen in -ldvdread... no configure: error: Need libdvdread, install it or specify it's location nych pakietów. Poszukiwanie pakietów dla programistów w SuSE Personal może nie przynieść efektu, ponieważ nie znajdują się one normalnie na płytach CD. W obu przypadkach najlepiej jest wtedy użyć wyszukiwarek pakietów RPM i DEB pod adresem [1]. Formularze na stronach WWW pomagają w przeszukiwaniu pakietów także pod kątem zawartości indywidualnych plików (patrz Rysunek 3). Użytkownicy Debiana mogą też korzystać z wyszukiwarki pod adresem http://packages.debian.org/. Dobrze ukryte Rysunek 3: Serwis rpmseek.com nie tylko wyszukuje pakiety, ale także przyjmuje nazwy plików jako wzorzec wyszukiwania. wodzeniem, być może plik naprawdę nie istnieje. W tym przypadku musisz go zainstalować. Ale jak znaleźć jeden plik pośród tysięcy pakietów, z których składa się dystrybucja? Narzędzia dostarczane przez dystrybucje Mandrake i SuSE ułatwiają to zadanie. Jeśli posiadasz Mandrake, wpisz urpmf imlib-config. To nakaże menadżerowi pakietów sprawdzić bazę danych i wyświetlić listę pakietów zawierających imlib-config (Rysunek 2). Polecenie urpmf gdk_imlib podpowie nam, że poszukiwane przez nas pliki znajdują się w pakiecie libimlib1-devel. Użytkownicy SuSE mogą natomiast uruchomić program pin. Gdy po raz pierwszy uruchamiasz to narzędzie, poprosi ono o włożenie instalacyjnego medium, z którego skopiuje na Twój dysk opisy pakietów (potrzebne są do tego uprawnienia administratora). Po zakończeniu tego kroku możesz uruchomić polecenie pin imlib-config. Dzięki temu dowiesz się, że plik należy do 28 Lipiec 2004 pakietu o nazwie imlib-devel i że dla wykonania poprawnej kompilacji należy go zainstalować w systemie. Wykonanie tego jest trudniejsze w SuSE Personal lub Red Hat Linux. Red Hat nie zawiera narzędzia służącego do przeszukiwania listy dostępnych, ale nie zainstalowa- Sprawa komplikuje się nieco, jeśli configure nie znajdzie pliku, będącego faktycznie w systemie. Może być to spowodowane tym, że sam skompilowałeś wymaganą bibliotekę lub wykorzystujesz dystrybucję przechowującą pliki w nietypowym katalogu, do którego configure nie zagląda – Listing 2 pokazuje taki przypadek. W tym przykładzie configure nie może odnaleźć biblioteki ldvdread. Ale nie jest to nazwa brakującego pliku – litera l na początku nazwy oznacza lib (biblioteka) i dopiero po dodaniu na końcu do nazwy .so otrzymujemy nazwę pliku brakującej biblioteki: libdvdread.so. Przykładowa biblioteka ldvdread jest częścią pakietu libdvdread. Jeśli skompilowaliśmy ten pakiet samodzielnie i zainstalowaliśmy w katalogu /usr/local/multimedia, to polecenie locate libdvdread.so wyświetli informację, że biblioteka libdvdread.so, obecnie poszukiwana przez configure, rzeczywiście znajduje się w katalogu /usr/local/multimedia/lib. Jednak configure nie znajdzie pliku, ponieważ katalog /usr/local/multimedia nie jest standardowym katalogiem przeznaczo- Rysunek 4: Polecenie ./configure --help wyświetla listę parametrów skryptu konfiguracyjnego. www.linux-magazine.pl Configure COVER STORY SŁOWNICZEK ./: Najczęściej katalog, w którym rozpakowałeś kod źródłowy, nie należy do ścieżki wyszukiwania powłoki. Nie możesz zatem wywołać skryptu configure wpisując tylko jego nazwę. Do nazwy musisz dodać przedrostek./, który wskazuje na katalog bieżący. locate: Program ten przeszukuje bazę danych zawierającą lokalizacje plików na dysku. Baza danych jest tworzona poleceniem updatedb, które w większości dystrybucji jest uruchamiane automatycznie jako codzienne zadanie programu cron. W SuSE Linux kombinacja updatedb/locate jest częścią pakietu findutils-locate. Nie jest on niestety domyślnie instalowany. nym do instalacji oprogramowania. Wykorzystanie tego typu katalogów ma sens, o ile chcesz przetestować aplikację tylko po to, by ją za chwilę usunąć lub w przypadku, gdy nie masz uprawnień do zapisu w całym systemie plików. Przedstawiony na Listingu 2 wynik pracy configure wskazuje rozwiązanie: configure: error: Need libdvdread, install it or specify it's location. Brakująca biblioteka jest już zainstalowana. Pozostaje tylko wskazać configure, gdzie ma dodatkowo szukać tej biblioteki. Wywołanie configure z flagą --help wyświetli listę obsługiwanych parametrów wraz z krótkim objaśnieniem. Do wskazywania określonej lokalizacji wykorzystujemy parametr --prefix. Program configure domyślnie wykorzystuje katalog /usr/local (Rysunek 4). Zatem rozwiązaniem naszego problemu byłoby wywołanie configure w następujący sposób: ./configure -with-dvdread=/usrU /local/multimedia SDL: Simple DirectMedia Layer jest przenośną biblioteką zawierającą funkcje niskopoziomowego dostępu do kart dźwiękowych, urządzeń wejścia, joysticka, kart grafiki 3D oraz innych urządzeń. Flagi kompilatora: Opcje, które informują kompilator, gdzie ma szukać bibliotek i plików nagłówkowych oraz w jaki sposób ma wykonywać kompilację. Bash: Interpreter poleceń (inaczej powłoka), analogiczny do znanego niegdyś „command.com” z MS-DOS. Dystrybucje Linuksa wykorzystują Bash jako standardową powłokę. Istnieją liczne alternatywy Basha, takie jak tcsh (jego składnia przypomi- na C) czy zshell. Pliki nagłówkowe: Pliki (najczęściej z rozszerzeniem .h) opisujące interfejsy biblioteki lub aplikacji. Dostarczają szczegółowych informacji co do sposobu wywoływania określonych funkcji. Programiści chcący wykorzystywać te funkcje muszę włączyć pliki nagłówkowe do kodu źródłowego. Pakiety programistyczne są złożone głównie z plików nagłówkowych potrzebnych do budowy aplikacji. Skrypt powłoki: Plik tekstowy zawierający polecenia sekwencyjnie przetwarzane przez interpreter poleceń (czyli powłokę – w większości dystrybucji Linuksa jest to Bash). Mnóstwo opcji Niektóre skrypty configure dostarczają użytkownikom bardziej precyzyjnych wskazówek odnośnie obsługi komunikatów błędów, np. configure na Listingu 3 szczegółowo informuje, że nie może znaleźć programu sdl-config. W takim wypadku najpierw sprawdź, czy aplikacja jest zainstalowana w systemie, np. w Mandrake aplikacja jest częścią pakietu libSDL1.2-devel. Jeżeli w systemie masz jednak skompilowaną przez siebie wersję sdl-config, configure dostarcza kilku podpowiedzi w liniach zaczynających się od gwiazdek. Tak naRysunek 5: Program pkg-config przetwarza plik prawdę sdl-config jest skryptem gtk+.pc, aby zdobyć wszystkie dane o zainstalowainformującym configure o tym, nej wersji biblioteki GTK. gdzie znajdują się biblioteki SDL stępu PATH. W przypadku, gdy sdl-config oraz wskazującym, jakie flagi kompilatora znajduje się w /usr/local/games/bin, wpronależy przekazać do Makefile. Oczywiście, wadź następującą komendę: żeby configure mógł znaleźć ten skrypt, musi on zostać umieszczony w ścieżce do- Listing 3: Komunikat błędu wraz z zintegrowaną pomocą [andi@diabolos lbreakout2-2.5beta-3]$./configure [...] checking for main in -lpng... yes checking for sdl-config... no checking for SDL – version >= 1.2.0... no *** The sdl-config script installed by SDL could not be found *** If SDL was installed in PREFIX, make sure PREFIX/bin is in *** your path, or set the SDL_CONFIG environment variable to the *** full path to sdl-config. configure: error: lib SDL is needed export PATH=$PATH:/usr/U local/games/bin żeby dodać katalog do bieżącej ścieżki powłoki. Następujące po znaku „=” wyrażenie $PATH pozwala na uniknięcie nadpisania istniejącej już definicji ścieżki. Nowa ścieżka powłoki zostanie utworzona przez złączenie obecnej ścieżki z katalogiem /usr/local/games/bin. Wprowadź powyższą komendę do pliku startowego Basha , .bash_profile znajdującego się w Twoim katalogu domowym /home. Alternatywnie możesz ustawić zmienną środowiskową SDL_CONFIG, ponownie www.linux-magazine.pl Lipiec 2004 29 COVER STORY Configure Listing 4: Komunikat błędu od pkg-config [andi@diabolos gphoto2-2.1.1]$./configure [...] checking for libgphoto2 >= 2.1.1... Package libgphoto2 was not found in the pkg-config search path. Perhaps you should add the directory containing `libgphoto2.pc' to the PKG_CONFIG_PATH environment variable No package 'libgphoto2' found configure: error: Library requirements (libgphoto2 >= 2.1.1) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them. wykorzystując komendę export: export SDL_CONFIG=/usr/localU /games/bin/sdl-config Musisz tutaj również wprowadzić pełną ścieżkę (na Listingu 3: do pliku sdl-config) Zmienne Ostatnio modne jest wykorzystywanie pkg-config do wykonywania zadań zwykłe przypisanych do skryptów konfiguracyjnych specyficznych dla danej biblioteki, takich jak sdl-config. Skrypt pkg-config jest programistycznym narzędziem służącym do wykrywania lokalizacji bibliotek i parametrów bibliotek wymaganych do poprawnej kompilacji programu. Skrypt pkg-config przetwarza tekstowe pliki z rozszerzeniem .pc, które zazwyczaj umieszczone są w katalogu /usr/lib/pkconfig. Dostarczają one informacji, takich jak wersje zainstalowanych bibliotek, ścieżki do plików nagłówkowych i bibliotek (patrz Rysunek 5). W przypadku, gdy samemu skompilowałeś bibliotekę np. libgphoto do obsługi aparatów cyfrowych, pliki zostaną zainstalowane domyślnie w ścieżce /usr/local. Polecenie make install skopiuje libgphoto2.pc do /usr/local/lib/pkgconfig. Jeżeli spróbujesz zbudować aplikację korzystającą z tej biblioteki, ./configure wyświetli błąd przedstawiony na Listingu 4. Na właściwej ścieżce Skrypt configure uważa, że zainstalowana wersja libgphoto2 jest zbyt stara, ponieważ wymagania dotyczące obecności biblioteki libgphoto2 w wersji 2.1.1 lub nowszej nie zostały spełnione. Skrypt nie znalazł libgphoto2.pc w ścieżce poszukiwania pkg-config. Na Listingu 4 configure podpowiada, że możesz użyć zmiennej środowiskowej PKG_CONFIG_PATH do poszerzenia ścieżki wyszukiwania. Sugeruje także, który z katalogów powinien zostać dołączony do ścieżki, tzn. katalog zawierający libgphoto2.pc. Tak jak poprzednio wspomniano, ponow- nie możesz w tym celu użyć polecenia export do zmodyfikowania ścieżki dostępu: export PKG_CONFIG_PATH=/usrU /local/lib/pkgconfig:/usrU /lib/pkgconfig Powyższe polecenie utworzy ścieżkę wyszukiwania pkg-config, wykorzystując katalog /usr/local/lib/pkgconfig i ścieżkę domyślną /usr/lib/pkgconfig. Jest to katalog, w którym znajduje się libgphoto2.pc. Tak naprawdę ta druga ścieżka nie jest konieczna, ponieważ pkg-config, tak czy inaczej, przeszuka swoją ścieżkę domyślną. Jeśli często kompilujesz programy, warto dodać definicję PKG_CONFIG_PATH do Twojego pliku ~/.bash_profile. Wtedy skrypt configure wywołujący pkg-config nie powinien mieć kłopotu ze znalezieniem stosownej wersji libgphoto2 (Rysunek 6). Więcej pomocy Przytoczone przykłady nie obejmują wszystkich błędów configure – szczególnie takich, gdy skrypt nie stosuje odpowiedniej opcji albo autor programu popełnił pomyłkę. Jeśli tego dotyczy Twój problem, to zacznij od analizy pliku config.log, który jest tworzony w katalogu z kodem źródłowym. To miejsce, gdzie configure rejestruje uruchamianie komend i ich rezultaty oraz opisy błędów. W przypadku gdy, to nie pomoże, możesz spróbować wprowadzić komunikat błędu do wyszukiwarki internetowej, takiej jak Google. Istnieją także grupy dyskusyjne dostępne pod adresem [2], zawierające pomocne informacje od innych użytkowników. Możliwe, że ktoś inny miał już podobny problem i że znaleziono już rozwiązanie. Ostatnią deską ratunku jest zwrócenie się do twórcy programu. Jego adres powinien być zawarty w pliku AUTHORS. Pliki BUGS i README często zawierają wymagany przez autora aplikacji sposób opisu problemu – należy się stosować do zawartych tam porad, ponieważ zwiększa to szansę na to, że autor zainteresuje się problemem. ■ INFO [1] Wyszukiwarka pakietów RPM i DEB: http://www.rpmseek.com/ Rysunek 6: Po poprawnym zdefiniowaniu PKG_CONFIG_PATH „pkg-config” może dostarczyć prawidłowe informacje skryptowi configure. 30 Lipiec 2004 www.linux-magazine.pl [2] Wyszukiwarka wiadomości w grupach dyskusyjnych Google: http://groups.google.com/