Tecnologia e non solo

marzo 28, 2009

dh_make per creare pacchetti deb.

Filed under: Attrezzi,Debian,Guida pericolosa,Pacchetti — telperion @ 6:04 pm

dh_make ci crea uno scheletro di partenza molto utile per creare pacchetti deb.
Ma “la domanda nasce spontanea”.

Come creare pacchetti deb che installano in /opt ?
Come creare pacchetti deb che installano file aggiuntivi ?
Come creare pacchetti deb che includono automaticamente le patch ?

Vediamo come utilizzare alcune funzioni che ci mette a disposizione il sistema di compilazione di pacchetti di debian.


Nell’esempio il programma vlcgit che verrà installato in /opt/vlc-git per non interferire con il sistema.
Verrà anche installato un file wrapper in /usr/local/bin e un .desktop in /usr/share/applications.
Per debian SID.

Scompattate il sorgente del programma o scaricate il git o svn

git clone git://git.videolan.org/vlc.git vlctrunk

Rinominate la cartella ottenuta con il nome del programma in minuscolo ed il numero versione.

mv vlctrunk vlcgit-0

all’interno della cartella eseguite:

dh_make -s -n -c gpl --dpatch

rispondendo ok alle domande.

Ora nella cartella debian generata editiamo i file

changelog
da
vlcgit (0) unstable; urgency=low
a
vlcgit (20090328) unstable; urgency=low

