Como posso criar um arquivo 'debian/control' que difere com base na versão do Ubuntu?

Como posso criar um arquivo 'debian/control' que difere com base na versão do Ubuntu?

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/controlarquivo 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-Dependscampo, 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-packagecomo uma dependência em vez de apenas real-packagee 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-packagee usaria <version>a versão do Ubuntu onde não precisa do real-package.

Por exemplo, para backport apache2para Ubuntu 12.04, mudei libnghttp2-devpara base-files (<< 7.2~) | libnghttp2-dev.

Adicionarei d/rulesum 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/controltem

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

informação relacionada