日曜日, 1月 07, 2007

 

Landisk distcc on debian sh4

distccは分散コンパイラ。

複数の協力コンピュータにコンパイルを手伝ってもらう。
パッケージをソースからビルドする前提のgentooではお馴染み?のようだ。

いくつかのパッケージをbackportsから持ってくることを計画したのだけれど
archに対応した出来合いのバイナリがない。
ソースからコンパイルしようとしてもsh4 landiskはあまりに非力だ。
だからi686のマシンでコンパイルのお手伝いをさせていただく。

要件は
1.landisk(debian)とi686(debian)のdistccによる連携。
2.i686マシンではarch sh4用のクロスコンパイル。

"distcc"はdistccdとdistccとに大きくわけることができるようだ。

distccd:デーモン、他マシンなどから要求があった場合に分散コンパイルを行う。
distcc :他マシンなどに分散コンパイルの要求を行う。

早速両方のマシンにaptして作業開始。

i686の設定ファイルを書き換える。
/etc/default/distcc

STARTDISTCC="true"
ALLOWEDNETS="127.0.0.1 192.168.11.22" ←localhostとlandisk のip
LISTENER=""

でデーモンを再起動

/etc/init.d/distcc restart

次はlandisk側の設定

ディレクトリの作成。
mkdir /usr/lib/distcc/bin

当該ディレクトリにdistccへのリンクを作成
sh4-linux-g++ -> /usr/bin/distcc
sh4-linux-gcc -> /usr/bin/distcc
c++ -> /usr/bin/distcc
cc -> /usr/bin/distcc
g++ -> /usr/bin/distcc
gcc -> /usr/bin/distcc

bashrcに環境変数を設定する。
DISTCC_HOSTS=i686-machine
PATH=/usr/lib/distcc/bin:$PATH


こうしておくと、ccが呼ばれたときにはサーチパス上にある/usr/lib/distcc/bin/ccが実行される。
その実態は/usr/bin/distccなわけで、distccが実行される。
その際には、distccはリンク元コマンド(cc)が何であったかも見ているようだ。

distccは分散コンパイル可能か判断する。
可能だと判断した場合は分散コンパイル先コンピュータ(今回はi686-machine)に依頼する。
不可能だと判断した場合は自分でコンパイルする。

で、コンパイルを敢行。見事失敗した。

問題となるのはi686マシンにccというコマンドを依頼した場合、archを気にせずccを行おうとすることだ。
当然i686マシンでccを行った場合はi686用のバイナリが作成される。

で、この問題を回避するためのヒントがgentooのdistccのマニュアルにあった。
ラッパーを作成する。

cd /usr/lib/distcc/bin/
touch wrapper
chmod a+x wrapper

中身はこんな感じ
#!/bin/bash
case ${0##*/} in
'cc') exec /usr/lib/distcc/bin/sh4-linux-gcc "$@"
;;
'c++') exec /usr/lib/distcc/bin/sh4-linux-g++ "$@"
;;
*) exec /usr/lib/distcc/bin/sh4-linux-${0##*/} "$@"
;;
esac


そんでg++、gcc、c++、cc のリンクを消してこんどはwrapperに対してリンクを作成する。
cd /usr/lib/distcc/bin/
ln -s wrapper c++
ln -s wrapper cc
ln -s wrapper g++
ln -s wrapper gcc

合計 12
drwxr-xr-x 2 root root 4096 2007-01-06 04:30 .
drwxr-xr-x 3 root root 4096 2007-01-03 21:57 ..
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 c++ -> wrapper
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 cc -> wrapper
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 g++ -> wrapper
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 gcc -> wrapper
lrwxrwxrwx 1 root root 15 2007-01-04 08:22 sh4-linux-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 2007-01-04 08:23 sh4-linux-gcc -> /usr/bin/distcc
-rwxr-xr-x 1 root root 211 2007-01-06 04:32 wrapper


そうすると
c++、g++が呼ばれると
/usr/lib/distcc/bin/sh4-linux-g++が実行され、
cc、gccが呼ばれると
/usr/lib/distcc/bin/sh4-linux-gccが実行される。

そんでもう一度コンパイルを敢行しました。

OK!

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
i686に突っ込んだsh4のクロスコンパイラにはkogiidenaさんの
sh4-cross-20050910.tgz
を利用させていただいた。
libstdc++6-sh4-crossインストール時にgcc-3.4-baseのバージョンがあわないと
怒られたが、controlファイルをいじって無理にいれた。

今回は設定に二日。
sh4-cross-20051023.tgz
を始めに利用していた。コンパイルエラーになる。
gcc-3.4-sh4-linuxとかのマイナーバージョンがlandiskよりも
新しくなっていたようだ。

ここも参考に
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

Comments: コメントを投稿



<< Home

This page is powered by Blogger. Isn't yours?