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 ..
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:
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.
Untar:a .orig.tar.gz-filen i den aktuella katalogen.
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
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.
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.
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.
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.
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.
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.
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 .
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