Rekompilering af programmer

Fra Debianguiden
Skift til: Navigation, Søgning

Selv om mange programmer ligger lige til at hente med 'apt-get', så kan det nogle gange være nødvendigt at kompilere dem selv alligevel. For ikke at ødelægge hele pakkesystemet, så kan det klart anbefales at lave .deb pakker og installere dem, i stedet for at kompilere normalt, f. eks. vha. './configure && make && make install', som smider en masse filer rundt omkring på diske, som der efterfølgende ikke rigtigt er kontrol med. (Dette kan dog løses med programmet checkinstall.)

Dette afsnit koncentrerer sig om at kompilere pakker, der kan hentes gennem apt-get, men som ikke er kompileret helt i forhold til de behov, man selv har. Nogle pakker, der ikke kan hentes gennem apt-get, som f.eks. mplayer kommer desuden med de nødvendige support-filer til at lave en .deb pakke, men for programmer, der ikke har nogle af delene skal der en større proces i gang. Det er alt sammen beskrevet på [http://www.debian.org/doc/maint-guide/ Debians guide til vedligeholdelse af pakker], og vil ikke blive dækket i dette afsnit.

Processen for at kompilere en pakke er

  • Hent kildekoden ned med 'apt-get source'
  • Foretag nødvendige tilpasninger i debian/rules
  • Hent eventuelle afhængigheder med 'apt-get build-dep'
  • Byg pakken
  • Installer pakken

Først er der dog et par supportprogrammer, der skal være installeret. Det drejer sig om pakkerne

  • dh-make
  • debhelper
  • fakeroot
  • debmake
  • patch
  • dpkg-dev

De kan installeres på sædvanlig vis med apt-get install. Alternativt kan pakken build-essential installeres, den installerer alle pakker, der er nødvendige for at lave .deb pakker selv. Derudover skal alle nødvendige programmer til at kompilere med også være installeret. Det drejer sig oftest om følgende:

  • gcc
  • libc6-dev
  • cpp
  • binutils
  • make
  • autoconf
  • automake
  • perl

Sidst, men ikke mindst, kræver det også, at der er nogle deb-src linier i /etc/apt/sources.list. Oftest er det de samme som deb-linierne, bare med deb-src i stedet for deb.

For at illustrere hele processen kommer der et eksempel på hvordan php4 kompileres. Først hentes php4 ned:

bruger@debian$ cd /tmp
bruger@debian/tmp$ apt-get source php4
Reading Package Lists... Done
Building Dependency Tree... Done
Need to get 3431kB of source archives.
Get:1 http://ftp.sunet.se unstable/main php4 4:4.1.2-1 (dsc) [1527B]
Get:2 http://ftp.sunet.se unstable/main php4 4:4.1.2-1 (tar) [3347kB]
Get:3 http://ftp.sunet.se unstable/main php4 4:4.1.2-1 (diff) [83.0kB]
Fetched 3431kB in 15s (215kB/s)
dpkg-source: extracting php4 in php4-4.1.2

Da har cd'et til /tmp, efterlades php4 i udpakket tilstand i /tmp/php4-4.1.2. Hvis installationen skal rettes lidt til, så kan det ske nu ved at rette i debian/rules filen, der ligger i den mappe, pakken er pakket ud til. Led efter linier, der starter med configure, og ret configure kommandoen til. Inden den færdige pakke bygges skal alle de nødvendige afhængigheder hentes ned. Det sker gennem 'apt-get build-dep':

debian:/tmp# apt-get build-dep php4

Endeligt kan pakken bygges. I dette tilfælde er det faktisk ikke bare en enkelt pakke, men en hel stak, da de enkelte php moduler også bliver bygget som separate pakker:

bruger@debian/tmp/php4-4.1.2$ fakeroot
dpkg-buildpackage -b -D

Skulle 'apt-get build-dep' have overset nogle pakker, så vil buildpackage stoppe med en fejl om hvilke pakker, der mangler, og disse kan så installeres med 'apt-get install'. Er alle de nødvendige pakker installeret, så bliver pakken nu bygget. Når den engang er færdig bliver .deb pakkerne lagt i ../, i dette tilfælde altså i /tmp, hvorefter de kan installeres med 'dpkg -i' som normalt:

bruger@debian/tmp$ ls *.deb
php4-cgi_4.1.2-1_i386.deb     php4-mhash_4.1.2-1_i386.deb
php4-curl_4.1.2-1_i386.deb    php4-mysql_4.1.2-1_i386.deb
php4-dev_4.1.2-1_all.deb      php4-pear_4.1.2-1_all.deb
php4-domxml_4.1.2-1_i386.deb  php4-recode_4.1.2-1_i386.deb
php4-gd_4.1.2-1_i386.deb      php4-snmp_4.1.2-1_i386.deb
php4-imap_4.1.2-1_i386.deb    php4-sybase_4.1.2-1_i386.deb
php4-ldap_4.1.2-1_i386.deb    php4-xslt_4.1.2-1_i386.deb
php4-mcal_4.1.2-1_i386.deb    php4_4.1.2-1_i386.deb

Her kan det selvfølgelig let ske, at nogle af disse pakker er afhængige af andre pakker. I det tilfælde er det letteste normalt at installere den netop byggede pakke med 'apt-get', og derefter installere den version, der lige er blevet bygget, med 'dpkg -i'. Som allerede nævnt, så er der nogle pakker, der ikke ligger til at hente med apt-get, men som er forberedt på at blive lavet som .deb pakke, som f.eks. MPlayer. Her er proceduren den samme som før, det er blot at køre 'dpkg-buildpackage -D -b' og installere den .deb pakke, der kommer ud af det. Pakker man selv har kompileret vil stadig blive erstattet når 'apt-get upgrade' køres, og det kan godt være noget irriterende, især hvis pakkerne er kompileret med andre funktioner end standardpakken. Det kan undgås ved at sætte pakken på 'hold':

debian:/tmp# dpkg --get-selections|sed 's/\(php4\)\([[:space:]]*\)\(install\)/\1\2hold/'|dpkg --set-selections

I dette eksempel angiver strengen 'php4' den pakke, der skal sættes on hold. Når pakker er on hold bliver de ikke længere opgraderet af 'apt-get'.