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:
- + Program jest idealnie dostosowany do Twojego procesora (szybciej działa) i wymagań, przez wyłączenie lub włączenie żądnych funkcji
- + Dostajesz najnowszą wersję programu
- - Kompilacja trwa średnio 15 minut. Może trwać kilka dni (update - słowa te pisałem posiadając jeszcze procesor o taktowaniu 1,4GHz ;) ).
- - Przy nieumiejętnym instalowaniu, możesz sobie zrobić bałagan w systemie
- - Program zainstalowany ze źródeł nie należy do bazy pakietów, używanych przez Twoją dystrybucję (RPM, DEB), więc nie zostanie automatycznie uaktualniony i może zostać nadpisany.
- - Kompilacja zajmuje większość czasu procesora i dużą ilość pamięci RAM, więc spowalnia komputer.
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:
- Nie chce im się czekać dwóch dni (przykładowo), aż ich dystrybucja spaczkuje nową wersję jakiegoś programu
- Program, który chcą zainstalować, jest tak mało popularny, że ich dystrybucja nie posiada pakietów z nim
- Dystrybucja jest tak mała, że nie posiada większości potrzebnych pakietów
- Użytkownik chce zoptymalizować program pod swój procesor lub w inny sposób dostosować źródła/ustawienia kompilacji
- Nie wypada nie umieć ;)
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:

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
Konfiguracja kodu źródłowego
Czym jest konfiguracja? Najprościej mówiąc, jest to procedura, uruchamiana po wpisaniu do konsoli
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
Kompilacją 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:
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:
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.