Poprzednia strona
Spis
Kolejna strona

Kompilacja i instalacja ze źródeł

Wstęp

Kompilacja źródeł... ach, jak to brzmi! Hoppke nawet twierdzi, że laski na to lecą. Bardziej poważnie, jeśli myślisz dodatkowo o optymalizacji pod procesor, zapoznaj się z podlinkowanym artykułem. Jeśli zaś zamierzasz Linuksa tylko używać, nawet nie czytaj dalej.

Poniższy artykuł ma za zadanie wyjaśnić bardzo przystępnie, dogłębnie i owocnie jak skompilować swój pierwszy program.

Trochę teorii

Źródła - program w postaci nieskompilowanej
Kompilacja - tłumaczenie kodu źródłowego wysokiego poziomu, zrozumiałego dla człowieka (np. C++) na kod maszynowy, zrozumiały dla procesora.
C++ - Język programowania wysokiego poziomu
Język wysokiego poziomu (autokod) - typ języka programowania, którego składnia i słowa kluczowe mają maksymalnie ułatwić rozumienie kodu programu dla człowieka, tym samym zwiększając poziom abstrakcji i dystansując się od sprzętowych niuansów. Kod napisany w języku wysokiego poziomu nie jest bezpośrednio "zrozumiały" dla komputera - większość kodu stanowią tak naprawdę normalne słowa, np. w języku angielskim. Aby umożliwić wykonanie programu napisanego w tym języku, należy dokonać kompilacji.

za Wikipedią
Kod maszynowy to postać programu komputerowego (zwana postacią wykonywalną lub binarną) przeznaczona do bezpośredniego lub prawie bezpośredniego wykonania przez procesor, przeznaczona na konkretny typ procesora (i zgodne z nim) wyrażona w postaci kodów rozkazów procesora i ich argumentów, praktycznie nieczytelna dla człowieka.

za Wikipedią

Kompilacja ze źródeł ma swoje plusy i minusy:

Dlaczego użytkownik musi się bawić w kompilowanie czegokolwiek?

Zwykły użytkownik może używać Linuksa i nigdy w życiu niczego nie kompilować. Dla zwykłego użytkownika są repozytoria pakietów RPM/DEB i innych, z których może korzystać bez żadnej wiedzy. Użytkownicy Linuksa decydują się na nauczenie się kompilacji z kilku powodów:

Jeśli nie bardzo interesuje Cię informatyka, możesz sobie odpuścić naukę kompilacji źródeł. W przeciwnym wypadku, prędzej czy później staniesz przed koniecznością kompilacji czegoś. Zanim jednak wpiszesz magiczne make install, przeczytaj na tej stronie wszystko, co się tyczy kompilacji źródeł. W innym przypadku zrobisz bałagan w systemie.

Do dzieła!

Przkład 1., najprostszy

Zdobywanie kodu źródłowego

Skompilujemy taką fajną gierkę o nazwie GL-117. Znajduje się ona na witrynie autora w dziale Download. Przyjrzyjmy się dokładnie, co tam jest napisane:

The Sources & pdf documentation
gl-117-1.3.2-src.tar.bz2 (2.4MB)
gl-117-1.3.1-src.tar.bz2 (2.3MB)
gl-117-1.3-src.tar.bz2 (2.3MB)
Linux
Debian Linux deb
(Cedric Delfosse) via Debian download page
Fedora Core 1+2 rpm
(Richard June)
http://yum.bravegnuworld.com/yum/fc/1/
http://yum.bravegnuworld.com/yum/fc/2/
RedHat 9 rpm
(Richard June)
http://yum.bravegnuworld.com/yum/rh/9/
Yellow Dog 3 rpm
(Richard June)
http://yum.bravegnuworld.com/yum/yd/3/


Jak widać, nieźle to pokomplikowane. Szukamy źródeł. No więc źródła znajdują się w dziale The Sources & pdf documentation. Reszta to pakiety dla wybranych dystrybucji. W ww. dziale mamy 3 pozycje:
gl-117-1.3.2-src.tar.bz2 (2.4MB)
gl-117-1.3.1-src.tar.bz2 (2.3MB)
gl-117-1.3-src.tar.bz2 (2.3MB)


Co wybieramy? Oczywiście najnowszą wersję, czyli gl-117-1.3.2-src.tar.bz2. Przyjrzyjmy się bliżej tej nazwie. Pierwszy człon to nazwa programu gl-117. Następnie mamy numer wersji 1.3.2. Kolejny ciąg znaków src oznacza, że chodzi o źródła (src - source). Dalej mamy rozszerzenie tar.bz2. Jest to archiwum tar, skompresowane do bz2. Zamiast tego może być tar.gz. Po więcej informacji możesz się udać do konsoli man tar, ale nie jest to konieczne w tej chwili.

Po kliknięciu w odnośnik, otworzy się kolejna strona. Możesz z niej wybrać żądany serwer lustrzany (mirror). Następnie rozpocznie się ściąganie pliku.

Po ściągnięciu pliku, należy go rozpakować. Wszystkie "poprawne" strony podają tu tekstowe polecenia, ale ja pokażę, jak to zrobić z środowisku graficznym KDE, w programie Ark. Przecież tak jest wygodniej :-). A więc do dzieła:

Konqueror, prawy przycisk myszy/Rozpakuj/Rozpakuj tutaj

W Konquerorze klikamy prawym przyciskiem na archiwum. Po zainstalowaniu paczki kdeaddons, menu będzie wyglądało tak, jak na obrazku

otwieramy konsolę w rozpakowanym archiwum

Otwieramy konsolę w rozpakowanym archiwum

Konfiguracja kodu źródłowego

Czym jest konfiguracja? Najprościej mówiąc, jest to procedura, uruchamiana po wpisaniu do konsoli

./configure

Czymże jest magiczne ./configure? Aby to zrozumieć, należy sobie uzmysłowić, że w poprzednim punkcie otworzyliśmy konsolę w rozpakowanym archiwum, co oznacza że bieżącym katalogiem konsoli jest gl-117-1.3.2-src. Napisanie w konsoli ./ oznacza bieżący katalog. Wpisanie ./configure oznacza wykonanie z bieżącego katalogu pliku wykonywalnego configure. Jeśli zajrzysz do wspomnianego katalogu gl-117-1.3.2-src, zobaczysz, że znajduje się tam istotnie plik configure. Dla zaspokojenia ciekawości powiem, że nie jest to plik binarny, tylko skrypt. A więc skonfigurujmy wreszcie te źródła:

bash-3.00$ ./configure checking for a BSD-compatible install... /usr/bin/ginstall -c checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for style of include used by make... GNU checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ANSI C... none needed checking dependency style of gcc... gcc3 checking how to run the C preprocessor... gcc -E checking for X... libraries /usr/X11R6/lib, headers /usr/X11R6/include checking for gethostbyname... yes checking for connect... yes checking for remove... yes checking for shmat... yes checking for IceConnectionNumber in -lICE... yes checking for g++... g++ checking whether we are using the GNU C++ compiler... yes checking whether g++ accepts -g... yes checking dependency style of g++... gcc3 checking for gcc... (cached) gcc checking whether we are using the GNU C compiler... (cached) yes checking whether gcc accepts -g... (cached) yes checking for gcc option to accept ANSI C... (cached) none needed checking dependency style of gcc... (cached) gcc3 checking for a BSD-compatible install... /usr/bin/ginstall -c checking whether make sets $(MAKE)... (cached) yes checking whether byte ordering is bigendian... no checking for OpenGL directory... /usr checking for SDL directory... /usr checking for egrep... grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking GL/gl.h usability... yes checking GL/gl.h presence... yes checking for GL/gl.h... yes checking GL/glu.h usability... yes checking GL/glu.h presence... yes checking for GL/glu.h... yes checking GL/glut.h usability... yes checking GL/glut.h presence... yes checking for GL/glut.h... yes checking SDL/SDL.h usability... yes checking SDL/SDL.h presence... yes checking for SDL/SDL.h... yes checking SDL/SDL_mixer.h usability... yes checking SDL/SDL_mixer.h presence... yes checking for SDL/SDL_mixer.h... yes checking for glEnable in -lGL... yes checking for gluPerspective in -lGLU... yes checking for glutMainLoop in -lglut... yes checking for SDL_Init in -lSDL... yes checking for Mix_LoadMUS in -lSDL_mixer... yes configure: creating ./config.status config.status: creating Makefile config.status: creating src/Makefile config.status: creating config.h config.status: config.h is unchanged config.status: executing depfiles commands bash-3.00$

