4 votes

Comment puis-je créer un fichier 'debian/control' qui diffère en fonction de la version d'Ubuntu ?

J'ai une grande quantité de code source que nous maintenons, produisant de nombreux paquets Ubuntu différents. Tous ces paquets doivent être construits sur les versions Ubuntu LTS de Ubuntu 8.04 (Héron rustique) en avant. (Oui, je sais qu'ils sont vieux et non supportés. Ils sont destinés aux systèmes spatiaux, donc la mise à jour vers une nouvelle version n'est pas possible. Pourtant, je dois toujours maintenir le logiciel sur eux, tout en mettant à jour pour les nouvelles versions).

J'essaie d'obtenir la base de code entière et de la faire fonctionner sur Ubuntu 14.04 (Trusty Tahr). J'ai découvert à mon grand désarroi que l'emballage du code Python a complètement changé. A partir de Trusty, Python-support et Python-central ont disparu et dh_python2 est ce que vous devez utiliser .

Mon problème est de trouver un moyen de faire fonctionner debian/control dossier. Le Build-Depends : pour les versions jusqu'à et y compris Ubuntu 12.04 (Pangolin précis) doit inclure python-central alors que pour les versions 14.04 et suivantes, 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 ?

J'ai un système de buildbot étendu qui fonctionne et qui compile sur de nombreuses versions d'Ubuntu, CentOS et quelques versions d'OS X. La division en paquets ramifiés pour différentes versions briserait ce système. Je suis donc à la recherche d'une solution qui fonctionne sur un seul arbre source. J'essaie de trouver un crochet au début que je pourrais utiliser dans dpkg-buildpackage pour configurer les choses par version, mais je n'ai pas encore trouvé de solution.

2voto

oerdnj Points 7822

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

La méthode la plus compliquée, si vous avez besoin de dépendre d'un paquet qui n'existe pas dans la version précédente (ou ultérieure), est d'ajouter le code suivant base-files (<< <version>) | real-package comme dépendance au lieu de simplement real-package et de régler le <version> pour correspondre à la version de la prochaine version. Si vous avez besoin d'un paquet sur un ancien système, mais pas sur le nouveau, vous pouvez utiliser base-file (>= <version>) | real-package et utiliser <version> à partir de la version d'Ubuntu où vous n'avez pas besoin de l'option real-package .

Par exemple pour le backporting apache2 pour Ubuntu 12.04 j'ai modifié libnghttp2-dev a base-files (<< 7.2~) | libnghttp2-dev .

Je vais ajouter 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

y d/control a

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

0voto

Jim Wright Points 61

Voici le script que j'ai créé pour permettre au code de se construire sur n'importe quelle version. Dans mon cas, j'ai créé un fichier control.pre_trusty et control.post_precise, et un 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X