分散クロスコンパイル環境の構築


パワー不足の玄箱でGentooを運用して行くには、少しでもコンパイルの速度を上げないとGentooが生きて来ないだろう、ということで・・・

ボロPC(とは言え、Pentium III 800MHz)に、コンパイルをお手伝いさせようと、前回は、PowerPC(玄箱)のコンパイル環境をPentiumeIII上に構築したわけです。

今回は、分散コンパイルさせるために、distccの導入です。
既に、玄箱には、distccは導入してあるので、ボロPCにも入れます。ついでに、ccacheも入れてしまいます。

ボロPCで:

# emerge distcc ccache

色々と試行錯誤がありましたが、最終的に次のようになりました。

玄箱側の設定:
/etc/make.confの内容:

CFLAGS="-O2 -mcpu=603e -fno-strict-aliasing -pipe -fsigned-char"
CHOST="powerpc-unknown-linux-gnu"
CXXFLAGS="${CFLAGS}"
PORTDIR=/var/portage
DISTDIR=/var/portage/distfiles
PKGDIR=/var/portage/packages
RPMDIR=/var/portage/rpm
PORTDIR_OVERLAY="/var/overlays/kurobox"
RSYNC_EXCLUDEFROM=/etc/portage/rsync_excludes
GENTOO_MIRRORS="http://mirror.gentoo.gr.jp/"
SYNC="rsync://192.168.11.101/gentoo-portage"
PORTAGE_TMPDIR=/var/tmp
MAKEOPTS="-j6"
FEATURES="ccache distcc"
DISTCC_DIR="${PORTAGE_TMPDIR}/.distcc"
CCACHE_SIZE="2G"
CCACHE_DIR="/var/tmp/ccache"

ホストの指定:

# distcc-config --set-hosts 192.168.11.101

/usr/lib/distcc/powerpc-unknown-linux-gnu-wrapperを次の内容で新規に作成する。

#!/bin/bash exec /usr/lib/distcc/bin/powerpc-unknown-linux-gnu-g${0:$[-2]} "$@"

これは、powerpc-unknown-linux-gnu-gccのようにフルネームではなく、gccと短い名前で呼ばれたときに、フルネームで呼ばれたかのように見せかけるラッパーです。
コンパイラが起動されたときにdistccを実行するように、シンボリックリンクをはります。

# cd /usr/lib/distcc/bin
# chmod a+x powerpc-unknown-linux-gnu-wrapper
# ln -s powerpc-unknown-linux-gnu-wrapper c++
# ln -s powerpc-unknown-linux-gnu-wrapper cc
# ln -s powerpc-unknown-linux-gnu-wrapper g++
# ln -s powerpc-unknown-linux-gnu-wrapper gcc
# ln -s /usr/bin/distcc powerpc-unknown-linux-gnu-c++
# ln -s /usr/bin/distcc powerpc-unknown-linux-gnu-g++
# ln -s /usr/bin/distcc powerpc-unknown-linux-gnu-gcc

デフォルトランレベルにdistccccacheを登録しておきます。

# rc-update add distcc default
# rc-update add ccache default

ボロPC側の設定:
/etc/make.confの内容:

CFLAGS="-Os -march=pentium4 -pipe"
CHOST="i686-pc-linux-gnu"
CXXFLAGS="${CFLAGS}"
GENTOO_MIRRORS="http://mirror.gentoo.gr.jp"
SYNC="rsync://rsync.jp.gentoo.org/gentoo-portage"
PORTDIR_OVERLAY="/usr/local/portage"
PORTAGE_TMPDIR=/var/tmp
MAKEOPTS="-j2"
FEATURES="ccache"
CCACHE_SIZE="2G"
CCACHE_DIR="/var/tmp/ccache"

こちらは、お手伝いをするだけなので、設定はこれだけです。
玄箱と同じくデフォルトランレベルに登録しておきます。

# rc-update add distcc default
# rc-update add ccache default

以上で、設定は終わりです。
それぞれのマシンでdistccccacheを起動した後、玄箱側で何かをemergeしてボロPC側で、powerpc-~cc1・・・などのプロセスが実行されれば、導入は成功です。

クロスコンパイル環境の構築


ひさびさのGentooいじりの投稿です。Gentoo玄箱は、立ち上がったものの、パッケージ導入の時間のかかること。
少しでも、このボトルネックを解消しようと、ボロPCにクロスコンパイル環境を構築して、distccを使った分散コンパイルを使用するという計画です。
なかなかうまくいかなかったのですが、なんとか動きだしたので、ご報告させていただきます。
ツールチェーンの構築は、何度か経験はあるのですが、「なんか面倒だった」という記憶だけ残っていて、すっかり忘れていました。 いろいろ調べていると、crossdevというツールがあるらしい。今回はこれを試してみることにしました。

# emerge crossdev

このツールは、コマンド一発で、ツールチェーンを構築してくれる優れものです。 まず、最初にやらなければならないのが、ターゲットマシン(すなわち玄箱)のツールチェーン環境のバージョンを調べることから。現在の玄箱にインストールされているバージョンは、次のとおりです。

  • gcc 3.4.4-r1
  • binutils 2.16.1
  • kernel(header) 2.4.26-r1
  • glibc 2.3.5-r3

次に、crossdevを使って

# crossdev -t powerpc --g 3.4.4-r --b 2.16.1 --k 2.4.26-r1 --l 2.3.5-r3

で後は、待つだけ。 のハズなのですが、configure中にエラーが出てしまうのです。ソースを見たり、検索でこんな事例はないか調べたり、まったく検討違いのことばかりの3日間。 結局、ボロPC(ホスト側)のビルドチェーンが玄箱のバージョンに対応できなかったのです。分かってしまえば、こんなもの、とほほ・・・

# emerge -uD system

を実行して、再度crossdevして、無事クロス環境の構築は完了。 crossdev、偉い! 次は、クロスでの、分散コンパイル環境の構築。

・・・(To be continued)