Comment construire un paquet Debian / Ubuntu à partir des sources?

116

J'ai la source d'un programme (tirée de cvs / svn / git / ...) et j'aimerais créer un paquet Debian / Ubuntu pour cela. Le package est présent dans les référentiels, mais:

  • C'est une version plus ancienne (il manque les fonctionnalités dont j'ai besoin)
  • J'ai besoin d'options de compilation légèrement différentes de celles par défaut.

Quelle est la manière la plus simple de le faire? Je suis préoccupé par plusieurs choses

  • Comment puis-je vérifier si j'ai répertorié correctement toutes les dépendances? (Je peux obtenir des indices en regardant de quoi dépendait l'ancienne version, mais de nouvelles dépendances ont peut-être été ajoutées.)
  • Comment puis-je empêcher le système de mise à jour d'installer l'ancienne version dans le dépôt lors d'une mise à jour?
  • Comment puis-je empêcher le système d'installer une version plus récente (lorsqu'elle est sortie) et d'écraser mon package personnalisé?
Ryszard Szopa
la source
Similaire sur AU: askubuntu.com/questions/28372/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

78

vous pouvez utiliser le package spécial "checkinstall" pour tous les packages qui ne sont même pas encore dans debian / ubuntu.

Vous pouvez utiliser "uupdate" ( apt-get install devscripts) pour construire un paquet à partir des sources avec les sources Debian existantes:

Exemple pour 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
Paweł Gościcki
la source
Merci! Je viens de l'utiliser pour porter Subversion 1.6.6 sur une installation Ubuntu qui n'a que 1.6.5 comme dernière version disponible, et cela a fonctionné parfaitement. M'a sauvé pas mal d'heures de bricolage! :)
Carlos Villela
Pourriez-vous donner un peu plus de contexte autour de ces commandes? Où est libdrm-2.3.1exactement? D'où libdrm-2.4.1.tar.gzvient également (mon hypothèse initiale est qu'il s'agit du binaire compilé de l'application que nous voulons empaqueter dans un deb, mais en remplaçant la version existante, est-ce correct?)
Wheeler
Si vous obtenez l'erreur You must put some 'source' URIs in your sources.list, décommentez les lignes deb-src dans votre/etc/apt/sources.list
Christian
27

Tout d'abord, la question du titre: en supposant que le répertoire debian est déjà là, soyez dans le répertoire source (le répertoire contenant le répertoire debian) et invoquez dpkg-buildpackage. J'aime l'exécuter avec ces options:

dpkg-buildpackage -us -uc -nc

ce qui signifie ne pas signer le résultat et ne pas nettoyer.

Comment puis-je vérifier si j'ai répertorié correctement toutes les dépendances?

Obtenir les dépendances est un art noir. La manière "officielle" est de vérifier si la construction dépend si le paquet se construit avec uniquement le système de base, les paquets "build-essential" et les dépendances de construction que vous avez spécifiées. Je ne connais pas de réponse générale pour les dépendances régulières, il suffit de patauger :)

Comment puis-je empêcher le système de mise à jour d'installer l'ancienne version dans le dépôt lors d'une mise à jour? Comment puis-je empêcher le système d'installer une version plus récente (lorsqu'elle est sortie) et d'écraser mon package personnalisé?

Mes connaissances sont peut-être obsolètes sur celui-ci, mais pour traiter les deux: Utilisez dpkg --set-selections. En supposant que nullidentd était le paquet que vous vouliez rester, exécutez en tant que root

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

Alternativement, puisque vous construisez à partir des sources, vous pouvez utiliser une époque pour définir le numéro de version artificiellement élevé et ne plus jamais être dérangé. Pour utiliser une époque, ajoutez une nouvelle entrée au fichier debian / changelog et placez un 99: devant le numéro de version. Compte tenu de mon exemple nullidentd, la première ligne de votre journal des modifications mis à jour se lirait:

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

Le lien de Bernard est bon, surtout si vous devez créer vous-même le répertoire debian - la référence des développeurs et la page de ressources générales sont également utiles . Le lien d'Adam semble également bon mais je ne le connais pas.

Daniel Bungert
la source
1
"dpkg --set-selections" fonctionne toujours, mais une meilleure méthode de nos jours serait "aptitude hold nullidentd".
Mark Baker
6

Pour ce que vous voulez faire, vous voudrez probablement utiliser le diff source Debian, donc votre paquet est similaire à celui officiel à l'exception de la version amont utilisée. Vous pouvez télécharger le diff source sur packages.debian.org , ou vous pouvez l'obtenir avec le .dsc et l'archive source originale en utilisant "apt-get source".

Ensuite, vous décompressez votre nouvelle version de la source en amont, passez dans ce répertoire et appliquez le diff que vous avez téléchargé en faisant

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

Ensuite, apportez les modifications souhaitées pour compiler les options et créez le package en faisant

dpkg-buildpackage -rfakeroot -us -uc
Mark Baker
la source
3
  • placez le répertoire "debian" du paquet d'origine dans votre répertoire source
  • utilisez " dch " pour mettre à jour la version du package
  • utilisez "debuild" pour construire le package
zowers
la source
2

Je crois que c'est le paquet Debian « bible ».

Eh bien, c'est le guide du nouveau responsable Debian, donc une grande partie ne sera pas applicable, mais ils couvrent ce qui va où.

Bernard
la source
1

Voici un tutoriel pour construire un paquet Debian.

Fondamentalement, vous devez:

  1. Configurez votre structure de dossiers
  2. Créer un fichier de contrôle
  3. En option créer postinst ou prerm scripts
  4. Exécutez dpkg-deb

Je fais généralement tout cela dans mon Makefile afin que je puisse simplement taper make pour cracher le binaire et le conditionner en une seule fois.

Adam Pierce
la source
1

Comment puis-je vérifier si j'ai répertorié correctement toutes les dépendances?

Le pbuilderest un excellent outil pour vérifier à la fois les dépendances de construction et les dépendances en mettant en place un système de base propre dans un environnement chroot. En compilant le package dans pbuilder, vous pouvez facilement vérifier les dépendances de construction, et en le testant dans un environnement pbuilder, vous pouvez vérifier les dépendances.

thiton
la source
1

Si vous voulez une manière rapide et sale d'installer les dépendances de build, utilisez:

apt-get build-dep

Cela installe les dépendances. Vous avez besoin de lignes sources dans votre sources.list pour cela:

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

Si vous rétroportez des paquets de testing vers stable, veuillez noter que les dépendances ont peut-être changé. La commande apt-get build-deb installe les dépendances pour les packages sources dans votre référentiel actuel.

Mais bien sûr, dpkg-buildpackage -us -uc vous montrera toutes les dépendances désinstallées.

Si vous souhaitez compiler plus souvent, utilisez cowbuilder.

apt-get install cowbuilder

Ensuite, créez une zone de construction:

sudo DIST = squeeze ARCH = amd64 cowbuilder - créer

Puis compilez un paquet source:

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

Regardez où cowbuilder place le package résultant.

Bonne chance!

Allard Hoeve
la source