うちのdebian26パッケージビルド環境 †
colinuxの立ち上げ †
- 詳細は省略します。
ツボとしては、
- インストールダイアログでdebian環境をインストールするを選択する。
- 環境立ち上げ後、Window XPのポート3632をcolinux側にフォワードする。
ことです。
colinux上にクロス開発環境を構築 †
- debian/sarge環境の準備。
- debianは既にはいってますよね?
debian26はsargeベースなので、colinuxの側の環境もsargeへdistupgradeしておきます。
- i386の開発環境を入れます。
- sh4のクロスコンパイラセットを入れます。
http://eggplant.ddo.jp/www/download/debian26/CROSS/sh4-cross-20050910.tgz
http://iohack.sourceforge.jp/kogiidena/debian26/CROSS/sh4-cross-20050910.tgz
を取得して中身を全てdpkg -i でインストールします。
- 中身
binutils-sh4-linux_2.15-5_i386.deb
cpp-3.4-sh4-linux_3.4.3-13_i386.deb
g++-3.4-sh4-linux_3.4.3-13_i386.deb
gcc-3.4-sh4-linux_3.4.3-13_i386.deb
libc6-dev-sh4-cross_2.3.5-6_all.deb
libc6-sh4-cross_2.3.5-6_all.deb
libdb1-compat-sh4-cross_2.1.3-7_all.deb
libgcc1-sh4-cross_3.4.3-13_all.deb
libncurses5-dev-sh4-cross_5.4-4_all.deb
libncurses5-sh4-cross_5.4-4_all.deb
libstdc++6-dev-sh4-cross_3.4.3-13_all.deb
libstdc++6-sh4-cross_3.4.3-13_all.deb
linux-kernel-headers-sh4-cross_2.6.13+0rc3-1.1_all.deb
- SH4用のライブラリをクロス環境へ追加したい時は!
# dpkg-cross -i 追加したライブラリ_sh4.deb
(ちなみに、本方法でインストールしたSH4用のパッケージ(主にライブラリ)類は全て
/usr/sh4-linux下に配置され、クロスビルド用に使用されます。)
以上でクロスビルド環境の構築は終了です。
この状態で、/usr/sh4-linuxの下にクロスビルド環境一式がインストールされています。
- クロスビルド環境のテスト
- hello.c
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("Hello sh4-cross-build world !\n");
}
を作成後、ビルド。
fileコマンドで生成オブジェクトのアーキテクチャを確認します。
colinux:~# sh4-linux-gcc hello.c -o hello
colinux:~# file hello
hello: ELF 32-bit LSB executable, Hitachi SH, version 1 (SYSV),
for GNU/Linux 2.3.99, dynamically linked (uses shared libs), not stripped
- debianパッケージのクロスビルド
クロスビルドに対応したパッケージ(数はすくないですが)をビルドすることが可能です。
(dpkg-buildpackage コマンドに-ash4オプションを追加する。)
- binutils
colinux:~# apt-get source binutils
colinux:~# cd binutils-2.15
ビルドに依存するパッケージをチェック
colinux:~/binutils-2.15# dpkg-checkbuilddeps
全ての依存関係が解消されるまで、apt-get install で該当パッケージをインストール。そして、
colinux:~/binutils-2.15# dpkg-buildpackage -ash4
distcc環境の構築 †
- colinux側の設定
- distccをapt-getします。
colinux:~# apt-get install distcc
- /etc/default/distccの編集
STARTDISTCC="true"
ALLOWEDNETS="192.168.0.0/24 192.168.1.0/24 127.0.0.1" ← 接続許可するクライアントのIP
PATH=/usr/sh4-linux/distcc/bin:$PATH ← クロスコンパイラのパス設定
- パス上にクロスコンパイラを用意
パスのトップに/usr/sh4-linux/distcc/binを追加したので、その場所に優先して呼び出したいコンパイラを用意します。
colinux:~# mkdir -p /usr/sh4-linux/distcc/bin
colinux:~# cd /usr/sh4-linux/distcc/bin
colinux:/usr/sh4-linux/distcc/bin#
colinux:/usr/sh4-linux/distcc/bin# ln -s /usr/bin/sh4-linux-gcc gcc
colinux:/usr/sh4-linux/distcc/bin# ln -s /usr/bin/sh4-linux-gcc cc
colinux:/usr/sh4-linux/distcc/bin# ln -s /usr/bin/sh4-linux-gcc sh4-linux-gcc
colinux:/usr/sh4-linux/distcc/bin# ln -s /usr/bin/sh4-linux-g++ g++
colinux:/usr/sh4-linux/distcc/bin# ln -s /usr/bin/sh4-linux-g++ c++
colinux:/usr/sh4-linux/distcc/bin# ln -s /usr/bin/sh4-linux-g++ sh4-linux-g++
colinux:/usr/sh4-linux/distcc/bin# ls
c++ cc g++ gcc sh4-linux-g++ sh4-linux-gcc
- distccサーバdistccdの起動
colinux:~# /etc/init.d/distcc start
Starting Distributed Compiler Daemon: distccd.
- LANDISK側の設定
- distccのインストール
(クライアント側なのでサーバは起動させないこと!)
landisk:~# apt-get install distcc
- 〜/.distcc/hosts
ホームディレクトリに〜/.distcc/hostsを用意し、そこに、distccサーバのIPアドレスを記述します。
colinuxの例では、ポートフォワードを行うWindows XPのIPアドレスを記述します。
192.168.1.2 ← distccサーバのIPアドレス
- コンパイラの指定
/usr/lib/distcc/bin ディレクトリを作成し、distccコマンドへのリンクを
呼び出すコンパイラ名で作成します。
landisk:~# mkdir -p /usr/lib/distcc/bin
landisk:~# cd /usr/lib/distcc/bin
landisk:/usr/lib/distcc/bin# ln -s /usr/bin/distcc gcc
landisk:/usr/lib/distcc/bin# ln -s /usr/bin/distcc cc
landisk:/usr/lib/distcc/bin# ln -s /usr/bin/distcc g++
landisk:/usr/lib/distcc/bin# ln -s /usr/bin/distcc c++
landisk:/usr/lib/distcc/bin# ln -s /usr/bin/distcc sh4-linux-gcc
landisk:/usr/lib/distcc/bin# ln -s /usr/bin/distcc sh4-linux-g++
landisk:/usr/lib/distcc/bin# ls
c++ cc g++ gcc sh4-linux-g++ sh4-linux-gcc
これらコマンドが呼び出されると、distccサーバ側の同名コマンドがパス設定に従い呼び出されます。
- パス設定
LANDISK側で、先ほどリンクしたコンパイラが優先して呼ばれるように、パス設定を行います。
export PATH=/usr/lib/distcc/bin:$PATH
以上で準備完了です。
- distccの動作概要
LANDISK側でセルフコンパイルするのと全く同じコマンドでクロスビルドを行うことができます。
ビルドを実行すると、
(1)LANDIK側のパス設定に従い/usr/lib/distcc/bin下のコンパイラが呼ばれます。
(2)本コンパイラの実態はdistccです。
(3)distccはcolinuxサーバに接続し、同名のコマンド(コンパイラ)を実行します。
(4)distccサーバはビルド結果をdistccクライアントに返信します。
このようなシーケンスでクロスビルドが行われます。
- 補足
gccは、通常、cpp,cc1,as,ldの4つのフェーズでコンパイルを行いますが、
distccサーバが処理するのは、cc1とasのフェーズだけです。
cppとldは、distccクライアント(LANDISK)側で実行されます。
従って、colinux側のincludeファイルやlibは、distccのビルド結果に影響しません。
(つまり、colonux側にincludeやlibがなくてもクロスビルドできるということ!)
- 運用にあたって
colinux上のクロス環境のほうがLANDISKに比べ、約一桁程度高速にビルドできるよう感じました。
従って、パッケージ作成にあたり、xtermを4つ開いて、4個のパッケージを同時にビルドしていました。
Counter: 4206,
today: 1,
yesterday: 1