Tak wygląda pomyślnie zakończony proces konfiguracji. Poznać to po tym, że skrypt nie wypisał żadnych błędów.

Tym razem udało się bezproblemowo. Oczywiście nie zawsze tak będzie, ale chodziło tylko o przykład. W kolejnych przykładach będzie już trudniej.

Kontynuujmy jednak kompilację gry GL-117. Po poprawnej konfiguracji źródeł, czas na ich kompilację:

Kompilacja

warning.pngKompilacją nazywamy także cały proces konfiguracji, właściwej kompilacji i instalacji
bash-3.1$ make make all-recursive make[1]: Wejście do katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' Making all in src make[2]: Wejście do katalogu `/home/mk/kompilacja/gl-117-1.3.2-src/src' if g++ -I. -I.. -I. -I. -I.. -DDATADIR='"/usr/local/share"' -Wall -pedantic -g -O2 -I/usr/include -I/usr/include -MT main.o -MD -MP -MF ".deps/main.Tpo" -c -o main.o main.cpp; \ then mv -f ".deps/main.Tpo" ".deps/main.Po"; else rm -f ".deps/main.Tpo"; exit 1; fi menu.h:36: warning: 'class Component' has virtual functions but non-virtual destructor menu.h:67: warning: 'class Container' has virtual functions but non-virtual destructor menu.h:88: warning: 'class Label' has virtual functions but non-virtual destructor menu.h:102: warning: 'class Button' has virtual functions but non-virtual destructor menu.h:113: warning: 'class TextField' has virtual functions but non-virtual destructor menu.h:126: warning: 'class EditKey' has virtual functions but non-virtual destructor menu.h:145: warning: 'class EditJoystick' has virtual functions but non-virtual destructor menu.h:161: warning: 'class EditField' has virtual functions but non-virtual destructor main.cpp:5153: warning: 'void myIdleFunc()' defined but not used if g++ -I. -I.. -I. -I. -I.. -DDATADIR='"/usr/local/share"' -Wall -pedantic -g -O2 -I/usr/include -I/usr/include -MT gl.o -MD -MP -MF ".deps/gl.Tpo" -c -o gl.o gl.cpp; \ then mv -f ".deps/gl.Tpo" ".deps/gl.Po"; else rm -f ".deps/gl.Tpo"; exit 1; fi if g++ -I. -I.. -I. -I. -I.. -DDATADIR='"/usr/local/share"' -Wall -pedantic -g -O2 -I/usr/include -I/usr/include -MT model.o -MD -MP -MF ".deps/model.Tpo" -c -o model.o model.cpp; \ then mv -f ".deps/model.Tpo" ".deps/model.Po"; else rm -f ".deps/model.Tpo"; exit 1; fi [i tak dalej] g++ -g -O2 -I/usr/include -I/usr/include -lm -lGL -lGLU -lglut -o gl-117 main.o gl.o model.o 3ds.o audio.o land.o glland.o aiobject.o effects.o vertexarray.o net.o mathtab.o dirs.o objload.o pilots.o loader_tga.o object.o conf.o mission.o cockpit.o common.o menu.o fileloader.o maploader.o -L/usr/X11R6/lib -L/usr/lib -L/usr/lib -lGL -lGLU -lglut -lSDL -lSDLmain -lSDL_mixer make[2]: Opuszczenie katalogu `/home/mk/kompilacja/gl-117-1.3.2-src/src' make[2]: Wejście do katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' make[2]: Nie ma nic do zrobienia w `all-am'. make[2]: Opuszczenie katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' make[1]: Opuszczenie katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' bash-3.1$

Jeśli proces konfiguracji zakończył się bez błędu, sama kompilacja powinna też przebiec poprawnie. Zwykle tak jest, jednak programy też piszą ludzie i zdarza im się popełnić błąd. Tym razem na szczęście kompilacja przebiegła pomyślnie (również nie widać błędów). Jednak widać ostrzeżenia: menu.h:67: warning: 'class Container' has virtual functions but non-virtual destructor. Nie są to błędy i nie powinniśmy się nimi specjalnie przejmować, o ile program nadal się kompiluje. Teraz czas na instalację programu w systemie:

Instalacja

Jednym z najważniejszych zabezpieczeń Linuksa są uprawnienia. Zwykły użytkownik nie może zapisywać plików nigdzie, poza swoim katalogiem domowym (z kilkoma wyjątkami). Dlatego procesu instalacji nie może przeprowadzić zwykły użytkownik. Musi to zrobić administrator:

bash-3.1$ su Password: [tu podajemy hasło roota] bash-3.1# make install Making install in src make[1]: Wejście do katalogu `/home/mk/kompilacja/gl-117-1.3.2-src/src' make[2]: Wejście do katalogu `/home/mk/kompilacja/gl-117-1.3.2-src/src' test -z "/usr/local/bin" || mkdir -p -- . "/usr/local/bin" /usr/bin/ginstall -c 'gl-117' '/usr/local/bin/gl-117' make[2]: Nie ma nic do zrobienia w `install-data-am'. make[2]: Opuszczenie katalogu `/home/mk/kompilacja/gl-117-1.3.2-src/src' make[1]: Opuszczenie katalogu `/home/mk/kompilacja/gl-117-1.3.2-src/src' make[1]: Wejście do katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' make[2]: Wejście do katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' make[2]: Nie ma nic do zrobienia w `install-exec-am'. test -z "/usr/local/share/gl-117/models" || mkdir -p -- . "/usr/local/share/gl-117/models" /usr/bin/ginstall -c -m 644 'models/aster1.3ds' '/usr/local/share/gl-117/models/aster1.3ds' /usr/bin/ginstall -c -m 644 'models/barrier.3ds' '/usr/local/share/gl-117/models/barrier.3ds' [i tak dalej] make[2]: Opuszczenie katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' make[1]: Opuszczenie katalogu `/home/mk/kompilacja/gl-117-1.3.2-src' bash-3.1#

Jak widać, proces instalacji nie zakończył się błędami, z czego należy wnioskować, że zakończył się powodzeniem ;)

Możesz teraz zamknąć konsolę. Skompilowaną grę można uruchomić poleceniem gl-117. Dodać grę do menu "start" musisz (lub nie) samodzielnie, w zależności od Twojego środowiska graficznego/menedżera okien.

Przykład 2., popularny

W tym przykładzie podarujemy już sobie ściąganie programu. Przejdźmy od razu do konkretów:

bash-3.1$ ./configure checking for a BSD-compatible install... /usr/bin/ginstall -c checking whether build environment is sane... yes [...] checking SDL/SDL.h usability... no checking SDL/SDL.h presence... no checking for SDL/SDL.h... no configure: WARNING: SDL.h not found - no sounds and no joystick available checking SDL/SDL_mixer.h usability... no checking SDL/SDL_mixer.h presence... no checking for SDL/SDL_mixer.h... no configure: WARNING: SDL_mixer.h not found - no advanced sounds available checking for glEnable in -lGL... yes checking for gluPerspective in -lGLU... yes checking for glutMainLoop in -lglut... yes checking for SDL_Init in -lSDL... no configure: WARNING: SDL not found - please install SDL checking for Mix_LoadMUS in -lSDL_mixer... no configure: WARNING: SDL_mixer not found - please install SDL_mixer configure: creating ./config.status config.status: creating Makefile config.status: creating src/Makefile config.status: creating config.h config.status: executing depfiles commands
Biblioteka - Zbiór konstrukcji programistycznych, z których korzystają różne programy. Wyobraź sobie, że piszesz przeglądarkę obrazków z obsługą pokazu slajdów. Pokaz slajdów piszesz własnoręcznie, natomiast do otwierania kilkudziesięciu formatów graficznych używasz gotowych funkcji.

