
Tengo una gran cantidad de código fuente que mantenemos y que produce muchos paquetes de Ubuntu diferentes. Todos estos paquetes deben basarse en las versiones Ubuntu LTS deubuntu 8.04(Hardy Heron) adelante. (Sí, sé que estos son antiguos y no son compatibles. Son para sistemas con limitaciones de espacio, por lo que no es posible actualizar a una nueva versión. Sin embargo, todavía tengo que mantener el software en ellos, mientras actualizo para nuevas versiones).
Estoy intentando poner en funcionamiento todo el código base.ubuntu 14.04(Confiable Tahr). Para mi consternación, descubrí que el empaquetado del código Python ha cambiado por completo. A partir de Trusty, python-support y python-central han desaparecido ydh_python2 es lo que tienes que usar.
Mi problema es cómo crear un debian/control
archivo que funcione. The Build-Depends: para versiones hasta e incluyendoubuntu 12.04(Precise Pangolin) debe incluir python-central
, mientras que para 14.04 y adelante debe incluir dh_python2
. No encontré ninguna disposición para texto condicional en el archivo de control. Intenté encontrar una manera de solucionar este problema, pero hasta ahora nada funciona.
¿Cómo se puede hacer esto?
Tengo un extenso sistema buildbot en funcionamiento que compila en numerosas versiones de Ubuntu, versiones de CentOS y algunas versiones de OS X. Dividirlo en paquetes ramificados para diferentes versiones rompería eso. Así que estoy buscando una solución que funcione en un único árbol de origen. Estoy tratando de encontrar un gancho desde el principio que pueda usar en dpkg-buildpackage para configurar las cosas por versión, pero aún no he encontrado una solución.
Respuesta1
La forma más sencilla es utilizar paquetes alternativos en el Build-Depends
campo, por ejemplo Build-Depends: dh-python | python-central, [...]
. Esto tiene varias peculiaridades: se seleccionará la primera dependencia que satisfaga el solucionador de dependencias. También puede utilizar Build-Depends versionados (por ejemplo, si sabe que algunas versiones anteriores de paquetes estaban incompletas), es decir Build-Depends: dh-python (>= <correct_version) | python-central
.
La forma más complicada si necesita depender de un paquete que no existe en una versión anterior (o posterior) es agregarlo base-files (<< <version>) | real-package
como una dependencia en lugar de simplemente real-package
ajustarlo <version>
para que coincida con la versión en la próxima versión. Si necesita un paquete en un sistema antiguo, pero no en uno nuevo, debería utilizarlo base-file (>= <version>) | real-package
desde <version>
la versión de Ubuntu donde no necesita el archivo real-package
.
Por ejemplo, para realizar backporting apache2
para Ubuntu 12.04, he cambiado libnghttp2-dev
a base-files (<< 7.2~) | libnghttp2-dev
.
Agregaré d/rules
un fragmento de mi 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
tiene
Build-Depends: [...], dh-systemd (>= 1.5) | base-files (<< 7.2ubuntu5~)
Respuesta2
Aquí está el script que se me ocurrió para permitir que el código se desarrolle en cualquier versión. En mi caso, creé un archivo control.pre_trusty y control.post_precise, y un archivo Rules.pre_trusty y 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