クロスコンパイルで絶大な効果の期待できそうなdistccを導入することに。以前、知り合いの組込み屋さんはネイティブコンパイルにこだわっておられ、クロスコンパイルをあまり信用されていなかったので、それに習って当方も真似してネイティブコンパイルしていましたが、、、もう我慢の限界ですw 素直にPentium4に任せよう、、、
ホスト側とLS-GL側で各々distccをmake installするだけ。
詳細はココやココを参照して頂くとして。distccのソースtarボールを拾ってきます。まずはホスト側から
$ ./configure --prefix=/usr/local/develop/bin
$ make
$ make install
同様にLS-GL側も
# ./configure --prefix=/usr/local/develop/bin
# make
# make install
ホスト側も--prefixが/usr/local/develop/binになってますが、単純にホスト側のクロスコンパイル環境をLS-GLに合わせているので、どうせ汚すなら害の少なそうな場所にという理由だけです。
早速出来上がったバイナリを使って分散コンパイルを請け負う待ち受け側のホストにてdistccdデーモンを起動するわけですが、当方の通常環境ではクロスコンパイラにはPathを通していないのでPathを通すかPathの通っているdirにリンクを張るかをしておきます(distccdってPathが通ってなくても探してくれるんでしょうか?):
$ cd /usr/local/bin ←当方の環境ではPathが通っている
$ ln -s /usr/local/develop/bin/arm-none-linux-gnueabi-gcc .
$ ln -s /usr/local/develop/bin/arm-none-linux-gnueabi-c++ .
$ ln -s /usr/local/develop/bin/arm-none-linux-gnueabi-g++ .
distccをデーモンとして起動させます:
$ /usr/local/develop/bin/distccd --allow 192.168.0.XX --daemon
--allowにはLS-GLのIPを直接指定するなりLANのネットマスクを記述します。しかしここでdistccのユーザがうんたらと警告が・・・。取りあえずdistccというユーザを作成したら警告は出なくなったので善しとする(必要なんでしょうか?)
LS-GL側の設定を行います。まずはLS-GLの本家gccよりdistccが優先されるように適当なdirを作成してPathの順序を優先させます。それから分散コンパイルを依頼する先をIPで指定します:
# mkdir -p /usr/local/develop/distcc
# export PATH=/usr/local/develop/distcc:$PATH
# export DISTCC_HOSTS=192.168.0.YY
次に、クロス用の簡単なスクリプトを用意する必要があります。これはLS-GL側でgccがキックされるとdistccはそのままホスト側にgccをキックさせてしまいARM用ではなくx86用が起動してしまうのを防ぐ為のトリックのようです。上記リンク先を参照にスクリプト(distcc-wrapper.sh)を用意しました:
#!/bin/bash
exec /usr/local/develop/distcc/arm-none-linux-gnueabi-${0##*/} "$@"
上記のスクリプトにgcc、c++、g++へリンクを張り、更にdistccへのリンクも張ります。
# ls -l /usr/local/develop/distcc
lrwxrwxrwx 1 root root 29 Apr 27 02:07 arm-none-linux-gnueabi-c++ -> /usr/local/develop/bin/distcc
lrwxrwxrwx 1 root root 29 Apr 27 02:07 arm-none-linux-gnueabi-g++ -> /usr/local/develop/bin/distcc
lrwxrwxrwx 1 root root 29 Apr 27 02:07 arm-none-linux-gnueabi-gcc -> /usr/local/develop/bin/distcc
lrwxrwxrwx 1 root root 19 Apr 27 02:08 c++ -> ./distcc-wrapper.sh
-rwxrwxrwx 1 root root 82 Apr 27 02:09 distcc-wrapper.sh
lrwxrwxrwx 1 root root 19 Apr 27 02:08 g++ -> ./distcc-wrapper.sh
lrwxrwxrwx 1 root root 19 Apr 27 02:08 gcc -> ./distcc-wrapper.sh
r
これで準備万端(のはず・・・)
適当なソースで試してみることに。
# ./configure
# make -j4
が、ちっともホスト側でコンパイルされる気配なし・・・何がおかしいのだろう???
# watch /usr/local/develop/bin/distccmon-text
でモニタしながらmakeしてみるとホスト側に依頼はかけにいっているようなのだが、そのまま固まってタイムアウトしているような動き。しばし悩む・・・悩む・・・が、ふとiptablesでハネちゃってね?というアホな事実に気が付きiptablesに穴を開けたら無事ホスト側のコンパイラがキックされるようになりました。
iptables -A OUTPUT -p tcp -m state --state NEW -s $HOST -d $LAN --dport 3632 -j ACCEPT
自分で穴塞いでおいてアホですなw>当方
.configure中にバイナリ実行してチェックしながらconfigするようなタイプのものでもクロスコンパイル並みにビルドが出来るのでストレスも随分減りますね。もっと早く導入しとけばよかった・・・orz