Tym razem mamy szereg błędów z przewijającym się skrótowcem SDL. W pewnym momencie otrzymujemy nawet czystym tekstem SDL not found - please install SDL. SDL to biblioteka, która używana jest przez gry do komunikacji z kartą graficzną, dźwiękową, klawiaturą... jak widać otwarte źródła to wygoda dla programistów, którzy zamiast skupiać się na rzeczach nieistotnych, używają gotowych programów i bibliotek.

Jak rozwiązać problem z kompilacją? Oczywiście instalując SDL. Procedura różni się dla każdej dystrybucji, ale chyba wiesz gdzie masz menedżer pakietów. SDL często jest rozbite na kilka pakietów, takich jak sdl_mixer, sdl_image, sdl_gfx. Rozbicie na pakiety zależy od filozofii przyjętej przez dystrybutora. W przypadku gier najprawdopodobniej i tak potrzebny będzie każdy z pakietów, którego nazwa rozpoczyna się od sdl. W przypadku kompilacji gier możesz potrzebować pakietów z przyrostkiem -devel, gdzie znajdują się pliki nagłówkowe i inne niezbędne rzeczy. Akurat SDL jako biblioteka sama w sobie zwykle nie będzie rozbita na pakiety -devel, ale warto wiedzieć że takie coś istnieje.

Na moim systemie KateOS pakiety nie są aż tak bardzo porozbijane, a wyszukanie tego co potrzebne zajmuje chwilkę. Na szczęście sdl obecne jest prawie wszędzie pod tą nazwą i jego instalacja powinna wyglądać wszędzie na zasadzie apt-get install sdl lub urpmi sdl. U mnie jest tak:

bash-3.1# updateos -i sdl Uruchamianie programu updateos... Wersja: 2.0.3 Tworzenie listy zainstalowanych pakietów... zrobione Sprawdzam zdalne repozytoria... http://www.generic.linuxpl.com/download/kateos/pkg/... OK [1/8] http://kateos.org/download/packages/dist3-community-stable/... OK [2/8] http://kateos.org/download/packages/dist3-community-current/... OK [3/8] http://kateos.org/download/packages/dist3-hilsim-extra/... OK [4/8] http://kateos.org/download/packages/testing3/... OK [5/8] http://kateos.org/download/packages/dist3-community-unstable/... OK [6/8] http://kateos.org/download/packages/distfiles3/... OK [7/8] http://kate.opsat.net/pkg... BŁĄD Poszukiwanie pakietów... Pobieranie z http://kateos.org/download/packages/distfiles3/... sdl: 100% [===================================================>] 486/486 KB (30,2 KB/s) Sprawdzam sumę MD5... OK Instaluję sdl... OK

Po tej operacji etap konfiguracji kończy się bez błędów.

bash-3.1$ ./configure checking for a BSD-compatible install... /usr/bin/ginstall -c checking whether build environment is sane... yes [...] checking SDL/SDL.h usability... yes checking SDL/SDL.h presence... yes checking for SDL/SDL.h... yes checking SDL/SDL_mixer.h usability... yes checking SDL/SDL_mixer.h presence... yes checking for SDL/SDL_mixer.h... yes checking for glEnable in -lGL... yes checking for gluPerspective in -lGLU... yes checking for glutMainLoop in -lglut... yes checking for SDL_Init in -lSDL... yes checking for Mix_LoadMUS in -lSDL_mixer... yes configure: creating ./config.status config.status: creating Makefile config.status: creating src/Makefile config.status: creating config.h config.status: executing depfiles commands

Naturalnie po konfiguracji można przystąpić do dalszych czynności kompilacyjnych.

Przykład 3., ekstremalny

Do stworzenia tego przykładu zainspirował mnie Ubuntu, na którym po instalacji nie ma absolutnie nic a nic przeznaczonego do kompilacji. Zamiast Ubuntu zainstalowałem KateOS z minimalną liczbą pakietów - właściwie tylko środowisko xfce + najniezbędniejsze rzeczy do działania. Żeby było śmieszniej, skompilujemy na tym systemie K3B (dlatego, że nie ma KDE). Docenisz ten przykład, gdy napotkasz na jedną z sytuacji, które musiałem tu rozwiązać, bowiem komunikaty wyświetlane przez ./configure w przypadku braku kompilatorów są może i całkiem jasne, ale nie dają żadnego punktu zaczepienia co właściwie zainstalować.

Zainstalowany z miniiso system po prostu zieje pustką. Nie ma nawet na czym posłuchać muzyki. Przeglądarkę WWW i jakiś emulator terminala musiałem sobie doinstalować, bo ich tam nie było. Nic więc dziwnego, że tym razem rozpakowujemy archiwum tekstowo:

bash-3.1$ tar jxvf /home/mk/Desktop/k3b-1.0.5.tar.bz2

Kolejno wchodzimy do katalogu ze źródłami (znajduje się on w katalogu domowym, nie na pulpicie, gdyż konsola w tym momencie została uruchomiona z katalogu domowego):

bash-3.1$ cd /home/mk/k3b-1.0.5/

Z ciężkim sercem, ale wstukujemy:

bash-3.1$ ./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking target system type... i686-pc-linux-gnu checking for a BSD-compatible install... /usr/bin/ginstall -c checking for -p flag to install... yes checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... no checking for kde-config... not found configure: error: The important program kde-config was not found! Please check whether you installed KDE correctly.

Uff, nie jest tak źle. Brak KDE to akurat najmniejszy kłopot.

Instalujemy KDE (oczywiście wszystko instalujemy z roota, co nie zostanie tu jednak pokazane). Ale zaraz, chwila! Przecież KDE rozbite jest na kilkanaście pakietów (oryginalnie, a w dystrybucjach i na kilkadziesiąt). Jak znaleźć odpowiedni? Ano przez wyszukanie pliku wskazanego przez configure: configure: error: The important program kde-config was not found!. Szukamy:

bash-3.1# updateos -f kde-config Uruchamianie programu updateos... Wersja: 2.0.3 Szukam... kdelibs-3.5.8-i686-1.tgz: * kde-config kdelibs-3.5.9-i686-1.tgz: * kde-config kdevelop-3.5.0-i686-1.tgz: * kde-configure.in.in kdevelop-3.5.1-i686-1.tgz: * kde-configure.in.in

Jak widać, dokładny wynik znajdziemy w kdelibs. Z mojego doświadczenia wiem, że kdelibs to podstawowy pakiet, wraz z kdebase i arts tworzą działające środowisko KDE, więc nie ma tu wątpliwości. Takie informacje można sobie doczytać również w Internecie, choć tym razem nie ma takiej potrzeby.

bash-3.1# updateos -i kdelibs Uruchamianie programu updateos... Wersja: 2.0.3 Tworzenie listy zainstalowanych pakietów... zrobione Sprawdzam zdalne repozytoria... http://kateos.org/download/packages/testing3/... OK [1/2] http://kateos.org/download/packages/distfiles3/... OK [2/2] Poszukiwanie pakietów... Pobieranie z http://kateos.org/download/packages/distfiles3/... kdelibs: 100% [=================================>] 19181/19181 KB (114,5 KB/s) Sprawdzam sumę MD5... OK Instaluję kdelibs... OK Instaluję wymagane pakiety Poszukiwanie pakietów... Pobieranie z http://kateos.org/download/packages/distfiles3/... libmng: 100% [======================================>] 373/373 KB (136,9 KB/s) Sprawdzam sumę MD5... OK Instaluję libmng... OK Pobieranie z http://kateos.org/download/packages/distfiles3/... arts: 100% [======================================>] 1245/1245 KB (135,5 KB/s) Sprawdzam sumę MD5... OK Instaluję arts... OK Pobieranie z http://kateos.org/download/packages/distfiles3/... qtlib: 100% [===================================>] 12016/12016 KB (100,5 KB/s) Sprawdzam sumę MD5... OK Instaluję qtlib... OK Instaluję wymagane pakiety Poszukiwanie pakietów... Pobieranie z http://kateos.org/download/packages/distfiles3/... esound: 100% [=======================================>] 132/132 KB (82,2 KB/s) Sprawdzam sumę MD5... OK Instaluję esound... OK Pobieranie z http://kateos.org/download/packages/distfiles3/... audiofile: 100% [====================================>] 168/168 KB (76,6 KB/s) Sprawdzam sumę MD5... OK Instaluję audiofile... OK Pobieranie z http://kateos.org/download/packages/distfiles3/... oggutils: 100% [====================================>] 625/625 KB (115,9 KB/s) Sprawdzam sumę MD5... OK Instaluję oggutils... OK Pobieranie z http://kateos.org/download/packages/distfiles3/... libmad: 100% [=======================================>] 145/145 KB (34,7 KB/s) Sprawdzam sumę MD5... OK Instaluję libmad... OK Pobieranie z http://kateos.org/download/packages/distfiles3/... libungif: 100% [=====================================>] 130/130 KB (79,4 KB/s) Sprawdzam sumę MD5... OK Instaluję libungif... OK

Jak widać na listingu, zadziałały zależności i wymusiły instalację kilku innych pakietów niezbędnych do działania kdelibs. Jednym z nich jest qtlib, biblioteka graficzna dzięki której KDE w ogóle istnieje. Nie musimy się więc nią kłopotać już później.

Wykonajmy kolejne podejście:

