#author("2022-05-03T15:16:51+00:00","","")
#author("2022-05-03T15:19:12+00:00","","")
#topicpath

* 目次 [#p89c0df5]
#contents();

///////////////////////////////////////////////////////////////////////////////
* distcc [#distcc]
- distcc は、C/C++/Objective-C/Objective-C++ のビルドをネットワーク上の複数の host に分散して行う機能を実現する。

///////////////////////////////////////////////////////////////////////////////
* setup [#setup]
//=============================================================================
** 前提 [#rf3261d3]
- distcc によるクラスタを構成する各 host は、同じバージョンのコンパイラがインストールされている必要がある。
- -march=native オプションは使えない
-- CGG 4.3.0 からサポートされたもので、CPU自動判別と最適化の機能を有効にするオプション。
-- このオプションを使用すると、それぞれのプロセッサでの最適化されたコードが生成され、それらが混在してしまうことになる。(クラスタを構成する host が全て同じ CPU を積んでいるなら問題なさそう)


//=============================================================================
** setup (master, slave 共通) [#setup-common]
- 全てのマシンに distcc パッケージをインストールする
- /etc/default/distcc
-- 記述例
 # Defaults for distcc initscript
 # sourced by /etc/init.d/distcc
 
 #
 # should distcc be started on boot?
 #
 # マシンの起動時に distccd を自動起動する場合は true にする。
 STARTDISTCC="true"
 
 #
 # Which networks/hosts should be allowed to connect to the daemon?
 # You can list multiple hosts/networks separated by spaces.
 # Networks have to be in CIDR notation, e.g. 192.168.1.0/24
 # Hosts are represented by a single IP address
 #
 # distcc の命令を受けるホストを IP address の範囲で指定
 ALLOWEDNETS="192.168.0.0/24"
 
 #
 # Which interface should distccd listen on?
 # You can specify a single interface, identified by it's IP address, here.
 #
 # LISTENER="127.0.0.1"
 # distcc の命令を listen するインターフェース(=自機の IP address)
 LISTENER="192.168.100.12"
 
 #
 # You can specify a (positive) nice level for the distcc process here
 #
 # 引き受ける Job の優先度(高:-20〜19:低)
 NICE="10"
 
 #
 # You can specify a maximum number of jobs, the server will accept concurrently
 #
 # 引き受ける job の上限数(マシンの性能・運用方針によって設定する)
 JOBS="4"
 
 #
 # Enable Zeroconf support?
 # If enabled, distccd will register via mDNS/DNS-SD.
 # It can then automatically be found by zeroconf enabled distcc clients
 # without the need of a manually configured host list.
 #
 # zeloconf 環境を構築している場合は true にする。
 ZEROCONF="false"


//=============================================================================
** setup (master) [#setup-master]
*** 環境変数 DISTCC_HOSTS の設定 [#kcb503c7]
- distcc の命令を受けるホストの "IP address/多重度" を指定する。多重度は省略すると 4 になる。
- 以下のいずれかの方法で設定する。
-- 環境変数を直接設定する
 $ export DISTCC_HOSTS="192.168.0.0/8 192.169.1.0/4 localhost"
--- 複数エントリを指定する場合は、エントリ間を半角スペースで区切る
-- ${HOME}/.distcc/hosts に記載する
 192.168.0.0/8,lzo 192.169.1.0/4,cpp,lzo localhost
--- 複数エントリを指定する場合は、エントリ間を半角スペースで区切る
--- --randomize を指定したい場合も、 ${HOME}/.distcc/hosts に記載すれば良い。
--- , の後に、各ホストに対するオプションを指定出来る
|~option |~description |~remark |
|lzo     |TCP 又は SSH で転送するこのホストで LZO 圧縮を有効にする    | |
|cpp     |distcc-pump mode をこのホストに対して有効にする             | |
|auth    |GSSAPI-based mutual authentication をこのホストで有効にする | |

-- 注意
--- DISTCC_HOSTS の設定に於いて、環境変数(方法1)と ${HOME}/.distcc/hosts (方法2)の両方を設定した場合、distcc 起動直前に設定している方法1での設定が優先され、それ以外の設定は無視される。

|~option     |~description |~remark |
|--randomize |job を投げる対象ホストのオーダーをランダムにする | |
|--randomize |job を投げる対象ホストのオーダーをランダムにする |指定しない場合、jpb を投げられるホストは環境変数 DISTCC_HOSTS で先に指定された順に偏重する |
|+zeroconf   | |distcc のビルド時に avahi support が有効になっているときのみ使える |


- gcc の置き換え
-- 何らかの方法で、"gcc" を "distcc gcc" に置き換える。
-- 方法1:Makefile の記載を変える
 (変更前) CC := gcc
 (変更後) CC := distcc gcc
-- &aname(compiler-wrapper){方法2:コマンドを置き換える};(${HOME}/bin/gcc に wrapper を作る)
--- 環境変数で、${HOME}/bin 配下を優先的に見に行くようにする
 $ export PATH=${HOME}/bin:${PATH}
--- ${HOME}/bin/gcc
 #!/bin/bash
 distcc gcc ${@}
-- 方法3:configure で設定する場合
 CC="distcc gcc" CXX="distcc g++" ./configure

//=============================================================================
** setup (slave) [#setup-slave]

//=============================================================================
** monitor [#monitor]
- distccmon-gnome
-- GUI の distcc モニタ
-- distccmon-gnome パッケージでインストールする。
- distccmon-text
-- CUI の distcc モニタ
- distcc パッケージに含まれている。


///////////////////////////////////////////////////////////////////////////////
* ccache と併用する [#e1245eda]
+ ccache パッケージを master ホストにインストールする
+ コンパイラコマンドを置換する
-- 方法1:Makefile の記載を変える
 (変更前) CC := gcc
 (変更後) CC := ccache distcc gcc
-- [[方法2:コマンドを置き換える>#compiler-wrapper]] で設定する置き換えコマンドの中身を下記のようにする(ccache を追記):
 #!/bin/bash
 ccache distcc gcc ${@}
-- 方法3:configure で設定する場合
 CC="ccache distcc gcc" CXX="ccache distcc g++" ./configure


///////////////////////////////////////////////////////////////////////////////
* gcc wrapper [#g5a218a3]
- ${HOME}/bin/gcc (or g++, clang, clang++, gobjc, gobjc++)

 #!/bin/bash
 IS_MONITOR_EXISTS=$(pgrep distccmon-gnome | wc -l);
 if [ ${IS_MONITOR_EXISTS} -eq 0 ]; then
     DISPLAY=${DISPLAY} distccmon-gnome &
 fi
 unset IS_MONITOR_EXISTS;
 
 CMD_CCHACHE=
 IS_CCACHE_EXISTS=$(which ccache | wc -l);
 if [ ${IS_CCACHE_EXISTS} -ne 0 ]; then
     CMD_CCHACHE=ccache
 fi
 ${CMD_CCACHE} distcc gcc ${@}


///////////////////////////////////////////////////////////////////////////////
* 参考リンク [#c326f890]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS