Journal construire un paquet debian -- KISS way (ou presque)

Posté par . Licence CC by-sa
Tags : aucun
28
25
avr.
2018

Il y a eu pas mal de critiques dans un précédent journal sur la complexité de création de paquets debian.

Si j'adore debian, je dois reconnaitre que c'est une distrib pas très KISS ; et la construction de paquet n'en est qu'un exemple…

Je présente donc ici mes méthodes pour constuire un paquet. Ce sont les plus simples que j'ai trouvé, et elles suffisent à mes besoins. Les paquets ainsi construits ne seront probablement pas acceptés dans debian, mais ça me dépanne pour un usage perso (et même pro en fait). Et c'est à mon goût pas trop complexe, enfin, j'ai pas trouvé plus simple…

Depuis les sources

On pars d'un dossier avec les sources du soft, récupérées depuis une archive ou un repository git/mercurial/…
Il faut d'abord compiler les sources et installer le soft en prenant un dossier de travail comme racine. Typiquement :

mkdir /tmp/monpaquet
./configure
make
make install DESTDIR=/tmp/monpaquet

Bien sûr ici, la méthode pourra varier en fonction du soft. Le but étant d'avoir dans le dossier de travail (ici /tmp/monpaquet l'arborescence et les fichiers installés par le paquet.
Si vous avez de la compilation à faire, il vous faudra auparavant installer build-essential, peut-être cmake. et les paquets -dev des libs qui en dépendent.

Si la doc d'installation de votre soft est un truc à base de curl ... | sudo sh et bien… faites au mieux !

Vous pouvez éventuellement y ajouter d'autres fichiers (un .desktop, un unit systemd,…)

Il faudra dans ce dossier créer un sous dossier DEBIAN/ avec au moins un fichier control.

$ cd /tmp/monpaquet
$ mkdir DEBIAN
$ editor DEBIAN/control

Le fichier control minimum est de la forme :

Package: 
Version: 
Section: 
Priority: 
Architecture: 
Depends: 
Maintainer: 
Description: 

avec :
- Package: le nom du paquet
- Version: la version du paquet
- Section: une des sections de paquets debian
- Priority: Essential, Required, Important, Standard, Optional ou Extra. Logiquement, si c'est un package que vous ajoutez, ce sera « optional ». Si vous voulez le détail, c'est par là
- Architecture: l'architecture pour laquelle vous construisez le paquet (i486, amd64,…). Mettez « any » s'il est installable sur n'importe quel architecture (langage interprété, doc).
- Depends: liste des dépendances du package, sous la forme foo, bar, baz (>=2.15)
- Maintainer: votre nom
- Description: une description du soft installé

Vous pouvez aussi ajouter « Homepage: », et si besoin : Recommends, Suggests, Conflicts, Replace, Breaks, Provides (détail)

Un exemple d'un fichier control est disponible ici.

Vous pouvez aussi ajouter dans le dossier DEBIAN/ des scripts :
- preinst : exécuté avant l'installation du paquet
- postinst : exécuté après l'installation du paquet
- prerm : exécuté avant la désinstallation du paquet
- postrm : exécuté après la désinstallation du paquet

Il ne vous reste plus qu'à lancer :

# apt install fakeroot
$ fakeroot dpkg-deb --build /tmp/monpaquet nom_du_fichier.deb

Depuis un paquet source debian

Quand le soft est déjà empaqueté sous debian, et que vous souhaitez faire un simple changement, il est préférable de partir du paquet source debian.

Ici aussi créez un répertoire de travail, et lancez les commandes depuis ce répertoire.

On installe d'abord les dépendances nécessaires pour construire le paquet, et on récupère le paquet source :

# apt-get build-dep <nom_du_paquet>
$ apt-get source <nom_du_paquet>

Si vous faites du pinning, vous pouvez préciser la release, par exemple :

# apt-get build-dep <nom_du_paquet>/stable
$ apt-get source <nom_du_paquet>/stable