bash-3.1$ ./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking target system type... i686-pc-linux-gnu checking for a BSD-compatible install... /usr/bin/ginstall -c checking for -p flag to install... yes checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... no checking for kde-config... /opt/kde/bin/kde-config checking where to install... /opt/kde3 (as returned by kde-config) checking for style of include used by make... none checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking dependency style of gcc... none checking how to run the C preprocessor... /lib/cpp configure: error: C preprocessor "/lib/cpp" fails sanity check See `config.log' for more details.

A oto najciekawszy problem. Niby brakuje kompilatora, a jednak instalacja wszystkich możliwych w niczym nie pomoże. Połowa plików na dysku ma rozszerzenie cpp, więc wyszukiwarką też nic nie zdziałamy. Należy przyjąć na wiarę, że rozwiązaniem jest instalacja gcc-g++ i kernel-headers. Oczywiście w razie napotkania niestandardowych problemów, pierwszą instancją do której się kierujemy jest wyszukiwarka; mnie się jednak nie udało nigdzie znaleźć notki, że powyższy problem powodowany jest jednocześnie przez brak 2 pakietów. Zwykle powyższy komunikat omija się przez instalację wszystkiego ze stajni gcc, licząc że któryś z tych pakietów będzie zawierał w zależnościach to co trzeba, a po ominięciu feralnego komunikatu nikogo już nie interesuje co właściwie go powodowało.

Rozwiązujemy problem:

bash-3.1# updateos -i gcc-g++ kernel-headers

Ponieważ ten błąd wyjątkowo daje się we znaki nawet doświadczonym użytkownikom, zamieszczam na wszelki wypadek pełen listing pakietów w systemie po instalacji i poprawnym skompilowaniu K3B:

bash-3.1$ ls aaa_base-3.6-i486-1 libpng-1.2.27-i486-3 aaa_etc-3.0-noarch-1 librsvg-2.22.2-i486-1 aalib-1.4rc5-i486-1 libtiff-3.8.2-486-2 alsa-lib-1.0.15-i486-1 libungif-4.1.4-i486-1 alsa-utils-1.0.13-i486-1 libusb-0.1.11-i486-1 arts-1.5.9-i686-1 libutempter-1.1.3-i486-1 atk-1.20.0-i486-1 libxfcegui-4.4.2-i486-1 audiofile-0.2.6-i486-1 libxfcemcs-4.4.2-i486-2 bash-3.1-i486-3 libxfceutil-4.4.2-i486-1 bin-3.0-i486-2 libxml2-2.6.27-i486-1 binutils-2.16.1-i486-1 libxslt-1.1.20-i486-1 bzip2-1.0.5-i486-1 logrotate-3.7.1-i486-3 cairo-1.6.4-i486-1 make-3.81-i486-1 coreutils-6.9-i486-1 module-init-tools-3.2.2-i486-1 cpio-2.5-i486-1 mousepad-0.2.13-i486-2 cracklib-2.8.6-i486-1 ncurses-5.5-i486-2 curl-7.16.3-i486-1 oggutils-1.1.3-i486-2 cxxlibs-6.0.6-i486-1 openldap-client-2.3.38-i486-1 cyrus-sasl-2.1.21-i486-3 openssl-solibs-0.9.8g-i486-1 dbh-1.0.24-i486-1 pam-0.99.3.0-i486-2 dbus-1.0.2-i486-2 pango-1.19.3-i486-1 desktop-file-utils-0.10-i486-1 pciutils-2.2.0-i486-1 device-mapper-1.01.05-i486-1 pcre-6.7-i486-1 devs-2.3.1-noarch-26 perl-5.8.8-i486-1 e2fsprogs-1.40.1-i486-1 pixman-0.10.0-i486-1 esound-0.2.36-i486-4 pkgtools-3.6-i486-14 expat-1.95.8-i486-1 popt-1.7-i486-1 findutils-4.2.30-i486-1 procps-3.2.6-i486-1 firefox-2.0.0.13-i686-1 qtlib-3.3.8-i686-2 flac-1.1.2-i486-1 readline-5.1-i486-2 freeglut-2.4.0-i686-1 reiserfsprogs-3.6.19-i486-1 freetype-2.1.9-i486-1 sdl-1.2.13-i486-1 gamin-0.1.8-i486-2 sed-4.1.5-i486-1 gawk-3.1.5-i486-1 shadow-4.0.14-i486-2 gcc-4.0.2-i486-1 slocate-2.7-i486-1 gcc-g++-4.0.2-i486-1 smartmontools-5.33-i486-1 gettext-0.16.1-i486-5 startup-notification-0.8-i486-1 getty-ps-2.1.1-i486-1 sysfsutils-2.0.0-i486-1 glib2-2.16.3-i486-1 sysklogd-1.4.1-i486-3 glibc-2.5-i486-2 system-repair-3.2-noarch-3 glibc-i18n-2.5-noarch-1 sysvinit-3.6-i486-15 glibc-solibs-2.5-i486-1 taglib-1.4-i486-1 glibc-zoneinfo-2.5-noarch-2 tango-icon-theme-0.8.2-i486-4 gpm-1.20.1-i486-6 tar-1.18-i486-1 grep-2.5.1a-i486-1 tcpip-0.17-i486-18 grub-0.97-i486-21 terminal-0.2.8-i486-1 gtk+2-2.12.9-i486-1 thunar-0.9.0-i486-3 gtk-xfce-engine-2.4.2-i486-4 udev-111-i486-2 gzip-1.3.12-i486-3 usbutils-0.71-i486-1 hal-0.5.7.1-i486-4 util-linux-2.12r-i486-1 hdparm-6.3-486-1 vte-0.16.2-i486-1 hicolor-icon-theme-0.9-noarch-1 xarchiver-0.4.2rc2-i486-3 imagemagick-6.2.7_0-i486-1 xfce-appfinder-4.4.2-i486-1 infozip-5.52-i486-1 xfce-mcs-manager-4.4.2-i486-1 iptables-1.4.0-i486-1 xfce-mcs-plugins-4.4.2-i486-1 isapnptools-1.26-i486-1 xfce-mixer-4.4.2-i486-1 kateos-version-3.6-noarch-1 xfce-panel-4.4.2-i486-1 kbd-1.12-i486-4 xfce-session-4.4.2-i486-1 kdelibs-3.5.9-i686-1 xfce-trigger-launcher-4.3.90.2-i486-2 kernel-2.6.24.7_kateos-i486-3 xfce-utils-4.4.0-i486-1 kernel-headers-2.6.24.7_kateos-noarch-3 xfdesktop-4.4.2-i486-5 kernel-modules-2.6.24.7_kateos-i486-3 xfmedia-0.10.0-i486-2 kernel-sources-2.6.24.7_kateos-noarch-3 xfs-progs-2.7.11-i486-1 less-406-i486-1 xfwm-4.4.2-i486-1 libart_lgpl-2.3.17-i486-1 xfwm-themes-4.4.2-i486-1 libexif-0.6.16-i486-1 xine-lib-1.1.6-i686-1 libexo-0.3.4-i486-1 xorg-7.3-i486-7 libidl-0.8.7-i486-1 xorg-devel-7.3-i486-5 libjpeg-6b-i486-1 xorg-fonts-misc-7.3-i486-4 libmad-0.15.1b-i486-1 xorg-fonts-scale-7.3-i486-4 libmng-1.0.9-i486-1 zlib-1.2.3-i486-1

Posuwamy się dalej w naszym przykładzie:

bash-3.1$ ./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking target system type... i686-pc-linux-gnu checking for a BSD-compatible install... /usr/bin/ginstall -c checking for -p flag to install... yes checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... no checking for kde-config... /opt/kde/bin/kde-config checking where to install... /opt/kde3 (as returned by kde-config) checking for style of include used by make... none checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking dependency style of gcc... none checking how to run the C preprocessor... gcc -E checking for g++... g++ checking whether we are using the GNU C++ compiler... yes checking whether g++ accepts -g... yes checking dependency style of g++... none checking whether gcc is blacklisted... no checking whether g++ supports -Wmissing-format-attribute... yes checking whether gcc supports -Wmissing-format-attribute... yes checking whether g++ supports -Wundef... yes checking whether g++ supports -Wno-long-long... yes checking whether g++ supports -Wno-non-virtual-dtor... yes checking whether g++ supports -fno-reorder-blocks... yes checking whether g++ supports -fno-exceptions... yes checking whether g++ supports -fno-check-new... yes checking whether g++ supports -fno-common... yes checking whether g++ supports -fexceptions... yes checking whether system headers can cope with -O2 -fno-inline... irrelevant checking how to run the C++ preprocessor... g++ -E checking whether g++ supports -O0... yes checking whether g++ supports -Wl,--no-undefined... yes checking whether g++ supports -Wl,--allow-shlib-undefined... yes not using lib directory suffix checking for a sed that does not truncate output... /usr/bin/sed checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ld used by gcc... /usr/i486-kateos-linux/bin/ld checking if the linker (/usr/i486-kateos-linux/bin/ld) is GNU ld... yes checking for /usr/i486-kateos-linux/bin/ld option to reload object files... -r checking for BSD-compatible nm... /usr/bin/nm -B checking whether ln -s works... yes checking how to recognise dependent libraries... pass_all checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking dlfcn.h usability... yes checking dlfcn.h presence... yes checking for dlfcn.h... yes checking for g77... no checking for xlf... no checking for f77... no checking for frt... no checking for pgf77... no checking for cf77... no checking for fort77... no checking for fl32... no checking for af77... no checking for xlf90... no checking for f90... no checking for pgf90... no checking for pghpf... no checking for epcf90... no checking for gfortran... no checking for g95... no checking for xlf95... no checking for f95... no checking for fort... no checking for ifort... no checking for ifc... no checking for efc... no checking for pgf95... no checking for lf95... no checking for ftn... no checking whether we are using the GNU Fortran 77 compiler... no checking whether accepts -g... no checking the maximum length of command line arguments... 32768 checking command to parse /usr/bin/nm -B output from gcc object... ok checking for objdir... .libs checking for ar... ar checking for ranlib... ranlib checking for strip... strip checking if gcc static flag works... yes checking if gcc supports -fno-rtti -fno-exceptions... no checking for gcc option to produce PIC... -fPIC checking if gcc PIC flag -fPIC works... yes checking if gcc supports -c -o file.o... yes checking whether the gcc linker (/usr/i486-kateos-linux/bin/ld) supports shared libraries... yes checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking for shl_load... no checking for shl_load in -ldld... no checking for dlopen... no checking for dlopen in -ldl... yes checking whether a program can dlopen itself... yes checking whether a statically linked program can dlopen itself... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... no configure: creating libtool appending configuration tag "CXX" to libtool checking for ld used by g++... /usr/i486-kateos-linux/bin/ld checking if the linker (/usr/i486-kateos-linux/bin/ld) is GNU ld... yes checking whether the g++ linker (/usr/i486-kateos-linux/bin/ld) supports shared libraries... yes checking for g++ option to produce PIC... -fPIC checking if g++ PIC flag -fPIC works... yes checking if g++ supports -c -o file.o... yes checking whether the g++ linker (/usr/i486-kateos-linux/bin/ld) supports shared libraries... yes checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking for shl_load... (cached) no checking for shl_load in -ldld... (cached) no checking for dlopen... (cached) no checking for dlopen in -ldl... (cached) yes checking whether a program can dlopen itself... (cached) yes checking whether a statically linked program can dlopen itself... (cached) yes appending configuration tag "F77" to libtool checking for msgfmt... msgfmt checking for gmsgfmt... msgfmt found msgfmt program is not GNU msgfmt; ignore it checking for xgettext... : checking for pkg-config... no checking if C++ programs can be compiled... yes checking for strlcat... no checking if strlcat needs custom prototype... yes - in libkdefakes checking for strlcpy... no checking if strlcpy needs custom prototype... yes - in libkdefakes checking for main in -lutil... yes checking for main in -lcompat... no checking for crypt in -lcrypt... yes checking for socklen_t... yes checking for dnet_ntoa in -ldnet... no checking for dnet_ntoa in -ldnet_stub... no checking for inet_ntoa... yes checking for connect... yes checking for remove... yes checking for shmat... yes checking for sys/types.h... (cached) yes checking for stdint.h... (cached) yes checking sys/bitypes.h usability... yes checking sys/bitypes.h presence... yes checking for sys/bitypes.h... yes checking for poll in -lpoll... no checking Carbon/Carbon.h usability... no checking Carbon/Carbon.h presence... no checking for Carbon/Carbon.h... no checking CoreAudio/CoreAudio.h usability... no checking CoreAudio/CoreAudio.h presence... no checking for CoreAudio/CoreAudio.h... no checking if res_init needs -lresolv... yes checking for res_init... yes checking if res_init needs custom prototype... no checking for killpg in -lucb... no checking for int... yes checking size of int... 4 checking for short... yes checking size of short... 2 checking for long... yes checking size of long... 4 checking for char *... yes checking size of char *... 4 checking for dlopen in -ldl... (cached) yes checking for shl_unload in -ldld... no checking for size_t... yes checking size of size_t... 4 checking for unsigned long... yes checking size of unsigned long... 4 checking sizeof size_t == sizeof unsigned long... yes checking for PIE support... yes checking if enabling -pie/fPIE support... yes checking crt_externs.h usability... no checking crt_externs.h presence... no checking for crt_externs.h... no checking for _NSGetEnviron... no checking for vsnprintf... yes checking for snprintf... yes checking for X... configure: error: Can't find X includes. Please check your installation and add the correct paths!

Jak widać kompilator działa poprawnie, ale czego nam też może jeszcze brakować? Przecież X serwer jest zainstalowany! Niby jakim cudem uruchomione jest środowisko graficzne? W komunikacie wyświetlonym przez configure widać jednak wyraźnie, że chodzi o includes, czyli wszelkie pliki nagłówkowe (te znowu mają nazwę headers, jak kernel-headers) i programistyczne. Na szczęście Kasia nie posiada zbyt wielu pakietów i rozwiązanie tego problemu sprowadza się do instalacji pakietu deweloperskiego X serwera:

bash-3.1# updateos -i xorg-devel Uruchamianie programu updateos... Wersja: 2.0.3 Tworzenie listy zainstalowanych pakietów... zrobione Sprawdzam zdalne repozytoria... http://kateos.org/download/packages/testing3/... OK [1/2] http://kateos.org/download/packages/distfiles3/... OK [2/2] Poszukiwanie pakietów... Pobieranie z http://kateos.org/download/packages/testing3/... xorg-devel: 100% [================================>] 1096/1096 KB (135,5 KB/s) Sprawdzam sumę MD5... OK Instaluję xorg-devel... OK Raport: Pomyślnie zainstalowane/zaktualizowane: 1/1

Podchodzimy do konfiguracji ponownie:

bash-3.1# ./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking target system type... i686-pc-linux-gnu [...] checking for kde-config... /opt/kde/bin/kde-config checking where to install... /opt/kde3 (as returned by kde-config) [...] checking for libpng... -lpng -lz -lm checking for libjpeg6b... no checking for libjpeg... -ljpeg checking for perl... /usr/bin/perl checking for Qt... configure: error: Qt (>= Qt 3.2 and < 4.0) (headers and libraries) not found. Please check your installation! For more details about this problem, look at the end of config.log.

A oto jeden z moich "ulubionych" problemów, pakiet niby jest zainstalowany, ale nie jest widziany przez configure (jak wiadomo qtlib zostało zainstalowane wcześniej). W tym przypadku jest to błąd skryptu configure, który choć znalazł KDE w nietypowej lokalizacji checking where to install... /opt/kde3 (as returned by kde-config), nie wpadał na to, że Qt może być w /opt/qt. W Kasi Qt jest właśnie tam umieszczone, co jest podobnoż zgodne ze standardem freedesktop. Musisz wiedzieć, że więszkość programów instalowana jest w /usr i właśnie tam szukają swoich zależności (tak jak zrobiłby K3B, gdyby nie znalazł KDE w innej lokacji. Wydawało mu się również, że Qt też tam musi być). Niektóre programy lubią robić bałagan instalując się do /usr/local, co można oczywiście nadpisać parametrem ./configure --prefix=/usr.

Tu jednak jako żywo widać, że K3B wykrył niestandardową ścieżkę KDE i tam się zamierza zainstalować, nie potrafił jednak znaleźć Qt. Co z tym począć? Normalnie w takich przypadkach należy linkować biblioteki (ln -s) do miejsca, w którym configure spodziewa się je znaleźć, co być może zostanie również kiedyś pokazane na tej stronie. Sprawdza się to w przypadku jednego, dwóch plików, ale nie w przypadku całej dystrybucji Qt. Configure powinno mieć gdzieś możliwość przekazania lokalizacji Qt. Szukamy:

bash-3.1$ ./configure --help `configure' configures this package to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print `checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for `--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/opt/kde3] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, `make install' will install all the files in `/opt/kde3/bin', `/opt/kde3/lib' etc. You can specify an installation prefix other than `/opt/kde3' using `--prefix', for instance `--prefix=$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-fast-perl disable fast Makefile generation (needs perl) --enable-debug=ARG enables debug symbols (yes|no|full) default=no --disable-debug disables debug output and debug symbols default=no --enable-strict compiles with strict compiler options (may not work!) --disable-warnings disables compilation with -Wall and similar --enable-profile creates profiling infos default=no --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-pch enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) default=no --enable-coverage use gcc coverage testing --enable-new-ldflags enable the new linker flags --enable-final build size optimized apps (experimental - needs lots of memory) --enable-closure delay template instantiation --enable-nmcheck enable automatic namespace cleanness check --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=no] --enable-libsuffix /lib directory suffix (64,32,none,auto=default) --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-pie platform supports PIE linking default=detect --enable-embedded link to Qt-embedded, don't use X --enable-qtopia link to Qt-embedded, link to the Qtopia Environment --enable-mac link to Qt/Mac (don't use X) --disable-mt link to non-threaded Qt (deprecated) --disable-threading disables threading even if libpthread found --disable-rpath do not use the rpath feature of ld --disable-path-check don't try to find out, where to install --enable-gcc-hidden-visibility toolchain hidden visibility default=no --enable-ffmpeg-all-codecs Build K3b's ffmeg decoder plugin with all audio codecs enabled (default=disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] --with-extra-includes=DIR adds non standard include paths --with-extra-libs=DIR adds non standard library paths --with-qt-dir=DIR where the root of Qt is installed --with-qt-includes=DIR where the Qt includes are. --with-qt-libraries=DIR where the Qt library is installed. --without-arts build without aRts default=no --with-external-libsamplerate use the libsamplerate provided by the system (default=yes) --with-k3bsetup=ARG do compile K3bSetup2 KControl Module (default=yes) --without-cdrecord-suid-root enable or disable K3b's suid root check for cdrecord/cdrdao/wodim (default=enabled) --without-musicbrainz build K3b without Musicbrainz support (default=no) --with-k3b-debug Enable additional K3b debugging output and functionality (default=no) --without-libdvdread build K3b without libdvdread (Video DVD ripping) support (default=no) --without-resmgr build K3b without ResMgr support (default=no) --without-hal build K3b without HAL support (default=no) --with-alsa enable support for ALSA output [default=check] --without-ffmpeg build K3b without ffmpeg audio decoder support (default=no) --without-flac build K3b without FLAC support (default=no) --without-sndfile build K3b without libsndfile support (default=no) --without-libmad build K3b without libmad support (default=no) --without-musepack build K3b without Musepack audio support (default=no) --without-oggvorbis build K3b without OggVorbis support (default=no) --without-lame build K3b without LAME support (default=no) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L[lib dir] if you have libraries in a nonstandard directory [lib dir] LIBS libraries to pass to the linker, e.g. -l[library] CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I[include dir] if you have headers in a nonstandard directory [include dir] CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags XMKMF Path to xmkmf, Makefile generator for X Window System CCAS assembler compiler command (defaults to CC) CCASFLAGS assembler compiler flags (defaults to CFLAGS) Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations.

