[home]
[log in]


distccとは?

本家のサイト

使い方

クライアント

$ 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()が、クライアントのメイン処理。

  1. dcc_scan_args() argsのパース。リモートでコンパイルできないなら、あきらめてローカルでコンパイル。
    • -specsが付いている。
    • 入力ファイルが.o(=リンク)
    • 複雑なオプション(=-x)が付いている。 など。
  2. dcc_pick_host_from_list()
    • コンパイルするホストを選ぶ(自分も含めて)。
    • 最近エラーを起こしたホストは、抜かす。(backoffファイルの作成日時が、60秒以内)
    • ホスト名の付いたロックファイルを作る。作れなかったら、別ホスト名で試す。
    • 空きが無かったら、空くまで待つ。

リモートが選択された場合

ルール: 失敗したら、そのホスト名のbackoffファイルを作って、ローカルコンパイル。

  1. dcc_cpp_maybe() ファイル名がプリプロセス後(i,ii,s,mi,mii)以外だったら… -oを抜いて、-Eを付けて、cpp(プリプロセッサ)を子プロセスで実行。

  2. dcc_strip_local_args() プリプロセスに必要なオプション(-I,-D)と、リンクに必要なオプションを削除。

  3. dcc_compile_remote()

    • サーバーに接続
    • cppが終わるのを待つ
    • サーバーにDOTIでプリプロセス後のファイルを送る

              parent
                |  fork() child
    server      |---------->|
      |  接続()  |           |
      |<--------|           |
      |         |        プリプロセス
      |         |  wait()   |
      |  DOTI   |---------->|
      |<--------|
      |         |
    コンパイル     |
      |  DOTO   |
      |-------->|
                |
              終了

ローカルが選択された場合

オプションのパースした結果などは全部捨てて、 元々の引数でローカルコンパイル。

この場合は、子プロセスをfork()、gccをexec()して、その結果を待つ。

注意



Last Modified: 2008-05-08 Thursday