Muokataan sivua Deb-paketin tekeminen

Siirry navigaatioon Siirry hakuun
Varoitus: Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos kirjaudut sisään tai luot tunnuksen, muokkauksesi yhdistetään käyttäjänimeesi ja saat paremman käyttökokemuksen.

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 ja [[Linux Mint]]issä) käytetään [[Dpkg]]-paketinhallintajärjestelmää. Dpkg:ssa paketit ovat <tt>.deb</tt>-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 ja mm. [[komentorivi|komentorivin käyttö]] ovat hallussa.
[[Debian]]issa ja siihen pohjautuvissa jakeluissa (esim. [[Knoppix]]issa, [[MEPIS]]issä, [[PCLinuxOS]]issa ja [[Ubuntu]]ssa) käytetään [[Dpkg]]-paketinhallintajärjestelmää. Dpkg:ssa paketit ovat <tt>.deb</tt>-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 ja mm. [[komentorivi|komentorivin käyttö]] ovat hallussa.


Tässä oppaassa luodaan aluksi 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 (<tt>dh</tt>).
Tässä oppaassa luodaan aluksi 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. Tämä ei aina ole yksinkertaisin tapa paketoida ohjelma, mutta ennen helpottaviin tekniikoihin tutustumista on hyvä käydä asiat yksityiskohtaisemmin läpi.


Debianin eri versiosta löytyvän paketin voi kääntää käytetylle versiolle sopivaksi tai pakettiin tehdä pieniä muutoksia huomattavasti helpommin kuin tätä ohjetta seuraamalla, komennoilla <tt>apt-get build-dep paketti</tt>, <tt>apt-get source paketti</tt> ja <tt>dpkg-deb -build pakettihakemisto</tt>, jolloin muutokset tehdään viimeksi mainittujen välissä (varsinainen muutos + uusi kohta tiedostoon <tt>debian/changelog</tt>). Jos paketti tehdään valmiista Debianin lähdekoodipaketista, kääntämisen binääripaketiksi voi hoitaa paketin hakemisen yhteydessä komennolla <tt>apt-get --compile source paketti</tt>. Lisätietoja näistä komennoista löytyy artikkeleista [[apt-get]] ja [[dpkg]].
Kun perusteet on hallussa, tutustumme artikkelin loppupuolella mm. CDBS:ään, joka helpottaa huomattavasti monia paketointiin liittyviä rutiinitehtäviä.
 
Debianin eri versiosta löytyvän paketin voi kääntää käytetylle versiolle sopivaksi tai pakettiin tehdä pieniä muutoksia huomattavasti helpommin kuin tätä ohjetta seuraamalla, komennoilla "apt-get build-dep paketti", "apt-get source paketti" ja "dpkg-deb -build pakettihakemisto", jolloin muutokset tehdään viimeksimainittujen välissä (varsinainen muutos + debian/changelog). Jos paketti tehdään valmiista debianin lähdekoodipaketista, kääntämisen binääripaketiksi voi hoitaa paketin hakemisen yhteydessä komennolla "apt-get --compile source paketti".


== Valmistelut ==
== Valmistelut ==
Aluksi on hyvä asentaa muutamia perustyökaluja, jotka sisältävät paketointityössä tarvittavia tai valinnaisia apuohjelmia. Asenna siis seuraavat paketit (<tt>[[APT#apt|apt]] install <i>paketit</i></tt>):
Aluksi on asennettava muutamia perustyökaluja, jotka löytyvät seuraavista paketeista
dpkg-dev autoconf dh-make devscripts [[fakeroot]] [[Gpg|gnupg]] build-essential lintian libtool automake pbuilder
*dpkg-dev
*autoconf
*dh-make
*devscripts
*[[fakeroot]]
*[[Gpg|gnupg]]
*build-essential
*lintian


Kun paketit on asennettu, lataa Hello-ohjelman lähdekoodi ja [[tar|pura]] se työhakemistoosi (<code>tar xzvf ''tiedosto''</code>). Nyt sinulla pitäisi olla työhakemistossasi tiedosto <tt>hello-2.10.tar.gz</tt> ja hakemisto <tt>hello-2.10</tt>.
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>.


== Paketoinnin aloitus ==
== Paketoinnin aloitus ==
Aluksi kannattaa kokeilla, että saat ohjelman [[Kääntäminen|käännettyä]] ja ajettua. Sinun pitäisi jo osata tehdä tämä, jos luet tätä opasta, mutta lyhykäisyydessään voit asentaa Hellon hakemistoon <tt>~/hello</tt> seuraavasti:
Aluksi kannattaa kokeilla, että saat ohjelman [[Kääntäminen|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 32:


=== Pohja ===
=== Pohja ===
Siirry ohjelman hakemistoon (hello-2.10) ja aja komento
Siirry ohjelman hakemistoon (hello-2.2) ja aja komento
  dh_make -e sinun@sähköpostiosoitteesi -f ../hello-2.10.tar.gz
  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. Ohjelma kysyy aluksi, minkätyyppistä pakettia olemme luomassa:
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: (single, indep, library, python)
  Type of package: single binary, multiple binary, library, kernel module or cdbs?
  [s/i/l/p]?
  [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 enterillä, 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.10.orig.tar.gz</tt>, joka sisältää alkuperäisen lähdekoodipaketin.
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 pohjalla käytetään paketin olemassa olevaa <tt>debian</tt>-kansiota, eikä dh_makea siis tarvitse ajaa uudelleen.
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>.


Muiden muassa [[Autoconf]]ia, [[CMake]]a ja [[QMake]]a käyttävien pakettien kanssa 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>. Paketointiapuohjelma antaa configurelle samalla tavalla sopivan parametrin, jolloin ohjelma asentuu oikeaan paikkaan.
[[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.


Joskus, kun ohjelman kääntäminen ei suju Debhelperiltä automaattisesti, asennushakemistosta on huolehdittava itse. Tämä tulee eteen kun myöhemmin muokkaamme tiedostoa <tt>debian/rules</tt>.
Jos ohjelma ei käytä autoconfia, on asennushakemistosta huolehdittava itse. Tämä tulee eteen kun myöhemmin muokkaamme tiedostoa <tt>debian/rules</tt>.


== Asetustiedostot ==
== Asetustiedostot ==
<tt>dh_make</tt> 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.
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):
<source lang="debcontrol" line>
<pre>
Source: hello
Source: hello
Section: unknown
Section: unknown
Priority: optional
Priority: extra
Maintainer: Paketin Tekijä <foo@bar.com>
Maintainer: Paketin Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 9), autotools-dev
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.9.8
Standards-Version: 3.7.2
Homepage: <insert the upstream URL, if relevant>
7
Vcs-Git: git://anonscm.debian.org/collab-maint/hello.git
Package: hello
Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/hello.git
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:
<insert long description, indented with spaces>
*Rivillä 1 on lähdekoodipaketin nimi
</source>
*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''. Osiot on listattu [http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections Debian policyssä].
Riveillä 1–9 on ''lähdekoodipaketin'' (engl. ''source'') perustiedot:
*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''. Osiot on listattu [http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections Debian policyssä].
*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 asetetaan sen tärkeysasteeksi ''optional'', jota käytetään useimmille paketeille.
*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 9 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.
*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}''" aiheuttaa sen, että pakettia luotaessa pyritään riippuvuuksiksi lisäämään automaattisesti ne paketit, joiden tiedostoja vasten tämän paketin konekieliset tiedostot on linkitetty.
* Riville 7 kirjoitetaan ohjelman kotisivu.
*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ä:
* Riveillä 8 ja 9 voidaan kertoa, missä [[versionhallintajärjestelmä]]ssä debian-pakettia ylläpidetään. Me voimme poistaa nämä rivit, koska emme tässä käytä versionhallintaa.
<pre>
 
Riveillä 11–15 on ''binääripaketin'' tiedot:
* Rivillä 11 on varsinaisen binääripaketin nimi. Yleensä se on sama kuin lähdekoodipaketin nimi.
* Rivillä 12 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. jos se on ohjepaketti tai [[Perl]]- tai [[Python]]-skripti), arkkitehtuuriksi laitetaan "all".
* Rivillä 13 listataan paketit, jotka ovat binääripaketin riippuvuuksia. Koska Hello ei tarvitse mitään erityisiä paketteja, jätetään tämä tyhjäksi. "''${shlibs:Depends}''" aiheuttaa sen, että pakettia luotaessa pyritään riippuvuuksiksi lisäämään automaattisesti ne paketit, joiden tiedostoja vasten tämän paketin konekieliset tiedostot on linkitetty.
* 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. Tyhjiä rivejä voidaan tehdä laittamalla riville pelkästään piste. Näin lopullinen <tt>control</tt>-tiedosto voisi näyttää tältä:
<source lang="debcontrol" line>
Source: hello
Source: hello
Section: text
Section: text
Priority: optional
Priority: extra
Maintainer: Paketin Tekijä <foo@bar.com>
Maintainer: Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 9), autotools-dev
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.9.8
Standards-Version: 3.7.2
Homepage: https://www.gnu.org/software/hello/


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ä.
</source>
</pre>


==== Suositeltavat paketit, ristiriidat ja muut suhteet toisiin paketteihin ====
=== Suositeltavat paketit, konfliktit ja muut suhteet toisiin paketteihin ===
Riippuvuuksien lisäksi paketti voi myös suositella jonkin toisen paketin asentamista, tai se voi myös kieltäytyä asentumasta samaan järjestelmään jonkin toisen paketin kanssa (ristiriita toisen paketin kanssa, engl. ''conflict''). Tällaiset paketit esitellään <tt>control</tt>-tiedostossa samaan tapaan kuin riippuvuudet.  
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 samaan järjestelmään tätä pakettia ei voida asentaa.
*<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:
<source lang="debcontrol">
Depends: ${shlibs:Depends}, ${misc:Depends}, foo (>=2.3)
Depends: ${shlibs:Depends}, ${misc:Depends}, foo (>= 2.3)
Recommends: bar
Recommends: bar
Conflicts: libfoo
Conflicts: libfoo
</source>


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 kannattaa seurata [https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Machine-readable debian/copyright file] -standardia. 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 version 3 tai myöhemmän alainen).
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.10-1) unstable; urgency=medium
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  -- Paketin Tekijä <foo@bar.com>  Fri, 29 Jul 2016 11:42:23 +0300
4  -- Tekijän Nimi <sähköposti@osoite.com>  Sat, 21 Apr 2007 23:59:27 +0300
</pre>
</pre>
Rivillä 1 on aluksi lähdekoodipaketin nimi (hello) ja versionumero (2.10-1). Seuraavana on jakelun nimi, johon paketti kuuluu (Debianilla on stable, testing ja unstable -jakelut). Yleensä uudet paketit ja päivitykset vanhoihin paketteihin lisätään ensin kehitysversioon, joka Debianilla on unstable. Viimeisenä on tieto paketin kiireellisyydestä (''urgency''), yleensä "medium" on sille oikea arvo.
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). Yleensä uudet paketit ja päivitykset vanhoihin paketteihin lisätään ensin kehitysversioon, joka Debianilla on unstable. 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 (*). Viimeisenä (rivillä 4) on tieto paketin tekijästä ja tekoajankohdasta (esimerkin mukaisessa muodossa). Tämän rivin alussa on yksi välilyönti.
Tämän jälkeen seuraavilla riveillä on itse muutosloki (engl. ''changelog''). Rivin alussa on kaksi välilyöntiä ja tähti (*). Viimeisenä (rivillä 4) on tieto paketin tekijästä ja tekoajankohdasta (esimerkin mukaisessa muodossa). Tämän rivin alussa on yksi välilyönti.
Rivi 137: Rivi 137:


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)
<source lang="make" line>
<pre>
#!/usr/bin/make -f
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
2  # -*- makefile -*-
# output every command that modifies files on the build system.
# 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
# see FEATURE AREAS in dpkg-buildflags(1)
# dh-make output file, you may use that output file without restriction.
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
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.
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.


# see ENVIRONMENT in dpkg-buildflags(1)
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>.
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed


%:
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.
dh $@ --with autotools_dev


# dh_make generated override targets
<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:
# This is example for Cmake (See https://bugs.debian.org/641051 )
{| border=1
#override_dh_auto_configure:
# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
</source>
 
Jos tiedoston syntaksi on epäselvä, katso artikkeli [[Makefile]]. Suurin osa tiedoston sisällöstä on #-merkillä alkavia kommentteja, poikkeuksena kuitenkin ensimmäinen rivi, joka on erityinen [[wikipedia:en:Shebang (Unix)|#!-rivi]].
 
Rivien 6–7 "hardening" viittaa [https://wiki.debian.org/Hardening#Environment_variables Debianin käyttöön ottamiin GCC-valitsimiin], joiden avulla voitaisiin estää mm. tietyntyyppisiä tietomurtoja.
 
Riveillä 9–13 asetetaan käännösoptiot, jos niitä tarvitsee erikseen määritellä. Esimerkiksi [[gcc|C-kääntäjän]] käännösparametrit laitetaan muuttujaan DEB_CFLAGS_MAINT_APPEND, C++-kääntäjän muuttujaan DEB_CXXFLAGS_MAINT_APPEND ja linkittäjän ([[ld]]) muuttujaan DEB_LDFLAGS_MAINT_APPEND.
 
Rivillä 15 oleva Makefilen jokerimerkki (engl. ''wildcard'') '''%''' tarkoittaa, että kun kutsutaan <tt>debian/rules ''build''</tt> tai <tt>debian/rules ''binary''</tt>, make suorittaa rivin 16 mukaan komennon <tt>dh ''build'' --with autotools_dev</tt> tai <tt>dh ''binary'' --with autotools_dev</tt>. Komento <tt>dh build</tt> taas puolestaan suorittaa pitkän listan erilaisia dh-alkuisia ohjelmia, jotka ovat debhelperin funktiokutsuja, jotka tekevät erilaisia pieniä operaatioita rakentaen pakettia. Mm. seuraavia funktioita on tarjolla:
 
{| border=1 class="mw-collapsible mw-collapsed"
|'''Komento'''
|'''Komento'''
|'''Kuvaus'''
|'''Kuvaus'''
Rivi 178: Rivi 263:
|<tt>dh_testroot</tt>
|<tt>dh_testroot</tt>
|Tarkistaa, että meillä on pääkäyttäjän oikeudet kun niitä tarvitaan
|Tarkistaa, että meillä on pääkäyttäjän oikeudet kun niitä tarvitaan
|-
|<tt>dh_auto_configure</tt>
|Suorittaa ./configure:n tai vastaavan vaiheen
|-
|<tt>dh_auto_build</tt>
|Kääntää paketin
|-
|<tt>dh_auto_install</tt>
|Suorittaa make installin tai vastaavan asentamisvaiheen
|-
|-
|<tt>dh_strip</tt>
|<tt>dh_strip</tt>
Rivi 213: Rivi 289:
|}
|}


Taulukossa on vain osa dh-funktioista, loput ovat man-sivulla debhelper(7). Rules-tiedostossamme viimeisenä on esimerkki ''override targetista'', jollainen ajetaan vastaavan dh-ohjelman sijasta.
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 kääntäminen tapahtuu, riippuu ohjelmasta. Funktion <tt>dh_install</tt> avulla asennetaan tiedostot oikeisiin hakemistoihin lopullisessa binaaripaketissa.
 
Jos paketti ei jotain yleisistä käännösjärjestelmistä (kuten Ant, GNU Autotools, CMake, QMake tai tavallinen Makefile), on <tt>rules</tt> muokattava sellaiseksi, että ohjelma kääntyy ja asentuu polkuun <tt>debian/''paketinnimi''</tt>. Se, miten kääntäminen tapahtuu, riippuu ohjelmasta. Funktion <tt>dh_install</tt> avulla asennetaan tiedostot oikeisiin hakemistoihin lopullisessa binääripaketissa.


=== compat ===
=== dirs ===
Tässä tiedostossa ilmoitamme, mitä versiota debhelperistä paketista käytetään. Kirjoitushetkellä viimeisin vakaa versio on 9.
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.


=== source/format ===
<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
Tätä tiedostoa ei tarvitse muuttaa. Sen sisältö on:
  usr/bin
  3.0 (quilt)
Quilt viittaa [[#Patchit|patchien hallintaan]] käyttämäämme ohjelmaan. 3.0:n merkityksestä voi lukea tarkemmin Debian Wikin artikkelista [https://wiki.debian.org/Projects/DebSrc3.0 DebSrc3.0].


=== .ex-päätteiset tiedostot ===
=== .ex-päätteiset tiedostot ===
Rivi 241: Rivi 313:
Ohjelman [[man]]-sivu. Pisteen jälkeen oleva numero kertoo, mihin kategoriaan man-sivu asennetaan (kategoriat on listattu artikkelissa [[man]]). Man-sivu asennetaan paikoilleen <tt>rules</tt>-tiedostossa olevalla komennolla <tt>dh_installman debian/mansivu.1</tt>. Tiedoston nimi on yleensä muotoa <tt>paketinnimi.numero</tt>.
Ohjelman [[man]]-sivu. Pisteen jälkeen oleva numero kertoo, mihin kategoriaan man-sivu asennetaan (kategoriat on listattu artikkelissa [[man]]). Man-sivu asennetaan paikoilleen <tt>rules</tt>-tiedostossa olevalla komennolla <tt>dh_installman debian/mansivu.1</tt>. Tiedoston nimi on yleensä muotoa <tt>paketinnimi.numero</tt>.


==== watch ====
==== manpage.sgml ====
Kertoo <tt>uscan</tt>-ohjelmalle, miten paketin uudet versiot voi ladata internetistä. Lisätietoja tiedostomuodosta: <code>man 1 uscan</code> ja [https://wiki.debian.org/debian/watch Debian Wiki]. Watch-tiedosto mahdollistaa lähdekoodipaketin helpon päivittämisen aina uusimpaan versioon.
SGML-muodossa kirjoitettu man-sivu. Pakettia käännettäessä (<tt>rules</tt>-tiedoston <tt>build</tt>-osiossa) se on käännettävä komennolla <tt>docbook-to-man debian/manpage.xml > debian/paketti.1</tt>. Käännösaikaisiksi riippuvuudeksi on lisättävä paketti <tt>docbook-to-man</tt>. Man-sivu asennetaan paikoilleen <tt>dh_installman</tt>-komennolla kuten edellä.
 
[[GNU]]:n projekteille, jollainen Hellokin on, toimii seuraavanlainen watch-tiedosto:
version=4
<nowiki>http://ftp.gnu.org/gnu/@PACKAGE@/</nowiki> \
    @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate


== 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.10</tt>) ja aja komento
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
  debuild
  debuild
joka tekee seuraavat asiat:
joka tekee seuraavat asiat:
Rivi 262: Rivi 329:


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.10-1_amd64.build</tt> – kääntämisloki (''build log'')
*<tt>hello_2.2.orig.tar.gz</tt> - alkuperäinen lähdekoodi
*<tt>hello_2.10-1_amd64.changes</tt> [[gpg]]:llä allekirjoitettu tiedosto, joka sisältää paketin muutoslokin (<tt>debian/changelog</tt>) ja pakettiin liittyvien tiedostojen [[SHA]]1- ja SHA256-summat
*<tt>hello_2.2-1.dsc</tt> - [[gpg]]:llä allekirjoitettu <tt>control</tt>-tiedoston kaltainen tiedosto, jossa on listattu lähdekooditiedoston ja diff-tiedoston [[md5]]-summat
*<tt>hello_2.10-1_amd64.deb</tt> – lopullinen deb-paketti!
*<tt>hello_2.2-1.diff.gz</tt> - [[gzip]]-pakattu [[diff]]-tiedosto lähdekoodiin tehdyistä muutoksista
*<tt>hello_2.10-1.debian.tar.xz</tt> – <tt>debian-hakemiston</tt> sisältö [[xz]]-pakattuna tar-arkistona
*<tt>hello_2.2-1_i386.deb</tt> - lopullinen deb-paketti!
*<tt>hello_2.10-1.dsc</tt> [[gpg]]:llä allekirjoitettu <tt>control</tt>-tiedoston kaltainen tiedosto, jossa on listattu lähdekooditiedoston ja diff-tiedoston SHA1- ja SHA256-summat
*<tt>hello_2.2-1_i386.changes</tt> - [[gpg]]:llä allekirjoitettu tiedosto, joka sisältää paketin muutoslokin (<tt>debian/changelog</tt>) ja pakettiin liittyvien tiedostojen md5-summat
*<tt>hello_2.10.orig.tar.gz</tt> – alkuperäinen lähdekoodi


Nyt lopullinen paketti voidaan asentaa [[dpkg]]:llä:
Nyt lopullinen paketti voidaan asentaa [[dpkg]]:llä:
  dpkg -i hello_2.10-1_amd64.deb
  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 277: Rivi 343:


=== Lähdekoodipaketti ===
=== Lähdekoodipaketti ===
Edellä teimme tavallisen ns. ''binääripaketin'', joka sisältää valmiiksi käännetyn ohjelman. Monesti on tarpeen tehdä myös lähdekoodipaketti, joka sisältää pakettiin ja sen kääntämiseen ja asentamiseen liittyvät tiedot (<tt>debian</tt>-hakemisto) ja ohjelman lähdekoodin. Tällöin paketti on mahdollista kääntää ja asentaa jokaiselle sopivalle alustalle kun taas käännetty <tt>.deb</tt>-paketti toimii vain yhdellä alustalla (esim. amd64, i386 tai armhf).
Edellä teimme tavallisen ns. ''binääripaketin'', joka sisältää valmiiksi käännetyn ohjelman. Monesti on tarpeen tehdä myös lähdekoodipaketti, joka sisältää pakettiin ja sen kääntämiseen ja asentamiseen liittyvät tiedot (<tt>debian</tt>-hakemisto) ja ohjelman lähdekoodin. Tällöin paketti on mahdollista kääntää ja asentaa jokaiselle sopivalle alustalle kun taas käännetty <tt>.deb</tt>-paketti toimii vain yhdellä alustalla (esim. x86).


Lähdekoodipaketteja käytetään etenkin kun paketti julkaistaan esimerkiksi lisäämällä se jonkin jakelun virallisiin pakettilähteisiin. Tällöin kehittäjä yleensä vain lähettää palvelimelle lähdekoodipaketin, jonka palvelin sitten kääntää useille eri arkkitehtuureille.
Lähdekoodipaketteja käytetään etenkin kun paketti julkaistaan esimerkiksi lisäämällä se jonkin jakelun virallisiin pakettilähteisiin. Tällöin kehittäjä yleensä vain lähettää palvelimelle lähdekoodipaketin, jonka palvelin sitten kääntää useille eri arkkitehtuureille.
Rivi 285: Rivi 351:
Missä valitsin <tt>-S</tt> tarkoittaa, että luodaan lähdekoodipaketti ja <tt>-sa</tt> sisällyttää pakettiin mukaan alkuperäisen lähdekooditiedoston (<tt>.orig.tar.gz</tt>). Tällöin ylähakemistoon pitäisi ilmestyä samanlaisten tiedostojen kuin luotaessa binääripakettia, paitsi että varsinaista <tt>.deb</tt>-pakettia ei ilmesty.  
Missä valitsin <tt>-S</tt> tarkoittaa, että luodaan lähdekoodipaketti ja <tt>-sa</tt> sisällyttää pakettiin mukaan alkuperäisen lähdekooditiedoston (<tt>.orig.tar.gz</tt>). Tällöin ylähakemistoon pitäisi ilmestyä samanlaisten tiedostojen kuin luotaessa binääripakettia, paitsi että varsinaista <tt>.deb</tt>-pakettia ei ilmesty.  


Nyt lähdekoodipaketti koostuu näistä tiedostoista (<tt>paketti.dsc</tt>, <tt>paketti.orig.tar.gz</tt> ja <tt>paketti.debian.tar.xz</tt>), ja sitä voidaan hallita esimerkiksi <tt>dpkg-source</tt>-ohjelmalla. Jos esimerkiksi olet saanut jostain lähdekoodipaketin, voit purkaa ja kääntää seuraavasti
Nyt lähdekoodipaketti koostuu näistä tiedostoista (<tt>paketti.dsc</tt>, <tt>paketti.orig.tar.gz</tt> ja <tt>paketti.diff.gz</tt>), ja sitä voidaan hallita esimerkiksi <tt>dpkg-source</tt>-ohjelmalla. Jos esimerkiksi olet saanut jostain lähdekoodipaketin, voit purkaa ja kääntää seuraavasti
  dpkg-source -x paketti.dsc
  dpkg-source -x paketti.dsc
  cd paketti
  cd paketti
Rivi 293: Rivi 359:


== Lintian: onnistuiko paketti? ==
== Lintian: onnistuiko paketti? ==
Lintian on ohjelma, joka tarkistaa tekemäsi paketin laadun. Sille annetaan parametrina pakettia luotaessa syntynyt <tt>.changes</tt>-päätteinen tiedosto. Yleensä kannattaa antaa myös valitsimet -E, -v, -i ja -I (iso ''i''), jolloin lintian kertoo tarkemmin, mikä paketissa on vialla:
Lintian on ohjelma, joka tarkistaa tekemäsi paketin laadun. Sille annetaan parametrina pakettia luotaessa syntynyt <tt>.changes</tt>-päätteinen tiedosto. Yleensä kannattaa antaa myös valitsin -i, jolloin lintian kertoo tarkemmin, mikä paketissa on vialla:
  lintian -EviI hello_2.10-1_amd64.changes
  lintian -i hello_2.2-1_i386.changes
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.


Rivi 301: Rivi 367:
== 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ä.
On olemassa monia erilaisia järjestelmiä patch-tiedostojen hallintaan. Seuraavaksi esitellään kaikkein matalimman tason vaihtoehto, eli emme käytä mitään erillistä toimintaa helpottavaa järjestelmää. Kun tietää, mitä pellin alla tapahtuu, voi alkaa käyttämään esimerkiksi [[CDBS]]:n tarjoamia vaihtoehtoja tai [[quilt]]-järjestelmää.
(Huomio! Debianin kehittäjien keskuudessa on keskusteltu patch-järjestelmien yhdenmukaistamisesta Debianin lähdekoodipaketeissa. Tässä artikkelissa esitetty tapa ei välttämättä ole suositeltava käytäntö, vaikka se sinänsä toimiikin. Aika paljon kannatusta on saanut esimerkiksi [[quilt]]-niminen patch-järjestelmä.)
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  # Oikea hakemisto
        # Kaikille .patch-päätteisille tiedostoille patches-hakemistossa
@patches=debian/patches/*.patch; for patch in $$patches; do \ 
test -f $$patch || continue; \
echo "Applying $$patch"; \
patch -stuN -p1 < $$patch || exit 1; \  # Otetaan pathci käyttöön
done
touch $@
# Patchien poistaminen (ajettaessa make clean), palauttaa lähdekoodin alkuperäiseksi
unpatch:
dh_testdir
@if test -f patch-stamp; then \
patches=debian/patches/*.patch; \
for patch in $$patches; do \  # Kerätään kaikki patchit
reversepatches="$$patch $$reversepatches"; \
done; \
for patch in $$reversepatches; do \
test -f $$patch || continue; \
echo "Reversing $$patch"; \
patch -suRf -p1 < $$patch || exit 1; \  # Poistetaan patchi
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


== Muut pakettityypit ==
== Muut pakettityypit ==
Rivi 309: Rivi 424:


Debhelper mahdollistaa useampien pakettien luomisen yhdestä lähdekoodipaketista varsin yksinkertaisesti. Ensinnäkin jokaiselle paketille kirjoitetaan oma osio <tt>debian/control</tt>-tiedostoon. Tiedostoon tulee aluksi normaalisti lähdekoodipaketin tiedot, ja tämän jälkeen luotavien binääripakettien tiedot peräkkäin. Esimerkki:
Debhelper mahdollistaa useampien pakettien luomisen yhdestä lähdekoodipaketista varsin yksinkertaisesti. Ensinnäkin jokaiselle paketille kirjoitetaan oma osio <tt>debian/control</tt>-tiedostoon. Tiedostoon tulee aluksi normaalisti lähdekoodipaketin tiedot, ja tämän jälkeen luotavien binääripakettien tiedot peräkkäin. Esimerkki:
<source lang="debcontrol">
<pre>
Source: hello
Source: hello
Section: unknown
Section: unknown
Priority: extra
Priority: extra
Maintainer: Paketin Tekijä <foo@bar.com>
Maintainer: Ylläpitäjä <sähkö@ơsti>
Build-Depends: debhelper (>= 9), autotools-dev
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.9.8
Standards-Version: 3.7.3


Package: hello
Package: hello
Rivi 330: Rivi 445:
Description: Hellon ohjeet
Description: Hellon ohjeet
  Monipuoliset käyttöohjeet hello world -sovelluksen käyttöön.
  Monipuoliset käyttöohjeet hello world -sovelluksen käyttöön.
</source>
</pre>
 
Tämän jälkeen muutetaan paketin asentamista (<tt>debian/rules</tt>) siten, että esimerkiksi pakettiin <tt>hello</tt> kuuluvat tiedostot asennettaisiin hakemistoon <tt>debian/hello/</tt> ja paketin <tt>hello-doc</tt>-tiedostot hakemistoon <tt>debian/hello-doc</tt>. Näihin hakemistoihin tiedostot asennetaan kuten normaalisti luotaessa vain yhtä pakettia, eli esimerkiksi ajettavat ohjelmat voitaisiin sijoittaa polkuun <tt>debian/hello/usr/bin/</tt>.


Tämän jälkeen muutetaan paketin asentamista (<tt>debian/install</tt>) siten, että esimerkiksi pakettiin <tt>hello</tt> kuuluvat tiedostot asennettaisiin hakemistoon <tt>debian/hello/</tt> ja paketin <tt>hello-doc</tt>-tiedostot hakemistoon <tt>debian/hello-doc</tt>. Näihin hakemistoihin tiedostot asennetaan kuten normaalisti luotaessa vain yhtä pakettia, eli esimerkiksi ajettavat ohjelmat voitaisiin sijoittaa polkuun <tt>debian/hello/usr/bin/</tt>.
Tällaisessa tilanteessa ei yleensä ole järkevää käyttää <tt>dirs</tt>-tiedostoa luomaan samat hakemistot molempiin paketteihin, koska luultavasti samoihin hakemistoihin ei sijoiteta tiedostoja eri paketeissa. Sen sijaan voidaan käyttää pakettikohtaisia tiedostoja, esimerkiksi <tt>hello.dirs</tt> ja <tt>hello-doc.dirs</tt>.


Jos jokin Debhelperin komento (muotoa <tt>dh_jotain</tt>) halutaan <tt>rules</tt>-tiedostossa ajaa vain tietylle paketille, voidaan käyttää valitsinta <tt>--package</tt> eli lyhyemmin <tt>-p</tt>, esimerkiksi komennolla
Jos jokin Debhelperin komento (muotoa <tt>dh_jotain</tt>) halutaan <tt>rules</tt>-tiedostossa ajaa vain tietylle paketille, voidaan käyttää valitsinta <tt>--package</tt>, esimerkiksi komennolla
<source lang="makefile">
dh_installinfo --package=hello
override_dh_installinfo:
dh_installinfo -phello
</source>
asennettaisiin [[info]]-tiedostot vain <tt>hello</tt>-pakettia luotaessa.
asennettaisiin [[info]]-tiedostot vain <tt>hello</tt>-pakettia luotaessa.


Rivi 347: Rivi 461:
#Paketin voi kääntää eri jakeluille ja jopa eri arkkitehtuurille
#Paketin voi kääntää eri jakeluille ja jopa eri arkkitehtuurille


Lisätietoja Pbuilderin käytöstä löytyy artikkelista [[Pbuilder]].
Lisätietoja Pbuilderin käytöstä löytyy artikkelista [[Pbuilder]]
 
== CDBS ==
Edellä tehtiin paketti käyttäen Debhelperiä, jolloin <tt>rules</tt>-tiedoston kirjoittaminen oli hyvinkin työlästä. CDBS (''Common Debian Build System'') on toinen lähestymistapa pakettien luomiseen: se yksinkertaistaa rutiinitehtäviä jolloin esimerkiksiä [[Autotools]]ia käyttävän paketin <tt>rules</tt>-tiedosto vaatii periaatteessa vain 4 riviä!
 
Lisätietoja CDBS:n käytöstä löytyy artikkelista [[CDBS]].


== Paketin päivittäminen ja muokkaaminen ==
== Paketin päivittäminen ja muokkaaminen ==
Rivi 373: Rivi 492:


== Pakettini on valmis, miten saan sen jakeluni pakettilähteisiin ==
== Pakettini on valmis, miten saan sen jakeluni pakettilähteisiin ==
Paketin saaminen jakelun virallisiin pakettilähteisiin on jakelun käytännöistä riippuen enemmän tai vähemmän työläs prosessi, johtuen muun muassa laadunvarmistuksesta. Teknisellä tasolla paketit viedään jakeluihin [[dput]]- tai [[dupload]]-työkaluilla. Katso lisää näiden työkalujen käytöstä näiden omilta sivuilta.
Paketin saaminen jakelun virallisiin pakettilähteisiin on jakelun käytännöistä riippuen enemmän tai vähemmän työläs prosessi. Debianilla on käytössä [http://mentors.debian.net mentors.debian.net]-palvelu, jonne kaikki voivat lähettää omia pakettejaan tarjolle. Tämän jälkeen paketille hankitaan halukas "sponsori", joka on kokenut Debian-kehittäjä jolla on oikeudet lisätä paketteja virallisiin pakettilähteisiin. Sponsoreita haetaan yleensä lähettämällä viesti <tt>debian-mentors</tt>-sähköpostilistalle sivustolta löytyvien ohjeiden mukaan. Tämän jälkeen joku paketista kiinnostunut kehittäjä tarkistaa sen ja antaa yleensä korjausehdotuksia. Kun paketti on hänen mielestään riittävän laadukas, hän lisää sen pakettilähteisiin. Prosessi voi paketin laadusta ja sponsoroijasta riippuen kestää pitkäänkin.
 
Debianilla on käytössä [http://mentors.debian.net mentors.debian.net]-palvelu, jonne kaikki voivat lähettää omia pakettejaan tarjolle lähdekoodimuodossa. Tämän jälkeen paketille hankitaan/pyydetään halukas "sponsori", joka on kokenut Debian-kehittäjä jolla on oikeudet lisätä paketteja virallisiin pakettilähteisiin. Sponsoreita haetaan yleensä lähettämällä viesti <tt>debian-mentors</tt>-sähköpostilistalle sivustolta löytyvien ohjeiden mukaan. Tämän jälkeen joku paketista kiinnostunut kehittäjä tarkistaa sen ja antaa yleensä korjausehdotuksia. Kun paketti on hänen mielestään riittävän laadukas, hän lisää sen pakettilähteisiin. Prosessi voi paketin laadusta ja sponsoroijasta riippuen kestää pitkäänkin, ja vapaaehtoisuuteen perustamalla saattaa vaatia omaa aktiivisuutta ja kohteliasta ajoittaista tiediustelua.
 
Virallisten pakettilähteiden lisäksi voit myös ylläpitää omaa. Paketteja voi myös jakaa helposti esimerkiksi [[Launchpad | Launchpadin]] tarjoaman [[PPA]]-ominaisuuden avulla. PPA automatisoi paketin kääntämistä ja julkaisua. Halutessasi voit myös vain yksinkertaisesti jakaa tekemääsi deb-tiedostoa millä tahansa tiedostonjakotekniikalla.
 
==Katso myös==
*[[CDBS]]


==Aiheesta muualla==
==Aiheesta muualla==
*[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]
*[http://www.debian.org/doc/debian-policy/ Debian policy] - Debianin käytäntöjä ja sääntöjä
*[http://www.debian.org/doc/debian-policy/ Debian policy] - Debianin käytäntöjä ja sääntöjä
*Ubuntun [https://wiki.ubuntu.com/PackagingGuide PackagingGuide]-opas
*Ubuntun [https://wiki.ubuntu.com/MOTU/School/PackagingBasics PackagingBasics]-opas
*[http://wiki.ubuntu.com/PackagingGuide Packaging guide - Ubuntu Wiki]
*[http://doc.ubuntu.com/ubuntu/packagingguide/C/index.html Ubuntu Packaging Guide]
*[https://debian-administration.org/article/286/Setting_up_your_own_APT_repository_with_upload_support Setting up your own APT repository with upload support]
*[http://www.debian-administration.org/articles/286 Setting up your own APT reposity]
*Vincent Bernat: [https://vincent.bernat.im/en/blog/2016-pragmatic-debian-packaging.html Pragmatic Debian packaging]


[[Luokka:Ohjeet]]
[[Luokka:Ohjeet]]
[[Luokka:Paketinhallinta]]
[[Luokka:Paketinhallinta]]
[[Luokka:Debian GNU/Linux]]
[[Luokka:Debian GNU/Linux]]
Wikin materiaali on kaikkien vapaasti käytettävissä Creative Commons 3.0 - nimi mainittava -lisenssin alaisuudessa. TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!

Muokataksesi tätä sivua vastaa alla olevaan kysymykseen (lisätietoja):

Peruuta Muokkausohjeet (avautuu uuteen ikkunaan)