Odpowiednia opcja z pomocy została wytłuszczona. Czas zastosować ją w praktyce:

bash-3.1$ ./configure --with-qt-dir=/opt/qt checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking target system type... i686-pc-linux-gnu checking for a BSD-compatible install... /usr/bin/ginstall -c [...] checking for Qt... libraries /opt/qt/lib, headers /opt/qt/include using -mt [...] config.status: creating src/rip/Makefile config.status: creating src/rip/videodvd/Makefile config.status: creating src/sounds/Makefile config.status: creating config.h config.status: executing depfiles commands K3b - Include libdvdread (Video DVD ripping) support: K3b - no K3b - You are missing the libdvdread library. K3b - Resmgr support: no K3b - Compile HAL support no K3b - You are missing the HAL >= 0.5 headers and libraries K3b - or the DBus Qt bindings. K3b - Audioplayer available (alsa) no K3b - FFMpeg decoder plugin (decodes wma and others): K3b - no K3b - You are missing the ffmpeg headers and libraries K3b - version 0.4.9 or higher. K3b - The ffmpeg audio decoding plugin (decodes wma and K3b - others) won't be compiled. K3b - FLAC support: no K3b - You are missing the FLAC++ headers and libraries. K3b - The FLAC decoding plugin won't be compiled. K3b - libsndfile audio decoding support: yes K3b - Mp3 decoding support (libmad): yes K3b - Musepack support: no K3b - You are missing the Musepack headers and libraries >= 1.1. K3b - The Musepack audio decoding plugin won't be compiled. K3b - Ogg Vorbis support: yes K3b - Lame Mp3 encoder plugin no K3b - You are missing the Lame headers and libraries. K3b - The Lame Mp3 encoding plugin won't be compiled. K3b - Audio meta data reading with Taglib: no K3b - You are missing the Taglib headers and libraries. K3b - The mp3 and flac decoder plugins will fall back to K3b - using KMetaFileInfo. K3b - Audio resampling: K3b - using version bundled with K3b K3b - Audioplayer available (aRts) yes K3b - Compile K3bSetup 2: yes K3b - Tag guessing using MusicBrainz no K3b - You are missing the musicbrainz headers and libraries. K3b - K3b will be compiled without support for tag guessing. Good - your configure finished. Start make now

