Ubuntu のリリースに応じて異なる「debian/control」ファイルを作成するにはどうすればよいでしょうか?

Ubuntu のリリースに応じて異なる「debian/control」ファイルを作成するにはどうすればよいでしょうか?

私たちは多くの異なるUbuntuパッケージを生産し、保守しているソースコードを大量に持っています。これらのパッケージはすべて、Ubuntu LTSリリースに基づいて構築する必要があります。ウブントゥ8.04(Hardy Heron) 以降。(はい、これらは古くてサポートされていないことは承知しています。これらは宇宙用システム用なので、新しいリリースに更新することはできません。それでも、新しいリリースに更新しながら、それらのソフトウェアを保守する必要があります。)

私はコードベース全体を稼働させようとしていますウブントゥ 14.04(Trusty Tahr)。Pythonコードのパッケージが完全に変更されたことに非常にがっかりしました。Trustyの時点では、python-supportとpython-centralは消え、dh_python2を使用する必要があります

私の問題は、動作するファイルをどのように作成するかですdebian/control。Build-Depends: バージョンまでウブントゥ 12.04(Precise Pangolin) には を含める必要がありますpython-centralが、14.04 以降では を含める必要がありますdh_python2。制御ファイルには条件付きテキストの規定が見つかりませんでした。この問題を回避する方法を見つけようとしましたが、今のところ何も機能していません。

これはどうすればできるのでしょうか?

私は、多数の Ubuntu バージョン、CentOS バージョン、および一部の OS X バージョンでコンパイルする大規模なビルドボット システムを稼働させています。異なるバージョン用に分岐したパッケージに分割すると、このシステムが機能しなくなります。そのため、単一のソース ツリーで機能するソリューションを探しています。バージョンごとに設定するために dpkg-buildpackage で使用できるフックを早い段階で見つけようとしていますが、まだ解決策が見つかっていません。

答え1

最も簡単な方法は、Build-Dependsフィールド feで代替パッケージを使用することですBuild-Depends: dh-python | python-central, [...]。これにはいくつかの癖があり、依存関係ソルバーを満たす最初の依存関係が選択されます。また、バージョン付きの Build-Depends (パッケージの以前のバージョンが不完全であることがわかっている場合は fe ) を使用することもできますBuild-Depends: dh-python (>= <correct_version) | python-central

以前のリリース (またはそれ以降のリリース) に存在しないパッケージに 依存する必要がある場合のより複雑な方法は、 をbase-files (<< <version>) | real-package依存関係として追加するのではなくreal-package、 を調整して、<version>次のリリースのバージョンと一致するようにすることです。古いシステムではパッケージが必要で、新しいシステムでは必要ない場合は、を必要としない Ubuntu リリースから を使用しbase-file (>= <version>) | real-package、 を使用します。<version>real-package

たとえば、Ubuntu 12.04 へのバックポートの場合は、にapache2変更しました。libnghttp2-devbase-files (<< 7.2~) | libnghttp2-dev

d/rulesMySQL-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

関連情報