Paketera från scratch
Föregående
Nästa

Paketera från scratch

Viktigt

Krav: build-essential, automake, gnupg, lintian, fakeroot och pbuilder.

I det här exemplet kommer vi att använda programmet GNU hello som ett exempel. Du kan ladda ner källkodstarbollen från ftp.gnu.org. I det här exemplet kommer vi använda katalogen ~/hello/.

mkdir ~/hello
cd ~/hello
wget http://ftp.gnu.org/gnu/hello/hello-2.1.1.tar.gz

Vi kommer också att jämföra vårt paket med det som redan finns paketerat i Ubuntus förråd. I nuläget kommer vi bara att läga det i katalogen ubuntu så att vi kan titta på det senare. För att få källpaketet, se till att du har en "deb-src"-rad i din /etc/apt/sources.list för förrådet Main. Kör sedan:

mkdir ubuntu
cd ubuntu
apt-get source hello
cd ..

Notera

Till skillnad från de flesta kommandon i apt-get behöver du inte root-rättigheter för att ladda ner källpaketet, eftersom det laddas ner till den aktuella katalogen. Det är till och med rekomenderat att du enbart använder apt-get source som en vanlig användare, eftersom du då kan ändra på filerna i källpaketet utan att behöva root-privilegier.

Vad kommandot apt-get source gör är:

  1. Ladda ner källpaketet. Ett källpaket innehåller vanligen en .dsc-fil som beskriver paketet och ger md5summor för källpakete, en .orig.tar.gz-fil som innehåller källkoden från skaparen/skaparna, och en .diff.gz-fil som innehåller alla patchar som applicerats på källkoden med paketinformation.

  2. Untar:a .orig.tar.gz-filen i den aktuella katalogen.

  3. Applicera den gunzippade .diff.gz-filen till den uppackade källkodskatalogen.

Om du laddade ner källkpaketen manuellt (filerna .dsc, .orig.tar.gz och .diff.gz) kan du packa upp dem på samma sätt som apt-get source gör genom att använda dpkg-source så här:

dpkg-source -x *.dsc

Det första du behöver göra är att göra en kopia av original-tarbollen (ibland kallad "uppström") i följande format: <packagename>_<version>.orig.tar.gz. Det här steget gör två saker. För det första skapar det två kopior av källkoden. Om du råkar ändra eller ta bort en arbetskopia kan du använda den du laddade ner. För det andra anses det vara dålig paketeringsstil att ändra i ursprungstarbollen om det inte är absolut nödvändigt. Se “Vanliga misstag” för olika skäl.

cp hello-2.1.1.tar.gz hello_2.1.1.orig.tar.gz
tar -xzvf hello_2.1.1.orig.tar.gz

Varning

Att använda ett understräck, "_", mellan paketnamnet (hello) och versionen (2.1.1), istället för ett bindesträck, "-", är väldigt viktigt. Ditt källpaket kommer felaktigt byggas som ett nativt Debianpaket.

Vi har nu en katalog som heter hello-2.1.1 som innehåler källkodsfilerna. Nu behöver vi skapa en extra katalog vid namn debian där all paketeringsinformation lagras, vilket låter oss separera paketeringsfilerna från källkodsfilerna.

mkdir hello-2.1.1/debian
cd hello-2.1.1/debian/

Vi behöver nu skapa de nödvändiga filer alla Ubuntus källpaket kräver: changelog, control, copyright och rules. De här filerna krävs för att skapa de binära paketen (.deb-filer) från den ursprungliga (uppströms) källkoden. Vi kollar på dem en i taget.

changelog

Filen changelog är, som namnet antyder, en lista över alla ändringar som gjorts i varje version. Den har ett speciellt format som berättar paketnamn, version, distribution, ändringar, vem som gjorde ändringarna, och när denne gjorde dem. Om du har en GPG-nyckel, se till att använda samma namn och email-adress i changelog som du har i din nyckel. Följande är en mall för changelog:

