
Tenho uma grande quantidade de código-fonte que mantemos, produzindo muitos pacotes diferentes do Ubuntu. Todos esses pacotes precisam ser compilados em versões do Ubuntu LTS deUbuntu 8.04(Hardy Heron) para frente. (Sim, eu sei que eles são antigos e não têm suporte. Eles são para sistemas com espaço limitado, portanto, não é possível atualizar para uma nova versão. Mesmo assim, ainda preciso manter o software neles enquanto atualizo para novas versões.)
Estou tentando colocar toda a base de código em funcionamentoUbuntu 14.04(Confiável Tahr). Para minha consternação, descobri que o empacotamento do código Python mudou completamente. A partir do Trusty, python-support e python-central desapareceram edh_python2 é o que você deve usar.
Meu problema é como criar um debian/control
arquivo de trabalho. The Build-Depends: para versões até e inclusiveUbuntu 12.04(Precise Pangolin) precisa incluir python-central
, enquanto para 14.04 e posteriores deve incluir dh_python2
. Não encontrei nenhuma provisão para texto condicional no arquivo de controle. Eu tentei encontrar uma maneira de contornar isso, mas até agora nada funciona.
Como isso pode ser feito?
Eu tenho um extenso sistema buildbot instalado e funcionando que compila em várias versões do Ubuntu, versões do CentOS e algumas versões do OS X. A divisão em pacotes ramificados para versões diferentes quebraria isso. Então, estou procurando uma solução que funcione em uma única árvore de origem. Estou tentando encontrar um gancho que eu possa usar no dpkg-buildpackage para configurar as coisas por versão, mas ainda não encontrei uma solução.
Responder1
A maneira mais fácil é usar pacotes alternativos em Build-Depends
campo, fe Build-Depends: dh-python | python-central, [...]
. Isso tem várias peculiaridades, a primeira dependência que satisfizer o solucionador de dependências será escolhida. Você também pode usar Build-Depends versionados (por exemplo, se você souber que algumas versões anteriores de pacotes estavam incompletas), ou seja Build-Depends: dh-python (>= <correct_version) | python-central
, .
A maneira mais complicada se você precisar depender de um pacote que não existe na versão anterior (ou posterior) é adicionar base-files (<< <version>) | real-package
como uma dependência em vez de apenas real-package
e ajustar para <version>
corresponder à versão na próxima versão. Se você precisar de um pacote em um sistema mais antigo, mas não em um novo, você usaria base-file (>= <version>) | real-package
e usaria <version>
a versão do Ubuntu onde não precisa do real-package
.
Por exemplo, para backport apache2
para Ubuntu 12.04, mudei libnghttp2-dev
para base-files (<< 7.2~) | libnghttp2-dev
.
Adicionarei d/rules
um trecho do meu 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
e d/control
tem
Build-Depends: [...], dh-systemd (>= 1.5) | base-files (<< 7.2ubuntu5~)
Responder2
Aqui está o script que criei para permitir que o código seja construído em qualquer versão. No meu caso, criei um arquivo control.pre_trusty e control.post_precise, e um arquivo regras.pre_trusty e regras.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