*うちのdebian26パッケージビルド環境 [#y5272879]
-こんな環境でsh4のdebianパッケージをビルドしています。~
(distccメインでやっています。dodesというもっと進んだ方法があるようですが、まだ試していません。)~
#pre{{
プロバイダOCN---ルータ-+-(192.168.1.x)
                       |
                       +- LANDISK(HP公開用)
            |
            +- LANDISK0(開発機…distccクライアント)
                       |
                       +- iMac G5(distccサーバにできないかな?)
                       |
                       +- Windows XP -+-(192.168.0,x)
                                      |
                                      +-colinux (distccサーバ)
}}
*colinuxの立ち上げ [#rba82d84]
-詳細は省略します。~
ツボとしては、
--インストールダイアログでdebian環境をインストールするを選択する。~
--環境立ち上げ後、Window XPのポート3632をcolinux側にフォワードする。~
-
ことです。~
~
&ref(distcc.jpg,nolink);~
~
*colinux上にクロス開発環境を構築 [#g0556fca]
-''debian/sarge環境の準備。''
--debianは既にはいってますよね?~
debian26はsargeベースなので、colinuxの側の環境もsargeへdistupgradeしておきます。~
~
-''i386の開発環境を入れます。''
--dpkg-dev,gcc,g++,gcc-3.4-base  … 開発環境基本セット
--binutils-multiarch … マルチアーキテクチャ対応のbinutilsを入れます。~
--dpkg-cross         … クロス環境サポートのdpkg~
#pre{{
# apt-get install dpkg-dev gcc g++ gcc-3.4-base binutils-multiarch dpkg-cross
}}
--/etc/dpkg-cross/cross-compile 編集~
次の1行を加えます。~
#pre{{
default_arch = sh4
}}
-''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 でインストールします。~
~
--中身~
#pre{{
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用のライブラリをクロス環境へ追加したい時は!
#pre{{
# dpkg-cross -i 追加したライブラリ_sh4.deb
}}
(ちなみに、本方法でインストールしたSH4用のパッケージ(主にライブラリ)類は全て~
/usr/sh4-linux下に配置され、クロスビルド用に使用されます。)~
~
以上でクロスビルド環境の構築は終了です。~
この状態で、/usr/sh4-linuxの下にクロスビルド環境一式がインストールされています。~
~
-''クロスビルド環境のテスト''~
--hello.c~
#pre{{
#include<stdio.h>
#include<stdlib.h>

int main()
{
   printf("Hello sh4-cross-build world !\n");
}
}}
を作成後、ビルド。~
fileコマンドで生成オブジェクトのアーキテクチャを確認します。~
#pre{{
colinux:~# sh4-linux-gcc hello.c -o hello
colinux:~# file hello
hello: ELF 32-bit LSB executable, &color(red){Hitachi SH};, version 1 (SYSV),
for GNU/Linux 2.3.99, dynamically linked (uses shared libs), not stripped
}}
--debianパッケージのクロスビルド~
クロスビルドに対応したパッケージ(数はすくないですが)をビルドすることが可能です。~
(dpkg-buildpackage コマンドに-ash4オプションを追加する。)~
---binutils~
#pre{{
colinux:~# apt-get source binutils
colinux:~# cd binutils-2.15
}}
ビルドに依存するパッケージをチェック
#pre{{
colinux:~/binutils-2.15# dpkg-checkbuilddeps
}}
全ての依存関係が解消されるまで、apt-get install で該当パッケージをインストール。そして、
#pre{{
colinux:~/binutils-2.15# dpkg-buildpackage &color(red){-ash4};
}}
*distcc環境の構築 [#k9e8f5f1]
-''colinux側の設定''~
--distccをapt-getします。~
#pre{{
colinux:~# apt-get install distcc
}}
--/etc/default/distccの編集~
#pre{{
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を追加したので、その場所に優先して呼び出したいコンパイラを用意します。~
#pre{{
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の起動~
#pre{{
colinux:~# /etc/init.d/distcc start
Starting Distributed Compiler Daemon: distccd.
}}

-''LANDISK側の設定''~
--distccのインストール~
(クライアント側なのでサーバは起動させないこと!)~
#pre{{
landisk:~# apt-get install distcc
}}
--〜/.distcc/hosts~
ホームディレクトリに〜/.distcc/hostsを用意し、そこに、distccサーバのIPアドレスを記述します。~
colinuxの例では、ポートフォワードを行うWindows XPのIPアドレスを記述します。~
#pre{{
192.168.1.2    ← distccサーバのIPアドレス
}}
--コンパイラの指定~
/usr/lib/distcc/bin ディレクトリを作成し、distccコマンドへのリンクを~
呼び出すコンパイラ名で作成します。~
#pre{{
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側で、先ほどリンクしたコンパイラが優先して呼ばれるように、パス設定を行います。~
#pre{{
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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS