Ero sivun ”Deb-paketin tekeminen” versioiden välillä
(alkua, jatkan huomenna (päivällä), nyt nukkumaan) |
(välitallennus) |
||
Rivi 41: | Rivi 41: | ||
Paketin luova työkalu päättelee paketin tiedostot siten, että ohjelma asennetaan sen valvonnassa väliaikaiseen alihakemistoon. Yleensä tämä alihakemisto on <tt>debian/paketin_nimi</tt>, jonne paketti asennetaan aivan normaalisti: esimerkiksi Hellon binääri menisi hakemistoon <tt>debian/hello-2.2/usr/bin/hello</tt>. | Paketin luova työkalu päättelee paketin tiedostot siten, että ohjelma asennetaan sen valvonnassa väliaikaiseen alihakemistoon. Yleensä tämä alihakemisto on <tt>debian/paketin_nimi</tt>, jonne paketti asennetaan aivan normaalisti: esimerkiksi Hellon binääri menisi hakemistoon <tt>debian/hello-2.2/usr/bin/hello</tt>. | ||
[[Autoconf]]ia käyttävien pakettien kanssa (pääasiassa ohjelmat, jotka asennetaan komennolla <tt>./configure && make && make | [[Autoconf]]ia käyttävien pakettien kanssa (pääasiassa ohjelmat, jotka asennetaan komennolla <tt>./configure && make && make install</tt>) paketin luoma työkalu osaa hoitaa tämän automaattisesti, eikä sinun tarvitse tässä vaiheessa tehdä mitään. Kuten huomasit asentaessamme ohjelmaa oppaan alussa, annoimme configure-skriptille parametrin <tt>--prefix=/hakemisto/jonne/ohjelma/asennetaan</tt>. Paketoija antaa configurelle samalla tavalla sopivan parametrin, jolloin ohjelma asentuu oikeaan paikkaan. | ||
=== Mitä jos ohjelma ei käytä autoconfia? === | === Mitä jos ohjelma ei käytä autoconfia? === | ||
Rivi 93: | Rivi 93: | ||
=== copyright === | === copyright === | ||
Paketin tekijänoikeuksista kerrotaan tiedostossa <tt>debian/copyright</tt>. Tämän tiedoston muoto on periaatteessa vapaa, mutta hyvän tiedoston saa muokkaamalla dh_maken luomaa. Tässä tiedostosta tulee käydä ilmi paketin luoja, alkuperäinen tekijä ja ohjelman tekijänoikeustiedot (esim. GPL-lisenssin alainen). | |||
=== changelog === | === changelog === | ||
dh_make luo seuraavanlaisen pohjan <tt>debian/changelog</tt>-tiedostolle: (rivinumerot lisätty) | |||
1 hello (2.2-1) unstable; urgency=low | |||
2 | |||
3 * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> | |||
3 | |||
4 -- Heikki Mäntysaari <heikkim@gmail.com> Sat, 21 Apr 2007 23:59:27 +0300 | |||
</pre> | |||
Rivillä 1 on aluksi paketin nimi (hello) ja versionumero (2.2-1). Seuraavana on jakelun nimi, johon paketti kuuluu (Debianilla on stable, testing ja unstable -jakelut). Unstable on yleensä hyvä. Viimeisenä on tieto paketin kiireellisyydestä (urgency), yleensä "low" on sille oikea arvo. | |||
Tämän jälkeen seuraavilla riveillä on itse muutosloki (engl. ''changelog''). Rivin alussa on kaksi välilyöntiä ja tähti (*). Viimeisnä (rivillä 4) on tieto paketin tekijästä. Tämän rivin alussa on yksi välilyönti. | |||
=== rules === | === rules === | ||
Tiedosto <tt>debian/rules</tt> on [[Makefile]]n tapainen tiedosto, jonka perusteella varsinainen paketti luodaan. Tämän tiedoston perusteella ohjelma käännetään ja asennetaan hakemistoon <tt>debian/paketin_nimi</tt>, tässä tapauksessa <tt>debian/hello</tt>. 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 <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> | |||
1 #!/usr/bin/make -f | |||
2 # -*- makefile -*- | |||
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> | |||
=== .ex-päätteiset tiedostot === | === .ex-päätteiset tiedostot === |
Versio 22. huhtikuuta 2007 kello 11.16
Debianissa ja siihen pohjautuvissa jakeluissa (esim. Ubuntussa) käytetään Apt-paketinhallintajärjestelmää. Apt:ssä paketit ovat .deb-tiedostoja, jotka sisältävät itse ohjelman lisäksi mm. tiedot paketin riippuvuuksista ja siitä, mihin ohjelma asennetaan. Deb-pakettien tekeminen ei ole mitenkään ylivoimainen tehtävä, kunhan perusasiat ovat hallussa.
Tässä oppaassa luodaan malliksi yksinkertainen paketti GNU Hello -ohjelmasta, joka on GNU-projektin esimerkkiohjelma. Ohjelman lähdekoodipaketin voi ladata GNU:n palvelimelta.
Valmistelut
Aluksi on asennettava muutamia perustyökaluja, jotka löytyvät seuraavista paketeista
Kun tarvittavat paketit on asennettu, lataa Hello-ohjelman lähdekoodi ja pura se työhakemistoosi. Nyt sinulla pitäisi olla työhakemistossasi tiedosto hello-2.2.tar.gz ja hakemisto hello-2.2.
Valmistelu
Aluksi kannattaa kokeilla, että saat ohjelman käännettyä ja ajettua. Sinun pitäisi osata tehdä tämä, jos luet tätä opasta, mutta lyhykäisyydessään voit asentaa Hellon hakemistoon ~/hello seuraavasti:
./configure --prefix=/home/käyttäjä/hello 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
Siirry ohjelman hakemistoon (hello-2.2) ja aja komento
dh_make -e sinun@sähköpostiosoitteesi -f ../hello-2.2.tar.gz
Toinen parametri on siis paketin tekijän sähköpostiosoite ja neljäs alkuperäinen lähdekooditiedosto. Kysyy aluksi, minkätyyppistä pakettia olemme luomassa:
Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b]
Vastaa tähän s (single binary), sillä olemme luomassa yksinkertaista yhden ohjelman käsittävää pakettia. Tämän jälkeen vahvista tiedot entterillä, 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.2.orig.tar.gz joka sisältää alkuperäisen lähdekoodipaketin.
Huomaa, että dh_make kuuluu ajaa vain kerran! Tulevien muutosten jälkeen sitä ei tarvitse (eikä saa) ajaa.
Asennushakemisto
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-2.2/usr/bin/hello.
Autoconfia käyttävien pakettien kanssa (pääasiassa ohjelmat, jotka asennetaan komennolla ./configure && make && make install) 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. Paketoija antaa configurelle samalla tavalla sopivan parametrin, jolloin ohjelma asentuu oikeaan paikkaan.
Mitä jos ohjelma ei käytä autoconfia?
Asetustiedostot
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
Tiedostossa debian/control kerrotaan perustiedot paketista ja sen riippuvuuksista. Meidän tapauksessamme dh_make loi seuraavanlaisen pohjan (rivinumerot lisätty):
1 Source: hello 2 Section: unknown 3 Priority: extra 4 Maintainer: Paketin Tekijä <foo@bar.com> 5 Build-Depends: debhelper (>= 5), autotools-dev 6 Standards-Version: 3.7.2 7 8 Package: hello 9 Architecture: any 10 Depends: ${shlibs:Depends}, ${misc:Depends} 11 Description: <insert up to 60 chars description> 12 <insert long description, indented with spaces>
Riveillä 1-6 on lähdekoodipaketin (engl. source) perustiedot:
- Rivillä 1 on lähdekoodipaketin nimi
- Rivillä 2 kerrotaan, mihin osioon paketti kuuluu. Debianissa paketit osioihin, joita ovat mm. main (vapaat ohjelmat), non-free (ohjelmat, jotka eivät ole vapaita) ja contrib (ohjelmat, jotka riippuvat vapaista ohjelmista). Nämä ohjelmat on yhä jaettu pienempiin osioihin, kuten devel (kehitystyökalut) ja mail (sähköpostiohjelmat). Hellolle on vähän hankala keksiä sopivaa osiota, laitetaan siihen nyt vaikka main.
- Kolmannella rivillä kerrotaan, kuinka tärkeää käyttäjälle on asentaa tämä paketti. Vaikka "Terve maailma!" -viestin tulostava ohjelma voi tuntua tärkeältä, ehkäpä se ei kuitenkaan ole yhtä tärkeä kuin vaikka ydin, joten jätetään sen tärkeysasteeksi extra.
- 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 5 tai uudempi). Käytännössä aina tarvittavia paketteja (esim. gcc ja make) ei tarvitse luetella, sillä ne otetaan mukaan automaattisesti. Kuitenkin kaikki muut kääntämisessä tarvittavat vähänkin harvinaisemmat paketit on lueteltava. Tässä vaiheessa voitaisiin myös samalla tavalla luetella paketit, jotka estävät kääntämisen (Build-Conflicts: paketti1, paketti2). Hello on sen verran helppo kääntää, ettei meidän tarvitse nyt lisätä tähän mitään ylimääräisiä paketteja.
- Rivillä 6 kerrotaan, minkä Debian Policy -standardin version mukainen paketti on. Tähän ei tarvitse koskea.
- Rivillä 8 on varsinaisen binääripaketin nimi. Yleensä se on sama kuin lähdekoodipaketin nimi.
- Rivillä 9 kerrotaan, millä arkkitehtuurilla paketti toimii. Jätetään tämä arvoon "any", jolloin paketin tekevä työkalu huolehtii arkkitehtuurista. Jos paketti toimii kaikilla arkkitehtuureilla (esim. se on ohjepaketti tai Perl-skripti), arkkitehtuuriksi laitetaan "all".
- Rivillä 10 listataan paketit, jotka ovat binääripaketin riippuvuuksia. Koska Hello ei tarvitse mitään erityisiä paketteja, jätetään tämä tyhjäksi. "${shllibs:Debends}" huolehtii siitä, että kriittisimmät paketit, kuten libc, ovat asennettuina.
- Lopuksi paketille annetaan vielä lyhyt (suositus noin 60 merkkiä) ja pitkä kuvaus. Pitkä kuvaus kirjoitetaan tiedoston loppuun siten, että jokaisen rivin alussa on välilyönti. Näin lopullinen control-tiedosto voisi näyttää tältä:
Source: hello Section: main Priority: extra Maintainer: Tekijä <foo@bar.com> Build-Depends: debhelper (>= 5), autotools-dev Standards-Version: 3.7.2 Package: hello Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Hello world -ohjelma Klassinen Hello world -ohjelma, jonka avulla opettelemme deb-pakettien tekemistä.
copyright
Paketin tekijänoikeuksista kerrotaan tiedostossa debian/copyright. Tämän tiedoston muoto on periaatteessa vapaa, mutta hyvän tiedoston saa muokkaamalla dh_maken luomaa. Tässä tiedostosta tulee käydä ilmi paketin luoja, alkuperäinen tekijä ja ohjelman tekijänoikeustiedot (esim. GPL-lisenssin alainen).
changelog
dh_make luo seuraavanlaisen pohjan debian/changelog-tiedostolle: (rivinumerot lisätty) 1 hello (2.2-1) unstable; urgency=low 2 3 * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> 3 4 -- Heikki Mäntysaari <heikkim@gmail.com> Sat, 21 Apr 2007 23:59:27 +0300
Rivillä 1 on aluksi paketin nimi (hello) ja versionumero (2.2-1). Seuraavana on jakelun nimi, johon paketti kuuluu (Debianilla on stable, testing ja unstable -jakelut). Unstable on yleensä hyvä. Viimeisenä on tieto paketin kiireellisyydestä (urgency), yleensä "low" on sille oikea arvo.
Tämän jälkeen seuraavilla riveillä on itse muutosloki (engl. changelog). Rivin alussa on kaksi välilyöntiä ja tähti (*). Viimeisnä (rivillä 4) on tieto paketin tekijästä. Tämän rivin alussa on yksi välilyönti.
rules
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)
1 #!/usr/bin/make -f 2 # -*- makefile -*- 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