Hurra! Naturalnie brakuje nam jeszcze połowy rzeczy, ale nie są one krytycznie potrzebne do dalszej kompilacji. Jednak jeśli w tej chwili ich nie zainstalujesz, późniejsza ich instalacja celem użycia w K3B wymusza jego rekompilację.

Posłuchajmy skryptu i wpiszmy magiczne make:

bash-3.1$ make bash: make: command not found

Ha ha! No pewnie, a niby czemu miałoby tu być? ;) W końcu make to osobny program (w przeciwieństwie do skryptu ./configure, który znajduje się już w źródłach i jest uruchamiany przez basha, który znowu jest wymagany w ogóle do działania systemu).

Rozwiązanie tego nie będzie na szczęście zbyt skompilowane:

bash-3.1# updateos -i make Uruchamianie programu updateos... Wersja: 2.0.3 Tworzenie listy zainstalowanych pakietów... zrobione Sprawdzam zdalne repozytoria... http://kateos.org/download/packages/testing3/... OK [1/2] http://kateos.org/download/packages/distfiles3/... OK [2/2] Poszukiwanie pakietów... Pobieranie z http://kateos.org/download/packages/distfiles3/... make: 100% [========================================>] 481/481 KB (136,2 KB/s) Sprawdzam sumę MD5... OK Instaluję make... OK Raport: Pomyślnie zainstalowane/zaktualizowane: 1/1

No to czadu:

bash-3.1$ make make all-recursive make[1]: Wejście do katalogu `/home/mk/k3b-1.0.5' Making all in doc make[2]: Wejście do katalogu `/home/mk/k3b-1.0.5/doc' /opt/kde3/bin/meinproc --check --cache index.cache.bz2 ./index.docbook /opt/kde3/bin/meinproc: error while loading shared libraries: libxslt.so.1: cannot open shared object file: No such file or directory make[2]: *** [index.cache.bz2] Błąd 127 make[2]: Opuszczenie katalogu `/home/mk/k3b-1.0.5/doc' make[1]: *** [all-recursive] Błąd 1 make[1]: Opuszczenie katalogu `/home/mk/k3b-1.0.5' make: *** [all] Błąd 2

Auć. To nie powinno było się zdarzyć! (tm). W końcu configure służy do wykrywania takich rzeczy. Po wyszukaniu pliku libxslt.so.1 w bazie pakietów dochodzimy do wielce odkrywczego wniosku, że zainstalować należy:

bash-3.1# updateos -i libxslt Uruchamianie programu updateos... Wersja: 2.0.3 Tworzenie listy zainstalowanych pakietów... zrobione Sprawdzam zdalne repozytoria... http://kateos.org/download/packages/testing3/... OK [1/2] http://kateos.org/download/packages/distfiles3/... OK [2/2] Poszukiwanie pakietów... Pobieranie z http://kateos.org/download/packages/distfiles3/... libxslt: 100% [=====================================>] 616/616 KB (135,5 KB/s) Sprawdzam sumę MD5... OK Instaluję libxslt... OK Raport: Pomyślnie zainstalowane/zaktualizowane: 1/1

Oby to była ostatnia niespodzianka dzisiaj:

bash-3.1$ make make all-recursive make[1]: Wejście do katalogu `/home/mk/k3b-1.0.5' Making all in doc make[2]: Wejście do katalogu `/home/mk/k3b-1.0.5/doc' /opt/kde3/bin/meinproc --check --cache index.cache.bz2 ./index.docbook make[2]: Opuszczenie katalogu `/home/mk/k3b-1.0.5/doc' Making all in libk3bdevice make[2]: Wejście do katalogu `/home/mk/k3b-1.0.5/libk3bdevice' /bin/sh ../libtool --silent --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -I./libk3bdevice -I. -I/opt/kde3/include -I/opt/qt/include -I. -I/usr/include/hal -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -DQT_THREAD_SUPPORT -D_REENTRANT -Wno-long-long -Wundef -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -O2 -Wformat-security -Wmissing-format-attribute -Wno-non-virtual-dtor -fno-exceptions -fno-check-new -fno-common -fpermissive -MT k3bdevice.lo -MD -MP -MF .deps/k3bdevice.Tpo -c -o k3bdevice.lo k3bdevice.cpp kilkanaście minut później mv -f .deps/base_k3bsetup2.Tpo .deps/base_k3bsetup2.Plo /bin/sh ../libtool --silent --tag=CXX --mode=link g++ -Wno-long-long -Wundef -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -O2 -Wformat-security -Wmissing-format-attribute -Wno-non-virtual-dtor -fno-exceptions -fno-check-new -fno-common -module -avoid-version -L/opt/kde3/lib -L/opt/qt/lib -no-undefined -o kcm_k3bsetup2.la -rpath /opt/kde3/lib/kde3 k3bsetup2.lo base_k3bsetup2.lo -lkdeui ../libk3b/libk3b.la -lm -L/opt/kde3/lib -L/opt/qt/lib make[2]: Opuszczenie katalogu `/home/mk/k3b-1.0.5/k3bsetup' make[2]: Wejście do katalogu `/home/mk/k3b-1.0.5' make[2]: Opuszczenie katalogu `/home/mk/k3b-1.0.5' make[1]: Opuszczenie katalogu `/home/mk/k3b-1.0.5'

No nareszcie! Można instalować:

bash-3.1$ su Password: bash-3.1# make install Making install in doc make[1]: Wejście do katalogu `/home/mk/k3b-1.0.5/doc' make[2]: Wejście do katalogu `/home/mk/k3b-1.0.5/doc' make[2]: Nie ma nic do zrobienia w `install-exec-am'. /bin/sh ../admin/mkinstalldirs /opt/kde3/share/doc/HTML/en/k3b mkdir -p -- /opt/kde3/share/doc/HTML/en/k3b /usr/bin/ginstall -c -p -m 644 commands.docbook /opt/kde3/share/doc/HTML/en/k3b/commands.docbook chwilę potem PATH="$PATH:/sbin" ldconfig -n /opt/kde3/lib/kde3 test -z "/opt/kde3/share/applnk/Settings/System" || /usr/bin/mkdir -p "/opt/kde3/share/applnk/Settings/System" /usr/bin/ginstall -c -p -m 644 'k3bsetup2.desktop' '/opt/kde3/share/applnk/Settings/System/k3bsetup2.desktop' make[2]: Opuszczenie katalogu `/home/mk/k3b-1.0.5/k3bsetup' make[1]: Opuszczenie katalogu `/home/mk/k3b-1.0.5/k3bsetup' make[1]: Wejście do katalogu `/home/mk/k3b-1.0.5' make[2]: Wejście do katalogu `/home/mk/k3b-1.0.5' make[2]: Nie ma nic do zrobienia w `install-exec-am'. make[2]: Nie ma nic do zrobienia w `install-data-am'. make[2]: Opuszczenie katalogu `/home/mk/k3b-1.0.5' make[1]: Opuszczenie katalogu `/home/mk/k3b-1.0.5'

