Come creare un pacchetto Debian / Ubuntu dai sorgenti?


116

Ho i sorgenti di un programma (preso da cvs / svn / git / ...) e mi piacerebbe creare un pacchetto Debian / Ubuntu per questo. Il pacchetto è presente nei repository, ma:

  • È una versione precedente (mancano le funzionalità di cui ho bisogno)
  • Ho bisogno di opzioni di compilazione leggermente diverse da quelle predefinite.

Qual è il modo più semplice per farlo? Sono preoccupato per un paio di cose

  • Come posso verificare se ho elencato correttamente tutte le dipendenze? (Posso ottenere alcuni suggerimenti guardando da cosa dipendeva la versione precedente, ma potrebbero essere state aggiunte nuove dipendenze.)
  • Come posso impedire al sistema di aggiornamento di installare la versione precedente nel repository su un aggiornamento?
  • Come posso impedire al sistema di installare una versione più recente (quando è disponibile), sovrascrivendo il mio pacchetto personalizzato?

Risposte:


78

puoi usare il pacchetto speciale "checkinstall" per tutti i pacchetti che non sono ancora in debian / ubuntu.

Puoi usare "uupdate" ( apt-get install devscripts) per creare un pacchetto dai sorgenti con sorgenti Debian esistenti:

Esempio per libdrm2:

apt-get build-dep libdrm2
apt-get source libdrm2
cd libdrm-2.3.1
uupdate ~/Downloads/libdrm-2.4.1.tar.gz
cd ../libdrm-2.4.1
dpkg-buildpackage -us -uc -nc

Grazie! L'ho appena usato per portare Subversion 1.6.6 su un'installazione di Ubuntu che ha solo 1.6.5 come ultima versione disponibile, e ha funzionato perfettamente. Mi ha risparmiato parecchie ore di armeggiare! :)
Carlos Villela

Potresti fornire un po 'più di contesto su questi comandi? Dov'è libdrm-2.3.1esattamente? Anche da dove libdrm-2.4.1.tar.gzviene (la mia ipotesi iniziale è che sia il binario compilato dell'applicazione che vogliamo impacchettare in un deb, ma sostituendo la versione esistente, è corretto?)
wheeler

Se ottieni l'errore You must put some 'source' URIs in your sources.list, rimuovi il commento dalle righe deb-src nel tuo/etc/apt/sources.list
Christian

27

In primo luogo, la domanda del titolo: supponendo che la directory debian sia già lì, essere nella directory dei sorgenti (la directory contenente la directory debian) e invocare dpkg-buildpackage. Mi piace eseguirlo con queste opzioni:

dpkg-buildpackage -us -uc -nc

che significa non firmare il risultato e non pulire.

Come posso verificare se ho elencato correttamente tutte le dipendenze?

Ottenere le dipendenze è un'arte nera. Il modo "ufficiale" di controllare la dipendenza della build è se il pacchetto viene compilato solo con il sistema di base, i pacchetti "essenziali per la compilazione" e le dipendenze di compilazione specificate. Non conosco una risposta generale per le dipendenze regolari, entra dentro :)

Come posso impedire al sistema di aggiornamento di installare la versione precedente nel repository su un aggiornamento? Come posso impedire al sistema di installare una versione più recente (quando è disponibile), sovrascrivendo il mio pacchetto personalizzato?

La mia conoscenza potrebbe non essere aggiornata su questo, ma per affrontare entrambi: Usa dpkg --set-selections. Supponendo che nullidentd fosse il pacchetto che si desiderava rimanere, eseguire come root

echo 'nullidentd hold' | dpkg --set-selections

In alternativa, poiché stai compilando dalla sorgente, puoi usare un'epoca per impostare il numero di versione artificialmente alto e non essere mai più disturbato. Per usare un'epoca, aggiungi una nuova voce al file debian / changelog e metti 99: davanti al numero di versione. Dato il mio esempio nullidentd, la prima riga del log delle modifiche aggiornato dovrebbe leggere:

nullidentd (99:1.0-4) unstable; urgency=low

Il collegamento di Bernard è buono, specialmente se devi creare tu stesso la directory debian - sono utili anche i riferimenti per gli sviluppatori e la pagina delle risorse generali . Anche il collegamento di Adam sembra buono ma non lo conosco.


1
"dpkg --set-selections" funziona ancora, ma un metodo migliore di questi tempi sarebbe "aptitude hold nullidentd".
Mark Baker

6

Per quello che vuoi fare, probabilmente vorrai usare il diff sorgente Debian, quindi il tuo pacchetto è simile a quello ufficiale a parte la versione upstream usata. Puoi scaricare la differenza del sorgente da packages.debian.org , oppure puoi scaricarla insieme a .dsc e all'archivio sorgente originale usando "apt-get source".

Quindi decomprimi la tua nuova versione del sorgente upstream, passa a quella directory e applica il diff scaricato in questo modo

zcat ~/downloaded.diff.gz | patch -p1
chmod +x debian/rules

Quindi apporta le modifiche desiderate per compilare le opzioni e crea il pacchetto in questo modo

dpkg-buildpackage -rfakeroot -us -uc


3
  • mettere la directory "debian" dal pacchetto originale alla directory dei sorgenti
  • usa " dch " per aggiornare la versione del pacchetto
  • usa "debuild" per creare il pacchetto

2

Credo che questo sia il pacchetto Debian "bibbia".

Bene, è la guida del nuovo manutentore di Debian, quindi molte non saranno applicabili, ma coprono ciò che va dove.



1

Ecco un tutorial per costruire un pacchetto Debian.

Fondamentalmente, devi:

  1. Imposta la struttura delle cartelle
  2. Crea un file di controllo
  3. Facoltativamente, crea script postinst o prerm
  4. Esegui dpkg-deb

Di solito faccio tutto questo nel mio Makefile, quindi posso semplicemente digitare make per sputare il binario e impacchettarlo in una volta.


1

Come posso verificare se ho elencato correttamente tutte le dipendenze?

Il pbuilderè un ottimo strumento per il controllo sia dipendenze di compilazione e le dipendenze attraverso la creazione di un sistema di base pulita all'interno di un ambiente chroot. Compilando il pacchetto all'interno di pbuilder, puoi facilmente controllare le dipendenze di compilazione e testandolo all'interno di un ambiente pbuilder, puoi controllare le dipendenze.


1

Se vuoi un modo rapido e sporco di installare le dipendenze di compilazione, usa:

apt-get build-dep

Questo installa le dipendenze. Hai bisogno di righe di sorgenti nel tuo sources.list per questo:

deb-src http://ftp.nl.debian.org/debian/ squeeze-updates main contrib non-free

Se stai eseguendo il backport di pacchetti da testing a stable, tieni presente che le dipendenze potrebbero essere cambiate. Il comando apt-get build-deb installa le dipendenze per i pacchetti sorgente nel tuo attuale repository.

Ma ovviamente dpkg-buildpackage -us -uc ti mostrerà tutte le dipendenze disinstallate.

Se vuoi compilare più spesso, usa cowbuilder.

apt-get install cowbuilder

Quindi crea un'area di costruzione:

sudo DIST = squeeze ARCH = amd64 cowbuilder --create

Quindi compila un pacchetto sorgente:

apt-get source cowsay

# do your magic editing
dpkg-source -b cowsay-3.03+dfsg1              # build the new source packages
cowbuilder --build cowsay_3.03+dfsg1-2.dsc    # build the packages from source

Guarda dove cowbuilder mette il pacchetto risultante.

In bocca al lupo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.