
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/control
Datei 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-Depends
Feld 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-package
als Abhängigkeit hinzuzufügen, anstatt es einfach so real-package
anzupassen, <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-package
verwenden <version>
, in der Sie es nicht benötigen real-package
.
Beispielsweise apache2
habe ich für die Backportierung für Ubuntu 12.04 libnghttp2-dev
zu gewechselt base-files (<< 7.2~) | libnghttp2-dev
.
Ich werde d/rules
einen 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/control
hat
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