Wie kann ich eine „debian/control“-Datei erstellen, die je nach Ubuntu-Version unterschiedlich ist?

Wie kann ich eine „debian/control“-Datei erstellen, die je nach Ubuntu-Version unterschiedlich ist?

Ich habe eine Menge Quellcode, den wir pflegen und der viele verschiedene Ubuntu-Pakete produziert. Alle diese Pakete müssen auf Ubuntu LTS-Versionen vonUbuntu 8.04(Hardy Heron) weiterleiten. (Ja, ich weiß, dass diese alt sind und nicht unterstützt werden. Sie sind für weltraumgebundene Systeme, daher ist ein Update auf eine neue Version nicht möglich. Dennoch muss ich die Software darauf warten und gleichzeitig Updates für neue Versionen durchführen.)

Ich versuche, die gesamte Codebasis zum Laufen zu bringen aufUbuntu 14.04(Trusty Tahr). Zu meinem großen Entsetzen habe ich festgestellt, dass sich die Paketierung von Python-Code komplett geändert hat. Seit Trusty sind python-support und python-central verschwunden unddh_python2 ist das, was Sie verwenden müssen.

Mein Problem ist, wie man eine funktionierende debian/controlDatei erstellt. Die Build-Depends: für Versionen bis einschließlichUbuntu 12.04(Precise Pangolin) muss enthalten python-central, während es ab 14.04 enthalten muss dh_python2. Ich habe in der Steuerdatei keine Vorgabe für bedingten Text gefunden. Ich habe versucht, einen Weg zu finden, dies zu umgehen, aber bisher hat nichts funktioniert.

Wie kann das erreicht werden?

Ich habe ein umfangreiches Buildbot-System am Laufen, das auf zahlreichen Ubuntu-Versionen, CentOS-Versionen und einigen OS X-Versionen kompiliert. Die Aufteilung in verzweigte Pakete für verschiedene Versionen würde das zerstören. Deshalb suche ich nach einer Lösung, die auf einem einzigen Quellbaum funktioniert. Ich versuche, frühzeitig einen Hook zu finden, den ich in dpkg-buildpackage verwenden könnte, um die Dinge pro Version einzurichten, aber ich habe noch keine Lösung gefunden.

Antwort1

Am einfachsten ist es, alternative Pakete im Build-DependsFeld zu verwenden, z. B. Build-Depends: dh-python | python-central, [...]. Das hat mehrere Eigenheiten, die erste Abhängigkeit, die den Abhängigkeitslöser erfüllt, wird ausgewählt. Sie können auch versionierte Build-Depends verwenden (z. B. wenn Sie wissen, dass einige frühere Versionen von Paketen unvollständig waren), d. h. Build-Depends: dh-python (>= <correct_version) | python-central.

Der kompliziertere Weg, wenn Sie von einem Paket abhängig sein müssen, das in einer früheren (oder späteren) Version nicht vorhanden ist, besteht darin, es base-files (<< <version>) | real-packageals Abhängigkeit hinzuzufügen, anstatt es einfach so real-packageanzupassen, <version>dass es der Version in der nächsten Version entspricht. Wenn Sie ein Paket auf einem älteren System, aber nicht auf einem neuen benötigen, würden Sie es aus der Ubuntu-Version base-file (>= <version>) | real-packageverwenden <version>, in der Sie es nicht benötigen real-package.

Beispielsweise apache2habe ich für die Backportierung für Ubuntu 12.04 libnghttp2-devzu gewechselt base-files (<< 7.2~) | libnghttp2-dev.

Ich werde d/ruleseinen Ausschnitt aus meinem MySQL-5.6-Backport hinzufügen:

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

und d/controlhat

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

Antwort2

Hier ist das Skript, das ich erstellt habe, damit der Code auf jeder Version erstellt werden kann. In meinem Fall habe ich eine Datei control.pre_trusty und control.post_precise sowie eine Datei rules.pre_trusty und eine Datei rules.post_precise erstellt.

#! /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

verwandte Informationen