[home]
[log in]
distccとは?
- プリプロセス後のコンパイル(またはアセンブル)をリモートホストに行わせるプログラム。 プリプロセス、リンク等はローカルで行う。
- distccは、ccやgccの代わりに呼ばれるプログラム。 distcc自体が並列ビルドを行うわけではない。 並列ビルドは、make -jの仕事。
使い方
クライアント
$ export DISTCC_HOSTS="localhost red green blue"
$ distcc -Wall hello.c
$ distcc gcc -Wall hello.c
$ make -j2 CC=distcc
サーバー
$ distccd
protocol
overview
C S
connect
---------> TCP port 3632へ接続
(disconnect)
<-------- IP filterで、はじく事も可能
request
--------->
response
<--------
close
<------->
request and response format
2種類。どちらのタイプになるかは、tokenによって決まる。
4byte 8byte
+-----+---------+-------+
|token| length | body |
+-----+---------+-------+
4byte 8byte
+-----+---------+
|token|parameter|
+-----+---------+
request
DIST <version>
リクエストの開始
ARGC <nargs>
argvの数
ARGV <len> <bytes>
argvの中身。argv回送られる。
DOTI <len> <bytes>
.iファイルの中身
response
DONE <version>
レスポンスの開始
STAT <status> ((EXITCODE << 8) | TERMSIGNAL)
コンパイラのエラーコード
SERR <len> <bytes>
コンパイラの標準エラー出力
SOUT <len> <bytes>
コンパイラの標準出力
DOTO <len> <bytes>
.oファイルの中身
クライアントの内部動作
dcc_build_somewhere()が、クライアントのメイン処理。
-
dcc_scan_args()
argsのパース。リモートでコンパイルできないなら、あきらめてローカルでコンパイル。
- -specsが付いている。
- 入力ファイルが.o(=リンク)
- 複雑なオプション(=-x)が付いている。 など。
-
dcc_pick_host_from_list()
- コンパイルするホストを選ぶ(自分も含めて)。
- 最近エラーを起こしたホストは、抜かす。(backoffファイルの作成日時が、60秒以内)
- ホスト名の付いたロックファイルを作る。作れなかったら、別ホスト名で試す。
- 空きが無かったら、空くまで待つ。
リモートが選択された場合
ルール: 失敗したら、そのホスト名のbackoffファイルを作って、ローカルコンパイル。
dcc_cpp_maybe() ファイル名がプリプロセス後(i,ii,s,mi,mii)以外だったら… -oを抜いて、-Eを付けて、cpp(プリプロセッサ)を子プロセスで実行。
dcc_strip_local_args() プリプロセスに必要なオプション(-I,-D)と、リンクに必要なオプションを削除。
dcc_compile_remote()
- サーバーに接続
- cppが終わるのを待つ
- サーバーにDOTIでプリプロセス後のファイルを送る
parent
| fork() child
server |---------->|
| 接続() | |
|<--------| |
| | プリプロセス
| | wait() |
| DOTI |---------->|
|<--------|
| |
コンパイル |
| DOTO |
|-------->|
|
終了
ローカルが選択された場合
オプションのパースした結果などは全部捨てて、 元々の引数でローカルコンパイル。
この場合は、子プロセスをfork()、gccをexec()して、その結果を待つ。
注意
- ローカルとリモートのコンパイラのバージョンは、できるだけ合わせておく事。
Last Modified: 2008-05-08 Thursday