paket (version) distribution; urgency=bråskandenivå

  * ändingsdetaljer
    fler ändringsdetaljer
  * ännu fler ändringsdetaljer

-- underhållarens namn <e-postadress>[två mellanslag]datum

Formatet (speciellt för datumet) är viktigt. Datumet ska vara i RFC822-formatet, som du kan få från programmet 822-date.

Här är en grundläggande changelog-fil för hello:

hello (2.1.1-1) dapper; urgency=low

   * New upstream release with lots of bug fixes.

-- Captain Packager <packager@coolness.com> Wed, 5 Apr 2006 22:38:49 -0700

Notera att versionen har ett -1 tillagt till sig - det är det som kallas för Debianrevisionen, och används så att paketen kan uppdateras (för att fixa buggar till exempel) med nya uppladdningar av exakt samma källkodsversion.

Notera

Ubuntu och Debian har något olika paketversionssceman för att undvika konflikter då paketen består av samma källkodsversion. Om ett Debianpaket har ändrats i Ubuntu har det ubuntuX (där X är Ubuntus revisionsnummer) tillagt till slutet av Debianversionen. Så om Debians paket för hello ändrades av Ubuntu blir versionen 2.1.1-1ubuntu1. Om ett paket för ett program inte finns i Debian blir Ubuntus version 0(till exempel 2.1.1-0ubuntu1).

Titta nu på changelog för Ubuntus källpaket som vi laddade ner tidigare.

less ../../ubuntu/hello-2.1.1/debian/changelog

Lägg märke till att i det här fallet är distribution unstable (en Debian-gren), eftersom Debianpaketet inte har ändrats av Ubuntu. Kom ihåg att sätta distribution till den distributionen du vill bygga paketet för.

Nu, skapa en changelog-fil i katalogen debian där du fortfarande bör befinna dig.

control

Filen control innehåller information som pakethanteraren (till exempel apt-get, synaptic eller aptitude) använder, bygg-beroenden, underhållarinformation, och mycket mer.

För Ubuntu-paketet hello ser control-filen ut ungefär såhär:

Source: hello
Section: devel
Priority: optional
Maintainer: Captain Packager <packager@coolness.com> 
Standards-Version: 3.6.1

Package: hello
Architecture: any
Depends: ${shlibs:Depends}
Description: The classic greeting, and a good example
 The GNU hello program produces a familiar, friendly greeting. It
 allows non-programmers to use a classic computer science tool which
 would otherwise be unavailable to them.
 .
 Seriously, though: this is an example of how to do a Debian
 package.
 It is the Debian version of the GNU Project's `hello world' program
 (which is itself an example for the GNU Project).

Skapa filen control med informationen ovan (se till att skriva in din information i fältet Maintainer).

Det första stycket ger information om källpaketet. Låt oss gå igenom det, rad för rad:

  • Source: Det här är namnet på källpaketet, i det här fallet hello.

  • Section: Apt-förråden är uppdelade i avdelningen för att underlätta bläddring bland och kategorisering av program. I det här fallet hör hello till avdelningen devel.

  • Priority: Det här avgör hur viktigt paketet är för våra användare. Det bör vara något av följande:

    • Required - paket som är nödvändiga för att systemet ska fungera ordentligt. Om de tas bort är det sannolikt att ditt system går sönder på ett sätt som inte går att åtgärda.

    • Important - den minsta uppsättningen paket som krävs för ett användbart system. Att ta bort de här paketen orsakar inte att ditt system går sönder på något sätt som inte går att åtgärda, men de är oftast viktiga verktyg, utan vilka en Linuxdistribution skulle vara halvfärdig. Obs: Det här inkluderar inte saker som Emacs eller ens X Window System.

    • Standard - Ganska självförklarande.

    • Optional - i princip är den här kategorin för paket som inte krävs, eller de flesta paketen som finns. De här paketen får dock inte orsaka konflikter med varandra.

    • Extra - paket som får orsaka konflikter med paket i någon av ovastående kategorier. Används även för specialiserade paket som bara skulle vara användbart för personer som redan vet vad paketet används till.

  • Maintainer: Paketunderhållaren med en e-postadress.

  • Standards-Version: Den version av Debian Policy som paketet uppfyller (i det här fallet: version 3.6.1). Ett enkelt sätt att hitta den aktuella versionen är apt-cache show debian-policy | grep Version.

  • Build-Depends: Ett av de viktigaste fälten, och ofta en källa till buggar. Den här raden listar de binära paket (med versioner om det är nödvändigt) som måste installeras för att skapa binära paket från källpaketet. De paket som är absolut nödvändiga är en del av build-essential och behöver inte inkluderas på den här raden. I fallet med hello behövs inga fler paket än de som är en del av build-essential, så vi behöver ingen Build-Depends-rad. Listan över paket som tillhör build-essential kan du hitta på /usr/share/doc/build-essential/list.

