DistCC クロスコンパイルガイド
1.
distccでのクロスコンパイル
はじめに
distccとは、ソフトウェアコンパイルの負荷をネットワーク上のコンピュータに分散させるツールです。
ネットワーク上のコンピュータがすべて同じプロセッサアーキテクチャ向けの同じツールチェインビルドを使用していれば、distccの特別な設定は必要ありません。
しかし、異なるアーキテクチャを使っている別のコンピュータでコンパイルする必要があるときにはどうしますか?
このガイドでは、異なるアーキテクチャでdistccを使ったコンパイルを行うための設定方法を説明します。
必要なユーティリティのemerge
まず、コンパイル行程に関わるすべてのマシンでcrossdevをemergeする必要があります。
crossdevは、クロスアーキテクチャツールチェインのビルドを簡単にするツールです。
このオリジナル版はJoshua Kinardが作成し、Mike Frysingerが改良しました。
この使用方法はわかりやすく、crossdev -t sparcを実行すれば、Sparcアーキテクチャをターゲットにした完全なクロスツールチェインをビルドします。
これには、binutils、gcc、glibc、そしてlinux-headersが含まれます。
より詳しいヘルプが必要なら、crossdev --helpを実行してみてください。
言うまでもありませんが、すべてのコンピュータに適切なクロスツールチェインをemergeする必要があります。
次に、行程に関わるすべてのマシンでdistccをemergeする必要があります。
これには、emergeを実行するコンピュータとクロスコンパイルを行うコンピュータが含まれます。
distccの設定方法と使用方法に関するより詳しい情報は、Gentoo Distcc Documentation(日本語訳)を参照してください。
アーキテクチャ特有の注意点
Intel x86の異なるサブアーキテクチャ間(たとえば、i586とi686)でクロスコンパイルを行うのなら、必要なCHOSTの完全なクロスツールチェインをビルドしなければ、コンパイルが失敗してしまいます。
これは、i586とi686とは"x86"と見なされるにもかかわらず、実際には異なったCHOSTであるためです。
クロスツールチェインをビルドする際には、このことを覚えておいてください。
たとえば、ターゲットとなるコンピュータがi586なら、i686のコンピュータでi586クロスツールチェインをビルドしなければならないと言うことです。
クロスコンパイルを正しく行うためにdistccを設定
distccの初期設定では、クロスコンパイルは正しく動作しません。
この原因は、多くのビルドが完全なコンパイラ名(sparc-unknown-linux-gnu-gccなど)の代わりに単にgccを実行しているからです。
このコンパイルがdistcc協力コンピュータへ配信を行う際に、新しいクロスコンパイラの代わりにネイティブコンパイラが呼び出されます。
幸運なことに、この小さな問題に対する代替方法があります。
emergeを行うコンピュータでラッパースクリプトといくつかのシンボリックリンクを作成することです。
Sparcコンピュータを例として使用します。
以下のsparc-unknown-linux-gnuというところは、あなた自身のCHOST(例えば、AMD64ではx86_64-pc-linux-gnu)に置き換えてください。
初めてdistccをemergeしたら、/usr/lib/distcc/binディレクトリは以下のようになっています。
注意:
以下の指示はemergeを実行するコンピュータでのみ行ってください。
協力コンピュータではこれらの段階を行ってはいけません。
|
コード表示 1.1: 利用可能なコンパイラ |
# cd /usr/lib/distcc/bin
# ls -l
total 0
lrwxrwxrwx 1 root root 15 Dec 23 20:13 c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 cc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 gcc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
|
これが行いたいことです。
コード表示 1.2: distccの修正 |
# rm c++ g++ gcc cc
|
次に、このコンピュータに新しいスクリプトを作成します。
お気に入りのエディタを起動して、以下のテキストを含むファイルを作成し、sparc-unknown-linux-gnu-wrapperという名前で保存します。
CHOST(この場合はsparc-unknown-linux-gnu)を、emergeを実行するコンピュータの実際のCHOSTに変更することを忘れないでください。
コード表示 1.3: 新しいラッパースクリプト |
#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-${0##*/} "$@"
|
次に、スクリプトを実行可能にし、適切なシンボリックリンクを作成します。
コード表示 1.4: シンボリックリンクの作成 |
# chmod a+x sparc-unknown-linux-gnu-wrapper
# ln -s sparc-unknown-linux-gnu-wrapper cc
# ln -s sparc-unknown-linux-gnu-wrapper gcc
# ln -s sparc-unknown-linux-gnu-wrapper g++
# ln -s sparc-unknown-linux-gnu-wrapper c++
|
完了したら、/usr/lib/distcc/binは以下のようになっているでしょう。
コード表示 1.5: 適切なコンパイラのセット |
# ls -l
total 4
lrwxrwxrwx 1 root root 25 Jan 18 14:20 c++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 cc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 g++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 gcc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Jul 27 10:52 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
-rwxr-xr-x 1 root root 70 Jan 18 14:20 sparc-unknown-linux-gnu-wrapper
|
おめでとうございます。
これでcross-distccの設定は完了です。
動作内容
distccが呼ばれたら、なんと呼ばれたかを確認します(例えば、i686-pc-linux-gnu-gccやsparc-unknown-linux-gnu-g++など)。
その後、distccがコンパイルを協力コンピュータへ配信するとき、呼び出された名前も一緒に渡します。
その他の協力コンピュータにあるdistccデーモンは同じ名前のバイナリを探します。
もしこれが単にgccなら、emergeを実行しているコンピュータと異なるアーキテクチャであっても、協力コンピュータのネイティブコンパイラであるgccを探します。
sparc-unknown-linux-gnu-gccといった完全なコンパイラ名の場合には、混乱は起きません。
このドキュメントの内容は、他のものが明示されない限りは、
CC-BY-SA-2.5ライセンスです。
Gentoo Name and Logo Usage Guidelines (日本語訳)が適用されます。
|