web-dev-qa-db-fra.com

Comment créer un fichier debian / control différent en fonction de la version d'Ubuntu?

Nous avons beaucoup de code source que nous gérons, produisant de nombreux paquets Ubuntu différents. Tous ces packages doivent s'appuyer sur les versions Ubuntu LTS à partir de 08.04. (Oui, je sais que ces versions sont anciennes et non prises en charge. Celles-ci sont destinées à des systèmes liés à l'espace. La mise à jour vers une nouvelle version n'est donc pas possible. Cependant, je dois toujours conserver le logiciel sur ces versions, tout en mettant à jour les nouvelles versions.) J'essaie pour que toute la base de code soit opérationnelle sur Trusty. J'ai découvert à mon grand désarroi que le packaging du code Python a complètement changé. Depuis Trusty, python-support et python-central ont disparu et dh_python2 est ce que vous devez utiliser .

Mon problème est de savoir comment créer un fichier debian/control fonctionnel. Build-Depends: pour les versions jusqu’à la version 12.04 incluse, doit inclure python-central, tandis que pour 14.04 et sa transmission ultérieure, il doit inclure dh_python2. Je n'ai trouvé aucune disposition pour le texte conditionnel dans le fichier de contrôle. J'ai essayé de trouver un moyen de contourner ce problème, mais jusqu'à présent, rien ne fonctionne.

Comment cela peut-il être fait?

MODIFIER:

J'ai un système buildbot complet, opérationnel, compilant de nombreuses versions d'Ubuntu, CentOS et certaines versions d'OSX. Diviser les paquets en branches pour les différentes versions aurait raison. Je recherche donc une solution qui fonctionne sur un seul arbre source. J'essaie de trouver très tôt un point d'accrochage que je pourrais utiliser dans dpkg-buildpackage pour configurer les éléments par version, mais je n'ai pas encore trouvé de solution.

3
Jim Wright

Le moyen le plus simple consiste à utiliser des packages alternatifs dans le champ Build-Depends, par exemple. Build-Depends: dh-python | python-central, [...]. Cela a plusieurs défauts, la première dépendance qui satisfasse le solutionneur de dépendance sera sélectionnée. Vous pouvez également utiliser Build-Depends versionné (c'est-à-dire si vous savez que certaines versions antérieures de packages étaient incomplètes), c'est-à-dire Build-Depends: dh-python (>= <correct_version) | python-central.

Le moyen le plus compliqué de dépendre d'un paquet inexistant dans les versions antérieures (ou ultérieures) consiste à ajouter base-files (<< <version>) | real-package comme dépendance au lieu de simplement real-package et à régler le <version>. pour correspondre à la version dans la prochaine version. Si vous avez besoin d'un paquet sur un système plus ancien, mais pas sur un nouveau, utilisez base-file (>= <version>) | real-package et utilisez <version> depuis Ubuntu où vous n'avez pas besoin du real-package.

Par exemple pour le portage Apache2 pour Ubuntu 12.04, j'ai changé libnghttp2-dev en base-files (<< 7.2~) | libnghttp2-dev.

J'ajouterai d/rules extrait de mon backport MySQL-5.6:

DPKG_VENDOR          ?= $(Shell dpkg-vendor --query Vendor | tr [A-Z] [a-z])
DEB_DISTRIBUTION     = $(Shell dpkg-parsechangelog | sed -ne 's/^Distribution: //p')

ENABLE_SYSTEMD = yes

ifeq (ubuntu,$(DPKG_VENDOR))
  ifeq ($(DEB_DISTRIBUTION),$(filter $(DEB_DISTRIBUTION),precise))
    $(warning Disabling systemd on $(DPKG_VENDOR) $(DEB_DISTRIBUTION))
    ENABLE_SYSTEMD = no
  endif
endif

[...]
%:
ifeq (yes,$(ENABLE_SYSTEMD))
        dh $@ --parallel --with systemd
else
        dh $@ --parallel
endif

et d/control a

Build-Depends: [...], dh-systemd (>= 1.5) | base-files (<< 7.2ubuntu5~)
2
oerdnj

Voici le script que j'ai créé pour permettre au code de s'appuyer sur n'importe quelle version. Dans mon cas, j'ai créé un fichier control.pre_trusty et control.post_precise, ainsi qu'un fichier rules.pre_trusty et rules.post_precise.

#! /bin/bash
#
# Do magic to allow building on different Ubuntu releases. This script is
# called by buildbot on the different systems prior to dpkg-buildpackage. Do
# what is needed to accomodate different build step requirements as
# Ubuntu changes.
# "pre" and "post" are not inclusive. For example, *.pre_precise files
# apply to hardy and lucid, but not precise or anything after.

RELEASE=$(lsb_release --release --short | tr -d '.')
export LANG=C   # so "cp" doesn't use fancy quoting, which messes up web page

#######################################################################
### we need to run this from the debian directory
#######################################################################
if [ -d debian ] ; then cd debian ; fi
if [ -d "*/debian" ] ; then cd */debian ; fi

#######################################################################
### copy files that apply to previous releases
#######################################################################
cp_pre_lucid ()
{
    for i in *.pre_lucid ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .pre_lucid) ; fi
    done
}

cp_pre_precise ()
{
    for i in *.pre_precise ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .pre_precise) ; fi
    done
}

cp_pre_trusty ()
{
    for i in *.pre_trusty ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .pre_trusty) ; fi
    done
}

cp_pre_xenial ()
{
    for i in *.pre_xenial ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .pre_xenial) ; fi
    done
}

#######################################################################
### copy files that apply to subsequent releases
#######################################################################
cp_post_hardy ()
{
    for i in *.post_hardy ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .post_hardy) ; fi
    done
}

cp_post_lucid ()
{
    for i in *.post_lucid ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .post_lucid) ; fi
    done
}

cp_post_precise ()
{
    for i in *.post_precise ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .post_precise) ; fi
    done
}

cp_post_trusty ()
{
    for i in *.post_trusty ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .post_trusty) ; fi
    done
}

#######################################################################
### process files for each release
#######################################################################
if [ "$RELEASE" -eq 804 ] ; then
    echo "Setup for Hardy 08.04"
    for i in *.hardy ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .hardy) ; fi
    done
    cp_pre_lucid
    cp_pre_precise
    cp_pre_trusty
    cp_pre_xenial

Elif [ "$RELEASE" -eq 1004 ] ; then
    echo "Setup for Lucid 10.04"
    cp_post_hardy
    for i in *.lucid ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .lucid) ; fi
    done
    cp_pre_precise
    cp_pre_trusty
    cp_pre_xenial

Elif [ "$RELEASE" -eq 1204 ] ; then
    echo "Setup for Precise 12.04"
    cp_post_hardy
    cp_post_lucid
    for i in *.precise ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .precise) ; fi
    done
    cp_pre_trusty
    cp_pre_xenial

Elif [ "$RELEASE" -eq 1404 ] ; then
    echo "Setup for Trusty 14.04"
    cp_post_hardy
    cp_post_lucid
    cp_post_precise
    for i in *.trusty ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .trusty) ; fi
    done
    cp_pre_xenial

Elif [ "$RELEASE" -eq 1604 ] ; then
    cp_post_hardy
    cp_post_lucid
    cp_post_precise
    cp_post_trusty
    echo "Setup for Xenial 16.04"
    for i in *.xenial ; do
        if [ -f $i ] ; then cp -v -p $i $(basename $i .xenial) ; fi
    done

else
    echo "ERROR: unknown Ubuntu LTS release number '$RELEASE'"
    exit 1
fi
0
Jim Wright