Det andra stycket är för det binära paketet som kommer att byggas från källkoden. Om flera binära paket byggs från källpaketet bör det finnas en avdelning för varje paket. Än en gång, låt oss gå igenom det, rad för rad:

  • Package: Namnet på det binära paketet. Många gånger för enkla program (som med hello) är käll- och binärpaketets namn identiska.

  • Architecture: Arkitekturen som det binära paketet byggs för. Exempel är:

    • all - Källkoden är inte plattforms-beroende. Program som använder Python eller andra tolkade språk använder det här. Det resulterande paketets namn skulle sluta med _all.deb.

    • any - Källkoden är plattforms-beroende och bör kompilera på alla de arkitekturer som stödjs. Det kommer att skapas en .deb-fil för varje arkitektur (_i386.deb till exempel)

    • Bara vissa arkitekturer (i386, amd64, ppc t ex) kan skrivas för att indikera att källkoden är platforms-beroende och inte fungerar på alla de arkitekturer som Ubuntu stödjer.

  • Depends: Listan över paket som det binära paketet beror på för sin funktionalitet. För hello ser vi ${shlibs:Depends}, vilket är en variabel som byts ut mot de bibliotek som krävs. Se manualsidan för dpkg-source för mer information.

  • Recommends: Används för paket som starkt rekomenderas och vanligtvis installeras tillsammans med paketet. Vissa pakethanterare, bland annat aptitude, installerar automatiskt paket som är Recommended.

  • Suggests: Används för paket som är liknande eller användbara när det här paketet är installerat.

  • Conflicts: Används för paket som kommer att orsaka konflikter med det här paketet. Båda kan inte vara installerade på samma gång, och installeras det ena tast det andra bort.

  • Description: Både long och kort beskrivning används av pakethanterare. Formatet är:

    Beskrivning: <enradsförklaring>
     <utökad information över flera rader>

    Notera att det är ett mellanslag i början av varje rad i den långa beskrivningen. Mer information om hur du skriver bra information hittar du på http://people.debian.org/~walters/descriptions.html.

copyright

Den här filen innehåller copyrightinformation. För det mesta hittar du copyrightinformation i filen COPYING i programmets källkodskatalog. Den här filen bör innehålla information som namnen på upphovsmannen och paketeraren, adressen som källkoden kom från, en Copyright-rad med år och upphovsrättsinehavare, och texten med själva licensen. En exempelmall skulle vara:

This package was debianized by {Ditt namn} <din e-postadress>
{Date}

It was downloaded from: {URL till webbsida} 

Upstream Author(s): {Namn och e-postadress(er) på upphovsmannen/-männen}

Copyright:
	Copyright (C) {År} by {Upphovsman/-män} {e-postadress(er)}

License:

Logiskt nog är hello licensierat under licensen GPL. I det här fallet är det enklast att kopiera copyright-filen från Ubuntu-paketet:

cp ../../ubuntu/hello-2.1.1/debian/copyright .

Du måste inkludera den fullständiga licensen om den inte är GPL, LGPL, BSD eller artistic License, då du istället kan referera till motsvarande fil i katalogen /usr/share/common-licenses/

Notera att Ubuntu-paketens copyright-fil licensierar ut manualen. Det är viktigt att alla filer i källpaketet licensieras.

rules

Filen rules är en körbar Makefile som har regler för att bygga binära paket från källpaket. För hello är det enklast att använda rules från Ubuntu-paketet:

#!/usr/bin/make -f
# Sample debian/rules file - for GNU Hello.
# Copyright 1994,1995 by Ian Jackson.
# I hereby give you perpetual unlimited permission to copy,
# modify and relicense this file, provided that you do not remove
# my name from the file itself. (I assert my moral right of
# paternity under the Copyright, Designs and Patents Act 1988.)
# This file may have to be extensively modified

package = hello
docdir = debian/tmp/usr/share/doc/$(package)

CC = gcc
CFLAGS = -g -Wall
INSTALL_PROGRAM = install

ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
  CFLAGS += -O2
endif
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
  INSTALL_PROGRAM += -s
endif

build:
        $(checkdir)
        ./configure --prefix=/usr
        $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)"
        touch build

clean:
        $(checkdir)
        rm -f build
        -$(MAKE) -i distclean
        rm -rf *~ debian/tmp debian/*~ debian/files* debian/substvars

binary-indep: checkroot build
        $(checkdir)
# There are no architecture-independent files to be uploaded
# generated by this package. If there were any they would be
# made here.

binary-arch: checkroot build
        $(checkdir)
        rm -rf debian/tmp
        install -d debian/tmp/DEBIAN $(docdir)
        install -m 755 debian/postinst debian/prerm debian/tmp/DEBIAN
        $(MAKE) INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \
                prefix=$$(pwd)/debian/tmp/usr install
        cd debian/tmp && mv usr/info usr/man usr/share
        cp -a NEWS debian/copyright $(docdir)
        cp -a debian/changelog $(docdir)/changelog.Debian
        cp -a ChangeLog $(docdir)/changelog
        cd $(docdir) && gzip -9 changelog changelog.Debian
        gzip -r9 debian/tmp/usr/share/man
        gzip -9 debian/tmp/usr/share/info/*
        dpkg-shlibdeps debian/tmp/usr/bin/hello
        dpkg-gencontrol -isp
        chown -R root:root debian/tmp
        chmod -R u+w,go=rX debian/tmp
        dpkg --build debian/tmp ..

define checkdir
        test -f src/$(package).c -a -f debian/rules
endef

binary: binary-indep binary-arch

checkroot:
        $(checkdir)
        test $$(id -u) = 0

.PHONY: binary binary-arch binary-indep clean checkroot

Vi går igenom den här filen lite noggrannare. En av de första delarna du kommer att få syn på är deklarerandet av några variabler:

package = hello
docdir = debian/tmp/usr/share/doc/$(package)

CC = gcc
CFLAGS = -g -Wall
INSTALL_PROGRAM = install

ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
  CFLAGS += -O2
endif
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
INSTALL_PROGRAM += -s
endif

Den här avdelningen sätter CFLAGS för kompilatorn och hanterar DEB_BUILD_OPTIONS-flaggorna noopt och nostrip för debugging.

Härnäst kommer regeln build:

build:
	$(checkdir)
	./configure --prefix=/usr
	$(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)"
	touch build

Regeln kör emphasis>./configure

Nästa regel är clean, som kör make -i distclean och tar bort alla filer som skapades under byggandet av paketet.

clean:
	$(checkdir)
	rm -f build
	-$(MAKE) -i distclean
	rm -rf *~ debian/tmp debian/*~ debian/files* debian/substvars

Härnäst ser vi en tom regel binary-indep, eftersom det inte finns några plattforms-oberoende filer i det här paketet.

Dock så finns det många plattforms-beroende filer, så binary-arch används:

binary-arch: checkroot build
		$(checkdir)
		rm -rf debian/tmp
		install -d debian/tmp/DEBIAN $(docdir)
		install -m 755 debian/postinst debian/prerm debian/tmp/DEBIAN
		$(MAKE) INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \
		prefix=$$(pwd)/debian/tmp/usr install
		cd debian/tmp && mv usr/info usr/man usr/share
		cp -a NEWS debian/copyright $(docdir)
		cp -a debian/changelog $(docdir)/changelog.Debian
		cp -a ChangeLog $(docdir)/changelog
		cd $(docdir) && gzip -9 changelog changelog.Debian
		gzip -r9 debian/tmp/usr/share/man
		gzip -9 debian/tmp/usr/share/info/*
		dpkg-shlibdeps debian/tmp/usr/bin/hello
		dpkg-gencontrol -isp
		chown -R root:root debian/tmp
		chmod -R u+w,go=rX debian/tmp
		dpkg --build debian/tmp ..

För det första, notera att den här regeln anropar regeln checkroot för att se till att paketet byggs som root, och även anropar regeln build för att kompilera källkoden. Sedan skapas filerna debian/tmp/DEBIAN och debian/tmp/usr/share/doc/hello och skripten postinst och prerm> installeras till debian/tmp/DEBIAN. Sedan körs make install med ett prefix som installerar till katalogen debian/tmp/usr. När det är klart gzippas och installeras dokumentationsfilerna (NEWS, ChangeLog och debians changelog). dpkg-shlibdeps körs sedan för att hitta de delade bibliotek programmet hello beror på, och det lagrar listan i filen debian/substvars för variabeln ${shlibs:Depends} i control. Sedan körs dpkg-gencontrol för att skapa en control-fil för det binära paketet, och det utför de ersättningar som genererades av dpkg-shlibdeps. Till slut, när rättigheterna på debian/tmp är korrekta, körs dpkg --build för att bygga det binära .deb-paketet, och lägga det i katalogen ovanför den vi är i.

postinst och prerm

Filerna postinst och prerm är exempel på underhållarskript. De är skalskript som körs efter installationen respektive före borttagningen av ett paket. I fallet med Ubuntus hello-paket används de till att installera (och ta bort) info-filen. Varsågod och kopiera dem till den här debian-katalogen.

cp ../../ubuntu/hello-2.1.1/debian/postinst .
cp ../../ubuntu/hello-2.1.1/debian/prerm .

Bygga och ta bort källpaketet

Nu när vi har gått igenom filerna i katalogen debian for hello i detalj kan vi bygga käll- och binärpaketen. Först går vi till huvudkatalogen för den uppackade källkoden

cd ..

Nu bygger vi källpaketet med dpkg-buildpackage:

dpkg-buildpackage -S -rfakeroot

Flaggan -S säger till dpkg-buildpackage att bygga ett källpaket, och -r-flaggan berättar för det att använda fakeroot för att ge oss fejkade root-rättigheter när vi bygger paketet. dpkg-buildpackage kommer att ta filen .orig.tar.gz och skapa en .diff.gz (skillnaden mellan original-tarbollen från skaparen och den katalogen vi har skapat, med debian/ och dess innehåll) och en .dsc-fil som har beskrivningen och md5summor för källpaketet. Filerna .dsc och *_source.changes (används för att ladda upp källpaketet) blir signerade med din GPG-nyckel. Om du inte har någon GPG-nyckel, lägg till flaggorna -us -uc till raden där du kör dpkg-buildpackage. Ditt paket kommer att byggas men det kan inte laddas upp utan att ha blivit signerat.

Förutom ett källpaket kan vi dessutom bygga ett binärt paket med pbuilder:

sudo pbuilder build ../*.dsc

Det är väldigt viktigt att använda pbuilder för att bygga de binära paketen. Det ser till att build-beroendena är riktiga, eftersom pbuilder bara ger dig en minimal miljö, varpå alla bygg-beroenden avgörs av control-filen.

Vi kan kontrollera källpaketet efter vanliga misstag genom att använda lintian:

cd ..
lintian -i *.dsc
Föregående
Nästa
Hem