Kompilacja programów źródłowych - autoconf
: 25 grudnia 2008, 23:06
Czasami nie sposób uświadczyć jakiegoś programu w repozytorium i jedynym sposobem posiadania programu jest jego kompilacja ze źródeł. Początkującym może nastręczyć wielu problemów.
Opis ten sporządziłem korzystając ze źródeł odtwarzacza Audacious.
KILKA WA¯NYCH RZECZY
Czasami przeczytamy gdzieś, że brakuje nam pakietu GTK w takiej, a takiej wersji, albo
narzędzia Quanty wersja 3. Szukamy i szukamy, a w repozytorium nie ma czegoś takiego jak np. GTK+2.10.
Jak to znaleźć? Otóż w wypadku programów takich jak amarok, czy inny mplayer znajdziemy je bez problemów po nazwie, ponieważ są to programy użytkowe. Nazwy GTK czy QT odnoszą się do bibliotek, które spełniają różne funkcje. Nie wywołuje się ich jawnie przez ,,dwuklik''. Ich nazwy zaczynają się od prefiksu lib. Jeśli nie jesteśmy pewni jak zabrać się za dany pakiet, najlepiej jego nazwę wrzucić w Google lub skorzystać z poleceniaPo czasie nauczymy się.
Podstawowe narzędzia do budowania programów ze źródeł to:
Pisząc ten opis zakładam, że pliki nagłówkowe jądra są już zainstalowane w systemie.
Pakiety w Debianie możemy (z grubsza) podzielić na trzy części:
Przykładem pakietu data będzie k3b-data. Jego zainstalowanie dostarcza pewnych danych, jak ikony, skróty do menu, dźwięki. Pakietem danych będzie również k3b-i18n dostarczający obsługę innego języka niż angielski.
Pakiet development nie dostarcza nic, z czego może skorzystać zwykły śmiertelnik. Ani tego uruchomić, ani posłuchać. Przydaje się za to, gdy potrzebujemy dostępu do źródła programu. Wtyczki (pluginy) np. do k3b będą potrzebować pakietu k3b-dev, który dostarczy im niezbędnych plików .c i .h.
Po tym krótkim wprowadzeniu przechodzimy do praktyki. Pobieramy źródła interesującego nas programu z oficjalnej strony np. niech to będzie program audacious:
Możemy to też pobrać z poziomu przeglądarki - w tym momencie ważne jest gdzie ściągają się źródła. Najczęściej będzie to katalog ~, w przypadku Firefoksa, Iceweasela będzie to ~/Desktop, przy czym ~ (tylda) oznacza katalog domowy użytkownika:
Rozpakowujemy pobrany plik
Tutaj jest wiele szkół. Niektóre mówią o przepuszczeniu pliku przez gunzip, następnie przez tar. Dzisiejszy tar sam załatwia sprawię ,,drugiego kompresora''.
Po chwili myślenia kursor przechodzi do nowej linii, a archiwum jest rozpakowane. Jeśli interesuje nas co się dzieje w trakcie rozpakowywania, wydajemy polecenie: lub
UWAGA: nie zawsze rozpakowanie mojearchiwum.tar.gz utworzy nam katalog mojearchiwum, dlatego przechodzimy do następnego punktu i sprawdzamy co nam się rozpakowało:
Jak widać w tym wypadku nazwa katalogu pokrywa się z nazwą archiwum.
Wchodzimy do nowo utworzonego katalogu i patrzymy co tam ciekawego:
Zapoznajemy się z plikami README i INSTALL. Mało kto to robi, a prawda jest taka, że znajdziemy tam odpowiedzi na 99% pytań odnośnie kompilacji.
Na przykład:
Glib jest w wymaganej wersji.
GTK też.libmowgli jest, ale brakuje pakietu development. Nie sugerujemy się tym co jest w opisie pakietu.
Sprawdzamy więc czy w ogóle w repozytorium jest dostępny pakiet rozwojowy dla libmowgli.
Jest, a więc instalujemy go.
Jedziemy dalej.
Znowu niezainstalowany pakiet rozwojowy - przeszukamy repozytorium:
Instalacja
Gnu make to po prostu make.
Skoro mamy już wszystko, co sugeruje nam informacja zawarta w pliku README, możemy przystąpić do kolejnego kroku jakim jest - KonfiguracjaTak wygląda poprawnie zakończona konfiguracja.
Czas teraz na Make:
Po drodze mogą trafić się komunikaty
Część ostatnia to oczywiście instalacja:
Co robić jeśli coś pójdzie nie tak?
Jeśli nie posiadamy na przykład pakietu libmowgli-dev, konfiguracja przebiega tak:
Podobnie sprawa ma się przy innej kompilacji
Opis ten sporządziłem korzystając ze źródeł odtwarzacza Audacious.
KILKA WA¯NYCH RZECZY
Czasami przeczytamy gdzieś, że brakuje nam pakietu GTK w takiej, a takiej wersji, albo
narzędzia Quanty wersja 3. Szukamy i szukamy, a w repozytorium nie ma czegoś takiego jak np. GTK+2.10.
Jak to znaleźć? Otóż w wypadku programów takich jak amarok, czy inny mplayer znajdziemy je bez problemów po nazwie, ponieważ są to programy użytkowe. Nazwy GTK czy QT odnoszą się do bibliotek, które spełniają różne funkcje. Nie wywołuje się ich jawnie przez ,,dwuklik''. Ich nazwy zaczynają się od prefiksu lib. Jeśli nie jesteśmy pewni jak zabrać się za dany pakiet, najlepiej jego nazwę wrzucić w Google lub skorzystać z polecenia
Kod: Zaznacz cały
apt-cache search szukana_nazwa
Podstawowe narzędzia do budowania programów ze źródeł to:
- gcc
make
Kod: Zaznacz cały
apt-get install linux-headers-$(uname -r)
Pakiety w Debianie możemy (z grubsza) podzielić na trzy części:
- runtime (uruchomieniowe),
data (dodatkowych danych),
development (rozwojowe).
Przykładem pakietu data będzie k3b-data. Jego zainstalowanie dostarcza pewnych danych, jak ikony, skróty do menu, dźwięki. Pakietem danych będzie również k3b-i18n dostarczający obsługę innego języka niż angielski.
Pakiet development nie dostarcza nic, z czego może skorzystać zwykły śmiertelnik. Ani tego uruchomić, ani posłuchać. Przydaje się za to, gdy potrzebujemy dostępu do źródła programu. Wtyczki (pluginy) np. do k3b będą potrzebować pakietu k3b-dev, który dostarczy im niezbędnych plików .c i .h.
Po tym krótkim wprowadzeniu przechodzimy do praktyki. Pobieramy źródła interesującego nas programu z oficjalnej strony np. niech to będzie program audacious:
Kod: Zaznacz cały
lis6502@Nexus:~$ wget [url]http://distfiles.atheme.org/audacious-1.5.1.tgz[/url]
--2008-12-25 16:26:07-- [url]http://distfiles.atheme.org/audacious-1.5.1.tgz[/url]
Translacja distfiles.atheme.org... 64.71.161.129
£ączenie się z distfiles.atheme.org|64.71.161.129|:80... połączono.
¯ądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK
Długość: 1937747 (1,8M) [application/x-gzip]
Zapis do: `audacious-1.5.1.tgz'
100%[======================================>] 1.937.747 116K/s w 28s
2008-12-25 16:26:36 (68,2 KB/s) - zapisano `audacious-1.5.1.tgz' [1937747/1937747]
Kod: Zaznacz cały
lis6502@Nexus:/$ cd ~
lis6502@Nexus:~$ pwd
/home/lis6502
lis6502@Nexus:~$
Tutaj jest wiele szkół. Niektóre mówią o przepuszczeniu pliku przez gunzip, następnie przez tar. Dzisiejszy tar sam załatwia sprawię ,,drugiego kompresora''.
Kod: Zaznacz cały
tar xf audacious-1.5.1.tgz
Kod: Zaznacz cały
tar xvf audacious-1.5.1.tgz
Kod: Zaznacz cały
tar xvvf audacious-1.5.1.tgz
Kod: Zaznacz cały
lis6502@Nexus:~$ ls
lis6502@Nexus:~$ ls -l
razem 82956
drwxr-xr-x 12 lis6502 lis6502 4096 maj 24 2008 [b]audacious-1.5.1[/b]
-rw-r--r-- 1 lis6502 lis6502 1937747 maj 23 2008 audacious-1.5.1.tgz
-r--r--r-- 1 lis6502 lis6502 24539 gru 4 17:36 config-2.6.24
drwxr-xr-x 27 lis6502 lis6502 4096 gru 20 13:51 data
drwxr-xr-x 13 lis6502 lis6502 4096 gru 25 14:50 Desktop
-rw-r--r-- 1 lis6502 lis6502 22042815 lis 25 11:59 donkey-1.0.1.tar.bz2
drwxr-xr-x 2 lis6502 lis6502 4096 gru 10 20:57 downloads
drwxr-xr-x 14 lis6502 lis6502 4096 gru 25 12:51 firefox
drwxr-xr-x 4 lis6502 lis6502 4096 lis 23 00:31 GNUstep
drwxr-xr-x 2 lis6502 lis6502 4096 gru 2 21:12 imgs
drwxr-xr-x 4 lis6502 lis6502 4096 gru 10 18:38 instalki
drwxr-xr-x 2 lis6502 lis6502 4096 gru 23 12:29 jajo 2.6.27.deb
drwxr-xr-x 21 lis6502 lis6502 4096 gru 23 19:13 linux-2.6.24
-rw-r--r-- 1 lis6502 lis6502 59078927 gru 4 13:42 linux-2.6.24.tar.gz
drwxr-xr-x 2 lis6502 lis6502 4096 lis 6 14:29 pdb
drwxr-xr-x 6 lis6502 lis6502 4096 gru 6 11:23 programy
drwxr-xr-x 4 lis6502 lis6502 4096 gru 2 21:12 projekty
drwxr-xr-x 3 lis6502 lis6502 4096 lis 27 17:30 resq
-rw-r--r-- 1 lis6502 lis6502 332467 gru 20 22:46 zrzut ekranu10.png
-rw-r--r-- 1 lis6502 lis6502 56832 gru 22 13:01 zrzut ekranu11.png
-rw-r--r-- 1 lis6502 lis6502 612642 gru 20 21:18 zrzut ekranu8.png
-rw-r--r-- 1 lis6502 lis6502 672612 gru 20 21:33 zrzut ekranu9.png
Wchodzimy do nowo utworzonego katalogu i patrzymy co tam ciekawego:
Kod: Zaznacz cały
lis6502@Nexus:~$ cd audacious-1.5.1/
is6502@Nexus:~/audacious-1.5.1$ ls
ABOUT-NLS buildsys.mk.in COPYING Makefile scripts
acinclude.m4 config.guess doc man Skins
aclocal.m4 config.h.in Doxyfile Mercurial-Access src
applications config.rpath extra.mk.in mkinstalldirs stamp-h.in
audacious.desktop config.sub HACKING NEWS TODO
audacious.pc.in configure INSTALL pixmaps
audclient.pc.in configure.ac install-sh po
AUTHORS contrib m4 README
lis6502@Nexus:~/audacious-1.5.1$
Na przykład:
W tym momencie już wiemy, jaki zestaw pakietów jest wymagany. Sprawdźmy zatem czego nam jeszcze może brakować:README pisze:2. Installation
---------------
Audacious requires the following libraries and their development
packages installed:
Glib 2.14.0
http://www.gtk.org/download/
GTK+ 2.10.0
http://www.gtk.org/download/
mcs >= 0.7
http://www.atheme.org/projects/mcs.shtml
libmowgli >= 0.4
http://www.atheme.org/projects/mowgli.shtml
GNU Make >= 3.80
Kod: Zaznacz cały
lis6502@Nexus:~$ dpkg-l | grep libglib
ii libglib-perl 1:1.190-2 Perl interface to the GLib and GObject libra
ii libglib1.2ldbl 1.2.10-19 The GLib library of C routines
ii libglib2.0-0 2.16.6-1 The GLib library of C routines
ii libglib2.0-cil 2.12.1-2 CLI binding for the GLib utility library 2.1
ii libglib2.0-data 2.16.6-1 Common files for GLib library
ii libglib2.0-dev 2.16.6-1 Development files for the GLib library
Kod: Zaznacz cały
lis6502@Nexus:~$ dpkg -l | grep libgtk
ii libgtk1.2 1.2.10-18.1 The GIMP Toolkit set of widgets for X
ii libgtk1.2-common 1.2.10-18.1 Common files for the GTK+ library
ii libgtk2-gladexml-perl 1.006-1+b1 Perl interface to use user interfaces create
ii libgtk2-perl 1:1.190-1 Perl interface to the 2.x series of the Gimp
ii libgtk2.0-0 2.12.11-4 The GTK+ graphical user interface library
ii libgtk2.0-bin 2.12.11-4 The programs for the GTK+ graphical user int
ii libgtk2.0-cil 2.12.1-2 CLI binding for the GTK+ toolkit 2.12
ii libgtk2.0-common 2.12.11-4 Common files for the GTK+ graphical user int
ii libgtk2.0-dev 2.12.11-4 Development files for the GTK+ library
ii libgtkextra-x11-2.0-1 2.1.1-5 A useful set of widgets for GTK+
ii libgtkhtml2-0 2.11.1-2 HTML rendering/editing library - runtime fil
Kod: Zaznacz cały
lis6502@Nexus:~$ dpkg -l | grep libmowgli
ii libmowgli1 0.6.1-1 a high performance development framework for
Sprawdzamy więc czy w ogóle w repozytorium jest dostępny pakiet rozwojowy dla libmowgli.
Kod: Zaznacz cały
lis6502@Nexus:~/audacious-1.5.1$ apt-cache search libmowgli
libmowgli-dev - a high performance development framework for C
libmowgli1 - a high performance development framework for C
libmowgli1-dbg - a high performance development framework for C
Kod: Zaznacz cały
lis6502@Nexus:~/audacious-1.5.1$ sudo apt-get install libmowgli-dev
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie... Gotowe
Zostaną zainstalowane następujące NOWE pakiety:
libmowgli-dev
0 aktualizowanych, 1 nowo instalowanych, 0 usuwanych i 12 nieaktualizowanych.
Konieczne pobranie 0B/20,3kB archiwów.
Po tej operacji zostanie dodatkowo użyte 218kB miejsca na dysku.
Zaznaczenie poprzednio niezaznaczonego pakietu libmowgli-dev.
(Odczytywanie bazy danych ... 134022 plików i katalogów obecnie zainstalowanych.)
Rozpakowanie libmowgli-dev (z .../libmowgli-dev_0.6.1-1_i386.deb) ...
Konfigurowanie libmowgli-dev (0.6.1-1) ...
Kod: Zaznacz cały
lis6502@Nexus:~$ dpkg -l | grep mcs
ii libmcs1 0.7.1-1 Abstraction library to store configurations
ii mono-gmcs 1.9.1+dfsg-5 Mono C# 2.0 and C# 3.0 compiler for CLI 2.0
Kod: Zaznacz cały
lis6502@Nexus:~$ apt-cache search mcs | grep dev
libmcs-dev - Development library and headers for libmcs1
libxfce4mcs-dev - Development files for libxfce4mcs-client and -manager
xfce4-mcs-manager-dev - Development files and static plugins
Kod: Zaznacz cały
lis6502@Nexus:~$ sudo apt-get install libmcs-dev
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie... Gotowe
Zostaną zainstalowane następujące NOWE pakiety:
libmcs-dev
0 aktualizowanych, 1 nowo instalowanych, 0 usuwanych i 12 nieaktualizowanych.
Konieczne pobranie 0B/4396B archiwów.
Po tej operacji zostanie dodatkowo użyte 57,3kB miejsca na dysku.
Zaznaczenie poprzednio niezaznaczonego pakietu libmcs-dev.
(Odczytywanie bazy danych ... 134087 plików i katalogów obecnie zainstalowanych.)
Rozpakowanie libmcs-dev (z .../libmcs-dev_0.7.1-1_i386.deb) ...
Konfigurowanie libmcs-dev (0.7.1-1) ...
Skoro mamy już wszystko, co sugeruje nam informacja zawarta w pliku README, możemy przystąpić do kolejnego kroku jakim jest - Konfiguracja
Kod: Zaznacz cały
lis6502@Nexus:~$ cd audacious-1.5.1/
lis6502@Nexus:~/audacious-1.5.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 pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking whether we need an implib... no
checking for shared library system... POSIX
checking if you are running Apple-GCC... no
checking whether make sets $(MAKE)... yes
checking for a BSD-compatible install... /usr/bin/install -c
--------------------
tutaj dużo tekstu
--------------------
config.status: executing default-1 commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing depfiles commands
Configuration:
Install path: /usr/local
Use one plugin dir: no
Allow user plugin dir: yes
Automatic character code detection: yes
Sample rate conversion: no
D-Bus support: yes
Session management (eggsm) yes
XSPF playlists yes
SSE2: yes
AltiVec: no
Czas teraz na Make:
Kod: Zaznacz cały
lis6502@Nexus:~/audacious-1.5.1$ make
Entering directory src.
Entering directory libaudclient.
Successfully generated dependencies.
Successfully compiled audctrl.c.
Successfully linked libaudclient.so.
Leaving directory libaudclient.
Entering directory audtool.
--------------------
znowu dużo tekstu
--------------------
Leaving directory po.
które można zbagatelizować, ponieważ są to ostrzeżenia - ang. warning.input.c: In function ‘]warning[/b]: dereferencing type-punned pointer will break strict-aliasing rules
input.c:150: warning: dereferencing type-punned pointer will break strict-aliasing rules
Część ostatnia to oczywiście instalacja:
Kod: Zaznacz cały
lis6502@Nexus:~/audacious-1.5.1$ sudo make install
Successfully installed audacious.pc.
Successfully installed audclient.pc.
Successfully installed audacious.desktop.
Entering directory src.
Entering directory libaudclient.
Successfully installed libaudclient.so.
Successfully installed audctrl.h.
Leaving directory libaudclient.
Entering directory audtool.
Successfully installed audtool.
Leaving directory audtool.
Entering directory libeggsmclient.
--------------------
znowu dużo tekstu
--------------------
Jeśli nie posiadamy na przykład pakietu libmowgli-dev, konfiguracja przebiega tak:
Kod: Zaznacz cały
lis6502@Nexus:~/audacious-1.5.1$ ./configure
--------------------
tutaj dużo tekstu
--------------------
checking for GLIB... yes
checking for GTHREAD... yes
checking for GTK... yes
checking for PANGO... yes
checking for CAIRO... yes
checking for MOWGLI... no
configure: error:
Cannot find libmowgli! If you are using binary packages based system, check that you
have the corresponding -dev/devel packages installed.
[url]http://www.atheme.org/projects/mowgli.shtml[/url]
Podobnie sprawa ma się przy innej kompilacji
Każdy komunikatconfigure: error: zlib library not found or incompatible, please specify the correct path with --with-zlib=DIR... stopping
Cannot find
mówi nam, że brakuje czegoś i podaje nazwę tego pakietu, którego brakuje. Wrzucamy ją w apt-cache search i instalujemy - pamiętając o pakietach runtime i devel.not found
- Pytanie: Dlaczego raz używamy apt-cache, a innym razem dpkg -l?
Odpowiedź: apt-cache z opcją search wyświetla wszystkie pakiety zawierające w nazwie lub opisie szukaną frazę niezależnie od ich stanu. dpkg -l wyświetla pakiety, które są zainstalowane, lub te, które po usunięciu zostawiły jakieś pliki konfiguracyjne po sobie - tutaj lista po prostu jest krótsza.