Aby zobaczyć efekt naszych dokonań należy z powrotem przelogować się na użytkownika (pamiętamy, uruchamianie programów graficznych z roota tylko w ostateczności):

bash-3.1# whoami root bash-3.1# exit exit bash-3.1$ whoami mk bash-3.1$ k3b bash: k3b: command not found

No i tym razem znowu nie obyło się bez niespodzianek ;). Zawiniła dystrybucja, która nie posiada /opt/kde w zmiennej $PATH (/usr się w niej znajduje). No cóż, wpiszmy zatem ścieżkę ręcznie:

bash-3.1$ /opt/kde/bin/k3b kbuildsycoca running... [...] ------------------------------ Blockdevice: /dev/hda Generic device: Vendor: LITE-ON Description: DVDRW SHW-1635S Version: YS0Z Write speed: 3324 Profiles: DVD-ROM, DVD-R Sequential, DVD-R Dual Layer Sequential, DVD-R Dual Layer Jump, DVD-RW Restricted Overwrite, DVD-RW Sequential, DVD+RW, DVD+R, DVD+R Dual Layer, CD-ROM, CD-R, CD-RW Read Cap: DVD-ROM, DVD-R, DVD-R Sequential, DVD-R Dual Layer, DVD-R Dual Layer Sequential, DVD-R Dual Layer Jump, DVD-RW, DVD-RW Restricted Overwrite, DVD-RW Sequential, DVD+RW, DVD+R, DVD+RW Dual Layer, DVD+R Dual Layer, CD-ROM, CD-R, CD-RW Write Cap: DVD-R, DVD-R Sequential, DVD-R Dual Layer, DVD-R Dual Layer Jump, DVD-RW, DVD-RW Restricted Overwrite, DVD-RW Sequential, DVD+RW, DVD+R, DVD+R Dual Layer, CD-R, CD-RW Writing modes: SAO, TAO, RAW, SAO/R96P, SAO/R96R, RAW/R16, RAW/R96P, RAW/R96R, Restricted Overwrite, Layer Jump Reader aliases: /dev/hda ------------------------------ Blockdevice: /dev/sr0 Generic device: /dev/sg1 Vendor: PIONEER Description: DVD-RW DVR-212 Version: 1.28 Write speed: 24930 Profiles: DVD-ROM, DVD-R Sequential, DVD-R Dual Layer Sequential, DVD-R Dual Layer Jump, DVD-RAM, DVD-RW Restricted Overwrite, DVD-RW Sequential, DVD+RW, DVD+R, DVD+R Dual Layer, CD-ROM, CD-R, CD-RW Read Cap: DVD-ROM, DVD-R, DVD-R Sequential, DVD-R Dual Layer, DVD-R Dual Layer Sequential, DVD-R Dual Layer Jump, DVD-RW, DVD-RW Restricted Overwrite, DVD-RW Sequential, DVD+RW, DVD+R, DVD+RW Dual Layer, DVD+R Dual Layer, CD-ROM, CD-R, CD-RW Write Cap: DVD-R, DVD-R Sequential, DVD-R Dual Layer, DVD-R Dual Layer Sequential, DVD-R Dual Layer Jump, DVD-RW, DVD-RW Restricted Overwrite, DVD-RW Sequential, DVD+RW, DVD+R, DVD+R Dual Layer, CD-R, CD-RW Writing modes: SAO, TAO, RAW, SAO/R96P, SAO/R96R, RAW/R16, RAW/R96P, RAW/R96R, Restricted Overwrite, Layer Jump Reader aliases: /dev/sr0 [...] Mamy 2 nagrywarki k3b: (K3bCore) System problems: k3b: CRITICAL k3b: PROBLEM: Unable to find cdrecord executable k3b: DETAILS: K3b uses cdrecord to actually write CDs. k3b: SOLUTION: Install the cdrtools package which contains cdrecord. k3b: k3b: CRITICAL k3b: PROBLEM: Unable to find cdrdao executable k3b: DETAILS: K3b uses cdrdao to actually write CDs. k3b: SOLUTION: Install the cdrdao package. k3b: k3b: CRITICAL k3b: PROBLEM: Unable to find growisofs executable k3b: DETAILS: K3b uses growisofs to actually write dvds. Without growisofs you will not be able to write dvds. Make sure to install at least version 5.10. k3b: SOLUTION: Install the dvd+rw-tools package. k3b: k3b: CRITICAL k3b: PROBLEM: Unable to find dvd+rw-format executable k3b: DETAILS: K3b uses dvd+rw-format to format DVD-RWs and DVD+RWs. k3b: SOLUTION: Install the dvd+rw-tools package. I zero programów do nagrywania.

Naturalnie musimy je doinstalować podobnie jak zależności. Ale K3B działa. I marudzi:

K3B marudzi o swoje programy do nagrywania

Jeśli potrzebujesz spolszczenia, musisz je doinstalować na podobnej zasadzie. Zdradzę od razu, że potrzebny będzie gettext.

Make bajzel

Tudzież make burdel, jak niektórzy mówią. Użycie make install na źródłach spowoduje przykopiowanie skompilowanych binariów i innych plików wraz z nadaniem odpowiednich uprawnień do drzewa systemu plików. Jak można usunąć później taki program? Wszak jego pliki są porozrzucane po wielu katalogach, a menedżer pakietów nie posiada informacji o nim. Otóż wraz ze skryptem instalacyjnym w źródłach powinien być także skrypt deinstalacyjny, który uruchamiamy poleceniem:

bash-3.1# make uninstall

Nie wszystkie programy jednak udostępniają taki skrypt, a już całkiem spora liczba nie posiada nawet skryptu instalacyjnego. Poza tym trzymanie na dysku rozpakowanych i skompilowanych źródeł celem odinstalowania czegoś w przyszłości jest bardzo nieekonomiczne. Istnieje kilka rozwiązań tego problemu.

Checkinstall

Checkinstall to najprostsze z rozwiązań i jednocześnie dosyć dobre dla przeciętnego użytkownika. Cały trick polega na zastąpieniu polecenia make install poleceniem checkinstall. Checkinstall to odrębny program monitorujący proces instalacji i tworzący pakiet właściwy danej dystrybucji. Domyślnie polecenie checkinstall także zainstaluje kompilowany program, który będzie od tego momentu widoczny w bazie pakietów dystrybucji. Nie wszystkie dystrybucje jednak są skonfigurowane do działania z checkinstall, więc stworzenie odpowiedniego pakietu może wymagać przeczytania man checkinstall.

Pakiet dla dystrybucji

Stworzenie pakietu dedykowanego dla swojej dystrybucji ze wszystkimi dodatkami (skrypty przed instalacją, po instalacji, przy usuwaniu, opisy pakietu w różnych językach, skrypt budujący, itd.) może być źródłem satysfakcji, nie tylko z racji dokształcenia się, ale przede wszystkim z możliwości udostępnienia swojej pracy innym. Jest to jednak trudne i mozolne zadanie, przynajmniej za pierwszym razem. Przy aktualizacjach programu będzie można skorzytać bowiem z istniejącego już skryptu budującego (tzw. build) do szybkiego zbudowania nowszego pakietu. Szczegółowych informacji należy szukać w dokumentacji swojej dystrybucji.

Poprzednia strona
Spis
Kolejna strona
hacker emblem

© Marcin Kocur (marcin2006 AT gmail COM), licencja: Creative Commons 3.0 Uznanie autorstwa-Użycie niekomercyjne-Na tych samych warunkach

Valid HTML 4.01 StrictPoprawny CSS!