Kompilacja programów źród

Archiwalne, stare wpisy FAQ i HowTo Użytkowników
Awatar użytkownika
lis6502
Member
Posty: 1798
Rejestracja: 05 listopada 2008, 20:14
Lokalizacja: Miasto Szybowców

Kompilacja programów źródłowych - autoconf

Post autor: lis6502 »

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 polecenia

Kod: Zaznacz cały

apt-cache search szukana_nazwa
Po czasie nauczymy się.

Podstawowe narzędzia do budowania programów ze źródeł to:
  • gcc
    make
Nie obejdziemy się też bez linux-headers w wersji zgodnej z jądrem zainstalowanym w systemie. Poniżej przepis instalacji plików nagłówkowych jądra:

Kod: Zaznacz cały

apt-get install linux-headers-$(uname -r)
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:
  • runtime (uruchomieniowe),
    data (dodatkowych danych),
    development (rozwojowe).
Przykładem pakietu typu runtime jest np. k3b, zawierający programy i biblioteki. Po zainstalowaniu tego pakietu możemy uruchomić program k3b do nagrywania płyt.
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]
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:

Kod: Zaznacz cały

lis6502@Nexus:/$ cd ~
lis6502@Nexus:~$ pwd
/home/lis6502
lis6502@Nexus:~$
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''.

Kod: Zaznacz cały

 tar xf audacious-1.5.1.tgz
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:

Kod: Zaznacz cały

tar xvf audacious-1.5.1.tgz
lub

Kod: Zaznacz cały

tar xvvf audacious-1.5.1.tgz
UWAGA: nie zawsze rozpakowanie mojearchiwum.tar.gz utworzy nam katalog mojearchiwum, dlatego przechodzimy do następnego punktu i sprawdzamy co nam się rozpakowało:

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
Jak widać w tym wypadku nazwa katalogu pokrywa się z nazwą archiwum.

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$
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:
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
W tym momencie już wiemy, jaki zestaw pakietów jest wymagany. Sprawdźmy zatem czego nam jeszcze może brakować:

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
Glib jest w wymaganej wersji.

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
GTK też.

Kod: Zaznacz cały

lis6502@Nexus:~$ dpkg -l | grep libmowgli
ii  libmowgli1                           0.6.1-1                                        a high performance development framework for
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.

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
Jest, a więc instalujemy go.

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) ...
Jedziemy dalej.

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
Znowu niezainstalowany pakiet rozwojowy - przeszukamy repozytorium:

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
Instalacja

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) ...
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 - 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
Tak wygląda poprawnie zakończona konfiguracja.

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.
Po drodze mogą trafić się komunikaty
input.c: In function &#8216]warning[/b]: dereferencing type-punned pointer will break strict-aliasing rules
input.c:150: warning: dereferencing type-punned pointer will break strict-aliasing rules
które można zbagatelizować, ponieważ są to ostrzeżenia - ang. warning.

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
--------------------
Co robić jeśli coś pójdzie nie tak?
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
configure: error: zlib library not found or incompatible, please specify the correct path with --with-zlib=DIR... stopping
Każdy komunikat
Cannot find
not found
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.
  • 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.
Podziękowania za pomoc przekazuję kolegom: pavbaranov i elektrykowi dyżurnemu z zaprzyjaźnionego forum.
Awatar użytkownika
qbsiu
Beginner
Posty: 491
Rejestracja: 19 marca 2007, 19:47
Lokalizacja: £DZ

Post autor: qbsiu »

£adny opis, jednak proponowałbym pobawić się w budowanie paczek .deb - żeby odinstalować taki pakiet, trzeba mieć źródełka.
Budowanie paczek może jest trudne, dlatego są dwa sposoby: checkinstall lub wersja bardziej profesjonalna - sposobem Debiana.
Zablokowany