Ero sivun ”Deb-paketin tekeminen” versioiden välillä

Siirry navigaatioon Siirry hakuun
6 189 merkkiä poistettu ,  29. heinäkuuta 2016
ei muokkausyhteenvetoa
(CDBS poistettu)
Ei muokkausyhteenvetoa
Rivi 60: Rivi 60:


=== control ===
=== control ===
Tiedostossa <tt>debian/control</tt> kerrotaan perustiedot paketista ja sen riippuvuuksista. Meidän tapauksessamme dh_make loi seuraavanlaisen pohjan (rivinumerot lisätty):
Tiedostossa <tt>debian/control</tt> kerrotaan perustiedot paketista ja sen riippuvuuksista. Meidän tapauksessamme dh_make loi seuraavanlaisen pohjan:
<pre>
<source lang="debcontrol" line>
Source: hello
Source: hello
Section: unknown
Section: unknown
Priority: optional
Priority: optional
Maintainer: Paketin Tekijä <foo@bar.com>
Maintainer: Paketin Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 9), autotools-dev
Build-Depends: debhelper (>= 9), autotools-dev
Standards-Version: 3.9.8
Standards-Version: 3.9.8
Homepage: <insert the upstream URL, if relevant>
Homepage: <insert the upstream URL, if relevant>
8  #Vcs-Git: git://anonscm.debian.org/collab-maint/hello.git
Vcs-Git: git://anonscm.debian.org/collab-maint/hello.git
9  #Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/hello.git
Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/hello.git
10
 
11 Package: hello
Package: hello
12 Architecture: any
Architecture: any
13 Depends: ${shlibs:Depends}, ${misc:Depends}
Depends: ${shlibs:Depends}, ${misc:Depends}
14 Description: <insert up to 60 chars description>
Description: <insert up to 60 chars description>
15 <insert long description, indented with spaces>
<insert long description, indented with spaces>
</pre>
</source>
Riveillä 1–9 on ''lähdekoodipaketin'' (engl. ''source'') perustiedot:
Riveillä 1–9 on ''lähdekoodipaketin'' (engl. ''source'') perustiedot:
*Rivillä 1 on lähdekoodipaketin nimi
*Rivillä 1 on lähdekoodipaketin nimi
Rivi 91: Rivi 91:
*Rivillä 11 on varsinaisen binääripaketin nimi. Yleensä se on sama kuin lähdekoodipaketin nimi.
*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. se on ohjepaketti tai [[Perl]]-skripti), arkkitehtuuriksi laitetaan "all".
*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. se on ohjepaketti tai [[Perl]]-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: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.
*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ä:
*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ä:
<pre>
<source lang="debcontrol" line>
Source: hello
Source: hello
Section: text
Section: text
Priority: optional
Priority: optional
Maintainer: Tekijä <foo@bar.com>
Maintainer: Paketin Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 9), autotools-dev
Build-Depends: debhelper (>= 9), autotools-dev
Standards-Version: 3.9.8
Standards-Version: 3.9.8
Rivi 108: Rivi 108:
  Klassinen Hello world -ohjelma, jonka avulla opettelemme  
  Klassinen Hello world -ohjelma, jonka avulla opettelemme  
  deb-pakettien tekemistä.
  deb-pakettien tekemistä.
</pre>
</source>


=== Suositeltavat paketit, ristiriidat ja muut suhteet toisiin paketteihin ===
=== Suositeltavat paketit, ristiriidat ja muut suhteet toisiin paketteihin ===
Rivi 122: Rivi 122:


Jos esimerkiksi pakettimme nyt vaatisi paketin ''foo'' version 2.3 tai uudemman, paketti ''bar'' olisi myös kiva sen kanssa, ja pakettimme ei toimisi yhdessä ''libfoo'':n kanssa, voisimme lisätä seuraavat rivit:
Jos esimerkiksi pakettimme nyt vaatisi paketin ''foo'' version 2.3 tai uudemman, paketti ''bar'' olisi myös kiva sen kanssa, ja pakettimme ei toimisi yhdessä ''libfoo'':n kanssa, voisimme lisätä seuraavat rivit:
Depends: ${shlibs:Depends}, ${misc:Depends}, foo (>=2.3)
<source lang="debcontrol">
Recommends: bar
Depends: ${shlibs:Depends}, ${misc:Depends}, foo (>=2.3)
Conflicts: libfoo
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.
Rivi 138: Rivi 140:
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  -- Tekijän Nimi <sähköposti@osoite.com>  Fri, 29 Jul 2016 11:42:23 +0300
4  -- Paketin Tekijä <foo@bar.com>  Fri, 29 Jul 2016 11:42:23 +0300
</pre>
</pre>
Rivillä 1 on aluksi paketin 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.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.
Rivi 152: Rivi 154:


Koska Hello käyttää autoconfia, osaa paketin luova työkalu tehdä tarvittavat asetukset itse, eikä meidän periaatteessa tarvitse edes koskea <tt>rules</tt>-tiedostoon. Katsotaan nyt kuitenkin sitä malliksi, sillä vähänkin monimutkaisempien pakettien kohdalla sitä on muokattava. Dh_maken luoma malli on seuraava: (rivinumerot lisätty)
Koska Hello käyttää autoconfia, osaa paketin luova työkalu tehdä tarvittavat asetukset itse, eikä meidän periaatteessa tarvitse edes koskea <tt>rules</tt>-tiedostoon. Katsotaan nyt kuitenkin sitä malliksi, sillä vähänkin monimutkaisempien pakettien kohdalla sitä on muokattava. Dh_maken luoma malli on seuraava: (rivinumerot lisätty)
<pre>
<source lang="make" line>
1  #!/usr/bin/make -f
1  #!/usr/bin/make -f
2  # -*- makefile -*-
</source>
3  # Sample debian/rules that uses debhelper.
4  # This file was originally written by Joey Hess and Craig Small.
5  # As a special exception, when this file is copied by dh-make into a
6  # dh-make output file, you may use that output file without restriction.
7  # This special exception was added by Craig Small in version 0.37 of dh-make.
8
9  # Uncomment this to turn on verbose mode.
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.
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.


Rivi 305: Rivi 200:


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 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.
=== dirs ===
Tiedostossa <tt>debian/dirs</tt> luetellaan hakemistot, joiden pitää olla olemassa kun ohjelmaa asennetaan mutta joita ohjelma ei normaalin asennusprosessin aikana luo. Esimerkiksi <tt>/usr/bin</tt> on monesti tällainen.
<tt>dirs</tt>-tiedostossa hakemistot luetellaan omilla riveillään, ja ensimmäinen kauttaviiva jätetään pois. Hellon tapauksessa meille riittää kirjoittaa tähän tiedostoon rivi
usr/bin


=== .ex-päätteiset tiedostot ===
=== .ex-päätteiset tiedostot ===
Rivi 382: Rivi 271:
== 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 439: Rivi 279:


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:
<pre>
<source lang="debcontrol">
Source: hello
Source: hello
Section: unknown
Section: unknown
Priority: extra
Priority: extra
Maintainer: Ylläpitäjä <sähkö@posti>
Maintainer: Paketin Tekijä <foo@bar.com>
Build-Depends: debhelper (>= 5), autotools-dev
Build-Depends: debhelper (>= 9), autotools-dev
Standards-Version: 3.7.3
Standards-Version: 3.9.8


Package: hello
Package: hello
Rivi 460: Rivi 300:
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.
</pre>
</source>


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/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>.
119

muokkausta

Navigointivalikko