|
Size: 27797
Comment:
|
← Revision 35 as of 2021-11-29 14:40:27 ⇥
Size: 33106
Comment: sync with English master v.66
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 2: | Line 2: |
| ~-[[DebianWiki/EditorGuide#translation|Translation(s)]]: [[IntroDebianPackaging|English]] - Italiano-~ | <<Include(Packaging/Intro, ,from="^##TAG:TRANSLATION-HEADER-START",to="^##TAG:TRANSLATION-HEADER-END")>> |
| Line 4: | Line 4: |
| ## If your page gets really long, uncomment this Table of Contents <<TableOfContents(2)>> |
<<TableOfContents(3)>> |
| Line 9: | Line 8: |
| ~- Seminario online tenuto da Lars Wirzenius per Debian Women, 18-Nov-2010 -~ Questa è una lezione introduttiva alla creazione di pacchetti per Debian quindi non verranno spiegati i meccanismi più complessi della pacchettizzazione, ma mostrato invece come creare pacchetti per programmmi semplici da pacchettizzare. Per questo motivo, verrà usato solo il comando dh da debhelper 7. |
Questa è una lezione introduttiva alla [Packaging|creazione di pacchetti per Debian]] quindi non verranno spiegati i meccanismi più complessi della pacchettizzazione, ma mostrato invece come creare pacchetti per programmi semplici da pacchettizzare. == Cosa è un "pacchetto"? == Un pacchetto Debian è una raccolta di file che permettono di distribuire applicazioni o librerie attraverso il sistema di gestione dei pacchetti. Lo scopo della pacchettizzazione è quello di permettere di automatizzare l'installazione, l'aggiornamento, la configurazione e la rimozione di programmi per Debian in modo coerente. Un pacchetto è formato da un pacchetto sorgente e da uno o più pacchetti binari. La Debian Policy specifica il formato standard per un pacchetto, che deve essere seguito da tutti i pacchetti. I pacchetti binari contengono eseguibili, file di configurazione standard, altre risorse necessarie per l'esecuzione di eseguibili, documentazione, dati... I pacchetti sorgente contengono la distribuzione originale a monte dei sorgenti, le configurazioni per il sistema di compilazione dei pacchetti, gli elenchi delle dipendenze di esecuzione e dei pacchetti in conflitto, una descrizione analizzabile da macchina delle informazioni sui diritti d'autore e sulla licenza, la configurazione iniziale del software, ecc. Lo scopo della pacchettizzazione è di produrre tali pacchetti dai sorgenti spacchettizzati. Il pacchetto sorgente (.dsc) e i pacchetti binari (.deb) verranno creati da strumenti come dpkg-buildpackage. Si possono leggere ulteriori informazioni sull'anatomia dei [[it/DebianPackage|pacchetti binari]] o dei [[it/SourcePackage|pacchetti sorgente]] nelle loro pagine nel wiki. {{{#!wiki warning Solo i pacchetti che sono conformi alle politiche di Debian vengono accettati nell'archivio dei pacchetti. Pacchetti binari (.deb) creati a mano che non sono compilati a partire da un pacchetto sorgente non vengono accettati per mantenere coerenza e riproducibilità. }}} |
| Line 19: | Line 29: |
| In questa guida si presume che: * si sappia installare pacchetti binari; * si conosca l'uso di base della linea di comando e l'utilizzo di un editor di testo a scelta (DebianPkg:emacs, DebianPkg:vim, DebianPkg:gedit, DebianPkg:kate, etc.); Requisiti tecnici: |
In questa guida si presume che l'utente conosca: * come installare pacchetti binari; * l'uso di base della riga di comando * l'utilizzo di un editor di testo a propria scelta per modificare i file Quello è tutto ciò di cui si ha bisogno. Pacchetti richiesti: |
| Line 28: | Line 41: |
| * DebianPkg:debhelper version 7 | * DebianPkg:debhelper versione 9 o successiva |
| Line 32: | Line 45: |
| I tre concetti centrali sono "archivio upstream", "pacchetto sorgente" e "pacchetto binario", la maggior parte delle persone pacchettizza programmi che qualcun altro ha scritto: questo qualcun altro si chiama "upstream developer". L'upstream developer rilascerà una versione del suo programma e il risultato sarà "il pacchetto dei sorgenti upstream" o "tarball". Un [[it/TarBall|tarball]] è un file che ha estensione ".tar.gz" o ".tgz" (la parola "tarball" fa parte del gergo informatico), esattamente ciò che Debian prende e dal quale costruisce un pacchetto. Quando si ha un tarball upstream, il passo successivo è creare un pacchetto sorgente per Debian, dal quale sia possibile creare il '''pacchetto binario''' che è quello che effettivamente verrà installato. Il '''pacchetto sorgente''' è composto, nella sua forma più semplice, da tre file: 1. il tarball upstream, rinominato in modo che segua un modello sistematico 2. un patch file, con tutti le modifiche al sorgente upstream, più tutti i file creati per il pacchetto Debian. Questo ha estensione ".diff.gz" 3. un file descrizione (con estensione ''.dsc''), che elenca gli altri due file Tutto questo può suonare più complicato del necessario, a prima vista potrebbe sembrare più semplice avere tutto in un unico file. Tuttavia, risulta che in questo modo ci sia maggior spazio sul disco e maggiore banda per mantenere l'archivio upstream separato da tutti i cambiamenti specifici. È anche più semplice tenere traccia di cosa è necessario cambiare per Debian. |
I tre concetti centrali sono * '''archivio upstream''': * Un '''tarball''' (archivio tar) è il file ''.tar.gz'' o ''.tgz'' creato dagli autori originali a monte(può anche essere in altri formati compressi come ''.tar.bz2'', ''.tb2'' o ''.tar.xz''). * Contiene il software scritto dagli '''autori originali a monte''' ("upstream developer"). * '''pacchetto sorgente''': * questo è il secondo passo del processo di pacchettizzazione: creare il '''pacchetto sorgente''' dai sorgenti originali a monte. * '''pacchetto binario''': * da tale pacchetto sorgente si crea poi il '''pacchetto binario''' che viene distribuito ed installato. Il [[it/SourcePackage|pacchetto sorgente]] più semplice è formato da tre file: * Il tarball upstream, rinominato secondo le convenzioni per i nomi * una directory debian, contenente le modifiche fatte ai sorgenti originali più tutti i file necessari per la creazione di un pacchettto binario. * un file descrizione (con estensione ''.dsc''), che contiene i metadati per i due file precedenti. |
| Line 50: | Line 65: |
| Il processo di pacchettizzazione normalmente è questo: 1. rinominare il tarball upstream in modo che segua uno specifico modello di denominazione. 2. estrarre il tarball upstream 3. aggiungere i file di pacchettizzazione di Debian (in una sotto-directory chiamata "debian"), e apportare altre modifiche necessarie 4. creare il pacchetto sorgente 5. creare il pacchetto binario 6. caricare il pacchetto sorgente e quello binario sui server Debian Per questa guida Lars ha usato [[http://code.liw.fi/hithere/hithere-1.0.tar.gz|questo tarball]]. === Fase 1: rinominare il tarball === Gli strumenti per la pacchettizzazione di Debian assumono che il tarball abbia un nome specifico. Il nome è composto dal nome del pacchetto sorgente, un underscore, il numero di versione upstream seguito da ''.orig.tar.gz''. Il nome del pacchetto sorgente dovrebbe essere minuscolo e può contenere lettere, cifre e trattini. Se il developer upstream usa un nome idoneo come nome per il pacchetto sorgente Debian, si dovrebbe lasciare quello. In caso contrario, si dovrebbe cambiare il nome quanto basta per renderlo adatto a Debian. Nel nosro caso, abbiamo un nome appropiato, "hithere", quindi non preoccupiamoci di questo. Quindi il risultato dovrebbe essere un file chiamato '''hithere_1.0.orig.tar.gz'''. Si noti che c'è un underscore nel nome, e non un trattino. Questo è importante in quanto gli strumenti per la pacchettizazione sono pignoli. {{{# mv hithere-1.0.tar.gz hithere_1.0.orig.tar.gz}}} === Fase 2: spacchettare il tarball === Dovremmo avere una directory chiamata "hithere-1.0". In generale, i sorgenti dovrebbero andare in una directory chiamata con il nome del pacchetto sorgente e la versione upstream, con un trattino (e non un underscore) tra i due. In questo caso, il developer upstream ha creato il tarball usando la directory giusta {{{ # tar xf hithere_1.0.orig.tar.gz}}} === Fase 3: aggiungere i file di pacchettizzazione di debian === Tutti i file vanno nella sottodirectory ''debian/'' all'interno della directory sorgente {{{ # cd hithere-1.0 # mkdir debian }}} Ci sono molti file da fornire, guardiamoli in ordine. |
* Fase 1: rinominare il tarball upstream * Fase 2: estrarre il tarball upstream * Fase 3: aggiungere i file debian.tar.gz * Fase 4: creare il pacchetto * Fase 5: testare il pacchetto Dopo i test, i pacchetti sorgente e binario posso essere caricati. A questo punto si può testare il pacchetto sul proprio computer e i pacchetti sorgente e binario possono essere caricati sui server Debian. Per questa guida viene usato come esempio [[attachment:Packaging/Intro/hithere-1.0.tar.gz|questo tarball]]. === Fase 1: rinominare il tarball originale === Gli strumenti per la pacchettizzazione richiedono che il tarball abbia un nome conforme alla convenzione per i nomi. Il nome è in questo formato: nome del pacchetto sorgente, un trattino basso (''_''), numero di versione originale a monte seguito da ''.orig.tar.gz''. Il nome del pacchetto sorgente deve essere tutto minuscolo e può contenere lettere, cifre e trattini. Sono permessi anche alcuni altri caratteri<!-- [link the full naming convention standard here] -->. Si dovrebbe modificare in modo minimo il nome originale per renderlo conforme a Debian. Se il nome originale è conforme, si dovrebbe usare quello. Nel caso considerato gli autori originali hanno scelto un nome appropriato, "hithere", perciò non sono necessarie modifiche. Il risultato sarà un file chiamato '''hithere_1.0.orig.tar.gz'''. Si noti che c'è un trattino basso (''_'') nel nome, e non un trattino (''-''). Questo è importante. {{{#!wiki blue/solid $ '''mv''' hithere-1.0.tar.gz hithere_1.0.orig.tar.gz }}} === Fase 2: spacchettare il tarball originale === I sorgenti si spacchettano in una directory chiamata con il nome del pacchetto sorgente e la versione originale a monte (con un trattino, e non un trattino basso, tra i due); perciò il tarball originale dovrebbe spacchettarsi in una directory chiamata "hithere-1.0". In questo caso, lo sviluppatore a monte è stato accorto e ha fatto sì che il tarball si spacchettasse nella directory giusta. {{{#!wiki blue/solid $ '''tar''' xf hithere_1.0.orig.tar.gz }}} === Fase 3: aggiungere i file di pacchettizzazione di Debian === Tutti i file successivi andranno nella sottodirectory ''debian/'' all'interno della directory sorgente, perciò va creata: {{{#!wiki blue/solid $ '''cd''' hithere-1.0 <<BR>> $ '''mkdir''' debian }}} Diamo uno sguardo ai file che è necessario fornire. |
| Line 107: | Line 123: |
| In questo file non c'è bisogno di elencare tutte le modifiche apportate al codice upstream, anche se può essere utile agli utenti riepilogare questi cambiamenti.. Dato che stiamo usando la prima versione, non c'è nessun cambiamento da registrare. Tuttavia, abbiamo comunque bisogno del file "changelog", perchè gli strumenti per la pacchettizzazione ne traggono alcune informazioni, in particolare la versione del pacchetto. ''debian/changelog'' ha un formato davvero particolare. Il modo più facile per crearlo è usare il programma '''''dch''''' . {{{# dch --create -v 1.0-1 --package hithere}}} |
In questo file non è ''necessario'' elencare tutte le modifiche apportate al codice originale, ma un riassunto è utile agli altri. Dato che stiamo creando la prima versione, non c'è nessun cambiamento da registrare. Tuttavia, abbiamo comunque bisogno di una voce all'interno del file "changelog", perché gli strumenti per la pacchettizzazione leggono informazioni da tale file: in particolare la versione del pacchetto. ''debian/changelog'' ha un formato standard. Il modo più facile per crearlo è usare il programma '''''dch''''' . {{{#!wiki blue/solid $ '''dch''' --create -v 1.0-1 --package hithere }}} |
| Line 130: | Line 146: |
| * La parte '''''hithere''''' DEVE essere la stessa del nome del pacchetto sorgente. '''''1.0-1''''' è la versione. La parte '''''1.0''''' è la versione upstream. La parte '''''-1''''' è la versione __Debian__ : la prima versione del pacchetto Debian della versione upstream 1.0. Se il pacchetto Debian ha un bug, che viene corretto, ma la versione di upstream resta la stessa, la versione successiva del pacchetto verrà chiamata 1.0-2. Quella ancora dopo 1.0-3, e così via. * La destinazione di upload viene chiamata '''''UNRELEASED'''''. Dice al programma di caricamento dove il pacchetto binario deve essere caricato. '''''UNRELEASED''''' significa che il pacchetto non è pronto per essere caricato. È una buona idea lasciare '''''UNRELEASED''''' così non verrà caricato nulla per sbaglio. * Ignora '''''urgency=low''''' per adesso. |
* Il nome del pacchetto ('''''hithere''''') DEVE essere la stessa del nome del pacchetto sorgente. '''''1.0-1''''' è la versione. La parte '''''1.0''''' è la versione upstream. La parte '''''-1''''' è la versione __Debian__ : la prima versione del pacchetto Debian della versione upstream 1.0. Se il pacchetto Debian ha un bug, che viene corretto, ma la versione di upstream resta la stessa, la versione successiva del pacchetto verrà chiamata 1.0-2. Quella ancora dopo 1.0-3, e così via. * '''''UNRELEASED''''' è ciò che viene definita destinazione di upload. Dice al programma di caricamento dove il pacchetto binario deve essere caricato. '''''UNRELEASED''''' significa che il pacchetto non è pronto per essere caricato. È una buona idea lasciare '''''UNRELEASED''''' così non verrà caricato nulla per sbaglio. * '''''urgency=low''''' per il momento non viene spiegato. |
| Line 137: | Line 152: |
| * Il '''''(Closes: #XXXXXX)''''' serve per chiudere i bug quando il pacchetto viene caricato. Questo è il modo consueto per chiuedere i bug in Debian: quando il pacchetto che corregge un bug viene caricato, il bug tracker lo avverte e segna il bug come chiuso. Possiamo rimuovere la parte '''''(Closes...)'''''. Oppure no. Non è importante adesso. * La linea finale nel changelog indica chi ha creato questa versione del pacchetto, e quando. Il programma dch prova ad indovinare il nome e l'indirizzo e-mail, ma puoi configurarlo con le informazioni giuste Guarda la pagina di manuale dch(1) per i dettagli. |
* La parte '''''(Closes: #XXXXXX)''''' serve per chiudere i bug quando il pacchetto viene caricato. Questo è il modo consueto per chiuedere i bug in Debian: quando il pacchetto che corregge un bug viene caricato, il sistema di tracciamento dei bug lo nota e segna il bug come chiuso. Se non ci sono bug risolti, questa parte può essere omessa. * La riga finale nel changelog indica chi ha compilato questa versione del pacchetto, e quando. Il programma dch prova ad indovinare il nome e l'indirizzo e-mail, ma può essere configurato con le informazioni giuste. Vedere la pagina di manuale dch(1) per i dettagli. |
| Line 147: | Line 161: |
Questo file dovrebbe contenere il numero 7. Questo è un numero magico. Non inserire nessun altro numero. '''debian/compat''' specifica "il livello di compatibilità" per il programma debhelper. Per ora non abbiamo bisogno di sapere cosa significa. |
'''debian/compat''' specifica il "[[https://manpages.debian.org/stable/debhelper.7.en#COMPATIBILITY_LEVELS|livello di compatibilità]]" per lo strumento DebianPackage:debhelper . {{{ 10 }}} |
| Line 154: | Line 169: |
| Il file "control" descrive il pacchetto sorgente e binario, e aggiunge anche alcune informazioni su di essi, come il loro nome, chi è il maintainer del pacchetto, etc. Sotto c'è un esempio di come potrebbe essere. |
Il file "control" descrive i pacchetti sorgente e binario, e fornisce anche alcune informazioni su di essi, come il loro nome, chi è il manutentore del pacchetto, ecc. Questo sottostante è un esempio di come potrebbe essere. |
| Line 162: | Line 177: |
| Standards-Version: 3.9.0 Build-Depends: debhelper (>= 7.3.8) |
Standards-Version: 3.9.2 Build-Depends: debhelper (>= 9) |
| Line 173: | Line 188: |
| Ci sono molti campi richiesti, ma per ora non è necessario preoccuparsi del loro significato. In debian/control, ci sono due paragrafi. Il primo descrive '''il pacchetto sorgente''': "Source:":: fornisce il nome del pacchetto sorgente. "Maintainer:":: fornisce il nome e l'e-mail della persona reponsabile del pacchetto. "Build-Depends:":: elenca i pacchetti che hanno bisogno di essere installati per creare il pacchetto. Pacchetti che sono o non sono necessari per usare il pacchetto. |
Ci sono molti campi obbligatori, ma per ora non è necessario preoccuparsi del loro significato. In {{{debian/control}}}, ci sono due paragrafi. Il primo paragrafo descrive '''il pacchetto sorgente''' con questi campi: Source:: Il nome del pacchetto sorgente. Maintainer:: Il nome e l'indirizzo di posta elettronica della persona responsabile del pacchetto. Priority:: La priorità del pacchetto (una tra "required", "important", "standard" o "optional"). In generale un pacchetto è "optional" (opzionale) a meno che non sia "essential" (essenziale) per un sistema standard funzionante, cioè per l'avvio o il funzionamento della rete. Secondo la [[https://www.debian.org/doc/debian-policy/ch-archive.html#s-priorities |Debian Policy 4.5.1]] (e forse da prima) la priorità 'extra' per i pacchetti è deprecata. Build-Depends:: L'elenco dei pacchetti che devono essere installati per creare il pacchetto; possono essere necessari per usare il pacchetto oppure no. |
| Line 182: | Line 198: |
| Il secondo paragrafo descrive il '''pacchetto binario''' creato dai sorgenti. Attualmente, è possibile creare molti pacchetti binari dallo stesso sorgente. "Package:":: è il nome del pacchetto binario. Il nome può essere differente dal pacchetto sorgente. "Architecture:":: indica con qualche architettura del computer il pacchetto binario dovrebbe funzionare: i386 per i processori 32-bit della Intel, amd64 per 64-bit, armel per ARM, e così via. Debian funziona su circa una dozzina di architetture, quindi il supporto ad esse è cruciale; il campo "Architecture:" può contenere nomi di particolari architetture, ma di solito contiene uno o due valori speciali. "any":: (che possiamo vedere nell'esempio) significa che il pacchetto può essere costruito per qualsiasi architettura. In altre parole il codice è stato scritto per essere portabile, in modo che non ci sia bisogno di fare troppe supposizioni sul tipo di hardware. Tuttavia, il pacchetto binario deve essere pacchettizato per ogni architettura separatamente. "Depends:":: visualizza i pacchetti che devono essere installati per potere avviare i programmi nel pacchetto binario. Elencare queste dipendenze manualmente può essere noioso. Per fare questo lavoro, il campo '''''${shlibs:Depends}''''' deve essere presente. Il campo shlibs viene usato per indicare le librerie condivise, gli altri campi sono invece sono usati da debhelper per altre dipendenze, queste devono essere aggiunte manualmente ai campi Depends o Build-Depends ma la sintassi ${...} funziona solo con il campo Depends "Description:":: è la descrizione del pacchetto che è molto utile agli utenti. |
Tutti i paragrafi dopo il primo descrivono i '''pacchetti binari''' creati dai sorgenti. Possono esserci molti pacchetti binari creati dallo stesso sorgente; nell'esempio qui riportate ce n'è uno solo. Vengono usati i seguenti campi: Package:: Il nome del pacchetto binario; può essere diverso da quello del pacchetto sorgente. Architecture:: Specifica con quale architettura del computer il pacchetto binario dovrebbe funzionare: i386 per i processori 32-bit della Intel, amd64 per 64-bit, armel per ARM, e così via. Debian funziona su circa una dozzina di architetture, quindi il supporto ad esse è cruciale; il campo "Architecture" può contenere nomi di particolari architetture, ma di solito contiene uno tra due valori speciali. any:: (come nell'esempio) significa che il pacchetto può essere costruito per qualsiasi architettura. In altre parole il codice è stato scritto per essere portabile, in modo che non ci sia bisogno di fare troppe supposizioni sul tipo di hardware. Tuttavia, il pacchetto binario deve comunque essere pacchettizzato per ogni architettura separatamente. all:: significa che il medesimo pacchetto binario funzionerà su tutte le architetture, senza dover essere creato separatamente per ciascuna. Per esempio, un pacchetto contenente solamente script per la shell avrebbe il valore "all"; gli script per la shell funzionano nello stesso modo ovunque e non necessitano di essere compilati. Depends:: L'elenco dei pacchetti che devono essere installati affinché i programmi nel pacchetto binario funzionino. Elencare queste dipendenze manualmente è noioso ed è facile fare errori. Per fare funzionare la cosa deve essere presente il campo magico '''''${shlibs:Depends}'''''. L'altro campo magico è invece usato da debhelper: '''''${misc:Depends}'''''. Il campo shlibs indica le dipendenze da librerie condivise, il campo misc è per alcune cose fatte da debhelper. Per altre dipendenze, queste devono essere aggiunte manualmente ai campi Depends o Build-Depends e la sintassi magica ${...} funziona solo con il campo Depends. Description:: La descrizione completa del pacchetto; è pensata per essere utile agli utenti. La prima riga è usata come breve riassunto (sinossi) e il resto della descrizione deve essere una descrizione indipendente più lunga del pacchetto. Il comando ''cme edit dpkg'' fornisce una GUI per modificare la maggior parte dei file di pacchettizzazione, incluso ''debian/control''. Vedere la pagina [[https://github.com/dod38fr/config-model/wiki/Managing-Debian-packages-with-cme|Gestire i pacchetti Debian con cme]]. Il comando cme viene fornito insieme al pacchetto DebianPkg:cme. È anche possibile modificare '''solamente''' ''debian/control'' con il comando ''cme edit dpkg-control''. |
| Line 194: | Line 213: |
| È un file molto importante, ma per ora ci basterà lasciarlo vuoto. | È un [[https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/|file importante]], ma per ora ci basterà lasciarlo vuoto. {{{ }}} |
| Line 198: | Line 221: |
| Per adesso ci concentreremo solo sugli aspetti tecnici. Possiamo tornare su ''debian/copyright'' più tardi. |
Per adesso ci si concentrerà solo sugli aspetti tecnici; si potrà tornare in seguito su ''debian/copyright''. |
| Line 211: | Line 233: |
| <!> '''Nota''': L'ultima linea dovrebbe essere indentata solo con un TAB, non da spazi. Questo file è un makefile, e il TAB è ciò che vuole il comando make. ''debian/rules'' potrebbe essere un file difficile da comprendere, tuttavia grazie al comando dh in debhelper 7 è possibile renderlo, in alcuni casi, meno complicato. |
<!> '''Nota''': L'ultima riga dovrebbe essere fatta rientrare solo con una tabulazione (TAB), non con spazi. Questo file è un makefile e la tabulazione è ciò che vuole il comando make. ''debian/rules'' può essere un file piuttosto complesso, tuttavia grazie al comando dh in debhelper 7 è possibile mantenerlo semplice come in questo esempio per molti casi. |
| Line 219: | Line 241: |
| L'ultimo file richiesto è ''debian/source/format'', e dovrebbe contenere il numero di versione "1.0". Questo è il numero di versione per il formato del pacchetto sorgente, che potrebbe sembrare lo stessa della versione upstream, ma è solo una coincidenza. ==== Fasi 4 e 5: compilare il pacchetto ==== Ora possiamo costruire il pacchetto. Il comando da lanciare è il seguente: {{{ debuild -us -uc }}} Ci sono molti comandi che possiamo usare per creare un pacchetto, ma questo è l'unico che useremo. Se questo comando verrà lanciato, il risultato ottenuto sarà simile a questo: |
L'ultimo file richiesto è ''debian/source/format'', e dovrebbe contenere il numero di versione "3.0 (quilt)". |
| Line 236: | Line 244: |
| 3.0 (quilt) }}} Questo è il numero di versione per il formato del pacchetto sorgente, e anche se è lo stesso della versione upstream, questa è solo una coincidenza. === Fase 4: compilare il pacchetto === ==== Primo tentativo ==== Ora si può costruire il pacchetto. Ci sono molti comandi utilizzabili ma questo è quello che verrà usato. Eseguendo il comando si otterrà un output simile al seguente: {{{#!wiki blue/solid $ '''debuild''' -us -uc }}} {{{#!highlight console numbers=disable |
|
| Line 246: | Line 271: |
}}} Qualcosa è andato storto. Questo è quello che accade di solito, si fa del proprio meglio per creare i file ''debian/*'' , ma c'è sempre qualcosa che non si ottiene nel modo giusto. |
}}} Qualcosa è andato storto. Questo è quello che accade di solito, si fa del proprio meglio per creare i file ''debian/*'' , ma c'è sempre qualcosa che non viene fatta nel modo giusto. |
| Line 252: | Line 277: |
{{{ |
{{{#!highlight console numbers=disable |
| Line 259: | Line 283: |
| Ci sono alcune cose da fare qui: ma prima cerchiamo di capire, almeno sommariamente, come funziona la pacchettizzazione in Debian. Quando un programma viene compilato, ed è "installato", non viene installato in "/usr" o in "/usr/local" come avviene di solito, ma da qualche parte nella directory ''debian/''. Creeremo un sottoinsieme del filesystem in ''debian/hithere'' e che poi verrà inserita nel pacchetto binario. Quindi ''.../debian/hithere/usr/local/bin'' è la posizione giusta, a parte il fatto che non dovrebbe essere installato in "usr/local", ma direttamente in "usr". Quindi abbiamo bisogno di modificare il file "debian/rules" per far sì che il programma venga installato nella giusta directory (''debian/hithere/usr/bin''): |
Ci sono diverse cose in ballo: una riguarda il modo in cui funziona la pacchettizzazione in Debian. ==== Correzione ==== Quando il programma viene compilato, ed è "installato", non viene installato in '''usr''' o in '''/usr/local''' come avviene di solito, ma da qualche parte nella sottodirectory '''debian/'''. Viene creato un sottoinsieme dell'intero file system in '''debian/hithere''' che poi verrà inserito nel pacchetto binario. Quindi '''.../debian/hithere/usr/local/bin''' è la posizione giusta, a parte il fatto che non dovrebbe essere installato in '''usr/local''', ma direttamente in '''usr'''. Quindi è necessario modificare il file '''debian/rules''' per far sì che dica al Makefile di installare il programma nella giusta directory ('''debian/hithere/usr/bin'''): |
| Line 277: | Line 304: |
| Per capire cosa fa il codice riportato sopra bisogna sapere come funzionano i Makefile, e i vari processi che avvia debhelper. | Per capire cosa fa il codice riportato sopra bisogna sapere come funzionano i Makefile e i vari passi dell'esecuzione di debhelper. |
| Line 281: | Line 308: |
| Abbiamo bisogno di sovrascrivere questo passaggio con la regola in ''debian/rules'' chiamata '''''override_dh_auto_install'''''. La linea finale nel nuovo''debian/rules'' è una tecnica usata per invocare il Makefile upstream ''debian/rules'' con gli argomenti giusti. Proviamo a creare di nuovo il pacchetto, e noteremo che il processo fallirà ancora. |
Abbiamo bisogno di sovrascrivere questo passaggio con la regola in '''debian/rules''' chiamata '''''override_dh_auto_install'''''. La riga finale nel nuovo '''debian/rules''' è una tecnica degli anni '70 usata per invocare il Makefile upstream '''debian/rules''' con gli argomenti giusti. ==== Riprovare ==== {{{#!wiki blue/solid $ '''debuild''' -us -uc }}} Fallisce ancora! |
| Line 290: | Line 322: |
| {{{ | {{{#!highlight console numbers=disable |
| Line 294: | Line 326: |
| Stiamo provando ad installare i binari nel posto giusto, ma questo non esiste. Per correggere questo problema dobbiamo dire al programma di pacchettizzazione di creare prima la directory. Normalmente, il Makefile upstream la creerebbe, ma in questo caso lo sviluppatore upstream è troppo pigro per farlo. Fortunatamente il programma per la pacchettizzazione (nello specifico debhelper) ci fornisce un modo per farlo. Basta creare un file chiamato debian/hithere.dirs, con il seguente contenuto: |
Si sta tentando di installare i binari nel posto giusto, ma questo non esiste. Per correggere questo problema è necessario dire agli strumenti di pacchettizzazione di creare prima la directory. Normalmente, il Makefile upstream la creerebbe esso stesso, ma in questo caso lo sviluppatore upstream è stato troppo pigro per farlo. ==== Un'altra correzione ==== Il programma per la pacchettizzazione (nello specifico debhelper) fornisce un modo per farlo. Basta creare un file chiamato '''debian/hithere.dirs''', con il seguente contenuto: |
| Line 307: | Line 341: |
| La seconda linea crea una directory per il manuale, ne avremmo bisogno più tardi. | La seconda riga crea una directory per la pagina di manuale, che sarà necessaria più avanti. Si deve porre attenzione nella manutenzione di questi file *.dirs perché possono dare origine a directory vuote nelle versioni future del proprio pacchetto, se le voci elencate in questi file non sono più valide. ==== Un'altra prova ==== {{{#!wiki blue/solid $ '''debuild''' -us -uc }}} |
| Line 310: | Line 351: |
| ''debuild'' lancia lo strumento ''lintian'', che controlla se il pacchetto è stato creato con alcuni errori non gravi. Ne vengono riportati molti per questo pacchetto. {{{ |
''debuild'' lancia lo strumento ''lintian'', che controlla la presenza nel pacchetto creato di alcuni errori comuni. Per questo pacchetto ne vengono riportati diversi. {{{#!highlight console numbers=disable |
| Line 322: | Line 363: |
| Normalmente dovrebbero essere corretti, ma nessuno di questi sembra essere un problema nel caso volessimo provare il pacchetto. Quindi ignoriamoli per ora. Dando un'occhiata alla directory superiore troveremo il pacchetto che è stato creato. {{{ # ls .. }}} {{{ |
Prima o poi dovrebbero essere corretti, ma nessuno di questi sembra essere un problema nel caso si volesse provare il pacchetto. Quindi possono essere ignorati per ora. Cercando nella directory superiore si trova il pacchetto che è stato creato. {{{#!wiki blue/solid $ '''ls''' .. }}} {{{#!highlight console numbers=disable |
| Line 333: | Line 373: |
| hithere_1.0-1_amd64.build hithere_1.0-1.diff.gz | hithere_1.0-1_amd64.build hithere_1.0-1.debian.tar.gz |
| Line 337: | Line 377: |
| I seguenti comandi installeranno il pacchetto che hai creato, non eseguirli sul tuo computer! Generalmente, è meglio creare pacchetti su un computer di cui stato stati fatti dei backup, sempre che non ti piaccia reinstallare tutto se le cose vanno per il verso sbagliato. |
=== Fase 5: installare il pacchetto === Il seguente comando installerà il pacchetto che è stato creato. NON dovrebbe essere eseguito su un computer che non si vuole danneggiare! Generalmente, è meglio fare lo sviluppo dei pacchetti su un computer di cui sono stati fatti dei backup e sul quale non è un problema reinstallare tutto da zero nel caso le cose vadano veramente per il verso sbagliato. |
| Line 342: | Line 388: |
| {{{ # sudo dpkg -i ../hithere_1.0-1_amd64.deb }}} E questo è il risultato: {{{ |
{{{#!wiki blue/solid $ '''sudo''' dpkg -i ../hithere_1.0-1_amd64.deb }}} {{{#!highlight console numbers=disable |
| Line 359: | Line 402: |
| Come possiamo testare il pacchetto? Eseguendo il comando. {{{ # hithere |
Come si può testare il pacchetto? Eseguendo il comando {{{#!wiki blue/solid $ '''hithere''' |
| Line 366: | Line 409: |
| Ma non è perfetto. Ricorda, litian ci ha restituito degli avvertimenti (es."debian/copyright" vuoto etc). Ora abbiamo un pacchetto pronto, ma non abbastanza per gli alti standard di qualità richiesti da Debian. |
Ma non è perfetto. Ricordarsi del fatto che lintian ha restituito degli avvertimenti e che '''debian/copyright''' è vuoto, ecc. Il pacchetto adesso funziona, ma non è abbastanza per gli alti standard di qualità richiesti da Debian per i suoi pacchetti. |
| Line 372: | Line 415: |
| Una volta che hai creato i tuoi pacchetti, vorrai probabilmente sapere come creare il tuo repository apt, così da fare in modo che i pacchetti siano semplici da installare. | Una volta che si siano creati i propri pacchetti, si vorrà probabilmente sapere come creare un proprio repository apt, in modo che i pacchetti siano semplici da installare. |
| Line 375: | Line 418: |
| Per eseguire più test sul tuo pacchetto puoi usare lo strumento chiamato DebianPkg:piuparts (è stato scritto originariamente da me e non sono mai stati riscontrati problemi di nessun genere). E se finalmente inizierai ad apportare cambiamenti ai sorgenti upstream, forse ti piacerebbe conoscere lo strumento DebianPkg:quilt. Un'altra serie di letture utili possono essere trovate nella pagina http://www.debian.org/devel/ . |
Per eseguire più test sul pacchetto si può usare lo strumento chiamato DebianPkg:piuparts (è stato scritto originariamente dall'autore di questa lezione perciò è perfetto e non è mai stato trovato alcun bug.... più o meno :) Da ultimo, se si inizia ad apportare cambiamenti ai sorgenti upstream, si vorrà conoscere lo strumento DebianPkg:quilt. Un'altra serie di letture utili possono essere trovate nella pagina https://www.debian.org/devel/ . |
| Line 383: | Line 426: |
| DOMANDA: posso generare un pacchetto per più architetture? RISPOSTA: non credo che Debian supporti la creazione di un pacchetto che funzioni su diverse architettura, tranne naturalmente i programmi scritti in modo da essere portabili ( "Architecture: all" ). DOMANDA: potresti chiarirmi come pacchettizzare programmi che si trovano già in forma binaria, come ad esempio nvidia blob o simili? RISPOSTA: per i pacchetti binari "blob", devi trattare il tarball con i "blob" come pacchetto sorgente, e fare in modo da evitare il processo di compilazione; però non ho mai avuto a che fare questo tipo di problema. DOMANDA: esiste qualcosa di simile a ppa di ubuntu? |
'''DOMANDA''': potresti chiarirmi come pacchettizzare programmi che si trovano già in forma binaria, come ad esempio i blob nvidia o simili? RISPOSTA: per i pacchetti binari "blob", si deve trattare il tarball con i "blob" come pacchetto sorgente, ed evitare la loro compilazione dai sorgenti; però non ho mai avuto a che fare con questo tipo di pacchetti. '''DOMANDA''': esiste qualcosa di simile a PPA di ubuntu? |
| Line 395: | Line 434: |
| DOMANDA: ho bisogno di ricreare il tarball originale se non contiene il modello di denominazione corretto? RISPOSTA: penso che tu non abbia bisogno di ricreare il pacchetto. È stato necessario per diversi anni, ma adesso con il comando "dpkg-source -x" è possibile rinominare la directory nel modo corretto. DOMANDA: ho notato che i pacchetti DEB "ufficiali" in /var/cache/apt/archives sono senza changelog e file compact. Perché? RISPOSTA: i pacchetti .deb in /var/cache/apt/archives sono pacchetti binari: il changelog è incluso, ma con un nome differente, i file originali sono solo nel pacchetto sorgente. DOMANDA: Liw ha detto che il file compact deve contenere il numero 7, immagino quindi che basti crearlo semplicemente con il comando 'echo 7 >debian/compat'. RISPOSTA: si, è sufficiente avere il singolo carattere 7 in debian/compat. DOMANDA: ho sentito di un specifico formato per "non maintainer" per i numeri di revisione di debian. RISPOSTA: penso che tu intenda il formato "pacchetto nativo" (in cui il numero di versione è solo 1.0, e non 1.0-1); oppure il formato "upload da non maintainer", che per questa sessione è troppo complesso per essere spiegato nel modo giusto. |
'''DOMANDA''': è necessario ricreare il tarball originale se non contiene una cartella con il modello di denominazione corretto? RISPOSTA: penso che al giorno d'oggi non sia necessario ricreare il pacchetto. Era necessario molti molti anni fa, ma adesso con il comando "dpkg-source -x" è possibile rinominare la directory nel modo corretto se necessario. '''DOMANDA''': alcuni pacchetti DEB "ufficiali" in /var/cache/apt/archives sono senza changelog e file compact. Perché? RISPOSTA: i pacchetti .deb in /var/cache/apt/archives sono pacchetti binari: il changelog è incluso, ma con un nome differente, i file compat originali sono solo nel pacchetto sorgente. '''DOMANDA''': Liw ha detto che il file compact deve contenere il numero 9, immagino quindi che basti un file di un solo carattere creato semplicemente con il comando 'echo 9 >debian/compat'. RISPOSTA: sì, è sufficiente avere il singolo carattere 9 in debian/compat. '''DOMANDA''': ho sentito di un specifico formato per "non maintainer" per i numeri di revisione di debian. RISPOSTA: penso che tu intenda il formato "pacchetto nativo" (in cui il numero di versione è solo 1.0, e non 1.0-1), oppure il formato "upload da non maintainer", che per questa sessione è troppo complesso per essere spiegato nel modo giusto ma che avrebbe un formato tipo "1.0-1.1". |
| Line 411: | Line 450: |
| DOMANDA: quando il comando "dpkg-source -x" viene lanciato? Deve essere fatto manualmente? | '''DOMANDA''': quando viene lanciato il comando "dpkg-source -x"? Deve essere fatto manualmente? |
| Line 415: | Line 454: |
| DOMANDA: come faccio a determinare quali pacchetti sono necessari per essere usati da Build-Depends? | '''DOMANDA''': come faccio a determinare quali pacchetti sono necessari per essere usati da Build-Depends? |
| Line 419: | Line 458: |
| DOMANDA: posso creare un pacchetto armel dal mio i386, e c'è un modo facile per farlo? RISPOSTA: questa dovrebbe essere cross-compilazione, e non credo ci sia un modo facile per farla; ci sono strumenti per farla, ma non ho familiarità con loro, mi spiace. DOMANDA: qual è la differenza tra Depends e Build Depends, in quali casi dovrei usare solo Depends invece che Build-Depends? RISPOSTA: Build-Depends è necessario __solo__ durante la creazione del pacchetto mentre viene compilato, e quando la sua test suite viene lanciata. Depends è necessario __solo__ quando il pacchetto deve venire usato, dopo essere stato installato. A volte alcune di queste dipendenze devono essere presenti sia durante la compilazione sia durante l'uso del programma, e in questo caso tu devi inserirle sia in Build-Depends e sia in Depends. Ad esempio, se un pacchetto contiene uno script PHP, ma questo non viene lanciato quando il pacchetto viene creato, PHP andrà a cercarlo solo in Depends, non Build-Depends. Tuttavia, se lo script PHP viene usato per un test e non viene includo nel pacchetto binario, la dipendenza dovrà essere presente solo in Build-Depends e non in Depends. DOMANDA: posso avere delle dipendenze in Build-Depends che non corrispondono a quelle in Depends? Sto pensando alle librerie linkate staticamente. RISPOSTA: Build-Depends e Depends sono due cose completamente separate, ed è perfettamente corretto (da un punto dal punto di vista della pacchettizzazione) avere dipendenze in una e non in un'altra, o in entrambe. DOMANDA: se volessi fare un NMU (non-maintainer upload), dovrei scrivere il mio nome nel campo Uploader, in quello del Maintainer, o in nessuno dei due? RISPOSTA: ''(da parte di dapal)'' nessuno, ma la prima linea del changelog dovrebbe essere "Non-maintainer upload" DOMANDA: quando creo un pacchetto con il campo "Architecture: all", alcuni dei file risultanti (b.build, .changes) continuano ad avere l'architettura con cui sono stati creati nel nome. È un comportamento corretto? |
'''DOMANDA''': posso creare un pacchetto armel sul mio i386, e c'è un modo facile per farlo? RISPOSTA: questa sarebbe una cross-compilazione, e non credo ci sia un modo facile per farla; ci sono strumenti per farla, ma non ho familiarità con loro, mi spiace. '''DOMANDA''': qual è la differenza tra Depends e Build Depends, in quali casi si deve usare solo Depends invece di Build-Depends? RISPOSTA: le dipendenze Build-Depends sono necessarie __solo__ durante la creazione del pacchetto mentre viene compilato, e quando la sua test suite viene lanciata. Le dipendenze Depends sono necessarie __solo__ quando il pacchetto viene usato, dopo essere stato installato. Alcune di queste dipendenze devono essere presenti sia durante la compilazione sia durante l'uso del programma, e in questo caso devono essere inserite sia in Build-Depends e sia in Depends. Ad esempio, se un pacchetto contiene uno script PHP, ma questo non viene lanciato quando il pacchetto viene creato, PHP dovrà essere inserito solo nel campo Depends, non Build-Depends. Invece, se lo script PHP viene usato solo per un test e non viene incluso nel pacchetto binario, la dipendenza dovrà essere presente solo in Build-Depends e non in Depends. '''DOMANDA''': posso avere delle dipendenze in Build-Depends che non hanno una corrispondenza con quelle in Depends? Sto pensando alle librerie con link statico. RISPOSTA: Build-Depends e Depends sono due cose completamente separate, ed è perfettamente corretto (dal punto di vista della pacchettizzazione) avere dipendenze in una e non nell'altra, o in entrambe. '''DOMANDA''': se volessi fare un NMU (non-maintainer upload), dovrei scrivere il mio nome nel campo Uploader, in quello del Maintainer, o in nessuno dei due? RISPOSTA: ''(da parte di dapal)'' in nessuno, ma la prima riga del changelog dovrebbe essere "Non-maintainer upload" '''DOMANDA''': quando creo un pacchetto con il campo "Architecture: all", alcuni dei file risultanti (b.build, .changes) hanno comunque l'architettura con cui sono stati creati nel nome. È un comportamento corretto? |
| Line 444: | Line 483: |
| DOMANDA: c'è un altro pacchetto come pacchetto sorgente o è lo stesso del pacchetto binario? Devo creare e mantenere due pacchetti? (binario e sorgente)? RISPOSTA: puoi modificare il pacchetto sorgente ed eseguire un comando per creare un pacchetto binario fuori dal pacchetto sorgente. DOMANDA: non mi è ancora chiaro se l'opzione "Architecture" ha effetto sul pacchetto sorgente (nel processo di compilazione) o sul pacchetto binario (installazione ed esecuzione). RISPOSTA: il campo "Architecture:" dice a chi sta creando il pacchetto se vi sia alcun motivo di creare il pacchetto su un'architettura particolare, se dice solo i386 e amd64, non ha alcun senso compilarlo su un amd64. DOMANDA: l'esempio debian/rules contiene solo #!make -f , che fine ha fatto ./configure , o cmake o scons o gli altri strumenti di configurazione? RISPOSTA: dh ha molta euristica, quindi un pacchetto con lo script ./configure, o uno degli altri consueti metodi per creare i pacchetti, verrà compilato senza nessuna aggiunta. DOMANDA: l'euristica è una cosa buona, ma se voglio passare --una-opzione-speciale a ./configure o qualche argomento per cmake, l'euristica si occupa di gestire i pacchetti sorgente che hanno bisogno ./waf o di altri stumenti di compilazione? |
'''DOMANDA''': c'è un altro pacchetto come pacchetto sorgente o è lo stesso del pacchetto binario? Devo creare e mantenere due pacchetti? (binario e sorgente)? RISPOSTA: devi modificare il pacchetto sorgente ed eseguire un comando per creare un pacchetto binario a partire dal pacchetto sorgente. '''DOMANDA''': non mi è ancora chiaro se l'opzione "Architecture" ha effetto sul pacchetto sorgente (nel processo di compilazione) o sul pacchetto binario (installazione ed esecuzione). RISPOSTA: il campo "Architecture:" dice a chi sta creando il pacchetto se vi sia un senso nel creare il pacchetto su un'architettura particolare; se dice solo i386, non ha alcun senso compilarlo su un AMD64. '''DOMANDA''': l'esempio di file debian/rules contiene solo #!make -f , che fine ha fatto ./configure , o cmake o scons o gli altri strumenti di configurazione? RISPOSTA: dh ha molta euristica, quindi un pacchetto con lo script ./configure, o uno degli altri consueti metodi per creare i pacchetti, verrà normalmente compilato senza bisogno di nessuna aggiunta. '''DOMANDA''': l'euristica è una cosa buona, ma se voglio passare --una-opzione-speciale come argomento per ./configure o cmake, l'euristica riesce a gestire i pacchetti sorgente che hanno bisogno ./waf o di altri stumenti di compilazione? |
| Line 459: | Line 498: |
| <dapal> lilith: usando dh7, se vuoi passare qualche argomento a ./configure, basta sovrascrivere _dh_auto_configure <TAB>dh_auto_configure -- --tuo-parametro dh ha un meccanismo di estensione/sovrascrittura che ti permette di sovrascrivere particolari parti; è davvero semplice da usare, una volta che hai letto la documentazione ovviamente. DOMANDA: dove posso trovare la documentazione per sovrascrivere le impostazioni di debhelper 7? RISPOSTA: dh esegue una specifica sequenza di comandi per compilare i pacchetti; ogni comando inizia con i caratteri "_dh", e ognuno di questi può essere sovrascritto avendo una voce all'interno di "debian/rules" chiamata override_dh_REGOLA. È possibile aggiungere l'opzione --no-act al comando dh in debian/rules per vedere quali comandi vengono eseguiti, devi anche leggere il manuale di quel comando per vedere se puoi configurarlo (tramite file come debian/hithere.dirs), o se hai bisogno di sovrascriverlo. DOMANDA: da dove lanci solitamente i tuoi comandi, all'interno della directory hithere-1.0 o fuori? Ci deve essere un'altra directory chiamata hithere (senza numerazione)? RISPOSTA: Ho sempre lanciato i comandi di pacchettizzazione in hithere-1.0, e avevo anche una directory superiore chiamata hithere, ma non è necessaria, serve solo a tenere i vari progetti più ordinati. DOMANDA: ho un upstream che ha bisogno di qmake (usa Qt) prima di lanciare make, posso aggiungerlo a debian/rules? Come? RISPOSTA: ''(da gregoa)'' debhelper supporta qmake dalla versione 7.4.12 (quindi non ci sono modifiche aggiuntive da apportare). L'unica cosa da fare è sovrascrivere _dh_auto_configure :\n\tqmake DOMANDA: qual è il miglior processo per aggiornare un pacchetto alla nuova versione upstream? RISPOSTA: ah, non sono sicuro quale sia il processo migliore per farlo, ma fondamentalmente: spacchettare il sorgente upstream in una nuova directory, copiare la directory debian/* del vecchio pacchetto, aggiornare debian/changelog ("dch -v 1.2.3-4") e provare a compilare e correggere ogni tipo di errore. Non è un buon processo, ma per qualcosa di meglio dovresti imparare ad usare quilt, e possibilmente anche usare una sistema di revisione con la pacchettizzazione debian, ma è un argomento troppo ampio per essere trattato in questa sessione. DOMANDA: ho creato un pacchetto debian che dipende da molti altri pacchetti. L'unico problema è che il mio pacchetto configura gli altri pacchetti in una certa maniera in modo che si adatti alle esigenze di alcune persone. Per fare questo apporta anche alcuni cambiamenti critici al sistema, come attivare il routing del network e così via... c'è qualche regola seconda la quale un pacchetto ufficiale ha il permesso di fare una cosa o no? Un pacchetto del genere può diventare un pacchetto ufficiale? RISPOSTA: http://www.debian.org/doc/debian-policy/ è la migliore documentazione disponibile per sapere cosa un pacchetto Debian ufficiale ha il permesso o l'obbligo di fare. I pacchetti Debian non sono autorizzati a modificare le configurazioni di altri pacchetti, a meno che l'altro pacchetto non fornisca un'interfaccia documentata per farlo. |
<dapal> lilith: usando dh7, se vuoi passare qualche argomento a ./configure, basta usare qualcosa tipo ovverride_dh_auto_configure <TAB>dh_auto_configure -- --tuoi-parametri <<BR>>dh ha un bel meccanismo di estensione/sovrascrittura che ti permette di sovrascrivere particolari parti; è davvero semplice da usare, una volta letta la documentazione. <<BR>><aron> Ho avuto brutte esperienze nel pacchettizzare software che usa waf come sistema di compilazione. Solitamente contiene blob binari che non possono essere estratti con gli strumenti standard (sì, incorpora un tgz nello script); ciò che è critico è che è difficile mantenere il pacchetto Debian con un sistema di compilazione waf perché non è pensato per aiutare gli autori upstream a compilare i proprio pacchetti in un modo sostanzialmente standard, ma solo in un modo "funziona per me". Si dovrebbe davvero suggerire agli autori upstream di prendere in considerazione un altro sistema (uno potente come CMake, Autotools; o uno più semplice come python-distutils-extra), se possibile. '''DOMANDA''': dove posso trovare la documentazione per sovrascrivere le impostazioni di debhelper 9? RISPOSTA: dh esegue una specifica sequenza di comandi per compilare i pacchetti; ogni comando ha un nome tipo "dh_qualcosa", e ognuno di questi può essere sovrascritto con una voce "override_dh_qualcosa" all'interno di "debian/rules". È possibile aggiungere l'opzione --no-act al comando dh in debian/rules per vedere quali comandi vengono eseguiti, poi si deve leggere il manuale di quel comando per vedere se è possibile configurarlo (tramite un file tipo debian/hithere.dirs) o se è necessario sovrascriverlo. In practica, usare l'opzione --no-act in combinazione con l'opzione --verbose permette di ottenere più dettagli riguardo a ciò che verrebbe eseguito. '''DOMANDA''': da dove lanci solitamente i tuoi comandi, all'interno della directory hithere-1.0 o fuori? Ci deve essere un'altra directory chiamata hithere (senza numerazione)? RISPOSTA: Lancio sempre i comandi di pacchettizzazione in hithere-1.0 e di solito ho anche una directory superiore chiamata hithere, ma non è necessaria, serve solo a tenere i vari progetti più ordinati. '''DOMANDA''': ho un upstream che ha bisogno di qmake (usa Qt) prima di lanciare make, posso aggiungerlo a debian/rules? Come? RISPOSTA: ''(da gregoa)'' debhelper supporta qmake dalla versione 7.4.12 (quindi non ci sono modifiche aggiuntive da apportare). Prima di quella versione era necessario usare override_dh_auto_configure :\n\tqmake '''DOMANDA''': qual è il miglior processo per aggiornare un pacchetto alla nuova versione upstream? RISPOSTA: ah, non sono sicuro quale sia il processo migliore per farlo, ma fondamentalmente: spacchettare il sorgente upstream in una nuova directory, copiare la directory debian/* del vecchio pacchetto, aggiornare debian/changelog ("dch -v 1.2.3-4"), provare a compilare e correggere ogni tipo di errore. Non è esattamente un buon processo, ma per qualcosa di meglio dovresti imparare ad usare quilt, e possibilmente anche ad usare un sistema di revisione con la pacchettizzazione debian, ma è un argomento troppo ampio per essere trattato in questa sessione. '''DOMANDA''': ho creato un pacchetto debian che dipende da molti altri pacchetti. L'unica cosa che fa realmente il mio pacchetto è configurarne altri in una certa maniera in modo che si adattino alle esigenze di alcune persone. Per fare questo apporta anche alcuni cambiamenti critici al sistema, come attivare l'instradamento di rete nel kernel e così via... c'è una qualche regola su cosa un pacchetto ufficiale ha il permesso di fare e cosa no? Un pacchetto del genere può diventare un pacchetto ufficiale? RISPOSTA: https://www.debian.org/doc/debian-policy/ è il migliore insieme di regole disponibile per sapere cosa un pacchetto Debian ufficiale ha il permesso o l'obbligo di fare. I pacchetti Debian non sono autorizzati a modificare le configurazioni di altri pacchetti, a meno che questi non forniscano un'interfaccia documentata per farlo. |
| Line 494: | Line 531: |
| * http://www.debian.org/devel/ | * https://www.debian.org/devel/ |
| Line 496: | Line 533: |
| * http://www.debian.org/doc/debian-policy/ * http://liw.fi/manpages/ |
* https://www.debian.org/doc/debian-policy/ * https://liw.fi/manpages/ * [[Packaging|Questa]] è la pagina che raccoglie tutte le risorse sulla pacchettizazzione trattate in questo wiki * [[http://meetbot.debian.net/debian-women/2010/debian-women.2010-11-18-20.05.html|Registro della conversazione IRC in Debian Women: creare pacchetti Debian]] * [[http://meetbot.debian.net/debian-women/2011/debian-women.2011-05-07-11.00.html|Registro della conversazione IRC in Debian Women: prendere un pacchetto esistente, ricostruirlo, applicarvi modifiche e preparare tali modifiche per essere inviate come patch per un bug.]] |
| Line 502: | Line 543: |
| ## If this page belongs to an existing Category, add it below. ## CategorySomething | CategoryAnother |
CategoryPackaging |
Translation(s): English - Español - Italiano - Català - Português (Brasil) - Română - Русский
Contents
Introduzione alla pacchettizzazione per Debian
Questa è una lezione introduttiva alla [Packaging|creazione di pacchetti per Debian]] quindi non verranno spiegati i meccanismi più complessi della pacchettizzazione, ma mostrato invece come creare pacchetti per programmi semplici da pacchettizzare.
Cosa è un "pacchetto"?
Un pacchetto Debian è una raccolta di file che permettono di distribuire applicazioni o librerie attraverso il sistema di gestione dei pacchetti. Lo scopo della pacchettizzazione è quello di permettere di automatizzare l'installazione, l'aggiornamento, la configurazione e la rimozione di programmi per Debian in modo coerente. Un pacchetto è formato da un pacchetto sorgente e da uno o più pacchetti binari. La Debian Policy specifica il formato standard per un pacchetto, che deve essere seguito da tutti i pacchetti.
I pacchetti binari contengono eseguibili, file di configurazione standard, altre risorse necessarie per l'esecuzione di eseguibili, documentazione, dati...
I pacchetti sorgente contengono la distribuzione originale a monte dei sorgenti, le configurazioni per il sistema di compilazione dei pacchetti, gli elenchi delle dipendenze di esecuzione e dei pacchetti in conflitto, una descrizione analizzabile da macchina delle informazioni sui diritti d'autore e sulla licenza, la configurazione iniziale del software, ecc.
Lo scopo della pacchettizzazione è di produrre tali pacchetti dai sorgenti spacchettizzati. Il pacchetto sorgente (.dsc) e i pacchetti binari (.deb) verranno creati da strumenti come dpkg-buildpackage.
Si possono leggere ulteriori informazioni sull'anatomia dei pacchetti binari o dei pacchetti sorgente nelle loro pagine nel wiki.
Solo i pacchetti che sono conformi alle politiche di Debian vengono accettati nell'archivio dei pacchetti. Pacchetti binari (.deb) creati a mano che non sono compilati a partire da un pacchetto sorgente non vengono accettati per mantenere coerenza e riproducibilità.
Requisiti
In questa guida si presume che l'utente conosca:
- come installare pacchetti binari;
- l'uso di base della riga di comando
- l'utilizzo di un editor di testo a propria scelta per modificare i file
Quello è tutto ciò di cui si ha bisogno.
Pacchetti richiesti:
debhelper versione 9 o successiva
I tre concetti centrali
I tre concetti centrali sono
archivio upstream:
Un tarball (archivio tar) è il file .tar.gz o .tgz creato dagli autori originali a monte(può anche essere in altri formati compressi come .tar.bz2, .tb2 o .tar.xz).
Contiene il software scritto dagli autori originali a monte ("upstream developer").
pacchetto sorgente:
questo è il secondo passo del processo di pacchettizzazione: creare il pacchetto sorgente dai sorgenti originali a monte.
pacchetto binario:
da tale pacchetto sorgente si crea poi il pacchetto binario che viene distribuito ed installato.
Il pacchetto sorgente più semplice è formato da tre file:
- Il tarball upstream, rinominato secondo le convenzioni per i nomi
- una directory debian, contenente le modifiche fatte ai sorgenti originali più tutti i file necessari per la creazione di un pacchettto binario.
un file descrizione (con estensione .dsc), che contiene i metadati per i due file precedenti.
Processo di pacchettizzazione
- Fase 1: rinominare il tarball upstream
- Fase 2: estrarre il tarball upstream
- Fase 3: aggiungere i file debian.tar.gz
- Fase 4: creare il pacchetto
- Fase 5: testare il pacchetto
Dopo i test, i pacchetti sorgente e binario posso essere caricati.
A questo punto si può testare il pacchetto sul proprio computer e i pacchetti sorgente e binario possono essere caricati sui server Debian.
Per questa guida viene usato come esempio questo tarball.
Fase 1: rinominare il tarball originale
Gli strumenti per la pacchettizzazione richiedono che il tarball abbia un nome conforme alla convenzione per i nomi.
Il nome è in questo formato: nome del pacchetto sorgente, un trattino basso (_), numero di versione originale a monte seguito da .orig.tar.gz. Il nome del pacchetto sorgente deve essere tutto minuscolo e può contenere lettere, cifre e trattini. Sono permessi anche alcuni altri caratteri<!-- [link the full naming convention standard here] -->.
Si dovrebbe modificare in modo minimo il nome originale per renderlo conforme a Debian. Se il nome originale è conforme, si dovrebbe usare quello.
Nel caso considerato gli autori originali hanno scelto un nome appropriato, "hithere", perciò non sono necessarie modifiche.
Il risultato sarà un file chiamato hithere_1.0.orig.tar.gz.
Si noti che c'è un trattino basso (_) nel nome, e non un trattino (-). Questo è importante.
$ mv hithere-1.0.tar.gz hithere_1.0.orig.tar.gz
Fase 2: spacchettare il tarball originale
I sorgenti si spacchettano in una directory chiamata con il nome del pacchetto sorgente e la versione originale a monte (con un trattino, e non un trattino basso, tra i due); perciò il tarball originale dovrebbe spacchettarsi in una directory chiamata "hithere-1.0".
In questo caso, lo sviluppatore a monte è stato accorto e ha fatto sì che il tarball si spacchettasse nella directory giusta.
$ tar xf hithere_1.0.orig.tar.gz
Fase 3: aggiungere i file di pacchettizzazione di Debian
Tutti i file successivi andranno nella sottodirectory debian/ all'interno della directory sorgente, perciò va creata:
$ cd hithere-1.0
$ mkdir debian
Diamo uno sguardo ai file che è necessario fornire.
debian/changelog
Il primo file è debian/changelog. Questo è il log dei cambiamenti del pacchetto Debian.
In questo file non è necessario elencare tutte le modifiche apportate al codice originale, ma un riassunto è utile agli altri. Dato che stiamo creando la prima versione, non c'è nessun cambiamento da registrare. Tuttavia, abbiamo comunque bisogno di una voce all'interno del file "changelog", perché gli strumenti per la pacchettizzazione leggono informazioni da tale file: in particolare la versione del pacchetto.
debian/changelog ha un formato standard. Il modo più facile per crearlo è usare il programma dch .
$ dch --create -v 1.0-1 --package hithere
Il risultato sarà un file come questo:
hithere (1.0-1) UNRELEASED; urgency=low * Initial release. (Closes: #XXXXXX) -- Lars Wirzenius <liw@liw.fi> Thu, 18 Nov 2010 17:25:32 +0000
Nota bene:
Il nome del pacchetto (hithere) DEVE essere la stessa del nome del pacchetto sorgente. 1.0-1 è la versione. La parte 1.0 è la versione upstream. La parte -1 è la versione Debian : la prima versione del pacchetto Debian della versione upstream 1.0. Se il pacchetto Debian ha un bug, che viene corretto, ma la versione di upstream resta la stessa, la versione successiva del pacchetto verrà chiamata 1.0-2. Quella ancora dopo 1.0-3, e così via.
UNRELEASED è ciò che viene definita destinazione di upload. Dice al programma di caricamento dove il pacchetto binario deve essere caricato. UNRELEASED significa che il pacchetto non è pronto per essere caricato. È una buona idea lasciare UNRELEASED così non verrà caricato nulla per sbaglio.
urgency=low per il momento non viene spiegato.
La parte (Closes: #XXXXXX) serve per chiudere i bug quando il pacchetto viene caricato. Questo è il modo consueto per chiuedere i bug in Debian: quando il pacchetto che corregge un bug viene caricato, il sistema di tracciamento dei bug lo nota e segna il bug come chiuso. Se non ci sono bug risolti, questa parte può essere omessa.
- La riga finale nel changelog indica chi ha compilato questa versione del pacchetto, e quando. Il programma dch prova ad indovinare il nome e l'indirizzo e-mail, ma può essere configurato con le informazioni giuste. Vedere la pagina di manuale dch(1) per i dettagli.
debian/compat
debian/compat specifica il "livello di compatibilità" per lo strumento debhelper .
10
debian/control
Il file "control" descrive i pacchetti sorgente e binario, e fornisce anche alcune informazioni su di essi, come il loro nome, chi è il manutentore del pacchetto, ecc. Questo sottostante è un esempio di come potrebbe essere.
Source: hithere
Maintainer: Lars Wirzenius <liw@liw.fi>
Section: misc
Priority: optional
Standards-Version: 3.9.2
Build-Depends: debhelper (>= 9)
Package: hithere
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: greet user
hithere greets the user, or the world.Ci sono molti campi obbligatori, ma per ora non è necessario preoccuparsi del loro significato. In debian/control, ci sono due paragrafi.
Il primo paragrafo descrive il pacchetto sorgente con questi campi:
- Source
- Il nome del pacchetto sorgente.
- Maintainer
- Il nome e l'indirizzo di posta elettronica della persona responsabile del pacchetto.
- Priority
La priorità del pacchetto (una tra "required", "important", "standard" o "optional"). In generale un pacchetto è "optional" (opzionale) a meno che non sia "essential" (essenziale) per un sistema standard funzionante, cioè per l'avvio o il funzionamento della rete. Secondo la Debian Policy 4.5.1 (e forse da prima) la priorità 'extra' per i pacchetti è deprecata.
- Build-Depends
- L'elenco dei pacchetti che devono essere installati per creare il pacchetto; possono essere necessari per usare il pacchetto oppure no.
Tutti i paragrafi dopo il primo descrivono i pacchetti binari creati dai sorgenti. Possono esserci molti pacchetti binari creati dallo stesso sorgente; nell'esempio qui riportate ce n'è uno solo. Vengono usati i seguenti campi:
- Package
- Il nome del pacchetto binario; può essere diverso da quello del pacchetto sorgente.
- Architecture
- Specifica con quale architettura del computer il pacchetto binario dovrebbe funzionare: i386 per i processori 32-bit della Intel, amd64 per 64-bit, armel per ARM, e così via. Debian funziona su circa una dozzina di architetture, quindi il supporto ad esse è cruciale; il campo "Architecture" può contenere nomi di particolari architetture, ma di solito contiene uno tra due valori speciali.
- any
- (come nell'esempio) significa che il pacchetto può essere costruito per qualsiasi architettura. In altre parole il codice è stato scritto per essere portabile, in modo che non ci sia bisogno di fare troppe supposizioni sul tipo di hardware. Tuttavia, il pacchetto binario deve comunque essere pacchettizzato per ogni architettura separatamente.
- all
- significa che il medesimo pacchetto binario funzionerà su tutte le architetture, senza dover essere creato separatamente per ciascuna. Per esempio, un pacchetto contenente solamente script per la shell avrebbe il valore "all"; gli script per la shell funzionano nello stesso modo ovunque e non necessitano di essere compilati.
- Depends
- L'elenco dei pacchetti che devono essere installati affinché i programmi nel pacchetto binario funzionino.
Elencare queste dipendenze manualmente è noioso ed è facile fare errori. Per fare funzionare la cosa deve essere presente il campo magico ${shlibs:Depends}. L'altro campo magico è invece usato da debhelper: ${misc:Depends}. Il campo shlibs indica le dipendenze da librerie condivise, il campo misc è per alcune cose fatte da debhelper. Per altre dipendenze, queste devono essere aggiunte manualmente ai campi Depends o Build-Depends e la sintassi magica ${...} funziona solo con il campo Depends.
- Description
- La descrizione completa del pacchetto; è pensata per essere utile agli utenti. La prima riga è usata come breve riassunto (sinossi) e il resto della descrizione deve essere una descrizione indipendente più lunga del pacchetto.
Il comando cme edit dpkg fornisce una GUI per modificare la maggior parte dei file di pacchettizzazione, incluso debian/control. Vedere la pagina Gestire i pacchetti Debian con cme. Il comando cme viene fornito insieme al pacchetto cme. È anche possibile modificare solamente debian/control con il comando cme edit dpkg-control.
debian/copyright
È un file importante, ma per ora ci basterà lasciarlo vuoto.
Per Debian, questo file è usato per tenere traccia del copyright e delle informazioni legate ad esso. Tuttavia, non è importante da un punto di vista tecnico. Per adesso ci si concentrerà solo sugli aspetti tecnici; si potrà tornare in seguito su debian/copyright.
debian/rules
Dovrebbe essere simile a questo:
#!/usr/bin/make -f
%:
dh $@
Nota: L'ultima riga dovrebbe essere fatta rientrare solo con una tabulazione (TAB), non con spazi.
Questo file è un makefile e la tabulazione è ciò che vuole il comando make.
debian/rules può essere un file piuttosto complesso, tuttavia grazie al comando dh in debhelper 7 è possibile mantenerlo semplice come in questo esempio per molti casi.
debian/source/format
L'ultimo file richiesto è debian/source/format, e dovrebbe contenere il numero di versione "3.0 (quilt)".
3.0 (quilt)
Questo è il numero di versione per il formato del pacchetto sorgente, e anche se è lo stesso della versione upstream, questa è solo una coincidenza.
Fase 4: compilare il pacchetto
Primo tentativo
Ora si può costruire il pacchetto.
Ci sono molti comandi utilizzabili ma questo è quello che verrà usato. Eseguendo il comando si otterrà un output simile al seguente:
$ debuild -us -uc
make[1]: Entering directory `/home/liw/debian-packaging-tutorial/x/hithere-1.0'
install hithere /home/liw/debian-packaging-tutorial/x/hithere-1.0/debian/hithere/usr/local/bin
install: cannot create regular file `/home/liw/debian-packaging-tutorial/x/hithere-1.0/debian/hithere/usr/local/bin': No such file or directory
make[1]: *** [install] Error 1
make[1]: Leaving directory `/home/liw/debian-packaging-tutorial/x/hithere-1.0'
dh_auto_install: make -j1 install DESTDIR=/home/liw/debian-packaging-tutorial/x/hithere-1.0/debian/hithere returned exit code 2
make: *** [binary] Error 29
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2
debuild: fatal error at line 1325:
dpkg-buildpackage -rfakeroot -D -us -uc failed
Qualcosa è andato storto. Questo è quello che accade di solito, si fa del proprio meglio per creare i file debian/* , ma c'è sempre qualcosa che non viene fatta nel modo giusto. Le cose sono andate nel verso sbagliato in questo pezzo:
install hithere /home/liw/debian-packaging-tutorial/x/hithere-1.0/debian/hithere/usr/local/bin
Il Makefile upstream sta tentando di installare il programma compilato in un posto sbagliato.
Ci sono diverse cose in ballo: una riguarda il modo in cui funziona la pacchettizzazione in Debian.
Correzione
Quando il programma viene compilato, ed è "installato", non viene installato in usr o in /usr/local come avviene di solito, ma da qualche parte nella sottodirectory debian/.
Viene creato un sottoinsieme dell'intero file system in debian/hithere che poi verrà inserito nel pacchetto binario. Quindi .../debian/hithere/usr/local/bin è la posizione giusta, a parte il fatto che non dovrebbe essere installato in usr/local, ma direttamente in usr.
Quindi è necessario modificare il file debian/rules per far sì che dica al Makefile di installare il programma nella giusta directory (debian/hithere/usr/bin):
#!/usr/bin/make -f
%:
dh $@
override_dh_auto_install:
$(MAKE) DESTDIR=$$(pwd)/debian/hithere prefix=/usr installPer capire cosa fa il codice riportato sopra bisogna sapere come funzionano i Makefile e i vari passi dell'esecuzione di debhelper.
Per ora basta dire che c'è un comando che viene lanciato dal debhelper che si occupa di installare i file upstream, e che questo passaggio si chiama dh_auto_install.
Abbiamo bisogno di sovrascrivere questo passaggio con la regola in debian/rules chiamata override_dh_auto_install.
La riga finale nel nuovo debian/rules è una tecnica degli anni '70 usata per invocare il Makefile upstream debian/rules con gli argomenti giusti.
Riprovare
$ debuild -us -uc
Fallisce ancora!
Questa volta il comando sbagliato è:
install hithere /home/liw/debian-packaging-tutorial/x/hithere-1.0/debian/hithere/usr/bin
Si sta tentando di installare i binari nel posto giusto, ma questo non esiste. Per correggere questo problema è necessario dire agli strumenti di pacchettizzazione di creare prima la directory.
Normalmente, il Makefile upstream la creerebbe esso stesso, ma in questo caso lo sviluppatore upstream è stato troppo pigro per farlo.
Un'altra correzione
Il programma per la pacchettizzazione (nello specifico debhelper) fornisce un modo per farlo.
Basta creare un file chiamato debian/hithere.dirs, con il seguente contenuto:
usr/bin usr/share/man/man1
La seconda riga crea una directory per la pagina di manuale, che sarà necessaria più avanti. Si deve porre attenzione nella manutenzione di questi file *.dirs perché possono dare origine a directory vuote nelle versioni future del proprio pacchetto, se le voci elencate in questi file non sono più valide.
Un'altra prova
$ debuild -us -uc
Ora la creazione del pacchetto riesce, ma ci sono ancora alcuni piccoli problemini.
debuild lancia lo strumento lintian, che controlla la presenza nel pacchetto creato di alcuni errori comuni. Per questo pacchetto ne vengono riportati diversi.
Now running lintian...
W: hithere source: out-of-date-standards-version 3.9.0 (current is 3.9.1)
W: hithere: copyright-without-copyright-notice
W: hithere: new-package-should-close-itp-bug
W: hithere: wrong-bug-number-in-closes l3:#XXXXXX
Finished running lintian.
Prima o poi dovrebbero essere corretti, ma nessuno di questi sembra essere un problema nel caso si volesse provare il pacchetto. Quindi possono essere ignorati per ora.
Cercando nella directory superiore si trova il pacchetto che è stato creato.
$ ls ..
hithere-1.0 hithere_1.0-1_amd64.deb hithere_1.0.orig.tar.gz
hithere_1.0-1_amd64.build hithere_1.0-1.debian.tar.gz
hithere_1.0-1_amd64.changes hithere_1.0-1.dsc
Fase 5: installare il pacchetto
Il seguente comando installerà il pacchetto che è stato creato.
NON dovrebbe essere eseguito su un computer che non si vuole danneggiare!
- Generalmente, è meglio fare lo sviluppo dei pacchetti su un computer di cui sono stati fatti dei backup e sul quale non è un problema reinstallare tutto da zero nel caso le cose vadano veramente per il verso sbagliato.
Le macchine virtuali sono un buon posto per lo sviluppo.
$ sudo dpkg -i ../hithere_1.0-1_amd64.deb
liw@havelock$ sudo dpkg -i ../hithere_1.0-1_amd64.deb
[sudo] password for liw:
Selecting previously deselected package hithere.
(Reading database ... 154793 files and directories currently installed.)
Unpacking hithere (from ../hithere_1.0-1_amd64.deb) ...
Setting up hithere (1.0-1) ...
Processing triggers for man-db ...
liw@havelock$
Come si può testare il pacchetto? Eseguendo il comando
$ hithere
Funziona! Ma non è perfetto. Ricordarsi del fatto che lintian ha restituito degli avvertimenti e che debian/copyright è vuoto, ecc.
Il pacchetto adesso funziona, ma non è abbastanza per gli alti standard di qualità richiesti da Debian per i suoi pacchetti.
Conclusioni
Una volta che si siano creati i propri pacchetti, si vorrà probabilmente sapere come creare un proprio repository apt, in modo che i pacchetti siano semplici da installare. Lo strumento migliore per farlo è reprepro.
Per eseguire più test sul pacchetto si può usare lo strumento chiamato piuparts (è stato scritto originariamente dall'autore di questa lezione perciò è perfetto e non è mai stato trovato alcun bug.... più o meno
Da ultimo, se si inizia ad apportare cambiamenti ai sorgenti upstream, si vorrà conoscere lo strumento quilt.
Un'altra serie di letture utili possono essere trovate nella pagina https://www.debian.org/devel/ .
Domande e risposte
DOMANDA: potresti chiarirmi come pacchettizzare programmi che si trovano già in forma binaria, come ad esempio i blob nvidia o simili?
RISPOSTA: per i pacchetti binari "blob", si deve trattare il tarball con i "blob" come pacchetto sorgente, ed evitare la loro compilazione dai sorgenti; però non ho mai avuto a che fare con questo tipo di pacchetti.
DOMANDA: esiste qualcosa di simile a PPA di ubuntu?
RISPOSTA: Debian non ha un servizio PPA come Ubuntu, però esistono gli strumenti per creare repository apt, c'è solo molto da configurare.
DOMANDA: è necessario ricreare il tarball originale se non contiene una cartella con il modello di denominazione corretto?
RISPOSTA: penso che al giorno d'oggi non sia necessario ricreare il pacchetto. Era necessario molti molti anni fa, ma adesso con il comando "dpkg-source -x" è possibile rinominare la directory nel modo corretto se necessario.
DOMANDA: alcuni pacchetti DEB "ufficiali" in /var/cache/apt/archives sono senza changelog e file compact. Perché?
RISPOSTA: i pacchetti .deb in /var/cache/apt/archives sono pacchetti binari: il changelog è incluso, ma con un nome differente, i file compat originali sono solo nel pacchetto sorgente.
DOMANDA: Liw ha detto che il file compact deve contenere il numero 9, immagino quindi che basti un file di un solo carattere creato semplicemente con il comando 'echo 9 >debian/compat'.
RISPOSTA: sì, è sufficiente avere il singolo carattere 9 in debian/compat.
DOMANDA: ho sentito di un specifico formato per "non maintainer" per i numeri di revisione di debian.
RISPOSTA: penso che tu intenda il formato "pacchetto nativo" (in cui il numero di versione è solo 1.0, e non 1.0-1), oppure il formato "upload da non maintainer", che per questa sessione è troppo complesso per essere spiegato nel modo giusto ma che avrebbe un formato tipo "1.0-1.1".
DOMANDA: quando viene lanciato il comando "dpkg-source -x"? Deve essere fatto manualmente?
RISPOSTA: "dpkg-source -x" è il comando per spacchettare un pacchetto sorgente Debian che è già stato creato (solitamente da qualcun altro); non viene usato di norma per la creazione di un pacchetto.
DOMANDA: come faccio a determinare quali pacchetti sono necessari per essere usati da Build-Depends?
RISPOSTA: di norma uso due metodi: a) con tentativi ed errori e b) leggendo il codice del programma. Entrambi sono di solito necessari.
DOMANDA: posso creare un pacchetto armel sul mio i386, e c'è un modo facile per farlo?
RISPOSTA: questa sarebbe una cross-compilazione, e non credo ci sia un modo facile per farla; ci sono strumenti per farla, ma non ho familiarità con loro, mi spiace.
DOMANDA: qual è la differenza tra Depends e Build Depends, in quali casi si deve usare solo Depends invece di Build-Depends?
RISPOSTA: le dipendenze Build-Depends sono necessarie solo durante la creazione del pacchetto mentre viene compilato, e quando la sua test suite viene lanciata. Le dipendenze Depends sono necessarie solo quando il pacchetto viene usato, dopo essere stato installato. Alcune di queste dipendenze devono essere presenti sia durante la compilazione sia durante l'uso del programma, e in questo caso devono essere inserite sia in Build-Depends e sia in Depends.
Ad esempio, se un pacchetto contiene uno script PHP, ma questo non viene lanciato quando il pacchetto viene creato, PHP dovrà essere inserito solo nel campo Depends, non Build-Depends.
Invece, se lo script PHP viene usato solo per un test e non viene incluso nel pacchetto binario, la dipendenza dovrà essere presente solo in Build-Depends e non in Depends.
DOMANDA: posso avere delle dipendenze in Build-Depends che non hanno una corrispondenza con quelle in Depends? Sto pensando alle librerie con link statico.
RISPOSTA: Build-Depends e Depends sono due cose completamente separate, ed è perfettamente corretto (dal punto di vista della pacchettizzazione) avere dipendenze in una e non nell'altra, o in entrambe.
DOMANDA: se volessi fare un NMU (non-maintainer upload), dovrei scrivere il mio nome nel campo Uploader, in quello del Maintainer, o in nessuno dei due?
RISPOSTA: (da parte di dapal) in nessuno, ma la prima riga del changelog dovrebbe essere "Non-maintainer upload"
DOMANDA: quando creo un pacchetto con il campo "Architecture: all", alcuni dei file risultanti (b.build, .changes) hanno comunque l'architettura con cui sono stati creati nel nome. È un comportamento corretto?
RISPOSTA: certo, è un comportamento corretto, non preoccuparti di questo.
DOMANDA: c'è un altro pacchetto come pacchetto sorgente o è lo stesso del pacchetto binario? Devo creare e mantenere due pacchetti? (binario e sorgente)?
RISPOSTA: devi modificare il pacchetto sorgente ed eseguire un comando per creare un pacchetto binario a partire dal pacchetto sorgente.
DOMANDA: non mi è ancora chiaro se l'opzione "Architecture" ha effetto sul pacchetto sorgente (nel processo di compilazione) o sul pacchetto binario (installazione ed esecuzione).
RISPOSTA: il campo "Architecture:" dice a chi sta creando il pacchetto se vi sia un senso nel creare il pacchetto su un'architettura particolare; se dice solo i386, non ha alcun senso compilarlo su un AMD64.
DOMANDA: l'esempio di file debian/rules contiene solo #!make -f , che fine ha fatto ./configure , o cmake o scons o gli altri strumenti di configurazione?
RISPOSTA: dh ha molta euristica, quindi un pacchetto con lo script ./configure, o uno degli altri consueti metodi per creare i pacchetti, verrà normalmente compilato senza bisogno di nessuna aggiunta.
DOMANDA: l'euristica è una cosa buona, ma se voglio passare --una-opzione-speciale come argomento per ./configure o cmake, l'euristica riesce a gestire i pacchetti sorgente che hanno bisogno ./waf o di altri stumenti di compilazione?
RISPOSTA: mi piace la risposta di dapal: <dapal> lilith: usando dh7, se vuoi passare qualche argomento a ./configure, basta usare qualcosa tipo ovverride_dh_auto_configure <TAB>dh_auto_configure -- --tuoi-parametri
dh ha un bel meccanismo di estensione/sovrascrittura che ti permette di sovrascrivere particolari parti; è davvero semplice da usare, una volta letta la documentazione.
<aron> Ho avuto brutte esperienze nel pacchettizzare software che usa waf come sistema di compilazione. Solitamente contiene blob binari che non possono essere estratti con gli strumenti standard (sì, incorpora un tgz nello script); ciò che è critico è che è difficile mantenere il pacchetto Debian con un sistema di compilazione waf perché non è pensato per aiutare gli autori upstream a compilare i proprio pacchetti in un modo sostanzialmente standard, ma solo in un modo "funziona per me". Si dovrebbe davvero suggerire agli autori upstream di prendere in considerazione un altro sistema (uno potente come CMake, Autotools; o uno più semplice come python-distutils-extra), se possibile.
DOMANDA: dove posso trovare la documentazione per sovrascrivere le impostazioni di debhelper 9?
RISPOSTA: dh esegue una specifica sequenza di comandi per compilare i pacchetti; ogni comando ha un nome tipo "dh_qualcosa", e ognuno di questi può essere sovrascritto con una voce "override_dh_qualcosa" all'interno di "debian/rules".
È possibile aggiungere l'opzione --no-act al comando dh in debian/rules per vedere quali comandi vengono eseguiti, poi si deve leggere il manuale di quel comando per vedere se è possibile configurarlo (tramite un file tipo debian/hithere.dirs) o se è necessario sovrascriverlo. In practica, usare l'opzione --no-act in combinazione con l'opzione --verbose permette di ottenere più dettagli riguardo a ciò che verrebbe eseguito.
DOMANDA: da dove lanci solitamente i tuoi comandi, all'interno della directory hithere-1.0 o fuori? Ci deve essere un'altra directory chiamata hithere (senza numerazione)?
RISPOSTA: Lancio sempre i comandi di pacchettizzazione in hithere-1.0 e di solito ho anche una directory superiore chiamata hithere, ma non è necessaria, serve solo a tenere i vari progetti più ordinati.
DOMANDA: ho un upstream che ha bisogno di qmake (usa Qt) prima di lanciare make, posso aggiungerlo a debian/rules? Come?
RISPOSTA: (da gregoa) debhelper supporta qmake dalla versione 7.4.12 (quindi non ci sono modifiche aggiuntive da apportare). Prima di quella versione era necessario usare override_dh_auto_configure :\n\tqmake
DOMANDA: qual è il miglior processo per aggiornare un pacchetto alla nuova versione upstream?
RISPOSTA: ah, non sono sicuro quale sia il processo migliore per farlo, ma fondamentalmente: spacchettare il sorgente upstream in una nuova directory, copiare la directory debian/* del vecchio pacchetto, aggiornare debian/changelog ("dch -v 1.2.3-4"), provare a compilare e correggere ogni tipo di errore. Non è esattamente un buon processo, ma per qualcosa di meglio dovresti imparare ad usare quilt, e possibilmente anche ad usare un sistema di revisione con la pacchettizzazione debian, ma è un argomento troppo ampio per essere trattato in questa sessione.
DOMANDA: ho creato un pacchetto debian che dipende da molti altri pacchetti. L'unica cosa che fa realmente il mio pacchetto è configurarne altri in una certa maniera in modo che si adattino alle esigenze di alcune persone. Per fare questo apporta anche alcuni cambiamenti critici al sistema, come attivare l'instradamento di rete nel kernel e così via... c'è una qualche regola su cosa un pacchetto ufficiale ha il permesso di fare e cosa no? Un pacchetto del genere può diventare un pacchetto ufficiale?
RISPOSTA: https://www.debian.org/doc/debian-policy/ è il migliore insieme di regole disponibile per sapere cosa un pacchetto Debian ufficiale ha il permesso o l'obbligo di fare.
I pacchetti Debian non sono autorizzati a modificare le configurazioni di altri pacchetti, a meno che questi non forniscano un'interfaccia documentata per farlo.
Vedi anche
Questa è la pagina che raccoglie tutte le risorse sulla pacchettizazzione trattate in questo wiki
Registro della conversazione IRC in Debian Women: creare pacchetti Debian
