
У меня есть большой объем исходного кода, который мы поддерживаем, создавая множество различных пакетов Ubuntu. Все эти пакеты должны быть построены на релизах Ubuntu LTS изУбунту 8.04(Hardy Heron) вперед. (Да, я знаю, что они старые и не поддерживаются. Они предназначены для систем, ограниченных пространством, поэтому обновление до новой версии невозможно. Тем не менее, мне все равно приходится поддерживать программное обеспечение на них, одновременно обновляя его для новых версий.)
Я пытаюсь запустить всю кодовую базу наУбунту 14.04(Trusty Tahr). Я обнаружил, к своему большому разочарованию, что упаковка кода Python полностью изменилась. Начиная с Trusty, python-support и python-central исчезли иdh_python2 — это то, что вам нужно использовать.
Моя проблема в том, как создать рабочий debian/control
файл. Сборка-Зависит: для версий до и включительноУбунту 12.04(Precise Pangolin) необходимо включить python-central
, а для 14.04 и далее необходимо включить dh_python2
. Я не нашел положения для условного текста в файле управления. Я пытался найти способ обойти это, но пока ничего не работает.
Как это может быть сделано?
У меня есть обширная система buildbot, которая работает и компилируется на многочисленных версиях Ubuntu, CentOS и некоторых версиях OS X. Разделение на ветки пакетов для разных версий сломало бы это. Поэтому я ищу решение, которое работает на одном исходном дереве. Я пытаюсь найти хук на раннем этапе, который я мог бы использовать в dpkg-buildpackage для настройки вещей для каждой версии, но я пока не нашел решения.
решение1
Самый простой способ — использовать альтернативные пакеты в Build-Depends
полевых условиях, например Build-Depends: dh-python | python-central, [...]
. Это имеет несколько особенностей, будет выбрана первая зависимость, которая удовлетворяет решателю зависимостей. Вы также можете использовать версионные Build-Depends (например, если вы знаете, что некоторые более ранние версии пакетов были неполными), например Build-Depends: dh-python (>= <correct_version) | python-central
.
Более сложный способ, если вам нужно Зависеть от пакета, которого нет в более ранней (или более поздней версии), — это добавить его base-files (<< <version>) | real-package
как зависимость, а не просто real-package
настроить его так, <version>
чтобы он соответствовал версии в следующей версии. Если вам нужен пакет в старой системе, но не в новой, вы бы использовали base-file (>= <version>) | real-package
и использовали <version>
из выпуска Ubuntu, где вам не нужен real-package
.
Например, для бэкпортирования apache2
в Ubuntu 12.04 я изменил libnghttp2-dev
на base-files (<< 7.2~) | libnghttp2-dev
.
Я добавлю d/rules
фрагмент из моего бэкпорта 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
и d/control
имеет
Build-Depends: [...], dh-systemd (>= 1.5) | base-files (<< 7.2ubuntu5~)
решение2
Вот скрипт, который я придумал, чтобы позволить коду строиться на любом релизе. В моем случае я создал файл control.pre_trusty и control.post_precise, а также rules.pre_trusty и 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