Vous obtenez alors :
- un fichier <paquet>_<version>.orig.tar.gz qui contient les sources du soft
- un dossier <paquet>_<version> qui n'est que le contenu de l'archive précédente
- un fichier <paquet>_<version>-<revision>.dsc (ici, on s'en fout)
- un fichier <paquet>_<version>-<revision>.debian.tar.xz qui contient un dossier debian/ avec les infos de construction du paquet

Si vous souhaitez faire des modifs dans le code source ou appliquer un patch, allez donc dans le dossier et reconstruisez l'archive <paquet>_<version>.orig.tar.gz ensuite.

Si vous souhaitez modifier la constuction du paquet (typiquement, changer des options de compilation), il vous faudra désarchiver <paquet>_<version>-<revision>.debian.tar.xz et modifier le fichier debian/rules (c'est grosso-modo un Makefile, en s'inspirant du contenu vous devriez vous en sortir) ; puis refaire l'archive.

Là il vous faudra marquer votre révision du paquet et le recompiler :

# apt install devscripts
$ dch --local <votre_nom_ou_nom_de_la_modif>
$ dpkg-buildpackage -us -uc

Voir aussi : https://raphaelhertzog.fr/2011/07/12/comment-recompiler-un-paquet-debian/

  • # debbuild

    Posté par . Évalué à 10 (+9/-0).

    En cadeau bonux, un script de construction de paquet debian, très inspiré des SlackBuilds :

    #!/bin/sh
    # Debian package creation script
    
    # Last release: https://github.com/valr/cbatticon/releases
    
    
    NAME="cbatticon"
    #VERSION="1.6.7"
    PKG="/tmp/build/$NAME"
    DOC="Changelog COPYING README"
    SRC="https://github.com/valr/cbatticon.git"
    #SRC="https://github.com/valr/cbatticon/archive/$VERSION.tar.gz"
    
    REVISION=${REVISION:-1}
    
    SECTION="x11"
    PRIORITY="optional"
    ARCH="amd64"
    DEPENDS=""
    MAINTAINER="masao"
    DESCRIPTION="A lightweight and fast battery icon that sits in your system tray"
    HOMEPAGE="https://github.com/valr/cbatticon"
    CONFFILES=""
    CWD=$(pwd)
    
    set -e
    umask 022
    
    if [ "$(id -u)" = "0" ]; then
            echo "Don't run this script as root !"
            exit 1
    fi
    
    
    ## GIT
    # Check if there is update
    if [ -d "$NAME" ]; then
            cd $NAME
            if [ $REVISION -eq 1 ]; then
                    git fetch origin
                    if [ -z "$(git log HEAD..origin/master --oneline)" ]; then
                            echo "Already up to date"
                            exit 0
                    fi
            fi
    else
            git clone $SRC
            cd $NAME
    fi
    
    # Get last version
    git pull
    version=$(git log --date=short | grep '^Date' | head -1 | sed -r 's/.*([0-9]{4}-[0-9]{2}-[0-9]{2})/\1/' | tr -d '-')
    
    
    ## RELEASE
    #[ -e "$NAME-$VERSION" ] || wget $SRC -O $NAME-$VERSION.tar.gz
    #tar xvf $NAME-$VERSION.tar.gz
    #cd $NAME-$VERSION
    #version=$VERSION
    
    
    [ -d $PKG ] || mkdir -p $PKG
    make
    make install DESTDIR=$PKG
    
    # Install documentation
    mkdir -p $PKG/usr/share/doc/$NAME-$version
    cp -a $DOC $PKG/usr/share/doc/$NAME-$version
    
    # Compress man pages
    if [ -d $PKG/usr/share/man ]; then
            find $PKG/usr/share/man -type f -name "*.?" -exec gzip -9 {} \;
            for manpage in $(find $PKG/usr/share/man -type l -name "*.?") ; do
                    ln -s $(readlink $manpage).gz $manpage.gz
                    rm -f $manpage
            done
    fi
    
    # Copy systemd unit, if any
    if [ -r $CWD/${NAME}.service ]; then
            mkdir -p $PKG/lib/systemd/system
            cp $CWD/${NAME}.service $PKG/lib/systemd/system
    fi
    
    
    # Strip binaries, libraries and archives
    find $PKG -type f | xargs file | grep "ELF \(32\|64\)-bit LSB" | cut -d: -f1 | \
            xargs strip --strip-unneeded 2> /dev/null || echo "No binaries and/or shared objects to strip"
    find $PKG -type f | xargs file | grep "current ar archive" | cut -f 1 -d : | \
            xargs strip -g 2> /dev/null || echo "No archives to strip"
    
    # Prepare package
    mkdir $PKG/DEBIAN
    
    cat >$PKG/DEBIAN/control <<EOF
    Package: $NAME
    Version: $version-$REVISION
    Section: $SECTION
    Priority: $PRIORITY
    Architecture: $ARCH
    Depends: $DEPENDS
    Maintainer: $MAINTAINER
    Description: $DESCRIPTION
    Homepage: $HOMEPAGE
    EOF
    if [ -n "$CONFFILES" ]; then
            for conffile in $CONFFILES ; do
                    echo $conffile >>$PKG/DEBIAN/conffiles
            done
    fi
    
    for script in postrm prerm preinst postinst ; do
            if [ -r $CWD/$script ]; then
                    cp $CWD/$script $PKG/DEBIAN/
                    chmod 755 $PKG/DEBIAN/$script
            fi
    done
    
    # Build package
    fakeroot dpkg-deb --build $PKG $CWD/$NAME-$version-${REVISION}.deb
    rm -rf $PKG
  • # Fedora Copr

    Posté par . Évalué à 1 (+0/-0).

    Je profite de ce journal pour demander si quelqu’un connaitrait une bonne documentation sur la création de paquets pour Fedora et leurs publication sur Copr ?
    Lors de mes recherches, je ne trouve que des documentations partielles ou périmées.

  • # fpm

    Posté par (page perso) . Évalué à 8 (+6/-0).

    Personnellement, je n'utilise que fpm pour créer des paquets Debian.

    https://fpm.readthedocs.io/en/latest/index.html

  • # Le plus difficile était fait

    Posté par . Évalué à 3 (+2/-0). Dernière modification le 27/04/18 à 13:47.

    C'est dommage toutes cette complexité que tu ajoutes, car le plus dur pour faire un paquet debian, c'est ce que tu as pris comme point de départ, c'est à dire avoir un ./configure && make && make install fonctionnant avec un destdir.

    Partant de là, il suffit de lancer dh_make pour avoir un squelette de paquet bien commenté et de remplir les trous.

    • [^] # Re: Le plus difficile était fait

      Posté par . Évalué à 1 (+0/-1).

      Ben le ./configure && make && make install, c'est juste le point de départ classique en fait. Mais ça pourrait bien être du cmake ou ./install.sh --prefix /tmp/monpaquet ou même une arborescence créée manuellement, la méthode reste la même derrière…

      Partant de là, je créé un fichier control et je lance dpkg-deb. On a fait pire comme complexité, non ?

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.