Muokataan sivua Deb-paketin tekeminen
Siirry navigaatioon
Siirry hakuun
Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.
Nykyinen versio | Oma tekstisi | ||
Rivi 1: | Rivi 1: | ||
[[Debian]]issa ja siihen pohjautuvissa jakeluissa (esim. [[Ubuntu]]ssa | [[Debian]]issa ja siihen pohjautuvissa jakeluissa (esim. [[Ubuntu]]ssa) käytetään [[Apt]]-paketinhallintajärjestelmää. Apt:ssä paketit ovat .deb-tiedostoja, jotka sisältävät itse ohjelman lisäksi mm. tiedot paketin riippuvuuksista ja siitä, mihin ohjelma asennetaan. Deb-pakettien tekeminen ei ole mitenkään ylivoimainen tehtävä, kunhan perusasiat ovat hallussa. | ||
Tässä oppaassa luodaan | Tässä oppaassa luodaan malliksi yksinkertainen paketti [http://www.gnu.org/software/hello/ GNU Hello] -ohjelmasta, joka on [[GNU]]-projektin esimerkkiohjelma. Ohjelman lähdekoodipaketin voi ladata [http://ftp.gnu.org/gnu/hello/ GNU:n palvelimelta]. | ||
Paketin luomisessa käytetään tässä apuna Debhelper-apuohjelmaa. | |||
== Valmistelut == | == Valmistelut == | ||
Aluksi on | Aluksi on asennettava muutamia perustyökaluja, jotka löytyvät seuraavista paketeista | ||
*dpkg-dev | |||
*autoconf | |||
*dh-make | |||
*devscripts | |||
*[[fakeroot]] | |||
*[[Gpg|gnupg]] | |||
*build-essential | |||
*lintian | |||
*linda | |||
Kun paketit on asennettu, lataa Hello-ohjelman lähdekoodi ja [[tar|pura]] se työhakemistoosi | Kun tarvittavat paketit on asennettu, lataa Hello-ohjelman lähdekoodi ja [[tar|pura]] se työhakemistoosi. Nyt sinulla pitäisi olla työhakemistossasi tiedosto <tt>hello-2.2.tar.gz</tt> ja hakemisto <tt>hello-2.2</tt>. | ||
== | == Valmistelu == | ||
Aluksi kannattaa kokeilla, että | Aluksi kannattaa kokeilla, että [[Ohjelman asentaminen|saat]] ohjelman käännettyä ja ajettua. Sinun pitäisi osata tehdä tämä, jos luet tätä opasta, mutta lyhykäisyydessään voit asentaa Hellon hakemistoon ~/hello seuraavasti: | ||
./configure --prefix=/home/käyttäjä/hello | ./configure --prefix=/home/käyttäjä/hello | ||
[[make]] | [[make]] | ||
Rivi 23: | Rivi 31: | ||
=== Pohja === | === Pohja === | ||
Siirry ohjelman hakemistoon (hello-2. | Siirry ohjelman hakemistoon (hello-2.2) ja aja komento | ||
dh_make -e sinun@sähköpostiosoitteesi -f ../hello-2. | dh_make -e sinun@sähköpostiosoitteesi -f ../hello-2.2.tar.gz | ||
Toinen parametri on siis paketin tekijän sähköpostiosoite ja neljäs alkuperäinen lähdekooditiedosto. | Toinen parametri on siis paketin tekijän sähköpostiosoite ja neljäs alkuperäinen lähdekooditiedosto. Kysyy aluksi, minkätyyppistä pakettia olemme luomassa: | ||
Type of package: | Type of package: single binary, multiple binary, library, kernel module or cdbs? | ||
[s/ | [s/m/l/k/b] | ||
Vastaa tähän s (''single binary''), sillä olemme luomassa yksinkertaista yhden ohjelman käsittävää pakettia. Tämän jälkeen vahvista tiedot | Vastaa tähän s (''single binary''), sillä olemme luomassa yksinkertaista yhden ohjelman käsittävää pakettia. Tämän jälkeen vahvista tiedot entterillä, jonka jälkeen dh_make luo hakemistoon <tt>debian</tt>-alihakemiston, joka sisältää tiedostot, joiden perusteella varsinainen paketti luodaan. Se myös luo ylähakemistoon tiedoston <tt>paketti_versio.orig.tar.gz</tt>, tässä tapauksessa siis <tt>hello_2.2.orig.tar.gz</tt> joka sisältää alkuperäisen lähdekoodipaketin. | ||
Huomaa, että <tt>dh_make</tt> kuuluu ajaa vain kerran! Tulevien muutosten | Huomaa, että <tt>dh_make</tt> kuuluu ajaa vain kerran! Tulevien muutosten jälkeen sitä ei tarvitse (eikä saa) ajaa. | ||
== Asennushakemisto == | == Asennushakemisto == | ||
Paketin luova työkalu päättelee paketin tiedostot siten, että ohjelma asennetaan sen valvonnassa väliaikaiseen alihakemistoon. Yleensä tämä alihakemisto on <tt>debian/paketin_nimi</tt>, jonne paketti asennetaan aivan normaalisti: esimerkiksi Hellon binääri menisi hakemistoon <tt>debian/hello/usr/bin/hello</tt>. | Paketin luova työkalu päättelee paketin tiedostot siten, että ohjelma asennetaan sen valvonnassa väliaikaiseen alihakemistoon. Yleensä tämä alihakemisto on <tt>debian/paketin_nimi</tt>, jonne paketti asennetaan aivan normaalisti: esimerkiksi Hellon binääri menisi hakemistoon <tt>debian/hello-2.2/usr/bin/hello</tt>. | ||
[[Autoconf]]ia käyttävien pakettien kanssa (pääasiassa ohjelmat, jotka asennetaan komennolla <tt>./configure && make && make install</tt>) paketin luoma työkalu osaa hoitaa tämän automaattisesti, eikä sinun tarvitse tässä vaiheessa tehdä mitään. Kuten huomasit asentaessamme ohjelmaa oppaan alussa, annoimme configure-skriptille parametrin <tt>--prefix=/hakemisto/jonne/ohjelma/asennetaan</tt>. Paketoija antaa configurelle samalla tavalla sopivan parametrin, jolloin ohjelma asentuu oikeaan paikkaan. | |||
=== Mitä jos ohjelma ei käytä autoconfia? === | |||
== Asetustiedostot == | == Asetustiedostot == | ||
Dh_make loi <tt>debian</tt>-hakemiston, joka sisältää monia tiedostoja, joiden perusteella itse paketti luodaan. Tässä vaiheessa on käytävä ne läpi ja muokattava sopiviksi. | |||
=== control === | === control === | ||
Tiedostossa <tt>debian/control</tt> kerrotaan perustiedot paketista ja sen riippuvuuksista. Meidän tapauksessamme dh_make loi seuraavanlaisen pohjan: | Tiedostossa <tt>debian/control</tt> kerrotaan perustiedot paketista ja sen riippuvuuksista. Meidän tapauksessamme dh_make loi seuraavanlaisen pohjan (rivinumerot lisätty): | ||
< | <pre> | ||
Source: hello | 1 Source: hello | ||
Section: unknown | 2 Section: unknown | ||
Priority: | 3 Priority: extra | ||
Maintainer: Paketin Tekijä <foo@bar.com> | 4 Maintainer: Paketin Tekijä <foo@bar.com> | ||
Build-Depends: debhelper (>= | 5 Build-Depends: debhelper (>= 5), autotools-dev | ||
Standards-Version: 3. | 6 Standards-Version: 3.7.2 | ||
7 | |||
8 Package: hello | |||
9 Architecture: any | |||
10 Depends: ${shlibs:Depends}, ${misc:Depends} | |||
Package: hello | 11 Description: <insert up to 60 chars description> | ||
Architecture: any | 12 <insert long description, indented with spaces> | ||
Depends: ${shlibs:Depends}, ${misc:Depends} | </pre> | ||
Description: <insert up to 60 chars description> | Riveillä 1-6 on ''lähdekoodipaketin'' (engl. ''source'') perustiedot: | ||
*Rivillä 1 on lähdekoodipaketin nimi | |||
</ | *Rivillä 2 kerrotaan, mihin osioon paketti kuuluu. Debianissa paketit osioihin, joita ovat mm. ''main'' (vapaat ohjelmat), ''non-free'' (ohjelmat, jotka eivät ole vapaita) ja ''contrib'' (ohjelmat, jotka riippuvat vapaista ohjelmista). Nämä ohjelmat on yhä jaettu pienempiin osioihin, kuten ''devel'' (kehitystyökalut) ja ''mail'' (sähköpostiohjelmat). Hellolle sopiva osio voisi olla ''text''. | ||
Riveillä | *Kolmannella rivillä kerrotaan, kuinka tärkeää käyttäjälle on asentaa tämä paketti. Vaikka "Terve maailma!" -viestin tulostava ohjelma voi tuntua tärkeältä, ehkäpä se ei kuitenkaan ole yhtä tärkeä kuin vaikka ydin, joten jätetään sen tärkeysasteeksi ''extra''. | ||
* Rivillä 1 on lähdekoodipaketin nimi | *Neljännellä rivillä on paketin tekijän nimi ja sähköpostiosoite | ||
* Rivillä 2 kerrotaan, mihin osioon paketti kuuluu. Debianissa paketit osioihin, joita ovat mm. ''main'' (vapaat ohjelmat), ''non-free'' (ohjelmat, jotka eivät ole vapaita) ja ''contrib'' (ohjelmat, jotka riippuvat vapaista ohjelmista). Nämä ohjelmat on yhä jaettu pienempiin osioihin, kuten ''devel'' (kehitystyökalut) ja ''mail'' (sähköpostiohjelmat). Hellolle sopiva osio voisi olla ''text'' | *Rivillä 5 listataan pilkulla erotettuna paketit, jotka tarvitaan tämän paketin kääntämiseen. Jos ohjelmasta on oltava tietty versio, haluttu versio voidaan ilmoittaa sulkeissa (esimerkissä tarvitaan ''debhelper''-paketin versio 5 tai uudempi). Käytännössä aina tarvittavia paketteja (esim. gcc ja make) ei tarvitse luetella, sillä ne otetaan mukaan automaattisesti. Kuitenkin kaikki muut kääntämisessä tarvittavat vähänkin harvinaisemmat paketit on lueteltava. Tässä vaiheessa voitaisiin myös samalla tavalla luetella paketit, jotka estävät kääntämisen (''Build-Conflicts: paketti1, paketti2''). Hello on sen verran helppo kääntää, ettei meidän tarvitse nyt lisätä tähän mitään ylimääräisiä paketteja. | ||
* Kolmannella rivillä kerrotaan, kuinka tärkeää käyttäjälle on asentaa tämä paketti. Vaikka "Terve maailma!" -viestin tulostava ohjelma voi tuntua tärkeältä, ehkäpä se ei kuitenkaan ole yhtä tärkeä kuin vaikka ydin, joten | *Rivillä 6 kerrotaan, minkä ''Debian Policy'' -standardin version mukainen paketti on. Tähän ei tarvitse koskea. | ||
* Neljännellä rivillä on paketin tekijän nimi ja sähköpostiosoite | *Rivillä 8 on varsinaisen binääripaketin nimi. Yleensä se on sama kuin lähdekoodipaketin nimi. | ||
* Rivillä 5 listataan pilkulla erotettuna paketit, jotka tarvitaan tämän paketin kääntämiseen. Jos ohjelmasta on oltava tietty versio, haluttu versio voidaan ilmoittaa sulkeissa (esimerkissä tarvitaan ''debhelper''-paketin versio | *Rivillä 9 kerrotaan, millä arkkitehtuurilla paketti toimii. Jätetään tämä arvoon "any", jolloin paketin tekevä työkalu huolehtii arkkitehtuurista. Jos paketti toimii kaikilla arkkitehtuureilla (esim. se on ohjepaketti tai [[Perl]]-skripti), arkkitehtuuriksi laitetaan "all". | ||
* Rivillä 6 kerrotaan, minkä ''Debian Policy'' -standardin version mukainen paketti on. Tähän ei tarvitse koskea. | *Rivillä 10 listataan paketit, jotka ovat binääripaketin riippuvuuksia. Koska Hello ei tarvitse mitään erityisiä paketteja, jätetään tämä tyhjäksi. "''${shllibs:Debends}''" huolehtii siitä, että kriittisimmät paketit, kuten libc, ovat asennettuina. | ||
* | *Lopuksi paketille annetaan vielä lyhyt (suositus noin 60 merkkiä) ja pitkä kuvaus. Pitkä kuvaus kirjoitetaan tiedoston loppuun siten, että jokaisen rivin alussa on välilyönti. Näin lopullinen <tt>control</tt>-tiedosto voisi näyttää tältä: | ||
<pre> | |||
* Rivillä | |||
* Rivillä | |||
* Lopuksi paketille annetaan vielä lyhyt (suositus noin 60 merkkiä) ja pitkä kuvaus. Pitkä kuvaus kirjoitetaan tiedoston loppuun siten, että jokaisen rivin alussa on välilyönti | |||
< | |||
Source: hello | Source: hello | ||
Section: text | Section: text | ||
Priority: | Priority: extra | ||
Maintainer: | Maintainer: Tekijä <foo@bar.com> | ||
Build-Depends: debhelper (>= | Build-Depends: debhelper (>= 5), autotools-dev | ||
Standards-Version: 3. | Standards-Version: 3.7.2 | ||
Package: hello | Package: hello | ||
Rivi 91: | Rivi 92: | ||
Klassinen Hello world -ohjelma, jonka avulla opettelemme | Klassinen Hello world -ohjelma, jonka avulla opettelemme | ||
deb-pakettien tekemistä. | deb-pakettien tekemistä. | ||
</ | </pre> | ||
=== Suositeltavat paketit, konfliktit ja muut suhteet toisiin paketteihin === | |||
Riippuvuuksien lisäksi paketti voi myös suositella | Riippuvuuksien lisäksi paketti voi myös suositella jonkun toisen paketin asentamista, tai se voi myös kieltäytyä asentumasta samaan järjestelmään jonkin toisen paketin kanssa (konfliktit). Tällaiset paketit esitellään <tt>control</tt>-tiedostossa samaan tapaan kuin riippuvuudet. | ||
Riippuvuuksien lisäksi apt tukee seuraavia suhteita pakettien välillä: | Riippuvuuksien lisäksi apt tukee seuraavia suhteita pakettien välillä: | ||
Rivi 100: | Rivi 101: | ||
*<tt>Suggests</tt>: Muita tämän paketin kanssa hyviä paketteja. Monet apt:n edustaohjelmat (kuten aptitude) näyttävät tämän listan, apt ei. | *<tt>Suggests</tt>: Muita tämän paketin kanssa hyviä paketteja. Monet apt:n edustaohjelmat (kuten aptitude) näyttävät tämän listan, apt ei. | ||
*<tt>Pre-Depends</tt>: Vahvempi kuin Depends. Vaatii, että paketit on asennettu ja otettu käyttöön ennen kuin suostuu asentamaan tämän paketin. Käytetään erittäin harvoin. | *<tt>Pre-Depends</tt>: Vahvempi kuin Depends. Vaatii, että paketit on asennettu ja otettu käyttöön ennen kuin suostuu asentamaan tämän paketin. Käytetään erittäin harvoin. | ||
*<tt>Conflicts</tt>: Paketit, joiden kanssa | *<tt>Conflicts</tt>: Paketit, joiden kanssa tätä pakettia ei voida asentaa. | ||
*<tt>Provides</tt>: Mitkä virtuaaliset paketit tämä paketti toteuttaa. | *<tt>Provides</tt>: Mitkä virtuaaliset paketit tämä paketti toteuttaa. | ||
*<tt>Replaces</tt>: Paketit, jotka tämä paketti korvaa. | *<tt>Replaces</tt>: Paketit, jotka tämä paketti korvaa. | ||
Jos esimerkiksi pakettimme nyt vaatisi paketin ''foo'' version 2.3 tai uudemman, paketti ''bar'' olisi myös kiva sen kanssa, ja pakettimme ei toimisi yhdessä ''libfoo'':n kanssa, voisimme lisätä seuraavat rivit: | Jos esimerkiksi pakettimme nyt vaatisi paketin ''foo'' version 2.3 tai uudemman, paketti ''bar'' olisi myös kiva sen kanssa, ja pakettimme ei toimisi yhdessä ''libfoo'':n kanssa, voisimme lisätä seuraavat rivit: | ||
Depends: ${shlibs:Depends}, ${misc:Depends}, foo (>=2.3) | |||
Depends: ${shlibs:Depends}, ${misc:Depends}, foo (>= 2.3) | Recommends: bar | ||
Recommends: bar | Conflicts: libfoo | ||
Conflicts: libfoo | |||
Vastaavasti on mahdollista asettaa myös lähdekoodipaketille ''Build-Conflicts'' ja muut vastaavat suhteet. | Vastaavasti on mahdollista asettaa myös lähdekoodipaketille ''Build-Conflicts'' ja muut vastaavat suhteet. | ||
=== copyright === | === copyright === | ||
Paketin tekijänoikeuksista kerrotaan tiedostossa <tt>debian/copyright</tt>. Tämän tiedoston muoto on periaatteessa vapaa, mutta | Paketin tekijänoikeuksista kerrotaan tiedostossa <tt>debian/copyright</tt>. Tämän tiedoston muoto on periaatteessa vapaa, mutta hyvän tiedoston saa muokkaamalla dh_maken luomaa. Tässä tiedostosta tulee käydä ilmi paketin luoja, alkuperäinen tekijä ja ohjelman tekijänoikeustiedot (esim. GPL-lisenssin alainen). | ||
=== changelog === | === changelog === | ||
dh_make luo seuraavanlaisen pohjan <tt>debian/changelog</tt>-tiedostolle: (rivinumerot lisätty) | dh_make luo seuraavanlaisen pohjan <tt>debian/changelog</tt>-tiedostolle: (rivinumerot lisätty) | ||
<pre> | <pre> | ||
1 hello (2. | 1 hello (2.2-1) unstable; urgency=low | ||
2 | 2 | ||
3 * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> | 3 * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> | ||
3 | 3 | ||
4 -- | 4 -- Heikki Mäntysaari <heikkim@gmail.com> Sat, 21 Apr 2007 23:59:27 +0300 | ||
</pre> | </pre> | ||
Rivillä 1 on aluksi | Rivillä 1 on aluksi paketin nimi (hello) ja versionumero (2.2-1). Seuraavana on jakelun nimi, johon paketti kuuluu (Debianilla on stable, testing ja unstable -jakelut). Unstable on yleensä hyvä. Viimeisenä on tieto paketin kiireellisyydestä (urgency), yleensä "low" on sille oikea arvo. | ||
Tämän jälkeen seuraavilla riveillä on itse muutosloki (engl. ''changelog''). Rivin alussa on kaksi välilyöntiä ja tähti (*). | Tämän jälkeen seuraavilla riveillä on itse muutosloki (engl. ''changelog''). Rivin alussa on kaksi välilyöntiä ja tähti (*). Viimeisnä (rivillä 4) on tieto paketin tekijästä. Tämän rivin alussa on yksi välilyönti. | ||
=== rules === | === rules === | ||
Rivi 137: | Rivi 133: | ||
Koska Hello käyttää autoconfia, osaa paketin luova työkalu tehdä tarvittavat asetukset itse, eikä meidän periaatteessa tarvitse edes koskea <tt>rules</tt>-tiedostoon. Katsotaan nyt kuitenkin sitä malliksi, sillä vähänkin monimutkaisempien pakettien kohdalla sitä on muokattava. Dh_maken luoma malli on seuraava: (rivinumerot lisätty) | Koska Hello käyttää autoconfia, osaa paketin luova työkalu tehdä tarvittavat asetukset itse, eikä meidän periaatteessa tarvitse edes koskea <tt>rules</tt>-tiedostoon. Katsotaan nyt kuitenkin sitä malliksi, sillä vähänkin monimutkaisempien pakettien kohdalla sitä on muokattava. Dh_maken luoma malli on seuraava: (rivinumerot lisätty) | ||
< | <pre> | ||
#!/usr/bin/make -f | 1 #!/usr/bin/make -f | ||
# | 2 # -*- makefile -*- | ||
# output | 3 # Sample debian/rules that uses debhelper. | ||
#export DH_VERBOSE = 1 | 4 # This file was originally written by Joey Hess and Craig Small. | ||
5 # As a special exception, when this file is copied by dh-make into a | |||
# | 6 # dh-make output file, you may use that output file without restriction. | ||
7 # This special exception was added by Craig Small in version 0.37 of dh-make. | |||
8 | |||
9 # Uncomment this to turn on verbose mode. | |||
# package | 10 #export DH_VERBOSE=1 | ||
11 | |||
12 | |||
13 # These are used for cross-compiling and for saving the configure script | |||
14 # from having to guess our platform (since we know it already) | |||
15 DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) | |||
16 DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) | |||
17 | |||
# | 18 | ||
19 CFLAGS = -Wall -g | |||
20 | |||
21 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) | |||
22 CFLAGS += -O0 | |||
23 else | |||
24 CFLAGS += -O2 | |||
25 endif | |||
26 | |||
27 config.status: configure | |||
28 dh_testdir | |||
29 # Add here commands to configure the package. | |||
30 ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr \ | |||
31 --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs" | |||
32 | |||
33 | |||
34 build: build-stamp | |||
35 | |||
36 build-stamp: config.status | |||
37 dh_testdir | |||
38 | |||
39 # Add here commands to compile the package. | |||
40 $(MAKE) | |||
41 #docbook-to-man debian/hello.sgml > hello.1 | |||
42 | |||
43 touch $@ | |||
44 | |||
45 clean: | |||
46 dh_testdir | |||
47 dh_testroot | |||
48 rm -f build-stamp | |||
49 | |||
50 # Add here commands to clean up after the build process. | |||
51 -$(MAKE) distclean | |||
52 ifneq "$(wildcard /usr/share/misc/config.sub)" "" | |||
53 cp -f /usr/share/misc/config.sub config.sub | |||
54 endif | |||
55 ifneq "$(wildcard /usr/share/misc/config.guess)" "" | |||
56 cp -f /usr/share/misc/config.guess config.guess | |||
57 endif | |||
58 | |||
59 | |||
60 dh_clean | |||
61 | |||
62 install: build | |||
63 dh_testdir | |||
64 dh_testroot | |||
65 dh_clean -k | |||
66 dh_installdirs | |||
67 | |||
68 # Add here commands to install the package into debian/hello. | |||
69 $(MAKE) DESTDIR=$(CURDIR)/debian/hello install | |||
70 | |||
71 | |||
72 # Build architecture-independent files here. | |||
73 binary-indep: build install | |||
74 # We have nothing to do by default. | |||
75 | |||
76 # Build architecture-dependent files here. | |||
77 binary-arch: build install | |||
78 dh_testdir | |||
79 dh_testroot | |||
80 dh_installchangelogs ChangeLog | |||
81 dh_installdocs | |||
82 dh_installexamples | |||
83 # dh_install | |||
84 # dh_installmenu | |||
85 # dh_installdebconf | |||
86 # dh_installlogrotate | |||
87 # dh_installemacsen | |||
88 # dh_installpam | |||
89 # dh_installmime | |||
90 # dh_python | |||
91 # dh_installinit | |||
92 # dh_installcron | |||
93 # dh_installinfo | |||
94 dh_installman | |||
95 dh_link | |||
96 dh_strip | |||
97 dh_compress | |||
98 dh_fixperms | |||
99 # dh_perl | |||
100 # dh_makeshlibs | |||
101 dh_installdeb | |||
102 dh_shlibdeps | |||
103 dh_gencontrol | |||
104 dh_md5sums | |||
105 dh_builddeb | |||
106 | |||
107 binary: binary-indep binary-arch | |||
108 .PHONY: build clean binary-indep binary-arch binary install | |||
</pre> | |||
Tiedoston alussa annetaan käännösoptiot, esimerkiksi [[gcc|C-kääntäjän]] käännösparametrit laitetaan muuttujaan CFLAGS. Tämä tehdään riveillä 19-25. | |||
Riveillä 27-31 ajetaan paketin <tt>configure</tt>-skripti. Koska Hello käyttää autoconfia ja siten <tt>configure</tt>-skriptiä, voimme välittää tässä vaiheessa tarvittavat parametrit. Saatat ihmetellä, miksi tässä annetaan parametrit <tt>--prefix=/usr</tt>, vaikka juuri todettiin, että ohjelma on asennettava <tt>debian/hello</tt>-alihakemistoon. Rivillä 69, kun ajetaan paketin asennuskomento, kuitenkin asetetaan kohdehakemistoksi <tt>debian/hello</tt>, jolloin paketti asentuu polkuun <tt>debian/hello/usr</tt>. | |||
Jos tiedoston syntaksi on epäselvä, katso artikkeli [[Makefile]]. Paketti asennetaan monessa vaiheessa, aluksi riviltä 27 lähtien ajetaan <tt>configure</tt>-skripti <tt>config.status</tt>-osiossa. Tämän jälkeen ohjelma käännetään <tt>build</tt>-osiossa riviltä 34 eteenpäin. | |||
<tt>build-indep</tt>-osiossa käännetään tai luodaan alustariippumattomat tiedostot. Hellon tapauksessa niitä ei ole. Riviltä 77 eteenpäin rakennetaan varsinaista alustariippuvaista binääripakettia. "dh_"-alkuiset rivit ovat debhelperin funktiokutsuja, jotka tekevät erilaisia pieniä operaatioita rakentaen pakettia. Mm. seuraavia funktioita on tarjolla: | |||
*<tt>dh_testdir</tt>: Tarkistaa, että ollaan oikeassa hakemistossa | |||
*<tt>dh_testroot</tt>: Tarkistaa, että meillä on pääkäyttäjän oikeudet kun niitä tarvitaan | |||
*<tt>dh_strip</tt>: Ajaa [[strip]]-komennon suoritettaville tiedostoille, jolloin niiden koko pienenee | |||
*<tt>dh_compress</tt>: Pakkaa [[gzip]]illä [[man]]-sivut ja ohjetiedostot, joiden koko ylittää 4kt | |||
*<tt>dh_gencontrol</tt>: Luo binääripaketille <tt>control</tt>-tiedoston ja kopioi sen hakemistoon <tt>debian/hello/DEBIAN</tt> | |||
*<tt>dh_md5sums</tt>: Luo [[md5sum|MD5]]-tarkistussummat paketin tiedostoille | |||
Jos paketti ei | Jos paketti ei käytä autoconfia, on <tt>rules</tt> muokattava sellaiseksi, että ohjelma kääntyy ja asentuu polkuun <tt>debian/paketinnimi</tt>. Se, miten tämä tapahtuu, riippuu ohjelmasta. Tällöinkin voit käyttää edellä esiteltyjä "dh_"-alkuisia funktioita ja mm. $(CURDIR)-muuttujaa. Sopivan tiedoston saat aikaan muokkaamalla dh_maken luomaa pohjaa. | ||
=== | === dirs === | ||
Tiedostossa <tt>debian/dirs</tt> luetellaan hakemistot, joiden pitää olla olemassa kun ohjelmaa asennetaan mutta joita ohjelma ei normaalin asennusprosessin aikana luo. Esimerkiksi <tt>/usr/bin</tt> on monesti tällainen. | |||
<tt>dirs</tt>-tiedostossa hakemistot luetellaan omilla riveillään, ja ensimmäinen kauttaviiva jätetään pois. Hellon tapauksessa meille riittää kirjoittaa tähän tiedostoon rivi | |||
usr/bin | |||
=== .ex-päätteiset tiedostot === | === .ex-päätteiset tiedostot === | ||
Rivi 230: | Rivi 270: | ||
Oletuksena .ex-päätteisiä tiedostoja ei huomioida. Jos haluat käyttää niitä, muokkaa tiedosto ensin sopivaksi ja poista tiedostonimestä tämän jälkeen .ex-pääte. Lisäksi tarkista, että sopivaa funktiota kutsutaan <tt>rules</tt>-tiedostossa. | Oletuksena .ex-päätteisiä tiedostoja ei huomioida. Jos haluat käyttää niitä, muokkaa tiedosto ensin sopivaksi ja poista tiedostonimestä tämän jälkeen .ex-pääte. Lisäksi tarkista, että sopivaa funktiota kutsutaan <tt>rules</tt>-tiedostossa. | ||
Poista ne .ex-tiedostot, joita et tarvitse. Hellon tapauksessa emme tarvitse näitä. | Poista ne .ex-tiedostot, joita et tarvitse. Hellon tapauksessa emme tarvitse näitä. | ||
== Tehdään paketti! == | == Tehdään paketti! == | ||
Nyt kun tarvittavat tiedostot on lopulta muokattu sopiviksi, on aika luoda varsinainen paketti. Siirry ohjelman päähakemistoon (<tt>hello-2. | Nyt kun tarvittavat tiedostot on lopulta muokattu sopiviksi, on aika luoda varsinainen paketti. Siirry ohjelman päähakemistoon (<tt>hello-2.2</tt>) ja aja komento | ||
dpkg-buildpackage -rfakeroot | |||
joka tekee seuraavat asiat: | joka tekee seuraavat asiat: | ||
*Siistii paketin (ajaa [[make]]lla komennon <tt>debian/rules clean</tt>) | *Siistii paketin (ajaa [[make]]lla komennon <tt>debian/rules clean</tt>) | ||
Rivi 258: | Rivi 281: | ||
*Allekirjoittaa .dsc-tiedoston [[gpg|gnupgllä]] | *Allekirjoittaa .dsc-tiedoston [[gpg|gnupgllä]] | ||
*Luo ja allekirjoittaa .changes-tiedoston | *Luo ja allekirjoittaa .changes-tiedoston | ||
*Käyttää [[fakeroot]] | *Käyttää [[fakeroot]]tia, jolloin pääkäyttäjän oikeuksia ei tarvita | ||
Allekirjoitus vaatii, että olet luonut [[gpg]]:llä itsellesi avaimen. Tällöin sinulta kysytään avaimesi salasanaa. | Allekirjoitus vaatii, että olet luonut [[gpg]]:llä itsellesi avaimen. Tällöin sinulta kysytään avaimesi salasanaa. | ||
Tämän jälkeen, jos kaikki sujui ilman virheitä, ylähakemistosta pitäisi löytyä seuraavat tiedostot: | Tämän jälkeen, jos kaikki sujui ilman virheitä, ylähakemistosta pitäisi löytyä seuraavat tiedostot: | ||
*<tt>hello_2. | *<tt>hello_2.2.orig.tar.gz</tt> - alkuperäinen lähdekoodi | ||
*<tt>hello_2. | *<tt>hello_2.2-1.dsc</tt> - [[gpg]]:llä allekirjoitettu <tt>control</tt>-tiedoston kaltainen tiedosto, jossa on myös md5-summat. | ||
*<tt>hello_2. | *<tt>hello_2.2-1.diff.gz</tt> - [[gzip]]-pakattu [[diff]]-tiedosto lähdekoodiin tehdyistä muutoksista. | ||
*<tt>hello_2. | *<tt>hello_2.2-1_i386.deb</tt> - lopullinen deb-paketti! | ||
*<tt>hello_2. | *<tt>hello_2.2-1_i386.changes</tt> - [[gpg]]:llä allekirjoitettu tiedosto, josta käy ilmi tehdyt muutokset | ||
Nyt lopullinen paketti voidaan asentaa [[dpkg]]:llä: | Nyt lopullinen paketti voidaan asentaa [[dpkg]]:llä: | ||
dpkg -i hello_2. | dpkg -i hello_2.2-1_i386.deb | ||
Kun myöhemmin teet muutoksia pakettiin, voit luoda uuden paketin nopeasti komennolla | Kun myöhemmin teet muutoksia pakettiin, voit luoda uuden paketin nopeasti komennolla | ||
Rivi 276: | Rivi 298: | ||
joka ei kuitenkaan käännä ohjelmaa alusta lähtien (tärkeää huomata, jos muutat lähdekoodia). | joka ei kuitenkaan käännä ohjelmaa alusta lähtien (tärkeää huomata, jos muutat lähdekoodia). | ||
== | == Lintian ja linda: onnistuiko paketti? == | ||
Lintian ja linda ovat ohjelmia, jotka tarkistavat tekemäsi paketin laadun. Molemmille ohjelmille annetaan parametrina pakettia luotaessa syntynyt <tt>.changes</tt>-päätteinen tiedosto. Yleensä kannattaa antaa niille myös valitsin -i: | |||
lintian -i hello_2.2-1_i386.changes | |||
linda -i hello_2.2-1_i386.changes | |||
Lintian | |||
Tulosteessa E:-alkavat rivit tarkoittavat virhettä, W:-alkavat varoituksia ja N:-alkavat huomautuksia. | Tulosteessa E:-alkavat rivit tarkoittavat virhettä, W:-alkavat varoituksia ja N:-alkavat huomautuksia. | ||
Jos esimerkiksi et poistanut <tt>debian</tt>-hakemistosta <tt>.ex</tt>-päätteisiä tiedostoja, lintian | Jos esimerkiksi et poistanut <tt>debian</tt>-hakemistosta <tt>.ex</tt>-päätteisiä tiedostoja, lintian ja linda varoittavat niistä. Yleensä paketin tulisi olla sellainen, etteivät lintian ja linda löydä niistä mitään valitettavaa. | ||
== Patchit == | == Patchit == | ||
Joskus pakettia tehtäessä on tehtävä muutoksia myös itse ohjelman lähdekoodiin. Tällöin on siistiä pitää muutokset erillään [[patch]]-tiedostoissa. Kun binääripaketti sitten tehdään, otetaan patchit käyttöön ennen kääntämistä. | Joskus pakettia tehtäessä on tehtävä muutoksia myös itse ohjelman lähdekoodiin. Tällöin on siistiä pitää muutokset erillään [[patch]]-tiedostoissa. Kun binääripaketti sitten tehdään, otetaan patchit käyttöön ennen kääntämistä. | ||
Patchien hallintaan on monia aputyökaluja, mutta yksinkertaisimmillaan se hoituu näin: | |||
*Pura alkuperäinen lähdekoodipaketti polkuihin <tt>/tmp/new</tt> ja <tt>/tmp/old</tt> | |||
*Tee muutokset hakemistoon <tt>/tmp/new</tt> | |||
*Aja hakemistossa <tt>tmp</tt> komento | |||
[[diff]] -Nurp old new > 01_patchin-nimi | |||
:Joka luo patchin tiedostoon <tt>01_patchin-nimi</tt> (yleensä patchien edessä on numero, ja patchit otetaan käyttöön numerojärjestyksessä). Optiot -Nurp aiheuttavat sen, että diff ottaa huomioon myös uudet tiedostot (-N) ja käy hakemistot läpi rekursiivisesti (-r) | |||
*Luo paketin <tt>debian</tt>-hakemistoon alihakemisto <tt>patches</tt> ja kopioi äsken luomasi patchi sinne (<tt>cp /tmp/01_patchin-nimi debian/patches/</tt>) | |||
*Lisää <tt>debian/rules</tt>-tiedostoon seuraavat kohdat, jotka ottavat patchit käyttöön ennen ohjelman kääntämistä ja poistavat ne käytöstä hakemistoa "siivottaessa": | |||
patch: patch-stamp | |||
<pre> | |||
patch-stamp: | |||
dh_testdir | |||
@patches=debian/patches/*.patch; for patch in $$patches; do \ | |||
test -f $$patch || continue; \ | |||
echo "Applying $$patch"; \ | |||
patch -stuN -p1 < $$patch || exit 1; \ | |||
done | |||
touch $@ | |||
# Remove patches from the package | |||
unpatch: | |||
dh_testdir | |||
@if test -f patch-stamp; then \ | |||
patches=debian/patches/*.patch; \ | |||
for patch in $$patches; do \ | |||
reversepatches="$$patch $$reversepatches"; \ | |||
done; \ | |||
for patch in $$reversepatches; do \ | |||
test -f $$patch || continue; \ | |||
echo "Reversing $$patch"; \ | |||
patch -suRf -p1 < $$patch || exit 1; \ | |||
done; \ | |||
rm -f patch-stamp; \ | |||
fi | |||
</pre> | |||
*Huolehdi siitä, että patch: ja unpatch: -kohdat ajetaan oikeaan aikaan: muuta rivi | |||
build: build-stamp | |||
:muotoon | |||
build: patch-stamp build-stamp | |||
Ja rivi | |||
clean: | |||
:muotoon | |||
clean: unpatch | |||
</ | |||
== Pbuilder == | == Pbuilder == | ||
== | == Muut pakettityypit == | ||
== CDBS == | |||
== | == Linkkejä == | ||
*[http://www.debian.org/doc/maint-guide/index.en.html#contents Debian New Maintainers' Guide] | *[http://www.debian.org/doc/maint-guide/index.en.html#contents Debian New Maintainers' Guide] | ||
* Ubuntun [https://wiki.ubuntu.com/MOTU/School/PackagingBasics PackagingBasics]-opas | |||
*Ubuntun [https://wiki.ubuntu.com/ | *[http://doc.ubuntu.com/ubuntu/packagingguide/C/index.html Ubuntu Packaging Guide] | ||
*[http:// | * [http://www.debian-administration.org/articles/286 Setting up your own APT reposity] | ||
*[ | |||
[[Luokka:Ohjeet]] | [[Luokka:Ohjeet]] | ||