2008/02/03

OpenBSD/Zaurusと分散コンパイル (Qt4.4TP1は挫折中)

相変らず体調悪し。

OpenBSD/ZaurusでQt 4.4 TP1のビルドは挫折中…。
ちょこちょこ修正しながらビルドしてたのだけど、OS固有のpthread関数の所で止まってます。
../JavaScriptCore/kjs/collector.cpp: In function `void*
KJS::currentThreadStackBase()':
../JavaScriptCore/kjs/collector.cpp:300: error: `pthread_getattr_np' undeclared
(first use this function)
../JavaScriptCore/kjs/collector.cpp:300: error: (Each undeclared identifier is
reported only once for each function it appears in.)

こちらを参考に修正しようとしたのだけど、横になりながらZaurusで修正しつづけるのも辛いので止めました。


でも、Qt4.4 TP1のビルド中に結構便利な環境が出来ました。
メモはあまり取っていませんけど。

distccで分散コンパイル環境を作成しました。
サーバ: OpenBSD(i386) 4.2
クライアント: OpenBSD(zaurus) 4.2
という環境です。

i386の方はWindowsXPマシン上のVMWare Serverで構築しました。

手間取ったのは下記の点でした。

(1) GNU標準のgccではarm-openbsdのクロスコンパイラが作成出来ない?
最初はノートPCに入っているLinux上でクロスコンパイラを作成しようとしたのですが、arm-openbsdのクロスコンパイラってGNU標準のgccで出来ませんでした。
i386-openbsdとかarm-linuxは調べた範囲、またconfigureしてみた範囲では出来るっぽいですけど。
もちろん私の調べ方が甘いのかもしれません。

で、どうしようかと思っていたのですが、どうやらOpenBSD(i386)で簡単にarmのクロスコンパイル環境が作成出来るらしい。
ということで、やってみました。

(2)クロスコンパイラの作成途中でエラーになる
# cd /usr/src
# TARGET=zaurus make cross-distrib

あちこちでエラーになります。

Makefile.crossを修正して、必要(そう)なライブラリをリンクしたり、SSLを使用するものを外したりしたところ、一応makeは終了するようになったみたいです。
(Makefile.crossを見たところ、SSLはビルドしないようになっている???)

こんなんでいいのか不安ですが、使いたいのはクロスコンパイラだけだし、試してみたらi386でarm用のOpenBSD実行ファイルが出来たので、まあいいとしましょう。



分散コンパイルに使用するdistccというアプリはこちらからいただいてきました。
インストールする場所は、色々なサイトを参考に適当に決めました。
今となってはもうちょっと考えるべきだったかなと思います。

サーバとして使用するOpenBSD(i386)の方は/usr/local/distcc以下にインストールし、次のような構成にしました。
lrwxr-xr-x  1 root  wheel       6 Jan 26 14:23 arm-unknown-openbsd4.2-c++ -> distcc
lrwxr-xr-x 1 root wheel 6 Jan 26 14:23 arm-unknown-openbsd4.2-g++ -> distcc
lrwxr-xr-x 1 root wheel 6 Jan 26 14:23 arm-unknown-openbsd4.2-gcc -> distcc
-rwxr-xr-x 1 root wheel 304288 Jan 25 18:23 distcc
-rwxr-xr-x 1 root wheel 368353 Jan 25 18:23 distccd
-rwxr-xr-x 1 root wheel 118547 Jan 25 18:23 distccmon-text

クライアント(arm)の方は/usr/local以下にインストールし、/usr/local/lib/distcc/以下に次のような構成でリンクを作成しました。
lrwxr-xr-x  1 root  wheel   21 Jan 26 22:01 arm-unknown-openbsd4.2-c++
-> /usr/local/bin/distcc
lrwxr-xr-x 1 root wheel 21 Jan 26 22:01 arm-unknown-openbsd4.2-g++
-> /usr/local/bin/distcc
lrwxr-xr-x 1 root wheel 21 Jan 26 22:00 arm-unknown-openbsd4.2-gcc
-> /usr/local/bin/distcc
-rwxr-xr-x 1 root wheel 148 Jan 30 22:50 arm-unknown-openbsd4.2-wrapper
lrwxr-xr-x 1 root wheel 30 Jan 26 22:10 c++ -> arm-unknown-openbsd4.2-wrapper
lrwxr-xr-x 1 root wheel 30 Jan 26 22:10 g++ -> arm-unknown-openbsd4.2-wrapper
lrwxr-xr-x 1 root wheel 30 Jan 26 22:10 gcc -> arm-unknown-openbsd4.2-wrapper

arm-unknown-openbsd4.2-wrapperはシェルスクリプトで中身は次のとおりです。
#!/bin/sh
export DISTCC_DIR=/tmp
export DISTCC_HOSTS='サーバのIPアドレス localhost'
exec /usr/local/lib/distcc/arm-unknown-openbsd4.2-${0##*/} "$@"
exit

クライアイント(arm)でのコンパイル時にPATH環境変数上に存在するgcc(/usr/bin/gcc)の代わりに/usr/local/lib/dist/gccを呼ぶようにします。
クライアント(arm)側ではarm-unknown-openbsd4.2-gccというシンボリックリンク経由でdistccを実行し、サーバ(i386)上ではクロスコンパイラであるarm-unknown-openbsd4.2-gcc( /usr/cross/zaurus/usr/bin/arm-unknown-openbsd4.2-gcc)を呼びだすようにします。

サーバ(i386)では/etc/rc.localに次のように記述して、OS起動時にdistccdを実行するようにしました。
echo -n 'starting distccd'
DISTCCD_PATH=/usr/cross/zaurus/usr/bin /usr/local/distcc/bin/distccd
--daemon --allow xxx.xxx.0.0/24 --log-file /var/log/distcc.log



以上、横になりながらメモも取らずに作業したのですが、確かこんな感じだったと思います。
適当に設定したわりにはとてもいい感じで使えてます

確か丸一日近くかけてビルドしていたkonqueror embeddedも一時間くらいで終ります。

0 件のコメント: