Ero sivun ”Deb-paketin tekeminen” versioiden välillä
(→Tehdään paketti!: lähdekoodipaketista) |
|||
(58 välissä olevaa versiota 11 käyttäjän tekeminä ei näytetä) | |||
Rivi 1: | Rivi 1: | ||
[[Debian]]issa ja siihen pohjautuvissa jakeluissa (esim. [[ | [[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. | ||
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]. | 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>). | ||
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]]. | |||
== Valmistelut == | == Valmistelut == | ||
Aluksi on | 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>): | ||
dpkg-dev autoconf dh-make devscripts [[fakeroot]] [[Gpg|gnupg]] build-essential lintian libtool automake pbuilder | |||
Kun | 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>. | ||
== | == Paketoinnin aloitus == | ||
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: | 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: | ||
./configure --prefix=/home/käyttäjä/hello | ./configure --prefix=/home/käyttäjä/hello | ||
[[make]] | [[make]] | ||
Rivi 31: | Rivi 23: | ||
=== Pohja === | === Pohja === | ||
Siirry ohjelman hakemistoon (hello-2. | Siirry ohjelman hakemistoon (hello-2.10) ja aja komento | ||
dh_make -e sinun@sähköpostiosoitteesi -f ../hello-2. | dh_make -e sinun@sähköpostiosoitteesi -f ../hello-2.10.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. Ohjelma kysyy aluksi, minkätyyppistä pakettia olemme luomassa: | ||
Type of package: single | Type of package: (single, indep, library, python) | ||
[s/ | [s/i/l/p]? | ||
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 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. | ||
Huomaa, että <tt>dh_make</tt> kuuluu ajaa vain kerran! Tulevien muutosten | 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. | ||
== 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 | 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>. | ||
[[Autoconf]]ia käyttävien pakettien kanssa | 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. | ||
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>. | |||
== 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. | |||
=== 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: | ||
< | <source lang="debcontrol" line> | ||
Source: hello | |||
Section: unknown | |||
Priority: optional | |||
Maintainer: Paketin Tekijä <foo@bar.com> | |||
Build-Depends: debhelper (>= 9), autotools-dev | |||
Standards-Version: 3.9.8 | |||
Homepage: <insert the upstream URL, if relevant> | |||
Vcs-Git: git://anonscm.debian.org/collab-maint/hello.git | |||
Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/hello.git | |||
Package: hello | |||
Architecture: any | |||
</ | Depends: ${shlibs:Depends}, ${misc:Depends} | ||
Riveillä | Description: <insert up to 60 chars description> | ||
*Rivillä 1 on lähdekoodipaketin nimi | <insert long description, indented with spaces> | ||
*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ä]. | </source> | ||
*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 | Riveillä 1–9 on ''lähdekoodipaketin'' (engl. ''source'') perustiedot: | ||
*Neljännellä rivillä on paketin tekijän nimi ja sähköpostiosoite | * Rivillä 1 on 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ä 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ä 6 kerrotaan, minkä ''Debian Policy'' -standardin version mukainen paketti on. Tähän ei tarvitse koskea. | * 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ä | * Neljännellä rivillä on paketin tekijän nimi ja sähköpostiosoite | ||
*Rivillä | * 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ä | * Rivillä 6 kerrotaan, minkä ''Debian Policy'' -standardin version mukainen paketti on. Tähän ei tarvitse koskea. | ||
*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ä: | * Riville 7 kirjoitetaan ohjelman kotisivu. | ||
< | * 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. | ||
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: | Priority: optional | ||
Maintainer: Tekijä <foo@bar.com> | Maintainer: Paketin Tekijä <foo@bar.com> | ||
Build-Depends: debhelper (>= | Build-Depends: debhelper (>= 9), autotools-dev | ||
Standards-Version: 3. | Standards-Version: 3.9.8 | ||
Homepage: https://www.gnu.org/software/hello/ | |||
Package: hello | Package: hello | ||
Rivi 91: | Rivi 91: | ||
Klassinen Hello world -ohjelma, jonka avulla opettelemme | Klassinen Hello world -ohjelma, jonka avulla opettelemme | ||
deb-pakettien tekemistä. | deb-pakettien tekemistä. | ||
</ | </source> | ||
=== Suositeltavat paketit, | ==== Suositeltavat paketit, ristiriidat ja muut suhteet toisiin paketteihin ==== | ||
Riippuvuuksien lisäksi paketti voi myös suositella | 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 apt tukee seuraavia suhteita pakettien välillä: | Riippuvuuksien lisäksi apt tukee seuraavia suhteita pakettien välillä: | ||
Rivi 100: | Rivi 100: | ||
*<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 tätä pakettia ei voida asentaa. | *<tt>Conflicts</tt>: Paketit, joiden kanssa samaan järjestelmään 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) | |||
Recommends: bar | |||
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 | 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). | ||
=== 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.10-1) unstable; urgency=medium | ||
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 -- Paketin Tekijä <foo@bar.com> Fri, 29 Jul 2016 11:42:23 +0300 | ||
</pre> | </pre> | ||
Rivillä 1 on aluksi | 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. | ||
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. | ||
Yleensä paketteihin tehdyt muutokset korjaavat joitain vianhallintajärjestelmään ilmoitettuja vikoja (bugeja). Jos paketti korjaa jonkin ilmoitetun vian, se ilmoitetaan muutoslokissa. Jos paketti esimerkiksi korjaa Debianin vianseurantajärjestelmän bugin numero 123456, tulee muutoslokissa esiintyä merkkijono <tt>Closes: #123456</tt>. | |||
Muutoslokia pystyy muokkaamaan joko muokkaamalla tekstitiedostoa suoraan tai käyttämällä [[dch]]-komentoa (tai sen pidempää muotoa, komentoa <tt>debchange</tt>). Sopivan pohjan uudelle muutokselle saa luotua komennolla <tt>dch -i</tt>. Tämä avaa muutoslokin <tt>EDITOR</tt>-[[ympäristömuuttuja]]ssa asetettuun tekstieditoriin. Muutoksen tekijän nimi haetaan ympäristömuuttujasta <tt>DEBFULLNAME</tt> tai <tt>NAME</tt> ja sähköpostiosoite ympäristömuuttujasta <tt>DEBEMAIL</tt> tai <tt>EMAIL</tt>. | |||
=== rules === | === rules === | ||
Rivi 132: | 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> | ||
#!/usr/bin/make -f | |||
# See debhelper(7) (uncomment to enable) | |||
# output every command that modifies files on the build system. | |||
#export DH_VERBOSE = 1 | |||
# see FEATURE AREAS in dpkg-buildflags(1) | |||
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all | |||
# see ENVIRONMENT in dpkg-buildflags(1) | |||
# 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 | |||
%: | |||
dh $@ --with autotools_dev | |||
# dh_make generated override targets | |||
# This is example for Cmake (See https://bugs.debian.org/641051 ) | |||
#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''' | |||
|'''Kuvaus''' | |||
|- | |||
|<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_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> | |||
|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> | |||
|Laskee [[md5sum|MD5]]-tarkistussummat paketin tiedostoille | |||
|- | |||
|<tt>dh_install</tt> | |||
|Jos ohjelma ei asenna kaikkia tarpeellisia tiedostoja oikeisiin hakemistoihin autoconfin avulla (esim. komennolla <tt>make install</tt>), voi käyttää tätä apufunktiota, jolle kerrotaan asennettavat tiedostot ja hakemistot <tt>debian/''paketinnimi''.install</tt>-tiedostossa | |||
|- | |||
|<tt>dh_installchangelog</tt> | |||
|Asentaa muutoslokin polkuun <tt>/usr/share/doc/package/changelog</tt>. Jos komennolle annetaan parametrina paketin mukana tulevan muutoslokin tiedostonimi, asennetaan myös se. | |||
|- | |||
|<tt>dh_shlibdeps</tt> | |||
|Määrittää paketin riippuvuuksia binääritiedostoihin linkitettyjen kirjastotiedostojen perusteella | |||
|- | |||
|<tt>dh_installdocs</tt> | |||
|Asentaa <tt>debian/docs</tt>-tiedostossa listatut tiedostot ja mm. <tt>debian/README.debian</tt> ja <tt>debian/copyright</tt>-tiedostot polkuun <tt>/usr/share/doc/paketti</tt>. | |||
|} | |||
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 | 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 === | ||
Tässä tiedostossa ilmoitamme, mitä versiota debhelperistä paketista käytetään. Kirjoitushetkellä viimeisin vakaa versio on 9. | |||
=== source/format === | |||
Tätä tiedostoa ei tarvitse muuttaa. Sen sisältö on: | |||
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 270: | Rivi 230: | ||
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ä. Seuraavassa esitellään kuitenkin muutamia yleisimmin käytettyjä tiedostoja joita luultavasti tulet joskus tarvitsemaan: | ||
==== cron.d ==== | |||
Tiedostoon <tt>cron.d</tt> kirjoitetaan rivit, jotka halutaan lisätä <tt>cron</tt>-järjestelmään. Rivit kirjoitetaan samassa muodossa kuin missä cronille annetaan suoritettavia tehtäviä. Katso lisätietoja artikkelista [[cron]]. | |||
==== init.d ==== | |||
[[init]]-skripti, joka asennetaan polkuun <tt>/etc/init.d</tt> <tt>rules</tt>-tiedoston komennolla <tt>dh_installinit</tt>. | |||
==== manpage.1 ==== | |||
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 ==== | |||
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. | |||
[[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. | 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 | ||
debuild | |||
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 281: | Rivi 258: | ||
*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]]ia, 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.10-1_amd64.build</tt> – kääntämisloki (''build log'') | ||
*<tt>hello_2. | *<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. | *<tt>hello_2.10-1_amd64.deb</tt> – lopullinen deb-paketti! | ||
*<tt>hello_2. | *<tt>hello_2.10-1.debian.tar.xz</tt> – <tt>debian-hakemiston</tt> sisältö [[xz]]-pakattuna tar-arkistona | ||
*<tt>hello_2. | *<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.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. | dpkg -i hello_2.10-1_amd64.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 299: | Rivi 277: | ||
=== 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. | 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). | ||
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 307: | Rivi 285: | ||
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. | 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 | ||
dpkg-source -x paketti.dsc | dpkg-source -x paketti.dsc | ||
cd paketti | cd paketti | ||
debuild | |||
Ilman <tt>debuildin</tt> <tt>-sa</tt>-valitsinta voi luoda paketin, joka ei sisällä alkuperäistä lähdekoodia. Tälle on käyttöä silloin, kun paketteja pidetään ulkopuolisessa pakettivarastossa ja uusi versio voidaan julkaista vain lähettämällä palvelimelle uusi lähdekoodipaketti ilman alkuperäistä lähdekoodia | Ilman <tt>debuildin</tt> <tt>-sa</tt>-valitsinta voi luoda paketin, joka ei sisällä alkuperäistä lähdekoodia. Tälle on käyttöä silloin, kun paketteja pidetään ulkopuolisessa pakettivarastossa ja uusi versio voidaan julkaista vain lähettämällä palvelimelle uusi lähdekoodipaketti ilman alkuperäistä lähdekoodia. Tällainen tilanne tulee eteen, kun paketista tehdään uusi versio joka ei muuta itse ohjelman lähdekoodia tai muuttaa sitä erillisellä <tt>patch</tt>-tiedostolla (eli ohjelman tekijä ei ole julkaissut uutta versiota, mutta paketin tekijä tekee muutoksia joko itse ohjelmaan tai paketointiin). | ||
== Lintian | == Lintian: onnistuiko paketti? == | ||
Lintian | 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 - | lintian -EviI hello_2.10-1_amd64.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. | ||
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 varoittaa niistä. Yleensä paketin tulisi olla sellainen, ettei lintian löydä siitä 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ä. | ||
== Muut pakettityypit == | |||
===Multi-binary: Monta pakettia yhdestä lähdekoodipaketista === | |||
Joskus tulee eteen tilanne, jossa yksi ohjelma on jaettava useampaan eri pakettiin. Tällainen tilanne tulee eteen mm. silloin, kun paketoidaan suurta peliä: yleensä peleissä itse käännetty ohjelma vie murto-osan siitä tilasta, jonka pelin datatiedostot vievät. Jos koko ohjelma laitettaisiin yhteen pakettiin, käytettäisiin turhaan palvelimen levytilaa ja resursseja, kun samat alustariippumattomat datatiedostot kopioitaisiin jokaiselle arkkitehtuurille tehtyyn pakettiin. | |||
Toinen esimerkki tilanteesta, jossa ohjelman jakaminen moneen pakettiin on järkevää on ohjelma, jonka mukana tulee paljon (esimerkiksi jopa kymmeniä megatavuja) dokumentaatiota ja ohjeita. | |||
: | |||
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"> | |||
Source: hello | |||
< | Section: unknown | ||
Priority: extra | |||
Maintainer: Paketin Tekijä <foo@bar.com> | |||
Build-Depends: debhelper (>= 9), autotools-dev | |||
Standards-Version: 3.9.8 | |||
Package: hello | |||
Architecture: any | |||
Depends: ${shlibs:Depends}, ${misc:Depends} | |||
Recommends: hello-doc | |||
Description: Hello-ohjelma | |||
Klassinen hello-ohjelma, joka tulostaa tekstin | |||
hello world. | |||
Package: hello-doc | |||
Architecture: all | |||
Depends: hello | |||
Description: Hellon ohjeet | |||
Monipuoliset käyttöohjeet hello world -sovelluksen käyttöön. | |||
</source> | |||
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>. | |||
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 | |||
<source lang="makefile"> | |||
override_dh_installinfo: | |||
dh_installinfo -phello | |||
</source> | |||
asennettaisiin [[info]]-tiedostot vain <tt>hello</tt>-pakettia luotaessa. | |||
</ | |||
== Pbuilder == | == Pbuilder == | ||
Pbuilder on järjestelmä, joka kääntää ja rakentaa paketit omassa pienessä [[chroot]]-järjestelmässä. Pbuilderia käytettäessä saavutetaan mm. seuraavat edut: | |||
#Käännösaikaiset riippuvuudet (''build-depends'') asennetaan automaattisesti | |||
#Paketti käännetään puhtaassa ja mahdollisimman yksinkertaisessa ympäristössä, johon ei ole asennettu mitään ylimääräistä. Näin varmistetaan, että paketin kääntäminen onnistuu kaikissa järjestelmissä ja että käännösaikaiset riippuvuudet ovat riittävät. | |||
#Paketin voi kääntää eri jakeluille ja jopa eri arkkitehtuurille | |||
Lisätietoja Pbuilderin käytöstä löytyy artikkelista [[Pbuilder]]. | |||
== Paketin päivittäminen ja muokkaaminen == | |||
Edellä käsiteltiin uuden paketin tekemistä. Monesti eteen tulee kuitenkin myös tilanteita, joissa jo olemassa olevaa pakettia tulee muuttaa tai päivittää. Päivittämiselle tulee tarve kun paketoidusta ohjelmasta julkaistaan uusi versio tai vaikkapa silloin, kun ohjelmassa oleva ohjelmavirhe (bugi) korjataan ''patch''-tiedostolla. | |||
Muokkauksen tekeminen alkaa hakemalla lähdekoodipaketti. Tämä onnistuu kätevästi komennolla <tt>[[apt-get]] source paketti</tt>. Tällöin <tt>apt</tt> hakee nykyiseen hakemistoon paketin <tt>.dsc</tt>-tiedoston, muutokset sisältävän <tt>.diff.gz</tt>-tiedoston ja alkuperäisen ohjelman sisältävän <tt>.tar.gz</tt>-paketin. Lisäksi hakemistoon syntyy <tt>ohjelmannimi-versio</tt>-hakemisto, jonka sisältä löytyy sekä itse ohjelma että siihen tehdyt muutokset (mm. <tt>debian</tt>)-hakemisto. | |||
== | Jos nyt halutaan esimerkiksi korjata ohjelmassa oleva bugi, voidaan edellä neuvotulla tavalla lisätä pakettiin uusi <tt>patch</tt>-tiedosto. Tämän lisäksi on aina muistettava kirjata tiedot muutoksesta <tt>debian/changelog</tt>-tiedostoon. Tämä onnistuu helpoiten komennolla <tt>dch -i</tt>. Muutoslokin on tarkoitus tarkkaan kertoa, mitä muutoksia on tehty. Yleensä muutos korjaa jonkun vianhallintajärjestelmässä olevan ilmoitetun bugin, jolloin muutoslokissa mainitaan tämän bugin numero (Debianin vianseurantajärjestelmän kanssa käytetään syntaksia <tt>Closes: #numero</tt> ja Ubuntun Launchpad-järjestelmässä ilmoitettujen bugien kanssa syntaksia LP: #numero). | ||
Jos paketoidusta ohjelmasta on ilmestynyt uusi versio, täytyy toimia hieman eri tavalla. Ensimmäinen tehtävä on ladata uuden ohjelman lähdekoodipaketti ja tutustua uuden version mukana tuomiin muutoksiin (<tt>NEWS</tt>- tai <tt>CHANGELOG</tt>-tiedosto). Tämän jälkeen puretaan paketti tiedostoon <tt>ohjelmannimi-versio</tt> ja uudelleennimetään lähdekoodipakettitiedosto nimelle <tt>ohjelman_versio.orig.tar.gz</tt>. Eli aivan kuin olisimme paketoimassa uutta ohjelmaa. | |||
Tämän jälkeen voidaan kopioida vanha ''debianisointi'' eli <tt>debian</tt>-hakemisto vanhasta paketista uuteen pakettiin. Helpoimmissa tapauksissa tämä riittää, mutta etenkin käytettävien patchien toimiminen ja tarpeellisuus uuden version kanssa on todella tärkeä selvittää. Lisäksi ohjelman kääntäminen ja asentaminen saattaa uuden version kanssa tapahtua eri tavalla. Tällaisessa tapauksessa muutoslokiin kirjataan maininta uudesta versiosta ("New upstream release") ja kerrotaan myös, mitä muita muutoksia pakettiin tehtiin (esimerkiksi jätettiin pois tarpeettomaksi käynyt patchi. | |||
Uuden version numero riippuu siitä, paketoitiinko uusi versio vai korjattiinko vain vanhassa versiossa oleva ongelma. Jos itse ohjelman versio ei muuttunut, kasvatetaan paketin "revision"-numeroa yhdellä, esimerkiksi versio "0.4.1-2" muuttuisi versioksi "0.4.1-3". Jos taas ohjelman versio muuttui, asetetaan paketin versioksi uuden version numero ja "revisioniksi" asetetaan 1: "0.4.1-2" -> "0.4.2-1". | |||
Näiden toimenpiteiden jälkeen voidaan paketti luoda kuten normaalistikin <tt>debuild</tt>- ja <tt>pdebuild</tt>-komennoilla. | |||
===Debdiff=== | |||
Debdiff on [[diff]]in kaltainen ohjelma, joka vertailee kahta deb-pakettia. Sitä käytetään mm. silloin, kun lähetetään itse tehty korjaus ohjelman alkuperäiselle paketoijalle tai vianseurantajärjestelmään. Yleensä näin toimitaan silloin, kun muutoksen tekijällä ei ole oikeutta lähettää korjauksiaan suoraan virallisiin pakettivarastoihin. | |||
Debdiffille annetaan kahden lähdekoodipaketin <tt>.dsc</tt>-tiedostot: | |||
debdiff vanha.dsc uusi.dsc | |||
Jolloin ohjelma tulostaa erot ruudulle. Yleensä erot kannattaa [[Komentorivin perusteet#putkitus|putkittaa]] tiedostoon: | |||
debdiff vanha.dsc uusi.dsc > erot.debdiff | |||
== 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. | |||
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/ | *Ubuntun [https://wiki.ubuntu.com/PackagingGuide PackagingGuide]-opas | ||
*[http:// | *[http://wiki.ubuntu.com/PackagingGuide Packaging guide - Ubuntu Wiki] | ||
* [ | *[https://debian-administration.org/article/286/Setting_up_your_own_APT_repository_with_upload_support Setting up your own APT repository with upload support] | ||
*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]] |
Nykyinen versio 23. helmikuuta 2017 kello 16.36
Debianissa ja siihen pohjautuvissa jakeluissa (esim. Ubuntussa ja Linux Mintissä) käytetään Dpkg-paketinhallintajärjestelmää. Dpkg:ssa 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 ja mm. komentorivin käyttö ovat hallussa.
Tässä oppaassa luodaan aluksi malliksi yksinkertainen paketti GNU Hello -ohjelmasta, joka on GNU-projektin esimerkkiohjelma. Ohjelman lähdekoodipaketin voi ladata GNU:n palvelimelta. Paketin luomisessa käytetään tässä apuna Debhelper-apuohjelmaa (dh).
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 viimeksi mainittujen välissä (varsinainen muutos + uusi kohta tiedostoon 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. Lisätietoja näistä komennoista löytyy artikkeleista apt-get ja dpkg.
Valmistelut[muokkaa]
Aluksi on hyvä asentaa muutamia perustyökaluja, jotka sisältävät paketointityössä tarvittavia tai valinnaisia apuohjelmia. Asenna siis seuraavat paketit (apt install paketit):
dpkg-dev autoconf dh-make devscripts fakeroot gnupg build-essential lintian libtool automake pbuilder
Kun paketit on asennettu, lataa Hello-ohjelman lähdekoodi ja pura se työhakemistoosi (tar xzvf tiedosto
). Nyt sinulla pitäisi olla työhakemistossasi tiedosto hello-2.10.tar.gz ja hakemisto hello-2.10.
Paketoinnin aloitus[muokkaa]
Aluksi kannattaa kokeilla, että saat ohjelman 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 ~/hello seuraavasti:
./configure --prefix=/home/käyttäjä/hello make make install
Nyt hakemistosta ~/hello pitäisi löytyä alihakemistot bin ja share, joissa Hellon tiedostot ovat.
Putsaa nyt hakemisto, jossa käänsit Hellon komennolla
make distclean
Nyt jos ohjelma kääntyi oikein, voimme aloittaa itse paketin tekemisen.
Pohja[muokkaa]
Siirry ohjelman hakemistoon (hello-2.10) ja aja komento
dh_make -e sinun@sähköpostiosoitteesi -f ../hello-2.10.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:
Type of package: (single, indep, library, python) [s/i/l/p]?
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 debian-alihakemiston, joka sisältää tiedostot, joiden perusteella varsinainen paketti luodaan. Se myös luo ylähakemistoon tiedoston paketti_versio.orig.tar.gz, tässä tapauksessa siis hello_2.10.orig.tar.gz, joka sisältää alkuperäisen lähdekoodipaketin.
Huomaa, että dh_make kuuluu ajaa vain kerran! Tulevien muutosten pohjalla käytetään paketin olemassa olevaa debian-kansiota, eikä dh_makea siis tarvitse ajaa uudelleen.
Asennushakemisto[muokkaa]
Paketin luova työkalu päättelee paketin tiedostot siten, että ohjelma asennetaan sen valvonnassa väliaikaiseen alihakemistoon. Yleensä tämä alihakemisto on debian/paketin_nimi, jonne paketti asennetaan aivan normaalisti: esimerkiksi Hellon binääri menisi hakemistoon debian/hello/usr/bin/hello.
Muiden muassa Autoconfia, CMakea ja QMakea 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 --prefix=/hakemisto/jonne/ohjelma/asennetaan. Paketointiapuohjelma 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 debian/rules.
Asetustiedostot[muokkaa]
dh_make loi debian-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[muokkaa]
Tiedostossa debian/control kerrotaan perustiedot paketista ja sen riippuvuuksista. Meidän tapauksessamme dh_make loi seuraavanlaisen pohjan:
Source: hello
Section: unknown
Priority: optional
Maintainer: Paketin Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 9), autotools-dev
Standards-Version: 3.9.8
Homepage: <insert the upstream URL, if relevant>
Vcs-Git: git://anonscm.debian.org/collab-maint/hello.git
Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/hello.git
Package: hello
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
Riveillä 1–9 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. Osiot on listattu Debian policyssä.
- 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.
- Neljännellä rivillä on paketin tekijän nimi ja sähköpostiosoite
- 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ä 6 kerrotaan, minkä Debian Policy -standardin version mukainen paketti on. Tähän ei tarvitse koskea.
- Riville 7 kirjoitetaan ohjelman kotisivu.
- 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.
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 control-tiedosto voisi näyttää tältä:
Source: hello
Section: text
Priority: optional
Maintainer: Paketin Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 9), autotools-dev
Standards-Version: 3.9.8
Homepage: https://www.gnu.org/software/hello/
Package: hello
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Hello world -ohjelma
Klassinen Hello world -ohjelma, jonka avulla opettelemme
deb-pakettien tekemistä.
Suositeltavat paketit, ristiriidat ja muut suhteet toisiin paketteihin[muokkaa]
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 control-tiedostossa samaan tapaan kuin riippuvuudet.
Riippuvuuksien lisäksi apt tukee seuraavia suhteita pakettien välillä:
- Recommends: Suositeltavat paketit. Yleensä paketteja, joita käytetään käytännössä aina tämän paketin kanssa. Esim. aptitude asentaa nämä automaattisesti, apt vain suosittelee.
- Suggests: Muita tämän paketin kanssa hyviä paketteja. Monet apt:n edustaohjelmat (kuten aptitude) näyttävät tämän listan, apt ei.
- Pre-Depends: 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.
- Conflicts: Paketit, joiden kanssa samaan järjestelmään tätä pakettia ei voida asentaa.
- Provides: Mitkä virtuaaliset paketit tämä paketti toteuttaa.
- Replaces: 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:
Depends: ${shlibs:Depends}, ${misc:Depends}, foo (>= 2.3)
Recommends: bar
Conflicts: libfoo
Vastaavasti on mahdollista asettaa myös lähdekoodipaketille Build-Conflicts ja muut vastaavat suhteet.
copyright[muokkaa]
Paketin tekijänoikeuksista kerrotaan tiedostossa debian/copyright. Tämän tiedoston muoto on periaatteessa vapaa, mutta kannattaa seurata 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).
changelog[muokkaa]
dh_make luo seuraavanlaisen pohjan debian/changelog-tiedostolle: (rivinumerot lisätty)
1 hello (2.10-1) unstable; urgency=medium 2 3 * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> 3 4 -- Paketin Tekijä <foo@bar.com> Fri, 29 Jul 2016 11:42:23 +0300
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.
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.
Yleensä paketteihin tehdyt muutokset korjaavat joitain vianhallintajärjestelmään ilmoitettuja vikoja (bugeja). Jos paketti korjaa jonkin ilmoitetun vian, se ilmoitetaan muutoslokissa. Jos paketti esimerkiksi korjaa Debianin vianseurantajärjestelmän bugin numero 123456, tulee muutoslokissa esiintyä merkkijono Closes: #123456.
Muutoslokia pystyy muokkaamaan joko muokkaamalla tekstitiedostoa suoraan tai käyttämällä dch-komentoa (tai sen pidempää muotoa, komentoa debchange). Sopivan pohjan uudelle muutokselle saa luotua komennolla dch -i. Tämä avaa muutoslokin EDITOR-ympäristömuuttujassa asetettuun tekstieditoriin. Muutoksen tekijän nimi haetaan ympäristömuuttujasta DEBFULLNAME tai NAME ja sähköpostiosoite ympäristömuuttujasta DEBEMAIL tai EMAIL.
rules[muokkaa]
Tiedosto debian/rules on Makefilen tapainen tiedosto, jonka perusteella varsinainen paketti luodaan. Tämän tiedoston perusteella ohjelma käännetään ja asennetaan hakemistoon debian/paketin_nimi, tässä tapauksessa debian/hello. Tähän hakemistoon asentuvien tiedostojen perusteella luodaan varsinainen paketti.
Koska Hello käyttää autoconfia, osaa paketin luova työkalu tehdä tarvittavat asetukset itse, eikä meidän periaatteessa tarvitse edes koskea rules-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)
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1
# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
# see ENVIRONMENT in dpkg-buildflags(1)
# 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
%:
dh $@ --with autotools_dev
# dh_make generated override targets
# This is example for Cmake (See https://bugs.debian.org/641051 )
#override_dh_auto_configure:
# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
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 #!-rivi.
Rivien 6–7 "hardening" viittaa 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 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 debian/rules build tai debian/rules binary, make suorittaa rivin 16 mukaan komennon dh build --with autotools_dev tai dh binary --with autotools_dev. Komento dh build 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:
Komento | Kuvaus |
dh_testdir | Tarkistaa, että ollaan oikeassa hakemistossa |
dh_testroot | Tarkistaa, että meillä on pääkäyttäjän oikeudet kun niitä tarvitaan |
dh_auto_configure | Suorittaa ./configure:n tai vastaavan vaiheen |
dh_auto_build | Kääntää paketin |
dh_auto_install | Suorittaa make installin tai vastaavan asentamisvaiheen |
dh_strip | Ajaa strip-komennon suoritettaville tiedostoille, jolloin niiden koko pienenee |
dh_compress | Pakkaa gzipillä man-sivut ja ohjetiedostot, joiden koko ylittää 4kt |
dh_gencontrol | Luo binääripaketille control-tiedoston ja kopioi sen hakemistoon debian/hello/DEBIAN |
dh_md5sums | Laskee MD5-tarkistussummat paketin tiedostoille |
dh_install | Jos ohjelma ei asenna kaikkia tarpeellisia tiedostoja oikeisiin hakemistoihin autoconfin avulla (esim. komennolla make install), voi käyttää tätä apufunktiota, jolle kerrotaan asennettavat tiedostot ja hakemistot debian/paketinnimi.install-tiedostossa |
dh_installchangelog | Asentaa muutoslokin polkuun /usr/share/doc/package/changelog. Jos komennolle annetaan parametrina paketin mukana tulevan muutoslokin tiedostonimi, asennetaan myös se. |
dh_shlibdeps | Määrittää paketin riippuvuuksia binääritiedostoihin linkitettyjen kirjastotiedostojen perusteella |
dh_installdocs | Asentaa debian/docs-tiedostossa listatut tiedostot ja mm. debian/README.debian ja debian/copyright-tiedostot polkuun /usr/share/doc/paketti. |
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 jotain yleisistä käännösjärjestelmistä (kuten Ant, GNU Autotools, CMake, QMake tai tavallinen Makefile), on rules muokattava sellaiseksi, että ohjelma kääntyy ja asentuu polkuun debian/paketinnimi. Se, miten kääntäminen tapahtuu, riippuu ohjelmasta. Funktion dh_install avulla asennetaan tiedostot oikeisiin hakemistoihin lopullisessa binääripaketissa.
compat[muokkaa]
Tässä tiedostossa ilmoitamme, mitä versiota debhelperistä paketista käytetään. Kirjoitushetkellä viimeisin vakaa versio on 9.
source/format[muokkaa]
Tätä tiedostoa ei tarvitse muuttaa. Sen sisältö on:
3.0 (quilt)
Quilt viittaa patchien hallintaan käyttämäämme ohjelmaan. 3.0:n merkityksestä voi lukea tarkemmin Debian Wikin artikkelista DebSrc3.0.
.ex-päätteiset tiedostot[muokkaa]
dh_make luo debian-hakemistoon monia .ex-päätteisiä tiedostoja. Näitä tiedostoja muokkaamalla on mahdollista esimerkiksi saada paketti lisäämään tehtäviä cronille ja kuvakkeen työpöytäympäristön valikkoon.
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 rules-tiedostossa.
Poista ne .ex-tiedostot, joita et tarvitse. Hellon tapauksessa emme tarvitse näitä. Seuraavassa esitellään kuitenkin muutamia yleisimmin käytettyjä tiedostoja joita luultavasti tulet joskus tarvitsemaan:
cron.d[muokkaa]
Tiedostoon cron.d kirjoitetaan rivit, jotka halutaan lisätä cron-järjestelmään. Rivit kirjoitetaan samassa muodossa kuin missä cronille annetaan suoritettavia tehtäviä. Katso lisätietoja artikkelista cron.
init.d[muokkaa]
init-skripti, joka asennetaan polkuun /etc/init.d rules-tiedoston komennolla dh_installinit.
manpage.1[muokkaa]
Ohjelman man-sivu. Pisteen jälkeen oleva numero kertoo, mihin kategoriaan man-sivu asennetaan (kategoriat on listattu artikkelissa man). Man-sivu asennetaan paikoilleen rules-tiedostossa olevalla komennolla dh_installman debian/mansivu.1. Tiedoston nimi on yleensä muotoa paketinnimi.numero.
watch[muokkaa]
Kertoo uscan-ohjelmalle, miten paketin uudet versiot voi ladata internetistä. Lisätietoja tiedostomuodosta: man 1 uscan
ja Debian Wiki. Watch-tiedosto mahdollistaa lähdekoodipaketin helpon päivittämisen aina uusimpaan versioon.
GNU:n projekteille, jollainen Hellokin on, toimii seuraavanlainen watch-tiedosto:
version=4 http://ftp.gnu.org/gnu/@PACKAGE@/ \ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate
Tehdään paketti![muokkaa]
Nyt kun tarvittavat tiedostot on lopulta muokattu sopiviksi, on aika luoda varsinainen paketti. Siirry ohjelman päähakemistoon (hello-2.10) ja aja komento
debuild
joka tekee seuraavat asiat:
- Siistii paketin (ajaa makella komennon debian/rules clean)
- Kääntää ohjelman (debian/rules build)
- Luo binääripaketin (debian/rules binary)
- Allekirjoittaa .dsc-tiedoston gnupgllä
- Luo ja allekirjoittaa .changes-tiedoston
- Käyttää fakerootia, 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.
Tämän jälkeen, jos kaikki sujui ilman virheitä, ylähakemistosta pitäisi löytyä seuraavat tiedostot:
- hello_2.10-1_amd64.build – kääntämisloki (build log)
- hello_2.10-1_amd64.changes – gpg:llä allekirjoitettu tiedosto, joka sisältää paketin muutoslokin (debian/changelog) ja pakettiin liittyvien tiedostojen SHA1- ja SHA256-summat
- hello_2.10-1_amd64.deb – lopullinen deb-paketti!
- hello_2.10-1.debian.tar.xz – debian-hakemiston sisältö xz-pakattuna tar-arkistona
- hello_2.10-1.dsc – gpg:llä allekirjoitettu control-tiedoston kaltainen tiedosto, jossa on listattu lähdekooditiedoston ja diff-tiedoston SHA1- ja SHA256-summat
- hello_2.10.orig.tar.gz – alkuperäinen lähdekoodi
Nyt lopullinen paketti voidaan asentaa dpkg:llä:
dpkg -i hello_2.10-1_amd64.deb
Kun myöhemmin teet muutoksia pakettiin, voit luoda uuden paketin nopeasti komennolla
fakeroot debian/rules binary
joka ei kuitenkaan käännä ohjelmaa alusta lähtien (tärkeää huomata, jos muutat lähdekoodia).
Lähdekoodipaketti[muokkaa]
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 (debian-hakemisto) ja ohjelman lähdekoodin. Tällöin paketti on mahdollista kääntää ja asentaa jokaiselle sopivalle alustalle kun taas käännetty .deb-paketti toimii vain yhdellä alustalla (esim. amd64, i386 tai armhf).
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ähdekoodipaketti luodaan ajamalla paketin päähakemistossa komento
debuild -S -sa
Missä valitsin -S tarkoittaa, että luodaan lähdekoodipaketti ja -sa sisällyttää pakettiin mukaan alkuperäisen lähdekooditiedoston (.orig.tar.gz). Tällöin ylähakemistoon pitäisi ilmestyä samanlaisten tiedostojen kuin luotaessa binääripakettia, paitsi että varsinaista .deb-pakettia ei ilmesty.
Nyt lähdekoodipaketti koostuu näistä tiedostoista (paketti.dsc, paketti.orig.tar.gz ja paketti.debian.tar.xz), ja sitä voidaan hallita esimerkiksi dpkg-source-ohjelmalla. Jos esimerkiksi olet saanut jostain lähdekoodipaketin, voit purkaa ja kääntää seuraavasti
dpkg-source -x paketti.dsc cd paketti debuild
Ilman debuildin -sa-valitsinta voi luoda paketin, joka ei sisällä alkuperäistä lähdekoodia. Tälle on käyttöä silloin, kun paketteja pidetään ulkopuolisessa pakettivarastossa ja uusi versio voidaan julkaista vain lähettämällä palvelimelle uusi lähdekoodipaketti ilman alkuperäistä lähdekoodia. Tällainen tilanne tulee eteen, kun paketista tehdään uusi versio joka ei muuta itse ohjelman lähdekoodia tai muuttaa sitä erillisellä patch-tiedostolla (eli ohjelman tekijä ei ole julkaissut uutta versiota, mutta paketin tekijä tekee muutoksia joko itse ohjelmaan tai paketointiin).
Lintian: onnistuiko paketti?[muokkaa]
Lintian on ohjelma, joka tarkistaa tekemäsi paketin laadun. Sille annetaan parametrina pakettia luotaessa syntynyt .changes-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 -EviI hello_2.10-1_amd64.changes
Tulosteessa E:-alkavat rivit tarkoittavat virhettä, W:-alkavat varoituksia ja N:-alkavat huomautuksia.
Jos esimerkiksi et poistanut debian-hakemistosta .ex-päätteisiä tiedostoja, lintian varoittaa niistä. Yleensä paketin tulisi olla sellainen, ettei lintian löydä siitä mitään valitettavaa.
Patchit[muokkaa]
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ä.
Muut pakettityypit[muokkaa]
Multi-binary: Monta pakettia yhdestä lähdekoodipaketista[muokkaa]
Joskus tulee eteen tilanne, jossa yksi ohjelma on jaettava useampaan eri pakettiin. Tällainen tilanne tulee eteen mm. silloin, kun paketoidaan suurta peliä: yleensä peleissä itse käännetty ohjelma vie murto-osan siitä tilasta, jonka pelin datatiedostot vievät. Jos koko ohjelma laitettaisiin yhteen pakettiin, käytettäisiin turhaan palvelimen levytilaa ja resursseja, kun samat alustariippumattomat datatiedostot kopioitaisiin jokaiselle arkkitehtuurille tehtyyn pakettiin.
Toinen esimerkki tilanteesta, jossa ohjelman jakaminen moneen pakettiin on järkevää on ohjelma, jonka mukana tulee paljon (esimerkiksi jopa kymmeniä megatavuja) dokumentaatiota ja ohjeita.
Debhelper mahdollistaa useampien pakettien luomisen yhdestä lähdekoodipaketista varsin yksinkertaisesti. Ensinnäkin jokaiselle paketille kirjoitetaan oma osio debian/control-tiedostoon. Tiedostoon tulee aluksi normaalisti lähdekoodipaketin tiedot, ja tämän jälkeen luotavien binääripakettien tiedot peräkkäin. Esimerkki:
Source: hello
Section: unknown
Priority: extra
Maintainer: Paketin Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 9), autotools-dev
Standards-Version: 3.9.8
Package: hello
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Recommends: hello-doc
Description: Hello-ohjelma
Klassinen hello-ohjelma, joka tulostaa tekstin
hello world.
Package: hello-doc
Architecture: all
Depends: hello
Description: Hellon ohjeet
Monipuoliset käyttöohjeet hello world -sovelluksen käyttöön.
Tämän jälkeen muutetaan paketin asentamista (debian/install) siten, että esimerkiksi pakettiin hello kuuluvat tiedostot asennettaisiin hakemistoon debian/hello/ ja paketin hello-doc-tiedostot hakemistoon debian/hello-doc. Näihin hakemistoihin tiedostot asennetaan kuten normaalisti luotaessa vain yhtä pakettia, eli esimerkiksi ajettavat ohjelmat voitaisiin sijoittaa polkuun debian/hello/usr/bin/.
Jos jokin Debhelperin komento (muotoa dh_jotain) halutaan rules-tiedostossa ajaa vain tietylle paketille, voidaan käyttää valitsinta --package eli lyhyemmin -p, esimerkiksi komennolla
override_dh_installinfo:
dh_installinfo -phello
asennettaisiin info-tiedostot vain hello-pakettia luotaessa.
Pbuilder[muokkaa]
Pbuilder on järjestelmä, joka kääntää ja rakentaa paketit omassa pienessä chroot-järjestelmässä. Pbuilderia käytettäessä saavutetaan mm. seuraavat edut:
- Käännösaikaiset riippuvuudet (build-depends) asennetaan automaattisesti
- Paketti käännetään puhtaassa ja mahdollisimman yksinkertaisessa ympäristössä, johon ei ole asennettu mitään ylimääräistä. Näin varmistetaan, että paketin kääntäminen onnistuu kaikissa järjestelmissä ja että käännösaikaiset riippuvuudet ovat riittävät.
- Paketin voi kääntää eri jakeluille ja jopa eri arkkitehtuurille
Lisätietoja Pbuilderin käytöstä löytyy artikkelista Pbuilder.
Paketin päivittäminen ja muokkaaminen[muokkaa]
Edellä käsiteltiin uuden paketin tekemistä. Monesti eteen tulee kuitenkin myös tilanteita, joissa jo olemassa olevaa pakettia tulee muuttaa tai päivittää. Päivittämiselle tulee tarve kun paketoidusta ohjelmasta julkaistaan uusi versio tai vaikkapa silloin, kun ohjelmassa oleva ohjelmavirhe (bugi) korjataan patch-tiedostolla.
Muokkauksen tekeminen alkaa hakemalla lähdekoodipaketti. Tämä onnistuu kätevästi komennolla apt-get source paketti. Tällöin apt hakee nykyiseen hakemistoon paketin .dsc-tiedoston, muutokset sisältävän .diff.gz-tiedoston ja alkuperäisen ohjelman sisältävän .tar.gz-paketin. Lisäksi hakemistoon syntyy ohjelmannimi-versio-hakemisto, jonka sisältä löytyy sekä itse ohjelma että siihen tehdyt muutokset (mm. debian)-hakemisto.
Jos nyt halutaan esimerkiksi korjata ohjelmassa oleva bugi, voidaan edellä neuvotulla tavalla lisätä pakettiin uusi patch-tiedosto. Tämän lisäksi on aina muistettava kirjata tiedot muutoksesta debian/changelog-tiedostoon. Tämä onnistuu helpoiten komennolla dch -i. Muutoslokin on tarkoitus tarkkaan kertoa, mitä muutoksia on tehty. Yleensä muutos korjaa jonkun vianhallintajärjestelmässä olevan ilmoitetun bugin, jolloin muutoslokissa mainitaan tämän bugin numero (Debianin vianseurantajärjestelmän kanssa käytetään syntaksia Closes: #numero ja Ubuntun Launchpad-järjestelmässä ilmoitettujen bugien kanssa syntaksia LP: #numero).
Jos paketoidusta ohjelmasta on ilmestynyt uusi versio, täytyy toimia hieman eri tavalla. Ensimmäinen tehtävä on ladata uuden ohjelman lähdekoodipaketti ja tutustua uuden version mukana tuomiin muutoksiin (NEWS- tai CHANGELOG-tiedosto). Tämän jälkeen puretaan paketti tiedostoon ohjelmannimi-versio ja uudelleennimetään lähdekoodipakettitiedosto nimelle ohjelman_versio.orig.tar.gz. Eli aivan kuin olisimme paketoimassa uutta ohjelmaa.
Tämän jälkeen voidaan kopioida vanha debianisointi eli debian-hakemisto vanhasta paketista uuteen pakettiin. Helpoimmissa tapauksissa tämä riittää, mutta etenkin käytettävien patchien toimiminen ja tarpeellisuus uuden version kanssa on todella tärkeä selvittää. Lisäksi ohjelman kääntäminen ja asentaminen saattaa uuden version kanssa tapahtua eri tavalla. Tällaisessa tapauksessa muutoslokiin kirjataan maininta uudesta versiosta ("New upstream release") ja kerrotaan myös, mitä muita muutoksia pakettiin tehtiin (esimerkiksi jätettiin pois tarpeettomaksi käynyt patchi.
Uuden version numero riippuu siitä, paketoitiinko uusi versio vai korjattiinko vain vanhassa versiossa oleva ongelma. Jos itse ohjelman versio ei muuttunut, kasvatetaan paketin "revision"-numeroa yhdellä, esimerkiksi versio "0.4.1-2" muuttuisi versioksi "0.4.1-3". Jos taas ohjelman versio muuttui, asetetaan paketin versioksi uuden version numero ja "revisioniksi" asetetaan 1: "0.4.1-2" -> "0.4.2-1".
Näiden toimenpiteiden jälkeen voidaan paketti luoda kuten normaalistikin debuild- ja pdebuild-komennoilla.
Debdiff[muokkaa]
Debdiff on diffin kaltainen ohjelma, joka vertailee kahta deb-pakettia. Sitä käytetään mm. silloin, kun lähetetään itse tehty korjaus ohjelman alkuperäiselle paketoijalle tai vianseurantajärjestelmään. Yleensä näin toimitaan silloin, kun muutoksen tekijällä ei ole oikeutta lähettää korjauksiaan suoraan virallisiin pakettivarastoihin.
Debdiffille annetaan kahden lähdekoodipaketin .dsc-tiedostot:
debdiff vanha.dsc uusi.dsc
Jolloin ohjelma tulostaa erot ruudulle. Yleensä erot kannattaa putkittaa tiedostoon:
debdiff vanha.dsc uusi.dsc > erot.debdiff
Pakettini on valmis, miten saan sen jakeluni pakettilähteisiin[muokkaa]
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.
Debianilla on käytössä 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 debian-mentors-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 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[muokkaa]
Aiheesta muualla[muokkaa]
- Debian New Maintainers' Guide
- Debian policy - Debianin käytäntöjä ja sääntöjä
- Ubuntun PackagingGuide-opas
- Packaging guide - Ubuntu Wiki
- Setting up your own APT repository with upload support
- Vincent Bernat: Pragmatic Debian packaging