DPKG-ARCHITECTURE(1)

名称
dpkg-architecture - パッケージ構築用にアーキテクチャを決定・設定する

書式
dpkg-architecture [options] [action]

有効なオプション: -aDebian-Architecture -tGnu-System-Type -f

有効なアクション: -l, -qVariable-Name, -s, -u, -c Command

説明
dpkg-architecture はパッケージ構築用に、 ビルド・ホストアーキテクチャを決定・設定する機構を提供する。

概要
ビルドアーキテクチャは、常に dpkg への外部呼び出しによって決定され、 コマンドラインでは設定できない。

-a か -t または両方のオプションで、 ホストアーキテクチャを指定できる。 デフォルトでは、gcc への外部呼び出しで決定されるが、 CC と gcc の両方が利用できない場合、ビルドアーキテクチャと同じになる。 -a と -t のどちらかで十分だが、 他方の値は使用可能なデフォルトにセットされる。 実際には、選択したものがデフォルトと一致しない場合、 dpkg-architecture が警告するので、たいてい 1 つを指定するだけのほうがよい。

デフォルトのアクションは -l で、 1行ごと 変数名=値 の形で環境変数を表示する。 単一の変数の値を表示したいだけなら、-q を利用してもよい。 -s を指定した場合、export コマンド形式で出力する。 これに eval を用いて、環境変数の設定 (set) に使用できる。 -u は、全変数を解除 (unset) するコマンドを返す。 -c は、決定した値を全変数に設定した環境で、コマンドを実行する。

-f 強制フラグが指定された場合を除き、 スクリプトで使用されるのと同名の既存の環境変数は、上書きされない。 これは dpkg-architecture への呼び出しを、 他のスクリプト (例えば dpkg-buildpackage) に埋め込んでも、 ユーザが値を上書きできるということである。 -q クエリオプションには、-f を暗黙に指定する。 そのため、既存の環境設定によって影響されない。

用語

ビルドマシン (build machine)
    パッケージの構築を行うマシン。

ホストマシン (host machine)
    構築したパッケージを使用するマシン。

Debian アーキテクチャ (Debian Architecture)
    FTP アーカイブのバイナリツリーで指定する Debian アーキテクチャ文字列。 例: i386, sparc, hurd-i386.

GNU システムタイプ (GNU System Type)
    cpu-system や cpu-vendor-system といった、 2, 3 パートから成るアーキテクチャ仕様文字列。 例: i386-linux, sparc-linux, i386-gnu.

例
dpkg-buildpackage は -a オプションを受け付け、 そのまま dpkg-architecture に渡す。 その他の用例:

CC=i386-gnu-gcc dpkg-architecture -c debian/rules build

eval `dpkg-architecture -u`

変数
dpkg-architecture は以下の変数を設定する:

DEB_BUILD_ARCH
    ビルドマシンの Debian アーキテクチャ

DEB_BUILD_GNU_TYPE
    ビルドマシンの GNU システムタイプ

DEB_BUILD_GNU_CPU
    DEB_BUILD_GNU_TYPE の CPU 部

DEB_BUILD_GNU_SYSTEM
    DEB_BUILD_GNU_TYPE のシステム部

DEB_HOST_ARCH
    ホストマシンの Debian アーキテクチャ

DEB_HOST_GNU_TYPE
    ホストマシンの GNU システムタイプ

DEB_HOST_GNU_CPU
    DEB_HOST_GNU_TYPE の CPU 部

DEB_HOST_GNU_SYSTEM
    DEB_HOST_GNU_TYPE のシステム部

DEBIAN/RULES
dpkg-architecture で設定した環境変数は、 debian/rules に make 変数 (make 文書を参照) として渡される。 必要であれば、構築プロセスでこの変数を使用できるし、使用するべきである。 以下、パッケージでのクロスコンパイルサポートの改良方法も示す、使用例である:

ARCH=`dpkg --print-architecture` configure $(ARCH)-linux

上記に代えて

B_ARCH=$(DEB_BUILD_GNU_TYPE) H_ARCH=$(DEB_HOST_GNU_TYPE) configure --build=$(B_ARCH) --host=$(H_ARCH)

とする。

ARCH=`dpkg --print-architecture` ifeq ($(ARCH),alpha)
  ... endif

この代わりに

ARCH=$(DEB_HOST_ARCH) ifeq ($(ARCH),alpha)
  ... endif

とする。

一般的に、アーキテクチャ情報を取得するためには、 rules ファイルで dpkg を呼ぶべきではない(後述の後方互換性を提供するまで)。 特に --print-architecture オプションは、 プロセッサ名と等しくない Debian アーキテクチャができて以来、当てにできない。

後方互換性
新機構を提供するときに、プログラムの旧バージョンとの互換性を確保するのは、 常によい考えである。 dpkg-architecture は古い debian/rules ファイルには影響を及ぼさない。 そのため、新しい debian/rules ファイルで、 古い構築スクリプトを使用する事を考慮するだけであることに注意してほしい。 以下はその方法である:

DEB_BUILD_ARCH := $(shell dpkg --print-installation-architecture) DEB_BUILD_GNU_CPU := $(patsubst hurd-%,%,$(DEB_BUILD_ARCH)) ifeq ($(filter-out hurd-%,$(DEB_BUILD_ARCH)),)
  DEB_BUILD_GNU_SYSTEM := gnu else
  DEB_BUILD_GNU_SYSTEM := linux endif DEB_BUILD_GNU_TYPE=$(DEB_BUILD_GNU_CPU)-$(DEB_BUILD_GNU_SYSTEM)

DEB_HOST_ARCH=$(DEB_BUILD_ARCH) DEB_HOST_GNU_CPU=$(DEB_BUILD_GNU_CPU) DEB_HOST_GNU_SYSTEM=$(DEB_BUILD_GNU_SYSTEM) DEB_HOST_GNU_TYPE=$(DEB_BUILD_GNU_TYPE)

debian/rules ファイルの一番上にの上記の行のサブセットを置くこと。 dpkg-architecture を使用する場合は、このデフォルト値が上書きされる。

フルセットは必要ない。 rules ファイルで使用する値を含む、矛盾しないセットを選ぶこと。 例えば、ホスト Debian アーキテクチャのみ必要とする場合、
 `DEB_HOST_ARCH=`dpkg --print-installation-architecture` で十分である。 (これは確かにビルドマシンの Debian アーキテクチャである。 しかし、ネイティブコンパイルとの後方互換性を持とうとしているだけであることを 思い出すこと)

(例えば、十分なソース依存関係をとにかく宣言する場合など) 旧式の構築パッケージには関心がないかもしれない。 しかし、少なくとも環境変数を設定せず、`debian/rules build' を直接呼んで パッケージを構築するという、従来の方法をサポートするべきだ。 そのためには、適切なデフォルト値を取得する -q オプションを使用すること。

DEB_BUILD_ARCH=`dpkg-architecture -qDEB_BUILD_ARCH` DEB_BUILD_GNU=`dpkg-architecture -qDEB_BUILD_GNU`

上記等の用法が考えられる。 このように、変数が未宣言でないことを保証できる。 これが旧式の構築スクリプトとの後方互換性を壊し、 そのためにソース依存関係が実装・宣言されるのであれば、 あえてそうするべきである。

関連項目
dpkg-buildpackage dpkg-cross

連絡
rules ファイルでの make 変数の使い方や、 パッケージのクロスコンパイルサポートについての疑問は、 Marcus Brinkmann <brinkmd@debian.org> まで email を送ってほしい。

翻訳者
倉澤 望 <nabetaro@debian.or.jp>