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/

Podobne dokumenty