rules
eliminate o commentate (con #) la riga
./configure $(CROSS) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs"

ed inserite subito sotto dopo la configurazione personalizzata
./bootstrap

./configure --prefix=/opt/vlc-git --enable-maintainer-mode

il configure è molto più lungo nel mio caso, qui è ridotto al default per semplicità,
da notare il --prefix=/opt/vlc-git che installerà il programma in quella cartella senza interferire con vlc installato di default. Maggiori info sulla configurazione con il solito ./configure --help

Verso il fondo decommentate la riga dh_install che ci permetterà di aggiungere file nel pacchetto

dh_install

dirs
Visto che installiamo in /opt/vlc-git bisogna informare di creare la cartella,
aggiungete la riga
/opt/vlc-git

File aggiuntivi.

Creiamo un lanciatore
gedit vlc-git

#!/bin/sh

PATH=/opt/vlc-git:$PATH
export PATH
LD_LIBRARY_PATH=/opt/vlc-git/lib
export LD_LIBRARY_PATH

/opt/vlc-git/bin/vlc "$@"
# ---- fine lanciatore

Salviamolo e rendiamo il file eseguibile.

Creiamo un file .desktop

gedit vlc-git.desktop

[Desktop Entry]
Version=1.0
Name=VLC-Git
Comment=Read, capture, broadcast your multimedia streams
Exec=/usr/local/bin/vlc-git %U
Icon=vlc
Terminal=false
Type=Application
Categories=AudioVideo;Player;
MimeType=video/dv;video/mpeg;video/x-mpeg;video/msvideo;video/quicktime;video/x-anim;video/x-avi;video/x-ms-asf;video/x-ms-wmv;video/x-msvideo;video/x-nsv;video/x-flc;video/x-fli;application/ogg;application/x-ogg;application/x-matroska;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-wav;audio/x-mpegurl;audio/x-scpls;audio/x-m4a;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;application/vnd.rn-realmedia;audio/x-real-audio;audio/x-pn-realaudio;application/x-flac;audio/x-flac;application/x-shockwave-flash;misc/ultravox;audio/vnd.rn-realaudio;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-wav;audio/x-pn-windows-acm;image/vnd.rn-realpix;video/vnd.rn-realvideo;audio/x-pn-realaudio-plugin;application/x-extension-mp4;audio/mp4;video/mp4;video/mp4v-es;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;video/x-flv;

e salviamolo.

Notate Name ed Exec che punta al nostro wrapper quando sarà installato.
Usate sempre nomi diversi dai programmi originali per evitare problemi.

Il wrapper serve per creare l’ambiente di lavoro solo per il nostro programma, visto che risiede in un ramo “alieno” al path, mentre il fle .desktop, facilmente ricavabile dal programma originale, integrerà nei menù il nostro software.

Ora che abbiamo i nostri due file aggiuntivi, bisogna dire a dh_install che abbiamo decommentato cosa farci.
Creiamo un file nomedelpacchetto.install quindi vlcgit.install

gedit vlcgit.install

e inseriamo le righe

debian/vlc-git /usr/local/bin
debian/vlc-git.desktop /usr/share/applications

che dichiarano i nostri 2 file e dove devono essere installati, e salviamo.

Patch.
Se vogliamo applicare delle patch dpatch lo fa per noi.
Creiamo una cartella patches all’interno della debian.
Copiamo la/e patch che ci interessano nel mio caso una
fonts.patch
che contiene:

#! /bin/sh /usr/share/dpatch/dpatch-run
## 99-unnamed.dpatch by  
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.

@DPATCH@
--- a/modules/misc/freetype.c	2009-01-19 13:56:59.000000000 +0100
+++ b/modules/misc/freetype.c	2009-01-23 13:18:51.000000000 +0100
@@ -60,7 +60,7 @@
 #define DEFAULT_FONT "" /* Default font found at run-time */
 #define FC_DEFAULT_FONT "Arial"
 #else
-#define DEFAULT_FONT "/usr/share/fonts/truetype/freefont/FreeSerifBold.ttf"
+#define DEFAULT_FONT "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf"
 #define FC_DEFAULT_FONT "Serif Bold"
 #endif

Bisogna sempre aggiungere alle patch la testata

#! /bin/sh /usr/share/dpatch/dpatch-run
## 99-unnamed.dpatch by  
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.

@DPATCH@

altrimenti non funzionano.

Creiamo sempre nella cartella patches il file

00list

che conterrà la lista delle patch da applicare, nel mio caso solo

fonts.patch

Bene, abbiamo tutto, torniamo nelle cartella vlcgit-0 e lanciamo

debuild binary

dopo alcuni minuti otterremo nella cartella superiore il nostro pacchetto
vlcgit_20090328_i386.deb

Apritelo con ark o fileroller e verificate se volete nel data.tar la correttezza delle cartelle di destinazione.

Installate il pacchetto.

Per ripulire la cartella di compilazione:

debuild binary

potrete poi riutilizzarla per nuove versioni ad esempio

git pull

aggiornerà i sorgenti di vlc,
vi basterà cambiare solo il file debian/changelog
esempio da
vlcgit (20090328) unstable; urgency=low
a
vlcgit (20090401) unstable; urgency=low
se ricompilate il primo aprile,
o usare l’apposito tool dch

dch -v 20090401
oppure
dch -v $(date +%Y%m%d)

e poi il consueto

debuild binary

genererà il nuovo pacchetto.

Approfondimenti:
www.debian.org/doc/manuals/maint-guide/maint-guide.it.txt

PS:
scopo dell’articolo non è compilare vlc git
ma illustrare alcuni meccanismi delle utilità di creazione dei pacchetti debian.

Annunci

20 commenti

  1. Questo mi fa ricordare cosa mi ha fatto innamorare di Arch Linux. Il sistema di pacchetti deb + dpkg + apt sarà più completo, complesso e performante ma la comodità di gestire tutti i pacchetti come semplici script ormai la trovo insostituibile.

    Detto questo… ottima guida. Saper maneggiare bene i pacchetti fa la differenza tra un sitema tenuto bene o no! 😉

    Commento di lele85 — marzo 28, 2009 @ 7:50 pm

  2. @lele85
    makepkg è enormemente più semplice ed altrettanto potente.

    Il sistema di debian sembra l’ufficio complicazioni cose semplici, un vero incubo.
    😀

    Commento di telperion — marzo 28, 2009 @ 8:03 pm

  3. Concordo in toto con voi, tuttavia ringrazio Telperion per l’ottima guida che sono sicuro mi risulterà utile.

    Commento di Bl@ster — marzo 29, 2009 @ 10:06 am

  4. concordo con lele85 sulla semplicità e la potenza di arch linux per quanto riguarda la pacchettizzazione, e aggiungo che di ancora più flessibile e potente c’e’ gentoo, anche se è un pelino meno semplice.
    La guida l’ho già “pidieffata” e salvata per la sua indubbia utilità. grazie telp !

    Commento di LuNa — marzo 29, 2009 @ 10:50 am

  5. @LuNa
    con tutta la buona volonta, a fare un ebuild che installa in /opt ancora non ci sono riuscito. Se hai qualche dritta …

    Commento di telperion — marzo 29, 2009 @ 11:52 am

  6. Non sono un gran esperto in materia, ma ho sbattuto il naso con DEB e RPM.
    Per me restano un mezzo mistero, anche se tra i due devo dire che RPM mi pare meno criptico, specie se uno si mette a far pacchetti “ogni tanto”.
    Non conosco gentoo, ma devo dire che con pacman, makepkg, abs e company ci ho smaronato parecchio e in fatto di semplicità li batte tutti senz’altro, anche nel farsi un repo personale, cosa di una banalità disarmante. E poi AUR … Le pecche di Pacman e Arch sono altre e ben conosciute, ma la semplicità d’uso del suo package manager è semplicemente fantastica.

    Commento di Steno — marzo 29, 2009 @ 1:02 pm

  7. non ricordo dove, ma ricordo che luna e/o telperion avevao parlato del linux plumber report.
    condividevamo la stessa idea su come le grandi industrie contribuiscano piu dei pîccoletti a linux.

    beh, ho trovato dei nuovi dati, se qualcuno si ricorda dove se ne discuteva, riportateli pure là:
    http://lwn.net/Articles/324046/
    http://remword.com/kps_result/

    by the way, interessante e utile articolo.
    per curiosità metti pure il tuo configure?

    Commento di scimmia — marzo 31, 2009 @ 12:44 pm

  8. @scimmia
    http://pastebin.com/f6915b401
    c’è tutto il rules

    Commento di telperion — marzo 31, 2009 @ 2:39 pm

  9. chiedevo ma qual’è la giusta sintassi di prefix per far si che lo veda come se fosse installato da synaptic?
    Ho provato –prefix=/usr/share o local o non mettendo per nulla il prefix ma se mi installo l’applet ubuntuwintv da deb mi dice che manca vlc anche se io l’ho installato ?
    Devo per caso agire su alcuni file dentro le cartelle che si creano con dh make?

    Commento di maxfact — novembre 3, 2009 @ 12:30 pm

    • il prefisso è /usr, nel control se rimpiazzi pacchetti, ti conviene mettere:
      esempio del mio mplayer svn che fornisce anche mencoder

      Package: mplayer
      Architecture: any
      Depends: ${shlibs:Depends},debconf
      Provides: mencoder
      Conflicts: mencoder
      Replaces: mencoder

      cioè dici che il tuo pacchetto fornisce i vari pezzetti del pacchetto ufficiale.

      per vlc i pacchetti sono
      vlc, vlc-data, libvlc2, libvlccore

      quindi

      Provides: vlc, vlc-data, libvlc2, libvlccore
      Conflicts: vlc, vlc-data, libvlc2, libvlccore
      Replaces: vlc, vlc-data, libvlc2, libvlccore

      Commento di telperion — novembre 3, 2009 @ 3:09 pm

  10. Grazie ecco svelato l’arcano

    Commento di maxfact — novembre 4, 2009 @ 8:49 am

  11. Ti disturbo nuovamente ho apportato le modifiche al file control sono riuscito ad installarmi il pacchetto fatto da me ma a fine installazione mi diceva che c’era un errore :
    il pacchetto vlc viola il conflitto del pacchetto esistente: vlc

    Vlc funziona ed è la versione 1.1 git yellow bastard

    Commento di maxfact — novembre 4, 2009 @ 11:43 am

  12. @telperion: tu dici di cambiare il changelog
    da
    vlcgit (0) unstable; urgency=low
    a
    vlcgit (20090328) unstable; urgency=low

    Ma quel numero (20090328) da dove lo ricavi? Si riferisce alla versione o cosa? Non è per vlc in sè (anche se quarda caso sono interessata proprio a lui), sto cercando di capire, sono al primo approccio con dh_make (nonchè con git). :/

    Commento di aleida — novembre 29, 2009 @ 11:55 pm

    • le versioni svn hanno il numero, quelle git no quindi di solito si mette la data,
      20090328 cioè 2009(a) 03(m) 28(g).

      Commento di telperion — novembre 30, 2009 @ 1:24 am

  13. Già… col senno di poi, rivedendo meglio i comandi e le spiegazioni che hai postato, appare tutto fin troppo chiaro. (che vergogna!)
    Sto leggendo diverse cose su git. Molto, molto intressante!
    Grazie Telp, credo che la tua guida mi tornerà presto utilissima! 🙂

    Commento di aleida — novembre 30, 2009 @ 2:22 am

    • Se usi debian SID o testing, stai all’occhio al pacchetto dh-make superiore alla 0.48 perchè hanno cambiato tutto (e quando mai maledizione) ed il nuovo template di rules non contiene nulla ed è molto difficoltoso da editare, nemmeno trovo la doc aggiornata e poi chi cavolo ha voglia.
      Consiglio di bloccare la versione a dh-make così che non si aggiorni.

      Commento di telperion — novembre 30, 2009 @ 4:31 pm

  14. No, uso stable (lenny) attualmente e la versione di git è la 0.46. Però buono a sapersi, ne bloccherò l’aggiornamento.
    Se non ti dispiace, vorrei un paio di chiarimenti ancora. Come si fa a sapere quale versione di vlc è stata scaricata con git? Se non ho capito male il suo funzionamento, dovrebbe scaricare quella più aggiornata, quindi la 1.0.3 (al momento).
    La data deve corrispondere al giorno in cui hai scaricato, o a quello in cui viene installato vlc? Purtroppo non ci sono molti esempi in rete…

    Commento di aleida — novembre 30, 2009 @ 5:17 pm

    • É la versione di dh-make da bloccare, non di git.

      Per le versioni svn il comando è svn info esempio

      mc@kk:~/develop/mplayersvn/mplayer$ svn info
      Percorso: .
      URL: svn://svn.mplayerhq.hu/mplayer/trunk
      Repository: svn://svn.mplayerhq.hu/mplayer
      UUID del Repository: b3059339-0415-0410-9bf9-f77b7e298cf2
      Revisione: 29969
      Tipo di Nodo: directory
      Azione: normale
      Autore dell’Ultimo Cambiamento: jrash
      Revisione dell’Ultimo Cambiamento: 29969
      Data dell’Ultimo Cambiamento: 2009-11-27 13:23:06 +0100 (ven, 27 nov 2009)

      quindi nel caso
      Revisione dell’Ultimo Cambiamento: 29969

      mentre per il git il comando è git show
      esempio

      mc@kk:~/develop/vlc-git/deb-vlc/vlcgit-1$ git show
      commit d8efdc14bbc5f7119bbe814539c2866e8d8c5fb4
      Author: Rafaël Carré
      Date: Wed Nov 25 10:20:50 2009 +0100

      si esce con q

      Con il git hai tutte le varie versioni
      esempio con vlc

      mc@kk:~/develop/vlc-git/deb-vlc/vlcgit-1$ git branch -r
      origin/0.2
      origin/0.2.92
      origin/0.4.1
      origin/0.8.1
      origin/0.8.1-jpsaman-thedj
      origin/0.8.2
      origin/0.8.2-bindings
      origin/0.8.2a
      origin/0.8.3
      origin/0.8.4
      origin/0.8.4-sam
      origin/0.8.4a
      origin/0.8.5
      origin/0.8.5-1
      origin/0.8.5-api
      origin/0.8.5-api@13839
      origin/0.8.5-bo
      origin/0.8.5-href
      origin/0.8.5-osx-embedded
      origin/0.8.5-zorglub
      origin/0.8.6
      origin/0.8.6-bugfix
      origin/0.8.6-jb
      origin/0.8.6-jpsaman
      origin/0.8.6-neuros
      origin/0.8.6-playlist-vlm
      origin/0.8.6-rtcp
      origin/0.8.6a
      origin/0.9-bugfix
      origin/0.9-trickplay
      origin/0.9.0-dev
      origin/0.9.0-eyetv
      origin/0.9.0-libass
      origin/0.9.0-vlm
      origin/1.0-bugfix
      origin/HEAD -> origin/master
      origin/V0_2
      origin/coin
      origin/master
      origin/v0_2_92_branch
      origin/v0_4_1_branch
      origin/win32-contrib

      bisogna poi switchare tra i vari branch per compilare la versione che si vuole. Di default sei nel branch master, se si cambia branch bisogna poi ripulirlo con make distclean e tornare al master prima di aggornarlo.

      Vedi un po questo vecchio articolo
      https://telperion.wordpress.com/2007/08/13/compiz-052-053-06-git-come-fare/
      per altre informazioni o leggi la complicata guida di git online.

      Commento di telperion — novembre 30, 2009 @ 5:35 pm

  15. Scusate, è vero che dare il semplice comando makepkg in arch rende più facile compilare, ma è anche vero che qualcuno deve aver PRIMA scritto un PKGBUILD! E onestamente non mi sembratanto cosa semplice scrivere una funzione build! Boh… Sono troppo scemo io o voi date per scontato di avere un pkgbuild con tanto di funzione build bella e pronta?

    Commento di Spinmc — novembre 30, 2009 @ 5:52 pm

    • Fare un pkgbuild è piuttosto semplice partendo dai template nel wiki di arch.
      Enormemente più semplice che impacchettare con dh_make o altri criptici strumenti debian.

      Commento di telperion — novembre 30, 2009 @ 6:01 pm


RSS feed for comments on this post.

%d blogger hanno fatto clic su Mi Piace per questo: